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

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