source: trunk/LMDZ.GENERIC/libf/phystd/tracer_h.F90 @ 3996

Last change on this file since 3996 was 3724, checked in by mmaurice, 13 months ago

Generic PCM

Add radioactive tracers in order to compare tracers mixing between 3D and 1D.

MM

File size: 7.9 KB
Line 
1
2       module tracer_h
3
4       implicit none
5
6       integer, save :: nqtot ! total number of tracers
7       integer, save :: nesp  ! number of species in the chemistry
8       integer, save :: ngt   ! number of generic tracers
9       integer, save :: n_rgcs ! number of Radiative Generic Condensable Species
10!$OMP THREADPRIVATE(nqtot,nesp,ngt,n_rgcs)
11
12       logical :: moderntracdef=.false. ! Standard or modern traceur.def
13!$OMP THREADPRIVATE(moderntracdef)
14
15       character*30, save, allocatable :: noms(:)   ! name of the tracer
16       real, save, allocatable :: mmol(:)     ! mole mass of tracer (g/mol)
17       real, save, allocatable :: aki(:)      ! to compute coefficient of thermal concduction if photochem
18       real, save, allocatable :: cpi(:)      ! to compute cpnew in concentration.F if photochem
19       real, save, allocatable :: radius(:)   ! dust and ice particle radius (m)
20       real, save, allocatable :: rho_q(:)    ! tracer densities (kg.m-3)
21       real, save, allocatable :: qext(:)     ! Single Scat. Extinction coeff at 0.67 um
22       real, save, allocatable :: alpha_lift(:)  ! saltation vertical flux/horiz flux ratio (m-1)
23       real, save, allocatable :: alpha_devil(:) ! lifting coeeficient by dust devil
24       real, save, allocatable :: qextrhor(:) ! Intermediate for computing opt. depth from q
25
26       real,save :: varian      ! Characteristic variance of log-normal distribution
27       real,save :: r3n_q     ! used to compute r0 from number and mass mixing ratio
28       real,save :: rho_dust     ! Mars dust density (kg.m-3)
29       real,save :: rho_ice     ! Water ice density (kg.m-3)
30       real,save :: rho_co2     ! CO2 ice density (kg.m-3)
31       real,save :: ref_r0        ! for computing reff=ref_r0*r0 (in log.n. distribution)
32!$OMP THREADPRIVATE(noms,mmol,aki,cpi,radius,rho_q,qext,alpha_lift,alpha_devil,qextrhor, &
33        !$OMP varian,r3n_q,rho_dust,rho_ice,rho_co2,ref_r0)
34
35       integer, save, allocatable :: is_chim(:) ! 1 if tracer used in chemistry, else 0
36       integer, save, allocatable :: is_rad(:)  ! 1 if   ""    ""  in radiative transfer, else 0
37!$OMP THREADPRIVATE(is_chim,is_rad)
38
39       integer, save, allocatable :: is_recomb(:)      ! 1 if tracer used in recombining scheme, else 0 (if 1, must have is_rad=1)
40       integer, save, allocatable :: is_recomb_qset(:) ! 1 if tracer k-corr assume predefined vmr, else 0 (if 1, must have is_recomb=1)
41       integer, save, allocatable :: is_recomb_qotf(:) ! 1 if tracer recombination is done on-the-fly, else 0 (if 1, must have is_recomb_qset=0)
42!$OMP THREADPRIVATE(is_recomb,is_recomb_qset,is_recomb_qotf)
43       integer, save, allocatable :: is_condensable(:)      ! 1 if tracer is generic, else 0 (added LT)
44       integer,save,allocatable :: is_rgcs(:)               ! 1 if tracer is a radiative generic condensable specie, else 0 (added LT 2022)
45       ! Lists of constants for condensable tracers
46       real, save, allocatable :: constants_mass(:)                    ! molecular mass of the specie (g/mol)
47       real, save, allocatable :: constants_delta_vapH(:)           ! Enthalpy of vaporization (J/mol)
48       real, save, allocatable :: constants_Tref(:)                 ! Ref temperature for Clausis-Clapeyron (K)
49       real, save, allocatable :: constants_Pref(:)                 ! Reference pressure for Clausius Clapeyron (Pa)
50       real, save, allocatable :: constants_epsi_generic(:)                 ! fractionnal molecular mass (m/mugaz)
51       real, save, allocatable :: constants_RLVTT_generic(:)                ! Latent heat of vaporization (J/kg)
52       real, save, allocatable :: constants_metallicity_coeff(:)    ! Coefficient to take into account the metallicity
53       real, save, allocatable :: constants_RCPV_generic(:)                   ! specific heat capacity of the tracer vapor at Tref
54!$OMP THREADPRIVATE(constants_mass,constants_delta_vapH,constants_Tref)
55!$OMP THREADPRIVATE(constants_Pref,constants_epsi_generic)
56!$OMP THREADPRIVATE(constants_RLVTT_generic,constants_metallicity_coeff,constants_RCPV_generic)
57
58       real, save, allocatable :: half_life(:) ! half-life (s) for radioactive tracers. If 0, tracer is not decaying.
59       real, save, allocatable :: top_prod(:)  ! top production rate (1/s) for radioactive tracers. Non-dim, so use 1.
60       real, save, allocatable :: bot_prod(:)  ! bottom production rate (1/s) for radioactive tracers. Non-dim, so use 1.
61!$OMP THREADPRIVATE(half_life,top_prod,bot_prod)
62
63
64!$OMP THREADPRIVATE(is_condensable,is_rgcs)   !also added by LT
65! tracer indexes: these are initialized in initracer and should be 0 if the
66!                 corresponding tracer does not exist
67       ! dust
68       integer,save,allocatable :: igcm_dustbin(:) ! for dustbin 'dust' tracers
69       ! dust, special doubleq case
70       integer,save :: igcm_dust_mass   ! dust mass mixing ratio (for transported dust)
71       integer,save :: igcm_dust_number ! dust number mixing ratio (transported dust)
72       ! water
73       integer,save :: igcm_h2o_vap ! water vapour
74       integer,save :: igcm_h2o_ice ! water ice
75       ! chemistry:
76       integer,save :: igcm_co2
77       integer,save :: igcm_co
78       integer,save :: igcm_o
79       integer,save :: igcm_o1d
80       integer,save :: igcm_o2
81       integer,save :: igcm_o3
82       integer,save :: igcm_h
83       integer,save :: igcm_h2
84       integer,save :: igcm_oh
85       integer,save :: igcm_ho2
86       integer,save :: igcm_h2o2
87       integer,save :: igcm_n2
88       integer,save :: igcm_ar
89       integer,save :: igcm_n
90       integer,save :: igcm_no
91       integer,save :: igcm_no2
92       integer,save :: igcm_n2d
93       integer,save :: igcm_ch4
94
95       integer,save :: igcm_ch3
96       integer,save :: igcm_ch
97       integer,save :: igcm_3ch2
98       integer,save :: igcm_1ch2
99       integer,save :: igcm_cho
100       integer,save :: igcm_ch2o
101       integer,save :: igcm_ch3o
102       integer,save :: igcm_c
103       integer,save :: igcm_c2
104       integer,save :: igcm_c2h
105       integer,save :: igcm_c2h2
106       integer,save :: igcm_c2h3
107       integer,save :: igcm_c2h4
108       integer,save :: igcm_c2h6
109       integer,save :: igcm_ch2co
110       integer,save :: igcm_ch3co
111       integer,save :: igcm_hcaer
112
113       ! other tracers
114       integer,save :: igcm_ar_n2 ! for simulations using co2 +neutral gaz
115       integer,save :: igcm_co2_ice ! CO2 ice
116!$OMP THREADPRIVATE(igcm_dustbin,igcm_dust_mass,igcm_dust_number,igcm_h2o_vap,igcm_h2o_ice,      &
117        !$OMP igcm_co2,igcm_co,igcm_o,igcm_o1d,igcm_o2,igcm_o3,igcm_h,igcm_h2,igcm_oh,        &
118        !$OMP igcm_ho2,igcm_h2o2,igcm_n2,igcm_ar,igcm_ar_n2,igcm_co2_ice,                         &
119       !$OMP igcm_n,igcm_no,igcm_no2,igcm_n2d,igcm_ch4,igcm_ch3,igcm_ch,igcm_3ch2,               &
120       !$OMP igcm_1ch2,igcm_cho,igcm_ch2o,igcm_ch3o,igcm_c,igcm_c2,igcm_c2h,igcm_c2h2,           &
121       !$OMP igcm_c2h3,igcm_c2h4,igcm_c2h6,igcm_ch2co,igcm_ch3co,igcm_hcaer)
122
123       contains
124       
125       ! some basic auxiliary functions for tracers
126       
127       logical function is_known_tracer(tracer_name)
128         ! checks if tracer_name is a know tracer
129         ! returns .true. if yes and .false. otherwise
130         implicit none
131         character(len=*),intent(in) :: tracer_name
132         integer :: iq
133         ! initialization
134         is_known_tracer=.false.
135         do iq=1,nqtot
136           if( trim(tracer_name) == trim(noms(iq)) ) then
137             is_known_tracer=.true.
138             exit
139           endif
140         enddo
141       end function is_known_tracer
142       
143       integer function tracer_index(tracer_name)
144         ! gets the index of the tracer tracer_name
145         ! returns index or 0 if unknown tracer
146         implicit none
147         character(len=*),intent(in) :: tracer_name
148         integer :: iq
149         ! initialization
150         tracer_index=0
151         do iq=1,nqtot
152           if( trim(tracer_name) == trim(noms(iq)) ) then
153             tracer_index=iq
154             exit
155           endif
156         enddo
157       end function tracer_index
158       
159       end module tracer_h
160
Note: See TracBrowser for help on using the repository browser.