1 | !> \file climat-forcage-stat-mois_mod-0.1.f90 |
---|
2 | !! Module pour forcage avec champs mensuels stationnaire |
---|
3 | !< |
---|
4 | |
---|
5 | !> \namespace climat_forcage_stat_mois_mod |
---|
6 | !!Module pour forcage avec champs mensuels stationnaire |
---|
7 | !! \author ... |
---|
8 | !! \date ... |
---|
9 | !! @note Used modules: |
---|
10 | !! @note - use module3D_phy |
---|
11 | !! @note - use printtable |
---|
12 | !< |
---|
13 | module climat_forcage_stat_mois_mod |
---|
14 | |
---|
15 | USE module3D_phy |
---|
16 | USE printtable |
---|
17 | |
---|
18 | IMPLICIT NONE |
---|
19 | |
---|
20 | ! 1=decalaration variables |
---|
21 | !------------------------- |
---|
22 | |
---|
23 | integer :: nft |
---|
24 | integer :: mo,ti,tj,la |
---|
25 | integer :: lake(nx,ny) !< NFT est le nombre de lignes a lire dans le fichier contenant le forcage climatique |
---|
26 | integer,parameter :: mois=12 |
---|
27 | integer,parameter :: NTR=1 !< nb of snapshot files : 1 pour stationnaire - ntr is now explicitely specified in the climat module |
---|
28 | |
---|
29 | real,dimension(:),allocatable :: TDATE !< time for climate forcing |
---|
30 | real,dimension(:),allocatable :: alphaT |
---|
31 | real,dimension(:),allocatable :: alphaP |
---|
32 | real,dimension(:),allocatable :: SPERT |
---|
33 | real ttr(ntr) !< la date des tranches (snapshots) (len=ntr) |
---|
34 | !reak alphaTTR(ntr) ! Le alphaT de l'index glaciologiq. aux snapshots |
---|
35 | |
---|
36 | real Tm(nx,ny,mois,ntr),Pm(nx,ny,mois,ntr) |
---|
37 | real Tm_time(nx,ny,mois),Pm_time(nx,ny,mois) |
---|
38 | real Tm_surf(nx,ny,mois+1) !< surface temperature (after topo. correction) |
---|
39 | real lapserate(nx,ny,mois) |
---|
40 | |
---|
41 | character (len=100) :: filin, filin2 |
---|
42 | character (len=100) :: filtr_t(ntr), filtr_p(ntr),filtr_t1, filtr_p1 !< snapshot file name (len=ntr) |
---|
43 | |
---|
44 | |
---|
45 | |
---|
46 | ! 2=lecure des inputs |
---|
47 | !-------------------- |
---|
48 | contains |
---|
49 | |
---|
50 | !> SUBROUTINE: input_clim |
---|
51 | !! Routine qui permet d'initialiser les variables climatiques |
---|
52 | !> |
---|
53 | SUBROUTINE input_clim !routine qui permet d'initialiser les variables climatiques |
---|
54 | |
---|
55 | USE module3D_phy |
---|
56 | |
---|
57 | IMPLICIT NONE |
---|
58 | |
---|
59 | character(len=8) :: control !label to check clim. forc. file (filin) is usable |
---|
60 | integer :: l !In snapshot files:the first column is the mask, read but not used |
---|
61 | |
---|
62 | |
---|
63 | !Pm(:,:,:,:)=0. |
---|
64 | !Pm_time(:,:,:)=0. |
---|
65 | !Tm(:,:,:,:)=0. |
---|
66 | !Tm_time(:,:,:)=0. |
---|
67 | lapserate(:,:,:)=0.008 |
---|
68 | |
---|
69 | |
---|
70 | !====================================================HEMINOR============ |
---|
71 | if (geoplace.eq.'hemin40') then |
---|
72 | |
---|
73 | ! atmospheric temperature gradient |
---|
74 | TEMPGRAD=0.008 |
---|
75 | TEMPGRJUL=0.0065 |
---|
76 | |
---|
77 | ! 1_fichiers snapshots pour forcage |
---|
78 | !---------------------------------- |
---|
79 | ! filtr(1)=TRIM(DIRNAMEINP)//'FORCAGES/forcage_hemin40-21k.g40' |
---|
80 | ! filtr(2)=TRIM(DIRNAMEINP)//'FORCAGES/file_regions_2act.g40' |
---|
81 | |
---|
82 | ! 2_fichiers donnant l'evolution temporelle |
---|
83 | ! ----------------------------------------- |
---|
84 | ! filin=TRIM(DIRNAMEINP)//'signal-cycle-hemin.dat' |
---|
85 | |
---|
86 | |
---|
87 | !====================================================EURASIE============ |
---|
88 | elseif (geoplace.eq.'euras40') then |
---|
89 | |
---|
90 | ! atmospheric temperature gradient |
---|
91 | ! TEMPGRAD=0.008 |
---|
92 | ! TEMPGRJUL=0.0065 |
---|
93 | TEMPGRAD=0.006 ! Pour Serie 2 (grad T reduit) |
---|
94 | TEMPGRJUL=0.005 |
---|
95 | |
---|
96 | |
---|
97 | filtr_t(1)=TRIM(DIRNAMEINP)//'/ABSOLU/forc_140ka_12temper.dat' ! 1_fichiers snapshots pour forcage |
---|
98 | filtr_p(1)=TRIM(DIRNAMEINP)//'/ABSOLU/forc_140ka_12precip.dat' |
---|
99 | |
---|
100 | filin=TRIM(DIRNAMEINP)//'signal-seal_i_inso_90ka.data' ! 2_fichiers donnant l'evolution temporelle |
---|
101 | filin=TRIM(DIRNAMEINP)//'signal-sealev_inso_26jui06.dat' |
---|
102 | |
---|
103 | filin2=TRIM(DIRNAMEINP)//'lak_reg40km_eu40_ij' |
---|
104 | |
---|
105 | |
---|
106 | !====================================================ANT20 ET 40======== |
---|
107 | elseif ((geoplace.eq.'anteis1').or.(geoplace.eq.'ant20km')) then |
---|
108 | |
---|
109 | |
---|
110 | ! atmospheric temperature gradient |
---|
111 | TEMPGRAD=0.0085 |
---|
112 | TEMPGRJUL=0.0085 |
---|
113 | |
---|
114 | ! 1_fichiers snapshots pour forcage |
---|
115 | !---------------------------------- |
---|
116 | ! filtr(1)='../INPUT-DATA/FORCAGES/forcage-ant-20k.g40' |
---|
117 | print*,'lecture de ',filin,filtr_p,filtr_t |
---|
118 | ! 2_fichiers donnant l'evolution temporelle |
---|
119 | ! ---------------------------- ------------ |
---|
120 | filin=TRIM(DIRNAMEINP)//'forcmodif4cycles.dat' !forcage vostok en rapport : a creer |
---|
121 | |
---|
122 | endif !Fin du test sur geolpace |
---|
123 | |
---|
124 | ! 3_lecure des fichiers snapsots pour tout geoplace |
---|
125 | ! ------------------------------------------------- |
---|
126 | write(6,*) 'fichiers snapshots' |
---|
127 | do k=1,ntr |
---|
128 | !temperature |
---|
129 | write(6,*) filtr_t(k) |
---|
130 | open(20,file=filtr_t(k)) |
---|
131 | do j=1,ny |
---|
132 | do i=1,nx |
---|
133 | read(20,*) ti, tj, (Tm(i,j,mo,k),mo=1,12) |
---|
134 | end do |
---|
135 | end do |
---|
136 | !precipitation |
---|
137 | close(20) |
---|
138 | close(21) |
---|
139 | write(6,*) filtr_p(k) |
---|
140 | open(20,file=filtr_p(k)) |
---|
141 | do j=1,ny |
---|
142 | do i=1,nx |
---|
143 | read(20,*) ti, tj, (Pm(i,j,mo,k),mo=1,12) |
---|
144 | end do |
---|
145 | end do |
---|
146 | close(20) |
---|
147 | end do |
---|
148 | ! ttr(1)=-500000. !ttr est la date des tranches 3D-1.h |
---|
149 | ! ttr(2)=0 |
---|
150 | ! 4_lecure des fichiers d'evolution pour tout geoplace |
---|
151 | ! ---------------------------------------------------- |
---|
152 | open(20,file=filin,status='old') |
---|
153 | ! print*,nft |
---|
154 | read(20,*) control,nft |
---|
155 | print*,'control',control,nft |
---|
156 | ! Determination of file size (line nb), allocation of perturbation array |
---|
157 | if (control.ne.'nb_lines') then |
---|
158 | write(6,*) filin,'indiquer le nb de ligne en debut de fichier:' |
---|
159 | write(6,*) 'le nb de lignes et le label de control nb_lines' |
---|
160 | stop |
---|
161 | endif |
---|
162 | |
---|
163 | if (.not.allocated(tdate)) THEN |
---|
164 | allocate(TDATE(nft),stat=err) |
---|
165 | if (err/=0) then |
---|
166 | print *,"Erreur à l'allocation du tableau TDATE",err |
---|
167 | stop 4 |
---|
168 | end if |
---|
169 | end if |
---|
170 | |
---|
171 | if (.not.allocated(alphat)) THEN |
---|
172 | allocate(alphaT(nft),stat=err) |
---|
173 | if (err/=0) then |
---|
174 | print *,"Erreur à l'allocation du tableau TPERT",err |
---|
175 | stop 4 |
---|
176 | end if |
---|
177 | end if |
---|
178 | |
---|
179 | if (.not.allocated(alphap)) THEN |
---|
180 | allocate(alphap(nft),stat=err) |
---|
181 | if (err/=0) then |
---|
182 | print *,"Erreur à l'allocation du tableau TPERT",err |
---|
183 | stop 4 |
---|
184 | end if |
---|
185 | end if |
---|
186 | |
---|
187 | if (.not.allocated(spert)) THEN |
---|
188 | allocate(spert(nft),stat=err) |
---|
189 | if (err/=0) then |
---|
190 | print *,"Erreur à l'allocation du tableau SPERT",err |
---|
191 | stop 4 |
---|
192 | end if |
---|
193 | end if |
---|
194 | |
---|
195 | do I=1,NFT |
---|
196 | ! read(20,*) TDATE(I),alphaT(I),alphaP(i),SPERT(I) ! forc grip |
---|
197 | ! print*,i,TDATE(I),alphaT(I),alphaP(i),SPERT(I) |
---|
198 | read(20,*) TDATE(I),alphaT(I),SPERT(I) ! forc inso |
---|
199 | end do |
---|
200 | !RAJOUT VINCE |
---|
201 | ! do k=1,ntr |
---|
202 | ! do I=1,NFT |
---|
203 | ! if (TDATE(I)==ttr(k)) then |
---|
204 | ! alphaTTR(k)=alphaT(I) |
---|
205 | ! endif |
---|
206 | ! end do |
---|
207 | ! end do |
---|
208 | |
---|
209 | alphaP(:)=1.0 |
---|
210 | !----------------------------masque de glace pour l'Eurasie |
---|
211 | do j=3,ny-2 |
---|
212 | do i=3,nx-2 |
---|
213 | mk0(i,j)=1 |
---|
214 | if ((i.lt.25).and.(j.gt.35)) mk0(i,j)=0 |
---|
215 | end do |
---|
216 | end do |
---|
217 | !----------------------------pour les lacs |
---|
218 | !print*, 'module forcage climatique' |
---|
219 | !print*, 'ajout de lakes' |
---|
220 | |
---|
221 | ! open(50,file=filin2) |
---|
222 | ! do j=1, ny |
---|
223 | ! write(*,*) 'entree boucle j' |
---|
224 | ! do i=1, nx |
---|
225 | ! write(*,*) 'entree boucle i' |
---|
226 | ! write(*,*) i |
---|
227 | ! read(50,*) k, k, lake(i,j) |
---|
228 | ! enddo |
---|
229 | ! enddo |
---|
230 | ! close(50) |
---|
231 | |
---|
232 | ! A CREER ou organiser a partir des codes dans ! 2_fichiers donnant l'evolution temporelle |
---|
233 | |
---|
234 | end subroutine input_clim |
---|
235 | !-------------------------------------------------------------------------------- |
---|
236 | !> SUBROUTINE: init_forclim |
---|
237 | !! Routine qui permet d'initialiser les variables climatiques au cours du temps |
---|
238 | !> |
---|
239 | SUBROUTINE init_forclim |
---|
240 | |
---|
241 | !namelist/clim_forc/ |
---|
242 | !namelist/clim_pert/rappact,retroac,rapbmshelf,mincoefbmelt,maxcoefbmelt |
---|
243 | |
---|
244 | !rewind(num_param) ! pour revenir au debut du fichier param_list.dat |
---|
245 | !read(num_param,clim_forc) |
---|
246 | |
---|
247 | ! formats pour les ecritures dans 42 |
---|
248 | 428 format(A) |
---|
249 | |
---|
250 | write(num_rep_42,428)'!___________________________________________________________' |
---|
251 | write(num_rep_42,428) '&clim_forc_mensuel ! pour le forcage climatique en stationnaire' |
---|
252 | write(num_rep_42,*) |
---|
253 | end subroutine init_forclim |
---|
254 | !--------------------------------------------------------------------- |
---|
255 | !forcage climatique au cours du temps |
---|
256 | !> SUBROUTINE: forclim |
---|
257 | !! Routine permet d'effectuer le calcul climatique au cours du temps |
---|
258 | !> |
---|
259 | subroutine forclim |
---|
260 | |
---|
261 | implicit none |
---|
262 | real COEFT,COEFP,coeftime!coeftime is not used |
---|
263 | INTEGER L !dumm index for loops on snapsots files l=ITR,NTR-1 |
---|
264 | INTEGER ITR !nb of the current snapshot file (change with time) |
---|
265 | ! time en dehors des limites du fichier forcage |
---|
266 | INTEGER ii,jj |
---|
267 | ITR=1 |
---|
268 | ! |
---|
269 | !run mensuels stationnaires |
---|
270 | ! avec 1 snapshots |
---|
271 | do mo=1,mois |
---|
272 | Tm_time(:,:,mo)=Tm(:,:,mo,1) |
---|
273 | Pm_time(:,:,mo)=Pm(:,:,mo,1) |
---|
274 | end do |
---|
275 | |
---|
276 | !if(time.le.tdate(1)) then ! time avant le debut du fichier forcage |
---|
277 | ! sealevel=spert(1) |
---|
278 | ! coeft=alphat(1) |
---|
279 | ! coefp=alphap(1) |
---|
280 | ! ift=1 |
---|
281 | ! |
---|
282 | !else if (time.ge.tdate(nft)) then ! time apres la fin du fichier forcage |
---|
283 | ! sealevel=spert(nft) |
---|
284 | ! coeft=alphat(nft) |
---|
285 | ! coefp=alphap(nft) |
---|
286 | ! ift=nft |
---|
287 | ! |
---|
288 | !else |
---|
289 | ! |
---|
290 | ! |
---|
291 | !!A modifier |
---|
292 | ! ift = 1 ! modifie par SC le 24/11/99 |
---|
293 | ! do i=ift,nft-1 |
---|
294 | !! print*,'ds boucle1 sur snapshots',ift,TDATE(I),TDATE(I+1),time |
---|
295 | ! if((time.ge.tdate(i)).and.(time.lt.tdate(i+1))) then |
---|
296 | ! |
---|
297 | !! interpolation entre I et I+1 : cas general |
---|
298 | !! TAFOR=TPERT(I)+(TPERT(I+1)-TPERT(I))* |
---|
299 | !! & (time-TDATE(I))/(TDATE(I+1)-TDATE(I)) |
---|
300 | ! SEALEVEL=SPERT(I)+(SPERT(I+1)-SPERT(I))* & |
---|
301 | ! (time-tdate(I))/(tdate(I+1)-tdate(I)) |
---|
302 | ! |
---|
303 | ! coeft=alphaT(I)+(alphaT(I+1)-alphaT(I))* & |
---|
304 | ! (time-tdate(I))/(tdate(I+1)-tdate(I)) |
---|
305 | ! |
---|
306 | !! COEFP=alphaP(I)+(alphaP(I+1)-alphaP(I))* & |
---|
307 | !! (time-TDATE(I))/(TDATE(I+1)-TDATE(I)) |
---|
308 | ! |
---|
309 | ! do k=1,ntr-1 |
---|
310 | ! if((time.ge.ttr(k)).and.(time.lt.ttr(k+1))) goto 105 |
---|
311 | ! |
---|
312 | ! enddo |
---|
313 | !105 continue |
---|
314 | ! |
---|
315 | !if (k==ntr) k=ntr-1 |
---|
316 | !!Rajout Vince 26 juin 2006 |
---|
317 | !! coefbmshelf est donné avec l'index d'insolation à 65°N |
---|
318 | ! coefbmshelf=coefT |
---|
319 | !!On retablit l'index entre |
---|
320 | ! |
---|
321 | ! if((time.ge.ttr(1)).and.(time.lt.ttr(ntr))) then |
---|
322 | ! coeft = ( coeft - alphaTTR(k) ) / & |
---|
323 | ! ( alphaTTR(k+1)-alphaTTR(k) ) |
---|
324 | ! else |
---|
325 | ! print*,'on est pas dans les périodes forcé' |
---|
326 | ! print*,'les bornes sont ttr(1) et ttr(ntr)',ttr(1),ttr(ntr) |
---|
327 | ! print*,'time=',time |
---|
328 | ! stop |
---|
329 | ! endif |
---|
330 | ! |
---|
331 | ! |
---|
332 | ! |
---|
333 | !! Pour les experiences eurasiennes coefp==coeft |
---|
334 | ! COEFP=COEFT |
---|
335 | !! SEALEVEL=-50. |
---|
336 | ! IFT=I |
---|
337 | ! goto 100 |
---|
338 | ! endif |
---|
339 | ! |
---|
340 | ! end do |
---|
341 | ! endif |
---|
342 | !100 continue |
---|
343 | ! |
---|
344 | !! print*,'coeffT P',COEFT,COEFP |
---|
345 | !!=forcage du climat |
---|
346 | !! time en dehors des limites du fichier forcage |
---|
347 | ! if(time.le.Ttr(1)) then ! mis a -500 000 ans |
---|
348 | ! do j=1,ny |
---|
349 | ! do i=1,nx |
---|
350 | ! delTatime(i,j)=delTa(i,j,1) |
---|
351 | ! delTjtime(i,j)=delTj(i,j,1) |
---|
352 | ! rapactime(i,j)=rapact(i,j,1) |
---|
353 | ! end do |
---|
354 | ! end do |
---|
355 | ! ITR=1 |
---|
356 | ! else if (time.ge.ttr(Ntr)) then ! mis a 0 |
---|
357 | ! do j=1,ny |
---|
358 | ! do i=1,nx |
---|
359 | ! delTatime(i,j)=delTa(i,j,ntr) |
---|
360 | ! delTjtime(i,j)=delTj(i,j,ntr) |
---|
361 | ! rapactime(i,j)=rapact(i,j,ntr) |
---|
362 | ! end do |
---|
363 | ! end do |
---|
364 | ! ITR=NTR |
---|
365 | ! else ! interpolation entre l et l+1 : cas general |
---|
366 | ! |
---|
367 | ! itr=max(itr,1) |
---|
368 | ! WRITE(6,*)'itr = !',itr |
---|
369 | ! |
---|
370 | ! |
---|
371 | !!parametres du fit |
---|
372 | ! do l=ITR,NTR-1 |
---|
373 | ! print*,'ds boucle2 sur snapshots',l,ttr(l) |
---|
374 | ! if((time.ge.ttr(l)).and.(time.lt.ttr(l+1))) then ! test tranche |
---|
375 | ! |
---|
376 | ! coeftime= (time-TTR(l))/(TTR(l+1)-TTR(l)) |
---|
377 | ! do j=1,ny |
---|
378 | ! do i=1,nx |
---|
379 | ! delTatime(i,j)=delTa(i,j,l)+ & |
---|
380 | ! (delTa(i,j,l+1)-delTa(i,j,l))*coefT |
---|
381 | ! |
---|
382 | ! delTjtime(i,j)=delTj(i,j,l)+ & |
---|
383 | ! (delTj(i,j,l+1)-delTj(i,j,l))*coefT |
---|
384 | ! |
---|
385 | ! rapactime(i,j)=rapact(i,j,l)+ & |
---|
386 | ! (rapact(i,j,l+1)-rapact(i,j,l))*coefP |
---|
387 | ! end do |
---|
388 | ! end do |
---|
389 | ! print*,'l= ',l,delTj(40,30,l),delTj(40,30,l+1),delTjtime(40,30) |
---|
390 | ! ITR=l |
---|
391 | ! goto 200 |
---|
392 | ! |
---|
393 | ! endif ! fin du test sur la tranche |
---|
394 | ! end do |
---|
395 | ! endif ! fin du test avant,apres,milieu |
---|
396 | ! |
---|
397 | !200 continue |
---|
398 | print*,'l= ',l,'itr= ',itr |
---|
399 | |
---|
400 | !--------NIVEAU DES MERS ET DES LAKES |
---|
401 | |
---|
402 | if ((time.lt.-95000.).or.(time.gt.-85500.)) then ! time SANS lacs |
---|
403 | levelflot=sealevel |
---|
404 | else |
---|
405 | do j=1,ny |
---|
406 | do i=1,nx |
---|
407 | !!if (ice(i,j)==1) delTjtime(i,j)=delTjtime(i,j)-3. ! correction effet albedo |
---|
408 | ! if ( lake(i,j)==2 ) then !KOMI |
---|
409 | ! levelflot(i,j)=100. |
---|
410 | ! elseif ( lake(i,j)==3 ) then !SIBERIAN |
---|
411 | ! levelflot(i,j)=60. |
---|
412 | ! if ((.not.flot(i,j)).and.(flot(i+1,j)) ) print*,i,j,h(i,j),bmelt(i,j) |
---|
413 | ! else |
---|
414 | ! levelflot(i,j)=sealevel |
---|
415 | ! endif |
---|
416 | levelflot(i,j)=-60. |
---|
417 | enddo |
---|
418 | enddo |
---|
419 | endif |
---|
420 | levelflot(:,:)=max(levelflot(:,:),bsoc(:,:)) |
---|
421 | nom_table='flot' |
---|
422 | call printtable_l(flot,nom_table) |
---|
423 | nom_table='lvflo' |
---|
424 | call printtable_r(levelflot,nom_table) |
---|
425 | |
---|
426 | ! coefbmshelf(:,:)=(1.+delTatime(:,:)/7.) |
---|
427 | !coefbmshelf=1. ! modif pour test de sensibilite (tof 20 avril 01) |
---|
428 | !coefbmshelf=coefT |
---|
429 | coefbmshelf=max(coefbmshelf,0.1) |
---|
430 | coefbmshelf=min(coefbmshelf,2.) |
---|
431 | !tafor=?? |
---|
432 | |
---|
433 | print*,'time, coefbmshelf ',time, coefbmshelf |
---|
434 | print*,'SEA,COEFT,COEFP', SEALEVEL,COEFT,COEFP |
---|
435 | !rint*,'= t,sea,tafor',time,sealevel,tafor |
---|
436 | print*,'===========================' |
---|
437 | |
---|
438 | ! calcul de Tjuly et et Tann |
---|
439 | ! the calcul is now done in subroutine forclim |
---|
440 | do J=1,NY |
---|
441 | do I=1,NX |
---|
442 | ZS(I,J)=max(levelflot(i,j),S(I,J)) |
---|
443 | do mo=1,mois |
---|
444 | Tm_surf(i,j,mo)= - lapserate(i,j,mo) * (Zs(i,j)-S0(i,j)) & ! correction d'altitude |
---|
445 | + Tm_time(i,j,mo) |
---|
446 | |
---|
447 | end do |
---|
448 | end do |
---|
449 | end do |
---|
450 | |
---|
451 | ! |
---|
452 | Tm_surf(:,:,mois+1)=Tm_surf(:,:,1) |
---|
453 | |
---|
454 | if ((geoplace(1:5).eq.'hemin').or.(geoplace(1:5).eq.'euras')) then |
---|
455 | |
---|
456 | call accum_month() ! ds le main |
---|
457 | call ablation_month() |
---|
458 | |
---|
459 | elseif ((geoplace.eq.'anteis1').or.(geoplace.eq.'ant20km')) then |
---|
460 | ! call n'est plus dans le main |
---|
461 | !call massb_anteis_forcage() |
---|
462 | !call ablation() |
---|
463 | else |
---|
464 | print*,"partie en travaux climat forcage auter que sur heminord" |
---|
465 | print*,"geoplace ",geoplace |
---|
466 | endif |
---|
467 | ! call bla2 |
---|
468 | ! call bla3 |
---|
469 | |
---|
470 | END subroutine forclim |
---|
471 | |
---|
472 | end module climat_forcage_stat_mois_mod |
---|