source: trunk/LMDZ.MARS/libf/phymars/initracer.F @ 2823

Last change on this file since 2823 was 2823, checked in by emillour, 2 years ago

Mars GCM:
Remove the "tracer" (logical) flag as we now always run with at least
one tracer.
EM

File size: 35.5 KB
Line 
1      SUBROUTINE initracer(ngrid,nq,qsurf)
2
3       use tracer_mod
4       use comcstfi_h, only: pi
5       use dust_param_mod, only: doubleq, submicron, dustbin
6       IMPLICIT NONE
7c=======================================================================
8c   subject:
9c   --------
10c   Initialization related to tracer
11c   (transported dust, water, chemical species, ice...)
12c
13c   Name of the tracer
14c
15c   Test of dimension :
16c   Initialize tracer related data in tracer_mod, using tracer names provided
17c   by the dynamics in "infotrac"
18c
19c
20c   author: F.Forget
21c   ------
22c    Modifs: Franck Montmessin, Sebastien Lebonnois (june 2003)
23c            Ehouarn Millour (oct. 2008) identify tracers by their names
24c=======================================================================
25
26
27      include "callkeys.h"
28
29      integer,intent(in) :: ngrid ! number of atmospheric columns
30      integer,intent(in) :: nq ! number of tracers
31      real,intent(out) :: qsurf(ngrid,nq) ! tracer on surface (e.g.  kg.m-2)
32
33      integer iq,ig,count
34      real r0_lift , reff_lift, nueff_lift
35      real r0_storm,reff_storm
36c     Ratio of small over large dust particles (used when both
37c       doubleq and the submicron mode are active); In Montmessin
38c       et al. (2002), a value of 25 has been deduced;
39      real, parameter :: popratio = 25.
40      character(len=30) :: txt ! to store some text
41
42c-----------------------------------------------------------------------
43c  radius(nq)      ! aerosol particle radius (m)
44c  rho_q(nq)       ! tracer densities (kg.m-3)
45c  alpha_lift(nq)  ! saltation vertical flux/horiz flux ratio (m-1)
46c  alpha_devil(nq) ! lifting coeeficient by dust devil
47c  rho_dust          ! Mars dust density
48c  rho_ice           ! Water ice density
49c  doubleq           ! if method with mass (iq=1) and number(iq=2) mixing ratio
50c  varian            ! Characteristic variance of log-normal distribution
51c-----------------------------------------------------------------------
52
53! Sanity check: check that we are running with at least 1 tracer:
54      if (nq<1) then
55        write(*,*) "initracer error, nq=",nq," must be >=1!"
56        call abort_physic("initracer","nq<1",1)
57      endif
58c------------------------------------------------------------
59c         NAME and molar mass of the tracer
60c------------------------------------------------------------
61   
62! Identify tracers by their names: (and set corresponding values of mmol)
63      ! 0. initialize tracer indexes to zero:
64      igcm_dustbin(1:nq)=0
65      igcm_co2_ice=0
66      igcm_ccnco2_mass=0
67      igcm_ccnco2_number=0
68      igcm_ccnco2_meteor_mass=0
69      igcm_ccnco2_meteor_number=0
70      igcm_ccnco2_h2o_mass_ice=0
71      igcm_ccnco2_h2o_mass_ccn=0
72      igcm_ccnco2_h2o_number=0
73      igcm_dust_mass=0
74      igcm_dust_number=0
75      igcm_ccn_mass=0
76      igcm_ccn_number=0
77      igcm_dust_submicron=0
78      igcm_h2o_vap=0
79      igcm_h2o_ice=0
80      igcm_hdo_vap=0
81      igcm_hdo_ice=0
82      igcm_stormdust_mass=0
83      igcm_stormdust_number=0
84      igcm_topdust_mass=0
85      igcm_topdust_number=0
86      igcm_co2=0
87      igcm_co=0
88      igcm_o=0
89      igcm_o1d=0
90      igcm_o2=0
91      igcm_o3=0
92      igcm_h=0
93      igcm_d=0
94      igcm_hd=0
95      igcm_h2=0
96      igcm_od=0
97      igcm_do2=0
98      igcm_hdo2=0
99      igcm_oh=0
100      igcm_ho2=0
101      igcm_h2o2=0
102      igcm_ch4=0
103      igcm_n2=0
104      igcm_ar=0
105      igcm_ar_n2=0
106      igcm_n=0
107      igcm_no=0
108      igcm_no2=0
109      igcm_n2d=0
110      igcm_he=0
111      igcm_co2plus=0
112      igcm_oplus=0
113      igcm_o2plus=0
114      igcm_coplus=0
115      igcm_cplus=0
116      igcm_nplus=0
117      igcm_noplus=0
118      igcm_n2plus=0
119      igcm_hplus=0
120      igcm_hco2plus=0
121      igcm_hcoplus=0
122      igcm_h2oplus=0
123      igcm_h3oplus=0
124      igcm_ohplus=0
125      igcm_elec=0
126     
127      ! 1. find dust tracers
128      count=0
129      if (dustbin.gt.0) then
130        do iq=1,nq
131          txt=" "
132          write(txt,'(a4,i2.2)')'dust',count+1
133          if (noms(iq).eq.txt) then
134            count=count+1
135            igcm_dustbin(count)=iq
136            mmol(iq)=100.
137          endif
138        enddo !do iq=1,nq
139      endif ! of if (dustbin.gt.0)
140      if (doubleq) then
141        do iq=1,nq
142          if (noms(iq).eq."dust_mass") then
143            igcm_dust_mass=iq
144            count=count+1
145          endif
146          if (noms(iq).eq."dust_number") then
147            igcm_dust_number=iq
148            count=count+1
149          endif
150        enddo
151      endif ! of if (doubleq)
152      if (microphys) then
153        do iq=1,nq
154          if (noms(iq).eq."ccn_mass") then
155            igcm_ccn_mass=iq
156            count=count+1
157          endif
158          if (noms(iq).eq."ccn_number") then
159            igcm_ccn_number=iq
160            count=count+1
161          endif
162        enddo
163      endif ! of if (microphys)
164      if (submicron) then
165        do iq=1,nq
166          if (noms(iq).eq."dust_submicron") then
167            igcm_dust_submicron=iq
168            mmol(iq)=100.
169            count=count+1
170          endif
171        enddo
172      endif ! of if (submicron)
173       if (rdstorm) then
174        do iq=1,nq
175          if (noms(iq).eq."stormdust_mass") then
176            igcm_stormdust_mass=iq
177            count=count+1
178          endif
179          if (noms(iq).eq."stormdust_number") then
180            igcm_stormdust_number=iq
181            count=count+1
182          endif
183        enddo
184      endif ! of if (rdstorm)
185       if (topflows) then
186        do iq=1,nq
187          if (noms(iq).eq."topdust_mass") then
188            igcm_topdust_mass=iq
189            count=count+1
190          endif
191          if (noms(iq).eq."topdust_number") then
192            igcm_topdust_number=iq
193            count=count+1
194          endif
195        enddo
196      endif ! of if (topflows)   
197      ! 2. find chemistry and water tracers
198      do iq=1,nq
199        if (noms(iq).eq."co2") then
200          igcm_co2=iq
201          mmol(igcm_co2)=44.
202          count=count+1
203        endif
204        if (noms(iq).eq."co") then
205          igcm_co=iq
206          mmol(igcm_co)=28.
207          count=count+1
208        endif
209        if (noms(iq).eq."o") then
210          igcm_o=iq
211          mmol(igcm_o)=16.
212          count=count+1
213        endif
214        if (noms(iq).eq."o1d") then
215          igcm_o1d=iq
216          mmol(igcm_o1d)=16.
217          count=count+1
218        endif
219        if (noms(iq).eq."o2") then
220          igcm_o2=iq
221          mmol(igcm_o2)=32.
222          count=count+1
223        endif
224        if (noms(iq).eq."o3") then
225          igcm_o3=iq
226          mmol(igcm_o3)=48.
227          count=count+1
228        endif
229        if (noms(iq).eq."h") then
230          igcm_h=iq
231          mmol(igcm_h)=1.
232          count=count+1
233        endif
234        if (noms(iq).eq."h2") then
235          igcm_h2=iq
236          mmol(igcm_h2)=2.
237          count=count+1
238        endif
239        if (noms(iq).eq."oh") then
240          igcm_oh=iq
241          mmol(igcm_oh)=17.
242          count=count+1
243        endif
244        if (noms(iq).eq."ho2") then
245          igcm_ho2=iq
246          mmol(igcm_ho2)=33.
247          count=count+1
248        endif
249        if (noms(iq).eq."h2o2") then
250          igcm_h2o2=iq
251          mmol(igcm_h2o2)=34.
252          count=count+1
253        endif
254        if (noms(iq).eq."n2") then
255          igcm_n2=iq
256          mmol(igcm_n2)=28.
257          count=count+1
258        endif
259        if (noms(iq).eq."ch4") then
260          igcm_ch4=iq
261          mmol(igcm_ch4)=16.
262          count=count+1
263        endif
264        if (noms(iq).eq."ar") then
265          igcm_ar=iq
266          mmol(igcm_ar)=40.
267          count=count+1
268        endif
269        if (noms(iq).eq."n") then
270          igcm_n=iq
271          mmol(igcm_n)=14.
272          count=count+1
273        endif
274        if (noms(iq).eq."no") then
275          igcm_no=iq
276          mmol(igcm_no)=30.
277          count=count+1
278        endif
279        if (noms(iq).eq."no2") then
280          igcm_no2=iq
281          mmol(igcm_no2)=46.
282          count=count+1
283        endif
284        if (noms(iq).eq."n2d") then
285          igcm_n2d=iq
286          mmol(igcm_n2d)=28.
287          count=count+1
288        endif
289        if (noms(iq).eq."he") then
290          igcm_he=iq
291          mmol(igcm_he)=4.
292          count=count+1
293        endif
294        if (noms(iq).eq."co2plus") then
295          igcm_co2plus=iq
296          mmol(igcm_co2plus)=44.
297          count=count+1
298        endif
299        if (noms(iq).eq."oplus") then
300          igcm_oplus=iq
301          mmol(igcm_oplus)=16.
302          count=count+1
303        endif
304        if (noms(iq).eq."o2plus") then
305          igcm_o2plus=iq
306          mmol(igcm_o2plus)=32.
307          count=count+1
308        endif
309        if (noms(iq).eq."coplus") then
310          igcm_coplus=iq
311          mmol(igcm_coplus)=28.
312          count=count+1
313        endif
314        if (noms(iq).eq."cplus") then
315          igcm_cplus=iq
316          mmol(igcm_cplus)=12.
317          count=count+1
318        endif
319        if (noms(iq).eq."nplus") then
320          igcm_nplus=iq
321          mmol(igcm_nplus)=14.
322          count=count+1
323        endif
324        if (noms(iq).eq."noplus") then
325          igcm_noplus=iq
326          mmol(igcm_noplus)=30.
327          count=count+1
328        endif
329        if (noms(iq).eq."n2plus") then
330          igcm_n2plus=iq
331          mmol(igcm_n2plus)=28.
332          count=count+1
333        endif
334        if (noms(iq).eq."hplus") then
335          igcm_hplus=iq
336          mmol(igcm_hplus)=1.
337          count=count+1
338        endif
339        if (noms(iq).eq."hco2plus") then
340          igcm_hco2plus=iq
341          mmol(igcm_hco2plus)=45.
342          count=count+1
343        endif
344        if (noms(iq).eq."hcoplus") then
345          igcm_hcoplus=iq
346          mmol(igcm_hcoplus)=29.
347          count=count+1
348        endif
349        if (noms(iq).eq."h2oplus") then
350          igcm_h2oplus=iq
351          mmol(igcm_h2oplus)=18.
352          count=count+1
353        endif
354        if (noms(iq).eq."h3oplus") then
355          igcm_h3oplus=iq
356          mmol(igcm_h3oplus)=19.
357          count=count+1
358        endif
359        if (noms(iq).eq."ohplus") then
360          igcm_ohplus=iq
361          mmol(igcm_ohplus)=17.
362          count=count+1
363        endif
364        if (noms(iq).eq."elec") then
365          igcm_elec=iq
366          mmol(igcm_elec)=1./1822.89
367          count=count+1
368        endif
369        if (noms(iq).eq."h2o_vap") then
370          igcm_h2o_vap=iq
371          mmol(igcm_h2o_vap)=18.
372          count=count+1
373        endif
374        if (noms(iq).eq."hdo_vap") then
375          igcm_hdo_vap=iq
376          mmol(igcm_hdo_vap)=19.
377          count=count+1
378        endif
379        if (noms(iq).eq."od") then
380          igcm_od=iq
381          mmol(igcm_od)=18.
382          count=count+1
383        endif
384        if (noms(iq).eq."d") then
385           igcm_d=iq
386           mmol(igcm_d)=2.
387           count=count+1
388        endif
389        if (noms(iq).eq."hd") then
390           igcm_hd=iq
391           mmol(igcm_hd)=3.
392           count=count+1
393        endif
394        if (noms(iq).eq."do2") then
395           igcm_do2=iq
396           mmol(igcm_do2)=34.
397           count=count+1
398        endif
399        if (noms(iq).eq."hdo2") then
400           igcm_hdo2=iq
401           mmol(igcm_hdo2)=35.
402           count=count+1
403        endif
404        if (noms(iq).eq."co2_ice") then
405          igcm_co2_ice=iq
406          mmol(igcm_co2_ice)=44.
407          count=count+1
408        endif
409        if (noms(iq).eq."h2o_ice") then
410          igcm_h2o_ice=iq
411          mmol(igcm_h2o_ice)=18.
412          count=count+1
413        endif
414        if (noms(iq).eq."hdo_ice") then
415          igcm_hdo_ice=iq
416          mmol(igcm_hdo_ice)=19.
417          count=count+1
418        endif
419        ! Other stuff: e.g. for simulations using co2 + neutral gaz
420        if (noms(iq).eq."Ar_N2") then
421          igcm_ar_n2=iq
422          mmol(igcm_ar_n2)=30.
423          count=count+1
424        endif
425        if (co2clouds) then
426           if (noms(iq).eq."ccnco2_mass") then
427              igcm_ccnco2_mass=iq
428              count=count+1
429           endif
430           if (noms(iq).eq."ccnco2_number") then
431              igcm_ccnco2_number=iq
432              count=count+1
433           endif
434           if (meteo_flux) then
435             if (noms(iq).eq."ccnco2_meteor_mass") then
436                igcm_ccnco2_meteor_mass=iq
437                count=count+1
438             endif
439             if (noms(iq).eq."ccnco2_meteor_number") then
440                igcm_ccnco2_meteor_number=iq
441                count=count+1
442             endif
443           end if
444           if (co2useh2o) then
445           if (noms(iq).eq."ccnco2_h2o_number") then
446              igcm_ccnco2_h2o_number=iq
447              count=count+1
448           endif
449           if (noms(iq).eq."ccnco2_h2o_mass_ice") then
450              igcm_ccnco2_h2o_mass_ice=iq
451              count=count+1
452           endif
453           if (noms(iq).eq."ccnco2_h2o_mass_ccn") then
454              igcm_ccnco2_h2o_mass_ccn=iq
455              count=count+1
456           endif
457           end if
458        endif
459      enddo                     ! of do iq=1,nq
460     
461      ! check that we identified all tracers:
462      if (count.ne.nq) then
463        write(*,*) "initracer: found only ",count," tracers"
464        write(*,*) "               expected ",nq
465        do iq=1,count
466          write(*,*)'      ',iq,' ',trim(noms(iq))
467        enddo
468        call abort_physic("initracer","tracer mismatch",1)
469      else
470        write(*,*) "initracer: found all expected tracers, namely:"
471        do iq=1,nq
472          write(*,*)'      ',iq,' ',trim(noms(iq))
473        enddo
474      endif
475
476      ! if water cycle but iceparty=.false., there will nevertheless be
477      ! water ice at the surface (iceparty is not used anymore, but this
478      ! part is still relevant, as we want to stay compatible with the
479      ! older versions).
480      if (water.and.(igcm_h2o_ice.eq.0)) then
481        igcm_h2o_ice=igcm_h2o_vap ! so that qsurf(i_h2o_ice) is identified
482                                  ! even though there is no q(i_h2o_ice)
483      else
484       ! surface ice qsurf(i_h2o_ice) was loaded twice by phyetat0,
485       ! as qsurf(i_h2o_vap) & as qsurf(i_h2o_ice), so to be clean:
486       if (igcm_h2o_vap.ne.0) then
487         qsurf(1:ngrid,igcm_h2o_vap)=0
488       endif
489      endif
490
491      ! Additional test required for HDO
492      ! We need to compute some things for H2O before HDO
493      if (hdo) then
494        if (igcm_h2o_vap.gt.igcm_hdo_vap) then
495           call abort_physic("initracer",
496     &          "Tracer H2O must be initialized before HDO",1)
497        else if ((nqfils(igcm_h2o_ice).lt.1)
498     &             .or. (nqfils(igcm_h2o_vap).lt.1)) then
499           write(*,*) "HDO must be transported as a son",
500     &                " of H2O: complete traceur.def"
501           call abort_physic("initracer","adapt your tracer.def",1)
502        else if ((igcm_hdo_ice.lt.nq-2)
503     &             .or. (igcm_hdo_vap.lt.nq-2)) then
504           write(*,*) "The isotopes (HDO) must be placed at",
505     &                " the end of the list in traceur.def"
506           call abort_physic("initracer","adapt your tracer.def",1)
507        endif
508      endif
509
510c------------------------------------------------------------
511c     Initialize tracers .... (in tracer_mod)
512c------------------------------------------------------------
513      ! start by setting everything to (default) zero
514      rho_q(1:nq)=0     ! tracer density (kg.m-3)
515      radius(1:nq)=0.   ! tracer particle radius (m)
516      alpha_lift(1:nq) =0.  ! tracer saltation vertical flux/horiz flux ratio (m-1)
517      alpha_devil(1:nq)=0.  ! tracer lifting coefficient by dust devils
518
519
520      ! some reference values
521      rho_dust=2500.  ! Mars dust density (kg.m-3)
522      rho_ice=920.    ! Water ice density (kg.m-3)
523      rho_ice_co2=1650.
524
525      if (doubleq) then
526c       "doubleq" technique
527c       -------------------
528c      (transport of mass and number mixing ratio)
529c       iq=1: Q mass mixing ratio, iq=2: N number mixing ratio
530
531        if( (nq.lt.2).or.(water.and.(nq.lt.4))
532     *       .or.(hdo.and.(nq.lt.6) )) then
533          write(*,*)'initracer: nq is too low : nq=', nq
534          write(*,*)'water= ',water,' doubleq= ',doubleq   
535        end if
536
537        nueff_lift = 0.5
538        varian=sqrt(log(1.+nueff_lift))
539
540        rho_q(igcm_dust_mass)=rho_dust
541        rho_q(igcm_dust_number)=rho_dust
542
543c       Intermediate calcul for computing geometric mean radius r0
544c       as a function of mass and number mixing ratio Q and N
545c       (r0 = (r3n_q * Q/ N)^(1/3))
546        r3n_q = exp(-4.5*varian**2)*(3./4.)/(pi*rho_dust)
547
548c       Intermediate calcul for computing effective radius reff
549c       from geometric mean radius r0
550c       (reff = ref_r0 * r0)
551        ref_r0 = exp(2.5*varian**2)
552       
553c       lifted dust :
554c       '''''''''''
555        reff_lift = 3.0e-6 !3.e-6 !Effective radius of lifted dust (m)
556        alpha_devil(igcm_dust_mass)=9.e-9   !  dust devil lift mass coeff
557c       alpha_lift(igcm_dust_mass)=3.0e-15  !  Lifted mass coeff
558
559!! default lifting settings
560!! -- GCM: alpha_lift not zero because large-scale lifting by default
561!! -- MESOSCALE: alpha_lift zero because no lifting at all in mesoscale by default
562#ifdef MESOSCALE
563        alpha_lift(igcm_dust_mass)=0.0
564#else
565        alpha_lift(igcm_dust_mass)=1.e-6 !1.e-6 !Lifted mass coeff
566        IF (dustinjection.ge.1) THEN
567                reff_lift = 3.0e-6 ! Effective radius of lifted dust (m)
568                alpha_lift(igcm_dust_mass)=(4/3.)*reff_lift*rho_dust
569     &                                          /2.4
570        ENDIF
571#endif
572
573        r0_lift = reff_lift/ref_r0
574        alpha_devil(igcm_dust_number)=r3n_q*
575     &                        alpha_devil(igcm_dust_mass)/r0_lift**3
576        alpha_lift(igcm_dust_number)=r3n_q*
577     &                        alpha_lift(igcm_dust_mass)/r0_lift**3
578
579        radius(igcm_dust_mass) = reff_lift
580        radius(igcm_dust_number) = reff_lift
581
582        write(*,*) "initracer: doubleq_param reff_lift:", reff_lift
583        write(*,*) "initracer: doubleq_param nueff_lift:", nueff_lift
584        write(*,*) "initracer: doubleq_param alpha_lift:",
585     &    alpha_lift(igcm_dust_mass)
586!c ----------------------------------------------------------------------
587!c rocket dust storm scheme
588!c lifting tracer stormdust using same distribution than
589!c normal dust
590        if (rdstorm) then
591          reff_storm=3.e-6 ! reff_lift !3.e-6
592          r0_storm=reff_storm/ref_r0
593          rho_q(igcm_stormdust_mass)=rho_dust
594          rho_q(igcm_stormdust_number)=rho_dust
595
596          alpha_devil(igcm_stormdust_mass)=9.e-9   ! dust devil lift mass coeff
597          alpha_lift(igcm_stormdust_mass)=4./3./2.4*reff_storm*rho_dust
598
599          write(*,*) 'alpha_lift(rds):',alpha_lift(igcm_stormdust_mass)
600 
601          alpha_devil(igcm_stormdust_number)=r3n_q*
602     &                      alpha_devil(igcm_stormdust_mass)/r0_storm**3
603          alpha_lift(igcm_stormdust_number)=r3n_q*
604     &                       alpha_lift(igcm_stormdust_mass)/r0_storm**3
605 
606          radius(igcm_stormdust_mass) = reff_storm
607          radius(igcm_stormdust_number) = reff_storm
608        end if !(rdstorm)
609!c ----------------------------------------------------------------------
610!c mountain top dust flows scheme
611!c you need a radius value for topdust to active its sedimentation
612!c we take the same value as for the normal dust
613        if (topflows) then
614          rho_q(igcm_topdust_mass)=rho_dust
615          rho_q(igcm_topdust_number)=rho_dust
616          radius(igcm_topdust_mass) = 3.e-6
617          radius(igcm_topdust_number) = 3.e-6
618        end if !(topflows)
619!c ----------------------------------------------------------------------
620     
621      else
622
623       ! initialize varian, which may be used (e.g. by surfacearea)
624       ! even with conrath dust
625       nueff_lift = 0.5
626       varian=sqrt(log(1.+nueff_lift))
627
628       if (dustbin.gt.1) then
629        print*,'initracer: STOP!',
630     $   ' properties of dust need to be set in initracer !!!'
631        call abort_physic("initracer","dustbin properties issue",1)
632
633       else if (dustbin.eq.1) then
634
635c       This will be used for 1 dust particle size:
636c       ------------------------------------------
637        radius(igcm_dustbin(1))=3.e-6
638        alpha_lift(igcm_dustbin(1))=0.0e-6
639        alpha_devil(igcm_dustbin(1))=7.65e-9
640        rho_q(igcm_dustbin(1))=rho_dust
641
642       endif
643      end if    ! (doubleq)
644
645
646c     Scavenging of dust particles by H2O clouds:
647c     ------------------------------------------
648c     Initialize the two tracers used for the CCNs
649      if (water.AND.doubleq.AND.scavenging) then
650        radius(igcm_ccn_mass) = radius(igcm_dust_mass)
651        alpha_lift(igcm_ccn_mass) = 1e-30
652        alpha_devil(igcm_ccn_mass) = 1e-30
653        rho_q(igcm_ccn_mass) = rho_dust
654
655        radius(igcm_ccn_number) = radius(igcm_ccn_mass)
656        alpha_lift(igcm_ccn_number) = alpha_lift(igcm_ccn_mass)
657        alpha_devil(igcm_ccn_number) = alpha_devil(igcm_ccn_mass)
658        rho_q(igcm_ccn_number) = rho_q(igcm_ccn_mass)
659      endif ! of if (water.AND.doubleq.AND.scavenging)
660
661c     Submicron dust mode:
662c     --------------------
663
664      if (submicron) then
665        radius(igcm_dust_submicron)=0.1e-6
666        rho_q(igcm_dust_submicron)=rho_dust
667        if (doubleq) then
668c         If doubleq is also active, we use the population ratio:
669          alpha_lift(igcm_dust_submicron) =
670     &      alpha_lift(igcm_dust_number)*popratio*
671     &      rho_q(igcm_dust_submicron)*4./3.*pi*
672     &      radius(igcm_dust_submicron)**3.
673          alpha_devil(igcm_dust_submicron)=1.e-30
674        else
675          alpha_lift(igcm_dust_submicron)=1e-6
676          alpha_devil(igcm_dust_submicron)=1.e-30
677        endif ! (doubleq)
678      end if  ! (submicron)
679
680c     Initialization for water vapor
681c     ------------------------------
682      if(water) then
683         radius(igcm_h2o_vap)=0.
684         alpha_lift(igcm_h2o_vap) =0.
685         alpha_devil(igcm_h2o_vap)=0.
686         if(water.and.(nq.ge.2)) then
687           radius(igcm_h2o_ice)=3.e-6
688           rho_q(igcm_h2o_ice)=rho_ice
689           alpha_lift(igcm_h2o_ice) =0.
690           alpha_devil(igcm_h2o_ice)=0.
691         elseif(water.and.(nq.lt.2)) then
692            write(*,*) 'nq is too low : nq=', nq
693            write(*,*) 'water= ',water
694         endif
695
696      end if  ! (water)
697
698c     Initialization for hdo vapor
699c     ------------------------------
700      if (hdo) then
701         radius(igcm_hdo_vap)=0.
702         alpha_lift(igcm_hdo_vap) =0.
703         alpha_devil(igcm_hdo_vap)=0.
704         if(water.and.(nq.ge.2)) then
705           radius(igcm_hdo_ice)=3.e-6
706           rho_q(igcm_hdo_ice)=rho_ice
707           alpha_lift(igcm_hdo_ice) =0.
708           alpha_devil(igcm_hdo_ice)=0.
709         elseif(hdo.and.(nq.lt.6)) then
710            write(*,*) 'nq is too low : nq=', nq
711            write(*,*) 'hdo= ',hdo
712         endif
713
714      end if  ! (hdo)
715
716     
717
718c     Output for records:
719c     ~~~~~~~~~~~~~~~~~~
720      write(*,*)
721      Write(*,*) '******** initracer : dust transport parameters :'
722      write(*,*) 'alpha_lift = ', alpha_lift
723      write(*,*) 'alpha_devil = ', alpha_devil
724      write(*,*) 'radius  = ', radius
725      if(doubleq) then
726        write(*,*) 'reff_lift (um) =  ', reff_lift
727        write(*,*) 'size distribution variance  = ', varian
728        write(*,*) 'r3n_q , ref_r0 : ', r3n_q , ref_r0
729      end if
730
731!
732!     some extra (possibly redundant) sanity checks for tracers:
733!     ---------------------------------------------------------
734
735       if (doubleq) then
736       ! verify that we indeed have dust_mass and dust_number tracers
737         if (igcm_dust_mass.eq.0) then
738           write(*,*) "initracer: error !!"
739           write(*,*) "  cannot use doubleq option without ",
740     &                "a dust_mass tracer !"
741           call abort_physic("initracer","doubleq issue",1)
742         endif
743         if (igcm_dust_number.eq.0) then
744           write(*,*) "initracer: error !!"
745           write(*,*) "  cannot use doubleq option without ",
746     &                "a dust_number tracer !"
747           call abort_physic("initracer","doubleq issue",1)
748         endif
749       endif
750
751       if ((.not.doubleq).and.(dustbin.gt.0)) then
752       ! verify that we indeed have 'dustbin' dust tracers
753         count=0
754         do iq=1,dustbin
755           if (igcm_dustbin(iq).ne.0) then
756             count=count+1
757           endif
758         enddo
759         if (count.ne.dustbin) then
760           write(*,*) "initracer: error !!"
761           write(*,*) "  dustbin is set to ",dustbin,
762     &                " but we only have the following dust tracers:"
763           do iq=1,count
764             write(*,*)"   ",trim(noms(igcm_dustbin(iq)))
765           enddo
766           call abort_physic("initracer","dustbin issue",1)
767         endif
768       endif
769
770       if (water) then
771       ! verify that we indeed have h2o_vap and h2o_ice tracers
772         if (igcm_h2o_vap.eq.0) then
773           write(*,*) "initracer: error !!"
774           write(*,*) "  cannot use water option without ",
775     &                "an h2o_vap tracer !"
776           call abort_physic("initracer","water cycle issue",1)
777         endif
778         if (igcm_h2o_ice.eq.0) then
779           write(*,*) "initracer: error !!"
780           write(*,*) "  cannot use water option without ",
781     &                "an h2o_ice tracer !"
782           call abort_physic("initracer","water cycle issue",1)
783         endif
784       endif
785
786       if (hdo) then
787       ! verify that we indeed have hdo_vap and hdo_ice tracers
788         if (igcm_hdo_vap.eq.0) then
789           write(*,*) "initracer: error !!"
790           write(*,*) "  cannot use hdo option without ",
791     &                "an hdo_vap tracer !"
792           call abort_physic("initracer","hdo cycle issue",1)
793         endif
794         if (igcm_hdo_ice.eq.0) then
795           write(*,*) "initracer: error !!"
796           write(*,*) "  cannot use hdo option without ",
797     &                "an hdo_ice tracer !"
798           call abort_physic("initracer","hdo cycle issue",1)
799         endif
800       endif
801
802
803       if (co2clouds) then
804          !verify that we have co2_ice and co2 tracers
805          if (igcm_co2 .eq. 0) then
806             write(*,*) "initracer: error !!"
807             write(*,*) "  cannot use co2 clouds option without ",
808     &            "a co2 tracer !"
809             call abort_physic("initracer","co2 clouds issue",1)
810          end if
811          if (igcm_co2_ice .eq. 0) then
812             write(*,*) "initracer: error !!"
813             write(*,*) "  cannot use co2 clouds option without ",
814     &            "a co2_ice tracer !"
815             call abort_physic("initracer","co2 clouds issue",1)
816          end if
817          if (igcm_ccnco2_number .eq. 0) then
818             write(*,*) "initracer: error !!"
819             write(*,*) "  cannot use co2 clouds option without ",
820     &            "a ccnco2_number tracer !"
821             call abort_physic("initracer","co2 clouds issue",1)
822          end if
823          if (igcm_ccnco2_mass .eq. 0) then
824             write(*,*) "initracer: error !!"
825             write(*,*) "  cannot use co2 clouds option without ",
826     &            "a ccnco2_mass tracer !"
827             call abort_physic("initracer","co2 clouds issue",1)
828          end if
829          if (co2useh2o) then
830            if (igcm_ccnco2_h2o_number .eq. 0) then
831               write(*,*) "initracer: error !!"
832               write(*,*) "  cannot use co2 clouds option without ",
833     &              "a ccnco2_h2o_number tracer !"
834               call abort_physic("initracer","co2 clouds issue",1)
835            end if
836            if (igcm_ccnco2_h2o_mass_ice .eq. 0) then
837               write(*,*) "initracer: error !!"
838               write(*,*) "  cannot use co2 clouds option without ",
839     &              "a ccnco2_h2o_mass_ice tracer !"
840               call abort_physic("initracer","co2 clouds issue",1)
841            end if
842            if (igcm_ccnco2_h2o_mass_ccn .eq. 0) then
843               write(*,*) "initracer: error !!"
844               write(*,*) "  cannot use co2 clouds option without ",
845     &              "a ccnco2_h2o_mass_ccn tracer !"
846               call abort_physic("initracer","co2 clouds issue",1)
847            end if
848          end if
849          if (meteo_flux) then
850            if (igcm_ccnco2_meteor_number .eq. 0) then
851               write(*,*) "initracer: error !!"
852               write(*,*) "  cannot use co2 clouds option without ",
853     &              "a ccnco2_meteor_number tracer !"
854               call abort_physic("initracer","co2 clouds issue",1)
855            end if
856            if (igcm_ccnco2_meteor_mass .eq. 0) then
857               write(*,*) "initracer: error !!"
858               write(*,*) "  cannot use co2 clouds option without ",
859     &              "a ccnco2_h2o_mass_ice tracer !"
860               call abort_physic("initracer","co2 clouds issue",1)
861            end if
862            if (igcm_ccnco2_meteor_mass .eq. 0) then
863               write(*,*) "initracer: error !!"
864               write(*,*) "  cannot use co2 clouds option without ",
865     &              "a ccnco2_meteor_mass tracer !"
866               call abort_physic("initracer","co2 clouds issue",1)
867            end if
868          end if
869       endif
870 
871       if (rdstorm) then
872       ! verify that we indeed have stormdust_mass and stormdust_number tracers
873         if (igcm_stormdust_mass.eq.0) then
874           write(*,*) "initracer: error !!"
875           write(*,*) "  cannot use rdstorm option without ",
876     &                "a stormdust_mass tracer !"
877           call abort_physic("initracer","rdstorm issue",1)
878         endif
879         if (igcm_stormdust_number.eq.0) then
880           write(*,*) "initracer: error !!"
881           write(*,*) "  cannot use rdstorm option without ",
882     &                "a stormdust_number tracer !"
883           call abort_physic("initracer","rdstorm issue",1)
884         endif
885       endif
886
887       if (topflows) then
888       ! verify that we indeed have topdust_mass and topdust_number tracers
889         if (igcm_topdust_mass.eq.0) then
890           write(*,*) "initracer: error !!"
891           write(*,*) "  cannot use topflows option without ",
892     &                "a topdust_mass tracer !"
893           call abort_physic("initracer","topflows issue",1)
894         endif
895         if (igcm_topdust_number.eq.0) then
896           write(*,*) "initracer: error !!"
897           write(*,*) "  cannot use topflows option without ",
898     &                "a topdust_number tracer !"
899           call abort_physic("initracer","topflows issue",1)
900         endif
901       endif
902     
903       if (callnlte) then ! NLTE requirements
904         if (nltemodel.ge.1) then
905           ! check that co2, co, o and n2 tracers are available
906           if (igcm_co2.eq.0) then
907             write(*,*) "initracer: error !!"
908             write(*,*) "  with nltemodel>0, we need the co2 tracer!"
909             call abort_physic("initracer","missing co2 tracer",1)
910           endif
911           if (igcm_co.eq.0) then
912             write(*,*) "initracer: error !!"
913             write(*,*) "  with nltemodel>0, we need the co tracer!"
914             call abort_physic("initracer","missing co tracer",1)
915           endif
916           if (igcm_o.eq.0) then
917             write(*,*) "initracer: error !!"
918             write(*,*) "  with nltemodel>0, we need the o tracer!"
919             call abort_physic("initracer","missing o tracer",1)
920           endif
921           if (igcm_n2.eq.0) then
922             write(*,*) "initracer: error !!"
923             write(*,*) "  with nltemodel>0, we need the n2 tracer!"
924             call abort_physic("initracer","missing n2 tracer",1)
925           endif
926         endif
927       endif
928
929       if (scavenging) then
930       ! verify that we indeed have ccn_mass and ccn_number tracers
931         if (igcm_ccn_mass.eq.0 .and. igcm_ccnco2_mass.eq.0) then
932           write(*,*) "initracer: error !!"
933           write(*,*) "  cannot use scavenging option without ",
934     &                "a ccn_mass or ccnco2_mass tracer !"
935             call abort_physic("initracer","scavenging issue",1)
936         endif
937         if (igcm_ccn_number.eq.0 .and. igcm_ccnco2_number.eq.0 ) then
938           write(*,*) "initracer: error !!"
939           write(*,*) "  cannot use scavenging option without ",
940     &                "a ccn_number or ccnco2_number tracer !"
941             call abort_physic("initracer","scavenging issue",1)
942         endif
943       endif ! of if (scavenging)
944
945       if (photochem .or. callthermos) then
946       ! verify that we indeed have the chemistry tracers
947         if (igcm_co2.eq.0) then
948           write(*,*) "initracer: error !!"
949           write(*,*) "  cannot use chemistry option without ",
950     &                "a co2 tracer !"
951           call abort_physic("initracer","missing co2 tracer",1)
952         endif
953         if (igcm_co.eq.0) then
954           write(*,*) "initracer: error !!"
955           write(*,*) "  cannot use chemistry option without ",
956     &                "a co tracer !"
957           call abort_physic("initracer","missing co tracer",1)
958         endif
959         if (igcm_o.eq.0) then
960           write(*,*) "initracer: error !!"
961           write(*,*) "  cannot use chemistry option without ",
962     &                "a o tracer !"
963           call abort_physic("initracer","missing o tracer",1)
964         endif
965         if (igcm_o1d.eq.0) then
966           write(*,*) "initracer: error !!"
967           write(*,*) "  cannot use chemistry option without ",
968     &                "a o1d tracer !"
969           call abort_physic("initracer","missing o1d tracer",1)
970         endif
971         if (igcm_o2.eq.0) then
972           write(*,*) "initracer: error !!"
973           write(*,*) "  cannot use chemistry option without ",
974     &                "an o2 tracer !"
975           call abort_physic("initracer","missing o2 tracer",1)
976         endif
977         if (igcm_o3.eq.0) then
978           write(*,*) "initracer: error !!"
979           write(*,*) "  cannot use chemistry option without ",
980     &                "an o3 tracer !"
981           call abort_physic("initracer","missing o3 tracer",1)
982         endif
983         if (igcm_h.eq.0) then
984           write(*,*) "initracer: error !!"
985           write(*,*) "  cannot use chemistry option without ",
986     &                "a h tracer !"
987           call abort_physic("initracer","missing h tracer",1)
988         endif
989         if (igcm_h2.eq.0) then
990           write(*,*) "initracer: error !!"
991           write(*,*) "  cannot use chemistry option without ",
992     &                "a h2 tracer !"
993           call abort_physic("initracer","missing h2 tracer",1)
994         endif
995         if (igcm_oh.eq.0) then
996           write(*,*) "initracer: error !!"
997           write(*,*) "  cannot use chemistry option without ",
998     &                "an oh tracer !"
999           call abort_physic("initracer","missing oh tracer",1)
1000         endif
1001         if (igcm_ho2.eq.0) then
1002           write(*,*) "initracer: error !!"
1003           write(*,*) "  cannot use chemistry option without ",
1004     &                "a ho2 tracer !"
1005           call abort_physic("initracer","missing ho2 tracer",1)
1006      endif
1007         if (igcm_h2o2.eq.0) then
1008           write(*,*) "initracer: error !!"
1009           write(*,*) "  cannot use chemistry option without ",
1010     &                "a h2o2 tracer !"
1011           call abort_physic("initracer","missing h2o2 tracer",1)
1012         endif
1013         if (igcm_n2.eq.0) then
1014           write(*,*) "initracer: error !!"
1015           write(*,*) "  cannot use chemistry option without ",
1016     &                "a n2 tracer !"
1017           call abort_physic("initracer","missing n2 tracer",1)
1018         endif
1019         if (igcm_ar.eq.0) then
1020           write(*,*) "initracer: error !!"
1021           write(*,*) "  cannot use chemistry option without ",
1022     &                "an ar tracer !"
1023           call abort_physic("initracer","missing ar tracer",1)
1024         endif
1025       endif ! of if (photochem .or. callthermos)
1026
1027! Initialisation for CO2 clouds
1028      if (co2clouds) then
1029        radius(igcm_ccnco2_mass) = radius(igcm_dust_mass)
1030        alpha_lift(igcm_ccnco2_mass) = 1e-30
1031        alpha_devil(igcm_ccnco2_mass) = 1e-30
1032        rho_q(igcm_ccnco2_mass) = rho_dust
1033        radius(igcm_ccnco2_number) = radius(igcm_ccnco2_mass)
1034        alpha_lift(igcm_ccnco2_number) = alpha_lift(igcm_ccnco2_mass)
1035        alpha_devil(igcm_ccnco2_number) = alpha_devil(igcm_ccnco2_mass)
1036        rho_q(igcm_ccnco2_number) = rho_q(igcm_ccnco2_mass)
1037
1038        radius(igcm_co2)=0.
1039        alpha_lift(igcm_co2) =0.
1040        alpha_devil(igcm_co2)=0.
1041        radius(igcm_co2_ice)=1.e-8
1042        rho_q(igcm_co2_ice)=rho_ice_co2
1043        alpha_lift(igcm_co2_ice) =0.
1044        alpha_devil(igcm_co2_ice)=0.
1045
1046      endif
1047
1048      end
Note: See TracBrowser for help on using the repository browser.