source: LMDZ6/trunk/libf/phylmdiso/isotrac_mod.F90 @ 4026

Last change on this file since 4026 was 3927, checked in by Laurent Fairhead, 3 years ago

Initial import of the physics wih isotopes from Camille Risi
CR

  • Property svn:executable set to *
File size: 36.8 KB
Line 
1#ifdef ISO
2#ifdef ISOTRAC
3! $Id: $
4
5MODULE isotrac_mod
6use infotrac_phy, ONLY: niso,ntraciso,ntraceurs_zone
7use isotopes_mod, only: ridicule
8
9IMPLICIT NONE
10SAVE
11
12! contient toutes les variables traceurs isotopiques + les routines specifiquement
13! traceurs isotopiques
14
15      real ridicule_trac
16      parameter (ridicule_trac=ridicule*1e4)
17
18integer, save ::  option_traceurs
19integer, save ::  ntraceurs_zone_opt ! ntraceurs_zone propre à l'option
20! on vérifie que ça correspond bien à ntraceurs_zone d'infotrac
21integer, save ::  ntraceurs_zoneOR
22!$OMP THREADPRIVATE(option_traceurs,ntraceurs_zone_opt,ntraceurs_zoneOR)
23integer, save ::  initialisation_isotrac
24                ! 1 pour idéalisé
25                ! 0 pour lecture dans fichier
26!$OMP THREADPRIVATE(initialisation_isotrac)
27
28! variables spécifiques aux différentes options, mais necessaires au
29! calcul du nombre de zones de traceurs
30! si option=3
31integer, save :: use_bassin_atlantic
32!$OMP THREADPRIVATE(use_bassin_atlantic)
33integer, save :: use_bassin_medit
34!$OMP THREADPRIVATE(use_bassin_medit)
35integer, save :: use_bassin_indian
36!$OMP THREADPRIVATE(use_bassin_indian)
37integer, save :: use_bassin_austral
38!$OMP THREADPRIVATE(use_bassin_austral)
39integer, save :: use_bassin_pacific
40!$OMP THREADPRIVATE(use_bassin_pacific)
41integer, save :: use_bassin_merarabie
42!$OMP THREADPRIVATE(use_bassin_merarabie)
43integer, save :: use_bassin_golfebengale
44!$OMP THREADPRIVATE(use_bassin_golfebengale)
45integer, save :: use_bassin_indiansud
46!$OMP THREADPRIVATE(use_bassin_indiansud)
47integer, save :: use_bassin_tropics
48!$OMP THREADPRIVATE(use_bassin_tropics)
49integer, save :: use_bassin_midlats
50!$OMP THREADPRIVATE(use_bassin_midlats)
51integer, save :: use_bassin_hauteslats
52!$OMP THREADPRIVATE(use_bassin_hauteslats)
53integer, save :: bassin_atlantic
54!$OMP THREADPRIVATE(bassin_atlantic)
55integer, save :: bassin_medit
56!$OMP THREADPRIVATE(bassin_medit)
57integer, save :: bassin_indian
58!$OMP THREADPRIVATE(bassin_indian)
59integer, save :: bassin_austral
60!$OMP THREADPRIVATE(bassin_austral)
61integer, save :: bassin_pacific
62!$OMP THREADPRIVATE(bassin_pacific)
63integer, save :: bassin_merarabie
64!$OMP THREADPRIVATE(bassin_merarabie)
65integer, save :: bassin_golfebengale
66!$OMP THREADPRIVATE(bassin_golfebengale)
67integer, save :: bassin_indiansud
68!$OMP THREADPRIVATE(bassin_indiansud)
69integer, save :: bassin_tropics
70!$OMP THREADPRIVATE(bassin_tropics)
71integer, save :: bassin_midlats
72!$OMP THREADPRIVATE(bassin_midlats)
73integer, save :: bassin_hauteslats
74!$OMP THREADPRIVATE(bassin_hauteslats)
75! si option=4
76integer nzone_temp
77parameter (nzone_temp=1)
78real, save :: zone_temp1,zone_tempf,zone_tempa 
79!$OMP THREADPRIVATE(zone_temp1,zone_tempf,zone_tempa)
80! si option 14
81integer nzone_lat
82parameter (nzone_lat=4)
83integer nzone_pres
84parameter (nzone_pres=3)
85real, save :: zone_pres1,zone_presf,zone_presa
86!$OMP THREADPRIVATE(zone_pres1,zone_presf,zone_presa)
87real, save :: dlattag,lattag_min
88!$OMP THREADPRIVATE(dlattag,lattag_min)
89
90
91! option 1: on trace evap ocean et continent séparement 
92! option 2: on trace evap ocean, continent et evap precip
93! option 3: on trace evap différents bassins océaniques
94!       + continents + résidu
95!       attention, choisir dans ce cas les bassins océaniques
96!       dans iso_traceurs_opt3F90.h
97! option 4: tracage par température minimale
98!       dans ce cas, on définit des bins dans iso_traceurs_opt4.h
99! option 5: pour AMMA: on taggue résidu/AEJ/flux mousson/Harmattan
100! option 6: taggage des ddfts
101! option 7: pour Sandrine: taggage de la vapeur à 700hPa pour omega500<-20 TODO
102! option 8: pour Sandrine: taggage de la vapeur entre 950 et 800hPa, omega de 0 à 25 hPa et de l'évaoration en omega<-20. TODO
103! option 9: taggage du condensat et de la revap precip
104! option 10: taggage evap oce, transpiration et evaporation
105! fractionante. A utiliser quand on couple avec ORCHIDEE
106! option 11: comme 2, mais on trace juste revap precip et reste
107! option 12: taggage evap oce, sol nu, canop et reste evap cont.
108! A utiliser quand on couple avec ORCHIDEE
109! option 13: taggage température minimale + revap precip
110! option 14: taggage lat et altitude de dernière saturation (niveaux de pression) + evap surf
111! otion 15: taggage irrigation
112! option 16: taggage precip selon saisons et fonte neige: seulement pour ORCHIDEE
113! option 17: taggage température minimum de condensation directement dans la convection et la cond LS, + evap sfc, condensat et precipitation
114! option 18: idem 17 mais on tague qsmin au lieu de Tmin
115! option 19: on tag vap residuelle, vap residuelle dans ddfts, sfc, cond, rev
116! option 20: on taggue vapeur tropicale vs vapeur extratropicale
117! option 21: taggage de 2 boites 3D: extratropiques (>35°) et UT tropicale (15-15°, > 500hPa)
118! option 22: tagage de la vapeur proccessée dans les zones très convectives
119               
120        ! ces variables sont initialisées dans traceurs_init
121       
122!integer ntraciso
123!parameter (ntraciso=(ntraceurs_zone+1)*niso)
124!integer ntracisoOR ! défini dans traceurs_init
125integer, ALLOCATABLE, DIMENSION(:), save :: index_iso
126!$OMP THREADPRIVATE(index_iso)
127integer, ALLOCATABLE, DIMENSION(:), save ::  index_zone
128!$OMP THREADPRIVATE(index_zone)
129integer, ALLOCATABLE, DIMENSION(:,:), save ::  index_trac_loc ! il y a déjà un index_trac dans infotrac: vérifier que c'est le même
130!$OMP THREADPRIVATE(index_trac_loc)
131character*3, ALLOCATABLE, DIMENSION(:), save :: strtrac
132!$OMP THREADPRIVATE(strtrac)
133! -> tout ça passe maintenant par infotrac
134
135integer, ALLOCATABLE, DIMENSION(:), save :: bassin_map
136integer, ALLOCATABLE, DIMENSION(:,:), save :: boite_map
137!$OMP THREADPRIVATE(bassin_map,boite_map)
138
139
140        ! traitement recyclage et evap
141integer, save :: izone_cont ! pour le recyclage continental
142!$OMP THREADPRIVATE(izone_cont)
143integer, save :: izone_oce ! pour l'océan
144!$OMP THREADPRIVATE(izone_oce)
145integer, save :: izone_poubelle ! pour les petits résidus numériques
146!$OMP THREADPRIVATE(izone_poubelle)
147integer, save :: izone_init ! pour l'initialisation par défaut
148!$OMP THREADPRIVATE(izone_init)
149integer, save :: izone_revap ! pour l'évap des gouttes
150!$OMP THREADPRIVATE(izone_revap)
151integer, save :: option_revap
152!$OMP THREADPRIVATE(option_revap)
153integer, save :: option_tmin
154!$OMP THREADPRIVATE(option_tmin)
155integer, save :: option_cond
156!$OMP THREADPRIVATE(option_cond)
157integer, save :: izone_cond
158!$OMP THREADPRIVATE(izone_cond)
159real evap_franche
160parameter (evap_franche=1e-6) ! en kg/m2/s
161
162! specifique à option 4:
163real, save ::  zone_temp(nzone_temp-1)
164!$OMP THREADPRIVATE(zone_temp)
165! si option 5
166integer, save :: izone_aej
167!$OMP THREADPRIVATE(izone_aej)
168integer, save :: izone_harmattan
169!$OMP THREADPRIVATE(izone_harmattan)
170integer, save :: izone_mousson
171!$OMP THREADPRIVATE(izone_mousson)
172! si option 6
173integer, save :: izone_ddft
174!$OMP THREADPRIVATE(izone_ddft)
175! si option 10
176integer, save :: izone_contfrac
177!$OMP THREADPRIVATE(izone_contfrac)
178! si option 12 
179integer, save :: izone_contcanop
180!$OMP THREADPRIVATE(izone_contcanop)
181! specifique à option 13:
182real, save ::  zone_pres(nzone_pres-1)
183!$OMP THREADPRIVATE(zone_pres)
184! si option 14
185real, save ::  zone_lat(nzone_lat-1)
186!$OMP THREADPRIVATE(zone_lat)
187! si option 15
188integer, save :: izone_irrig
189!$OMP THREADPRIVATE(izone_irrig)
190! si option 17
191real, save ::  seuil_tag_tmin
192!$OMP THREADPRIVATE(seuil_tag_tmin)
193real, save ::  seuil_tag_tmin_ls
194!$OMP THREADPRIVATE(seuil_tag_tmin_ls)
195integer, save :: option_seuil_tag_tmin
196!$OMP THREADPRIVATE(option_seuil_tag_tmin)
197! si option 20
198integer, save :: izone_trop,izone_extra
199real, save ::  lim_tag20
200!$OMP THREADPRIVATE(izone_trop,izone_extra,lim_tag20)
201! si option 21: on garde izone_trop,izone_extra 
202! si opt 22
203integer, save :: izone_conv_BT,izone_conv_UT
204real, save ::  lim_precip_tag22
205!$OMP THREADPRIVATE(izone_conv_BT,izone_conv_UT,lim_precip_tag22)
206
207
208CONTAINS
209
210      subroutine iso_traceurs_init()
211
212      use IOIPSL ! getin
213      USE infotrac_phy, ONLY: ntraciso,niso,ntraceurs_zone,index_trac
214      USE isotopes_mod, ONLY: iso_eau,ntracisoOR,initialisation_iso, &
215&               iso_eau_possible
216      USE dimphy, only: klon,klev
217
218        implicit none
219
220
221        ! définition de quelles zones et quelles isotopes représentent
222        ! les traceurs
223
224        ! inputs, outputs
225        ! ! c'est les variables dans traceurs.h qui sont modifiées
226
227        ! locals
228        integer itrac,izone,ixt,k
229        integer izone_pres,izone_lat
230        character*2 strz,strz_preslat
231        character*1 strz_pres,strz_lat
232        integer ntraceurs_zone_opt
233
234        ! vérifier que on a bien l'eau comme traceurs
235        if (iso_eau.eq.0) then
236            write(*,*) 'traceurs_init 18: isotrac ne marche que si ', &
237     &            'on met l''eau comme isotope'
238            stop
239        endif
240
241        ! initialiser
242        option_traceurs=0
243        initialisation_isotrac=0
244
245        ! allouer
246        allocate (index_iso(ntraciso))
247        allocate (index_zone(ntraciso))
248        allocate (index_trac_loc(ntraceurs_zone,niso))
249        allocate (strtrac(ntraceurs_zone))
250        allocate (bassin_map(klon))
251        allocate (boite_map(klon,klev))
252
253        if (initialisation_iso.eq.0) then
254          call getin('initialisation_isotrac',initialisation_isotrac)
255          write(*,*) 'initialisation_isotrac=',initialisation_isotrac
256        endif !if (initialisation_iso.eq.0) then
257
258        ! lire l'option de traçage
259        call getin('option_traceurs',option_traceurs)
260        write(*,*) 'option_traceurs=',option_traceurs
261
262        ! cas général: pas de traceurs dans ORCHIDEE
263        ntracisoOR=niso
264
265        ! partie à éditer ! pour définir les différentes zones
266        if (option_traceurs.eq.1) then
267          ! on trace continents/ocean 
268
269          ntraceurs_zone_opt=2
270          izone_cont=1
271          izone_oce=2         
272          izone_poubelle=2 ! zone où on met les flux non physiques, de
273                ! réajustement
274          izone_init=2 ! zone d'initialisation par défaut         
275          option_revap=0
276          option_tmin=0
277          izone_revap=0
278          option_cond=0
279
280          strtrac(izone_cont)='con'
281          strtrac(izone_oce)='oce'
282
283        elseif (option_traceurs.eq.2) then
284          ! on trace continent/ ocean/reevap des gouttes
285
286          ntraceurs_zone_opt=3
287          izone_cont=1
288          izone_oce=2
289          izone_poubelle=2 ! zone où on met les flux non physiques, de
290                ! réajustement
291          izone_init=2 ! zone d'initialisation par défaut
292          option_revap=1
293          option_tmin=0
294          izone_revap=3
295          option_cond=0
296
297          strtrac(izone_cont)='con'
298          strtrac(izone_oce)='oce'
299          strtrac(izone_revap)='rev'
300         
301
302        else if (option_traceurs.eq.3) then
303            ! on trace des bassins océaniques + un résidu. On ne trace
304            ! pas l'évap des gouttes à part
305            ! le résidu est la dernère dimension
306           
307          ! lire les use_bassin
308          call getin('use_bassin_atlantic',use_bassin_atlantic)     
309          call getin('use_bassin_medit',use_bassin_medit)     
310          call getin('use_bassin_indian',use_bassin_indian)     
311          call getin('use_bassin_austral',use_bassin_austral)     
312          call getin('use_bassin_pacific',use_bassin_pacific)     
313          call getin('use_bassin_merarabie',use_bassin_merarabie)     
314          call getin('use_bassin_golfebengale',use_bassin_golfebengale)     
315          call getin('use_bassin_indiansud',use_bassin_indiansud)     
316          call getin('use_bassin_tropics',use_bassin_tropics)     
317          call getin('use_bassin_midlats',use_bassin_midlats)     
318          call getin('use_bassin_hauteslats',use_bassin_hauteslats)
319
320          write(*,*) 'use_bassin_atlantic=' ,use_bassin_atlantic 
321          write(*,*) 'use_bassin_medit=' ,use_bassin_medit
322          write(*,*) 'use_bassin_indian=' ,use_bassin_indian
323          write(*,*) 'use_bassin_austral=' ,use_bassin_austral
324          write(*,*) 'use_bassin_merarabie=' ,use_bassin_merarabie
325          write(*,*) 'use_bassin_golfebengale=' ,use_bassin_golfebengale
326          write(*,*) 'use_bassin_indiansud=' ,use_bassin_indiansud
327          write(*,*) 'use_bassin_tropics=' ,use_bassin_tropics
328          write(*,*) 'use_bassin_midlats=' ,use_bassin_midlats
329          write(*,*) 'use_bassin_hauteslats=' ,use_bassin_hauteslats
330
331       
332          ntraceurs_zone_opt=2 &
333     &                   +use_bassin_atlantic &
334     &                   +use_bassin_medit &
335     &                   +use_bassin_indian &
336     &                   +use_bassin_austral &
337     &                   +use_bassin_pacific &
338     &                   +use_bassin_merarabie &
339     &                   +use_bassin_golfebengale &
340     &                   +use_bassin_indiansud &
341     &                   +use_bassin_tropics &
342     &                   +use_bassin_midlats &
343     &                   +use_bassin_hauteslats
344
345          izone_cont=ntraceurs_zone
346          izone_oce=0 ! pas de sens car séparée en bassins         
347          izone_poubelle=ntraceurs_zone-1 ! zone où on met les flux non physiques, de
348                ! réajustement
349          izone_init=ntraceurs_zone-1 ! zone d'initialisation par défaut
350          option_revap=0 ! on ne trace pas les gouttes
351          option_tmin=0
352          izone_revap=0 ! pas de sens car on taggue pas les gouttes séparemment 
353          option_cond=0
354
355          ! si on a use_bassin_indian, on n'a pas le découpage détaillé
356          ! de l'indian:
357#ifdef ISOVERIF
358          if (use_bassin_indian.eq.1) then
359!              call iso_verif_egalite(float(use_bassin_merarabie), &
360!     &            0.0,'iso_traceurs_init 73: revoir def des bassins')
361               if ((use_bassin_merarabie.ne.0).or. &
362      &            (use_bassin_indiansud.ne.0).or. &
363      &            (use_bassin_golfebengale.ne.0)) then
364                write(*,*) 'traceurs_init 73'
365                stop
366               endif
367!              call iso_verif_egalite(float(use_bassin_golfebengale), &
368!     &            0.0,'iso_traceurs_init 73: revoir def des bassins')
369!              call iso_verif_egalite(float(use_bassin_indiansud), &
370!     &            0.0,'iso_traceurs_init 73: revoir def des bassins')
371          endif
372#endif   
373         
374          bassin_atlantic= max(use_bassin_atlantic,1)
375          bassin_medit=max(use_bassin_atlantic &
376     &           +use_bassin_medit,1)
377          bassin_indian=max(use_bassin_atlantic &
378     &           +use_bassin_medit &
379     &           +use_bassin_indian,1)
380          bassin_austral=max(use_bassin_atlantic &
381     &           +use_bassin_medit &
382     &           +use_bassin_indian &
383     &           +use_bassin_austral,1)
384          bassin_pacific=max(use_bassin_atlantic &
385     &           +use_bassin_medit &
386     &           +use_bassin_indian &
387     &           +use_bassin_austral &
388     &           +use_bassin_pacific,1)
389          bassin_merarabie=max(use_bassin_atlantic &
390     &           +use_bassin_medit &
391     &           +use_bassin_indian &
392     &           +use_bassin_austral &
393     &           +use_bassin_pacific &
394     &           +use_bassin_merarabie,1)
395          bassin_golfebengale=max(use_bassin_atlantic&
396     &           +use_bassin_medit &
397     &           +use_bassin_indian &
398     &           +use_bassin_austral &
399     &           +use_bassin_pacific &
400     &           +use_bassin_merarabie &
401     &           +use_bassin_golfebengale,1)
402          bassin_indiansud=max(use_bassin_atlantic &
403     &           +use_bassin_medit &
404     &           +use_bassin_indian &
405     &           +use_bassin_austral &
406     &           +use_bassin_pacific &
407     &           +use_bassin_merarabie &
408     &           +use_bassin_golfebengale &
409     &           +use_bassin_indiansud,1)
410          bassin_tropics=max(use_bassin_atlantic &
411     &                       +use_bassin_medit &
412     &                       +use_bassin_indian &
413     &                       +use_bassin_austral &
414     &                       +use_bassin_pacific &
415     &                       +use_bassin_merarabie &
416     &                       +use_bassin_golfebengale &
417     &                       +use_bassin_indiansud, &
418     &                       +use_bassin_tropics,1)
419          bassin_midlats=max(use_bassin_atlantic &
420     &                       +use_bassin_medit &
421     &                       +use_bassin_indian &
422     &                       +use_bassin_austral &
423     &                       +use_bassin_pacific &
424     &                       +use_bassin_merarabie &
425     &                       +use_bassin_golfebengale &
426     &                       +use_bassin_indiansud &
427     &                       +use_bassin_tropics &
428     &                       +use_bassin_midlats,1)
429          bassin_hauteslats=max(use_bassin_atlantic &
430     &                       +use_bassin_medit &
431     &                       +use_bassin_indian &
432     &                       +use_bassin_austral &
433     &                       +use_bassin_pacific &
434     &                       +use_bassin_merarabie &
435     &                       +use_bassin_golfebengale &
436     &                       +use_bassin_indiansud &
437     &                       +use_bassin_tropics &
438     &                       +use_bassin_midlats &
439     &                       +use_bassin_hauteslats,1)
440
441          write(*,*) 'bassin_atlantic=' ,bassin_atlantic 
442          write(*,*) 'bassin_medit=' ,bassin_medit
443          write(*,*) 'bassin_indian=' ,bassin_indian
444          write(*,*) 'bassin_austral=' ,bassin_austral
445          write(*,*) 'bassin_merarabie=' ,bassin_merarabie
446          write(*,*) 'bassin_golfebengale=' ,bassin_golfebengale
447          write(*,*) 'bassin_indiansud=' ,bassin_indiansud
448          write(*,*) 'bassin_tropics=' ,bassin_tropics
449          write(*,*) 'bassin_midlats=' ,bassin_midlats
450          write(*,*) 'bassin_hauteslats=' ,bassin_hauteslats
451
452          if (use_bassin_atlantic.eq.1) then
453            strtrac(bassin_atlantic)='atl'
454          endif
455          if (use_bassin_medit.eq.1) then
456            strtrac(bassin_medit)='med'
457          endif
458          if (use_bassin_indian.eq.1) then
459            strtrac(bassin_indian)='ind'
460          endif
461          if (use_bassin_austral.eq.1) then
462            strtrac(bassin_austral)='aus'
463          endif
464          if (use_bassin_pacific.eq.1) then
465            strtrac(bassin_pacific)='pac'
466          endif
467          if (use_bassin_merarabie.eq.1) then
468            strtrac(bassin_merarabie)='ara'
469          endif
470          if (use_bassin_golfebengale.eq.1) then
471            strtrac(bassin_golfebengale)='ben'
472          endif
473          if (use_bassin_indiansud.eq.1) then
474            strtrac(bassin_indiansud)='ins'
475          endif
476          if (use_bassin_tropics.eq.1) then
477            strtrac(bassin_tropics)='tro'
478          endif
479          if (use_bassin_midlats.eq.1) then
480            strtrac(bassin_midlats)='mid'
481          endif
482          if (use_bassin_hauteslats.eq.1) then
483            strtrac(bassin_hauteslats)='hau'
484          endif
485          strtrac(ntraceurs_zone-1)='res'
486          strtrac(ntraceurs_zone)='con'
487
488        else if (option_traceurs.eq.4) then
489          ! on trace les température minimales vécues
490          ! comme dans article sur LdG sauf pas de revap
491           
492          zone_temp1=293.0 ! en K
493!          zone_tempf=223.0 ! en K
494          zone_tempf=243.0 ! en K
495 ! courbure de la relation entre l'indice et la température: 0 pour linéaire, <0 pour plus de détal en bas
496
497        ! zone 1: >= zone_temp1
498        ! zone 2 à 4: intermédiaire,
499        ! zone 5: <zone_tempf
500       
501          ntraceurs_zone_opt=nzone_temp+1
502
503          zone_tempa=-4.0 ! en K
504          izone_cont=ntraceurs_zone
505          izone_oce=ntraceurs_zone 
506          izone_poubelle=ntraceurs_zone
507          izone_init=ntraceurs_zone ! zone d'initialisation par défaut
508          option_revap=0
509          option_tmin=0 
510          izone_revap=0
511          option_cond=0
512          do izone=1,nzone_temp
513            write(strz,'(i2.2)') izone
514            strtrac(izone)='t'//strz
515            write(*,*) 'izone,strz,strtrac=',izone,strz,strtrac(izone)
516          enddo
517          strtrac(izone_poubelle)='pou'
518
519          ! initialisation des zones de tempéarture
520          do izone=1,nzone_temp-1
521            zone_temp(izone)=zone_temp1+float(izone-1) &
522     &                      *(zone_tempa*float(izone-nzone_temp+1) &
523     &                      +(zone_tempf-zone_temp1)/float(nzone_temp-2))
524          enddo
525          write(*,*) 'iso_trac_init 183: zone_temp=',zone_temp         
526
527        elseif (option_traceurs.eq.5) then
528          ! on trace AEJ/flux de mousson/Harmattan
529!          write(*,*) 'iso_traceurs_init 129'
530
531          ntraceurs_zone_opt=4
532          izone_cont=1
533          izone_oce=1
534          izone_poubelle=1 ! zone où on met les flux non physiques, de
535                ! réajustement
536          izone_init=1 ! zone d'initialisation par défaut
537          option_revap=0
538          option_tmin=0
539          izone_revap=0
540          izone_aej=2
541          izone_mousson=3
542          izone_harmattan=4
543          option_cond=0
544
545          strtrac(izone_poubelle)='res'
546          strtrac(izone_aej)='aej'
547          strtrac(izone_mousson)='mou'
548          strtrac(izone_harmattan)='sah'
549
550        elseif (option_traceurs.eq.6) then
551          ! on trace les ddfts
552
553          ntraceurs_zone_opt=2
554          izone_cont=1
555          izone_oce=1
556          izone_poubelle=1 ! zone où on met les flux non physiques, de
557                ! réajustement
558          izone_init=1 ! zone d'initialisation par défaut
559          option_revap=0
560          option_tmin=0
561          izone_revap=0
562          izone_ddft=2
563          option_cond=0
564
565          strtrac(izone_poubelle)='res'
566          strtrac(izone_ddft)='dft'
567
568        elseif (option_traceurs.eq.9) then
569          ! on trace le condensat
570
571          ntraceurs_zone_opt=3
572          izone_cont=1
573          izone_oce=1
574          izone_poubelle=1 ! zone où on met les flux non physiques, de
575                ! réajustement
576          izone_init=1 ! zone d'initialisation par défaut
577          option_revap=1
578          option_tmin=0
579          izone_revap=2
580          izone_cond=3
581          option_cond=1
582
583          ! 1 par défaut pour colorier à la fois condensat LS et
584          ! condensat convectif. Mais on peut mettre 2 si on ne veut que
585          ! collorier que le condensat convectif.
586          call getin('option_cond',option_cond)
587          write(*,*) 'option_cond=',option_cond
588
589          strtrac(izone_poubelle)='res'
590          strtrac(izone_cond)='con'
591          strtrac(izone_revap)='rev'
592
593        elseif (option_traceurs.eq.10) then
594          ! on trace l'évap venant de ocean/continent no frac/continent frac
595          !  utilse seulement si couplé avec ORCHIDEE
596#ifdef CPP_VEGET
597#else
598          write(*,*) 'iso_traceurs_init 219: option_traceurs=10 ', &
599     &                      'inutile si on ne couple pas avec ORCHIDEE'
600          stop
601#endif         
602
603          ntraceurs_zone_opt=3
604          izone_cont=1 ! sous-entendu non fractionnant
605          izone_oce=2
606          izone_poubelle=2 ! zone où on met les flux non physiques, de
607                ! réajustement
608          izone_init=2 ! zone d'initialisation par défaut
609          option_revap=0
610          option_tmin=0
611          izone_revap=0
612          izone_contfrac=3
613          izone_contcanop=3
614          izone_irrig=0
615          option_cond=0
616
617          strtrac(izone_oce)='oce'
618          strtrac(izone_cont)='con' 
619          strtrac(izone_contfrac)='enu'  ! evap sol nu
620
621        elseif (option_traceurs.eq.11) then
622          ! on trace reevap des gouttes et le reste
623
624          ntraceurs_zone_opt=2
625          izone_cont=1
626          izone_oce=1
627          izone_poubelle=1 ! zone où on met les flux non physiques, de
628                ! réajustement
629          izone_init=1 ! zone d'initialisation par défaut
630          option_revap=1
631          option_tmin=0
632          izone_revap=2
633          izone_irrig=0
634          option_cond=0
635
636          strtrac(izone_poubelle)='res'
637          strtrac(izone_revap)='rev'
638
639        elseif (option_traceurs.eq.12) then
640          ! on trace evap du sol nu, evap de la canopée, reste de l'evap cont et
641          ! evap oce
642#ifdef CPP_VEGET
643#else
644          write(*,*) 'iso_traceurs_init 257: option_traceurs=10 ', &
645     &                      'inutile si on ne couple pas avec ORCHIDEE'
646          stop
647#endif           
648
649          ntraceurs_zone_opt=2
650          izone_cont=1
651          izone_oce=2
652          izone_poubelle=2 ! zone où on met les flux non physiques, de
653                ! réajustement
654          izone_init=2 ! zone d'initialisation par défaut
655          option_revap=0
656          option_tmin=0
657          izone_revap=0
658          izone_contfrac=3
659          izone_contcanop=4
660          izone_irrig=0   
661          option_cond=0
662
663          strtrac(izone_oce)='oce'
664          strtrac(izone_cont)='con'
665          strtrac(izone_contfrac)='enu'  ! evap sol nu
666          strtrac(izone_contcanop)='eca'  ! evap canop
667
668       else if (option_traceurs.eq.13) then
669          ! on trace les température minimales vécues + la revap
670          ! comme dans article sur LdG
671           
672        zone_temp1=293.0         ! en K       
673!        parameter (zone_tempf=223.0) ! en K
674        zone_tempf=243.0 ! en K
675        zone_tempa=-4.0 ! courbure de la relation entre l'indice et la température: 0 pour linéaire, <0 pour plus de détal en bas
676
677        ! zone 1: >= zone_temp1
678        ! zone 2 à 4: intermédiaire,
679        ! zone 5: <zone_tempf
680       
681          ntraceurs_zone_opt=nzone_temp+1
682         
683          izone_cont=1
684          izone_oce=1 
685          izone_poubelle=1
686          izone_init=1 ! zone d'initialisation par défaut
687          option_revap=1   
688          option_tmin=0
689          izone_revap=ntraceurs_zone
690          izone_irrig=0
691          option_cond=0
692          do izone=1,nzone_temp
693            write(strz,'(i2.2)') izone
694            strtrac(izone)='t'//strz
695            write(*,*) 'izone,strz,strtrac=',izone,strz,strtrac(izone)
696          enddo
697          strtrac(izone_revap)='rev'
698
699          ! initialisation des zones de tempéarture
700          do izone=1,nzone_temp-1
701            zone_temp(izone)=zone_temp1+float(izone-1) &
702     &                      *(zone_tempa*float(izone-nzone_temp+1) &
703     &                      +(zone_tempf-zone_temp1)/float(nzone_temp-2))
704          enddo
705          write(*,*) 'zone_temp=',zone_temp
706
707       else if (option_traceurs.eq.14) then
708          ! on trace les pres et lat de dernière saturation définies
709          ! comme rh>90%
710           
711        zone_pres1=600.0*100.0 ! en Pa       
712        zone_presf=300.0*100.0 ! en Pa
713        zone_presa=0.0 ! courbure de la relation entre l'indice et la température: 0 pour linéaire, <0 pour plus de détal en bas
714
715        lattag_min=10.0 ! en degrès
716        dlattag=15.0
717
718        ! zone 1: >= zone_pres1
719        ! zone 2 à 4: intermédiaire,
720        ! zone 5: <zone_presf
721       
722         ntraceurs_zone_opt=nzone_pres*nzone_lat+1         
723          izone_cont=ntraceurs_zone
724          izone_oce=ntraceurs_zone
725          izone_poubelle=ntraceurs_zone
726          izone_init=ntraceurs_zone ! zone d'initialisation par défaut
727          option_revap=0 
728          option_tmin=0
729          izone_revap=0
730          izone_irrig=0
731          option_cond=0
732          do izone_pres=1,nzone_pres
733           do izone_lat=1,nzone_lat
734            write(strz_pres,'(i1.1)') izone_pres
735            write(strz_lat,'(i1.1)') izone_lat
736            strz_preslat=strz_pres//strz_lat
737            izone=izone_lat+(izone_pres-1)*nzone_lat
738            strtrac(izone)='t'//strz_preslat
739            write(*,*) 'izone_pres,izone_lat,strtrac=', &
740     &                        izone_pres,izone_lat,izone,strtrac(izone)
741           enddo !do izone_lat=1,nzone_lat
742          enddo !do izone_pres=1,nzone_pres
743          strtrac(ntraceurs_zone)='sfc'
744
745          ! initialisation des zones de tempéarture
746          do izone=1,nzone_pres-1
747            zone_pres(izone)=zone_pres1+float(izone-1) &
748     &                      *(zone_presa*float(izone-nzone_pres+1) &
749     &                      +(zone_presf-zone_pres1)/float(nzone_pres-2))
750          enddo !do izone=1,nzone_pres-1
751          write(*,*) 'traceurs_init 332: zone_pres=',zone_pres
752!          stop
753!
754       elseif (option_traceurs.eq.15) then
755          ! on trace l'irrigation dans ORCHIDEE
756#ifdef CPP_VEGET
757#else
758          write(*,*) 'iso_traceurs_init 257: option_traceurs=15 ', &
759     &                      'inutile si on ne couple pas avec ORCHIDEE'
760          stop
761#endif
762
763          ntraceurs_zone_opt=1
764          izone_cont=1
765          izone_oce=1
766          izone_poubelle=1 ! zone où on met les flux non physiques, de
767                ! réajustement
768          izone_init=1 ! zone d'initialisation par défaut
769          option_revap=0
770          option_tmin=0
771          izone_revap=0
772          izone_contfrac=0
773          izone_contcanop=0
774          izone_irrig=2
775          option_cond=0
776         
777          strtrac(izone_poubelle)='res'
778          strtrac(izone_irrig)='irrig'
779
780          ! dans ce cas particulier, il y a des traceurs dans ORCHIDEE
781          ntracisoOR=ntraciso
782
783        else if ((option_traceurs.eq.17).or. &
784     &           (option_traceurs.eq.18)) then
785          ! on trace les température minimales vécues
786          ! comme dans article sur LdG sauf pas de revap
787           
788        zone_temp1=12.0e-3 ! en kg/kg       
789        zone_tempf=0.2e-3 ! en kg/kg
790        zone_tempa=1.2e-3 ! courbure de la relation entre l'indice et la température: 0 pour linéaire, <0 pour plus de détail en bas
791
792!       parameter (zone_temp1=14.0e-3) ! en kg/kg       
793!       parameter (zone_tempf=0.2e-3) ! en kg/kg
794!       parameter (zone_tempa=0.5e-3)       
795
796!        parameter (zone_temp1=10.0e-3) ! en kg/kg
797!       parameter (zone_tempf=0.5e-3) ! en kg/kg
798!       parameter (zone_tempa=0.5e-3)
799
800        ! zone 1: >= zone_temp1
801        ! zone 2 à 4: intermédiaire,
802        ! zone 5: <zone_tempf
803       
804        ntraceurs_zone_opt=nzone_temp+3
805       
806          izone_cont=nzone_temp+1
807          izone_oce=nzone_temp+1
808          izone_poubelle=nzone_temp+1
809          izone_init=nzone_temp+1 ! zone d'initialisation par défaut
810          option_revap=1 
811          option_tmin=1
812          option_cond=1
813
814          izone_revap=nzone_temp+3
815          izone_cond=nzone_temp+2
816          do izone=1,nzone_temp
817            write(strz,'(i2.2)') izone
818            strtrac(izone)='t'//strz
819            write(*,*) 'izone,strz,strtrac=',izone,strz,strtrac(izone)
820          enddo !do izone=1,nzone_temp
821          strtrac(izone_poubelle)='sfc'
822          strtrac(izone_cond)='con'
823          strtrac(izone_revap)='rev'
824
825          ! initialisation des zones de tempéarture
826          do izone=1,nzone_temp-1
827            zone_temp(izone)=zone_temp1+float(izone-1) &
828     &                      *(zone_tempa*float(izone-nzone_temp+1) &
829     &             +(zone_tempf-zone_temp1)/float(nzone_temp-2))
830          enddo
831         write(*,*) 'zone_temp1,zone_tempf,zone_tempa=', &
832     &              zone_temp1,zone_tempf,zone_tempa
833          write(*,*) 'zone_temp=',zone_temp
834!          stop         
835
836        else if (option_traceurs.eq.19) then
837
838        zone_temp1=12.0e-3 ! en kg/kg       
839        zone_tempf=0.2e-3 ! en kg/kg
840        zone_tempa=1.2e-3 ! courbure de la relation entre l'indice et la température: 0 pour linéaire, <0 pour plus de détail en bas
841
842!       parameter (zone_temp1=14.0e-3) ! en kg/kg       
843!       parameter (zone_tempf=0.2e-3) ! en kg/kg
844!       parameter (zone_tempa=0.5e-3)       
845
846!        parameter (zone_temp1=10.0e-3) ! en kg/kg
847!       parameter (zone_tempf=0.5e-3) ! en kg/kg
848!       parameter (zone_tempa=0.5e-3)
849
850        ! zone 1: >= zone_temp1
851        ! zone 2 à 4: intermédiaire,
852        ! zone 5: <zone_tempf
853       
854        ntraceurs_zone_opt=nzone_temp+4
855       
856          izone_cont=nzone_temp+1
857          izone_oce=nzone_temp+1
858          izone_poubelle=nzone_temp+1
859          if (option_seuil_tag_tmin.eq.1) then
860            izone_init=nzone_temp+1 ! zone d'initialisation par défaut
861          else
862            izone_init=nzone_temp
863          endif
864          option_revap=1   
865          izone_revap=nzone_temp+3
866          izone_cond=nzone_temp+2
867          izone_ddft=nzone_temp+4
868          option_tmin=1         
869          option_cond=1
870          do izone=1,nzone_temp
871            write(strz,'(i2.2)') izone
872            strtrac(izone)='t'//strz
873            write(*,*) 'izone,strz,strtrac=',izone,strz,strtrac(izone)
874          enddo !do izone=1,nzone_temp
875          strtrac(izone_poubelle)='sfc'
876          strtrac(izone_cond)='con'
877          strtrac(izone_revap)='rev'
878          strtrac(izone_ddft)='dft'
879
880        elseif (option_traceurs.eq.20) then
881          ! on vapeur tropical/extractropicale/recyclage extractropical
882          ! pour comprendre controles humidité et isotopes subtropicaux.       
883         
884          lim_tag20=35.0
885          call getin('lim_tag20',lim_tag20)
886          write(*,*) 'lim_tag20=',lim_tag20
887
888          ntraceurs_zone_opt=3
889          izone_cont=1
890          izone_oce=1
891          izone_poubelle=2 ! zone où on met les flux non physiques, de
892                ! réajustement
893          izone_init=2 ! zone d'initialisation par défaut
894          option_revap=0
895          option_tmin=0
896          izone_revap=0
897          izone_trop=2
898          izone_extra=3
899
900          strtrac(izone_trop)='tro' ! vapeur tropicale
901          strtrac(izone_extra)='ext' ! vapeur extractropicale evaporée
902                ! dans les tropiques
903          strtrac(izone_cont)='rec' ! recyclage
904
905        elseif (option_traceurs.eq.21) then
906          ! on trace 2 boites 3D: UT tropicale et extratropiques
907          ! fonctionnement similaire à option 5 pour taggage des zones
908          ! AMMA
909!          write(*,*) 'iso_traceurs_init 129'
910
911          ntraceurs_zone_opt=3
912          izone_cont=1
913          izone_oce=1
914          izone_poubelle=1 ! zone où on met les flux non physiques, de
915                ! réajustement
916          izone_init=1 ! zone d'initialisation par défaut
917          option_revap=0
918          option_tmin=0
919          izone_revap=0
920          izone_trop=2
921          izone_extra=3
922          option_cond=0
923
924          strtrac(izone_poubelle)='res'
925          strtrac(izone_trop)='tro'
926          strtrac(izone_extra)='ext'
927
928        elseif (option_traceurs.eq.22) then
929          ! on trace la vapeur qui a été processée dans zones de
930          ! convections à 3 niveaux: BT, MT et UT
931
932          lim_precip_tag22=20.0
933          call getin('lim_precip_tag22',lim_precip_tag22)
934          write(*,*) 'lim_precip_tag22=',lim_precip_tag22
935
936          ntraceurs_zone_opt=3
937          izone_cont=1
938          izone_oce=1
939          izone_poubelle=1 ! zone où on met les flux non physiques, de
940                ! réajustement
941          izone_init=1 ! zone d'initialisation par défaut
942          option_revap=0
943          option_tmin=0
944          izone_revap=0
945          izone_conv_BT=2
946          izone_conv_UT=3
947          option_cond=0
948
949          strtrac(izone_poubelle)='res'
950          strtrac(izone_conv_BT)='cbt'
951          strtrac(izone_conv_UT)='cut'
952
953        else
954            write(*,*) 'traceurs_init 36: option pas encore prévue'
955            stop
956        endif
957
958       
959          if (ntraceurs_zone_opt.ne.ntraceurs_zone) then
960                write(*,*) 'ntraceurs_zone_opt,ntraceurs_zone=', &
961                        & ntraceurs_zone_opt,ntraceurs_zone
962                call abort_physic ('isotrac_mod','ntraceurs_zone incoherent',1)
963          endif
964
965       
966        ! seuil sur le taux de condensation
967        if (option_tmin.eq.1) then
968          seuil_tag_tmin=0.01
969          call getin('seuil_tag_tmin',seuil_tag_tmin)
970          write(*,*) 'seuil_tag_tmin=',seuil_tag_tmin
971
972          seuil_tag_tmin_ls=seuil_tag_tmin
973          call getin('seuil_tag_tmin_ls',seuil_tag_tmin_ls)
974          write(*,*) 'seuil_tag_tmin_ls=',seuil_tag_tmin_ls
975
976          option_seuil_tag_tmin=1
977          call getin('option_seuil_tag_tmin',option_seuil_tag_tmin)
978          write(*,*) 'option_seuil_tag_tmin=',option_seuil_tag_tmin
979        endif
980
981
982        do ixt=1,niso
983           index_zone(ixt)=0
984           index_iso(ixt)=ixt
985        enddo
986        itrac=niso       
987        do izone=1,ntraceurs_zone
988          do ixt=1,niso
989            itrac=itrac+1
990            index_zone(itrac)=izone
991            index_iso(itrac)=ixt
992            index_trac_loc(izone,ixt)=itrac
993            if (index_trac(izone,ixt).ne.index_trac_loc(izone,ixt)) then
994                write(*,*) 'isotrac 989: izone,ixt,itrac=',izone,ixt,itrac
995                CALL abort_physic ('isotrac','isotrac 989',1)
996            endif
997          enddo
998        enddo
999#ifdef ISOVERIF
1000!        call iso_verif_egalite(float(itrac),float(ntraciso), &
1001!     &           'traceurs_init 50')
1002        if (itrac.ne.ntraciso) then
1003          write(*,*) 'traceurs_init 50'
1004          stop
1005        endif
1006     
1007        write(*,*) 'traceurs_init 65: bilan de l''init:'
1008        write(*,*) 'index_zone=',index_zone(1:ntraciso)
1009        write(*,*) 'index_iso=',index_iso(1:ntraciso)
1010        write(*,*) 'index_trac=',index_trac(1:ntraceurs_zone,1:niso)
1011        do izone=1,ntraceurs_zone
1012          write(*,*) 'strtrac(',izone,')=',strtrac(izone)
1013        enddo !do izone=1,ntraceurs_zone
1014        write(*,*) 'ntracisoOR=',ntracisoOR
1015#endif 
1016
1017        end subroutine iso_traceurs_init
1018
1019
1020END MODULE isotrac_mod
1021#endif
1022#endif
Note: See TracBrowser for help on using the repository browser.