1 | SUBROUTINE initracer() |
---|
2 | |
---|
3 | use comgeomfi_h |
---|
4 | use aerosol_mod |
---|
5 | IMPLICIT NONE |
---|
6 | c======================================================================= |
---|
7 | c subject: |
---|
8 | c -------- |
---|
9 | c Initialization related to tracer |
---|
10 | c (transported dust, water, chemical species, ice...) |
---|
11 | c |
---|
12 | c Name of the tracer |
---|
13 | c |
---|
14 | c Test of dimension : |
---|
15 | c Initialize COMMON tracer in tracer.h, using tracer names provided |
---|
16 | c by the dynamics in "advtrac.h" |
---|
17 | c |
---|
18 | c author: F.Forget |
---|
19 | c ------ |
---|
20 | c Ehouarn Millour (oct. 2008) identify tracers by their names |
---|
21 | c Tanguy Bertrand (oct. 2014) Adaptation Pluto |
---|
22 | c Tanguy Bertrand (dec. 2014) Adding tracers for haze |
---|
23 | c -precurseur |
---|
24 | c -haze |
---|
25 | c======================================================================= |
---|
26 | |
---|
27 | |
---|
28 | #include "dimensions.h" |
---|
29 | #include "dimphys.h" |
---|
30 | #include "comcstfi.h" |
---|
31 | #include "callkeys.h" |
---|
32 | #include "tracer.h" |
---|
33 | #include "advtrac.h" |
---|
34 | #include "fisice.h" |
---|
35 | #include "surfdat.h" |
---|
36 | |
---|
37 | ! real qsurf(ngridmx,nqmx) ! tracer on surface (e.g. kg.m-2) |
---|
38 | character(len=20) :: txt ! to store some text |
---|
39 | integer iq,ig,count,i |
---|
40 | real r0_lift , reff_lift, rho_haze |
---|
41 | integer nqhaze(nqmx) ! to store haze tracers |
---|
42 | ! logical :: oldnames ! =.true. if old tracer naming convention (q01,...) |
---|
43 | integer ia, block |
---|
44 | CHARACTER(LEN=20) :: tracername ! to temporarily store text |
---|
45 | |
---|
46 | c----------------------------------------------------------------------- |
---|
47 | c radius(nqmx) ! aerosol particle radius (m) |
---|
48 | c rho_q(nqmx) ! tracer densities (kg.m-3) |
---|
49 | c rho_ch4_ice ! ch4 ice density |
---|
50 | c rho_co_ice ! co ice density |
---|
51 | c varian ! Characteristic variance of log-normal distribution |
---|
52 | c----------------------------------------------------------------------- |
---|
53 | |
---|
54 | ! Initialization: get tracer names from the dynamics and check if we are |
---|
55 | ! using 'old' tracer convention ('q01',q02',...) |
---|
56 | ! or new convention (full tracer names) |
---|
57 | |
---|
58 | ! copy tracer names from dynamics |
---|
59 | do iq=1,nqmx |
---|
60 | noms(iq)=tnom(iq) |
---|
61 | enddo |
---|
62 | |
---|
63 | print*,'initracer : number of tracers nqmx=',nqmx |
---|
64 | ! Identify tracers by their names: (and set corresponding values of mmol) |
---|
65 | ! 0. initialize tracer indexes to zero: |
---|
66 | ! NB: igcm_* indexes are commons in 'tracer.h' |
---|
67 | igcm_n2=0 |
---|
68 | igcm_ch4_gas=0 |
---|
69 | igcm_ch4_ice=0 |
---|
70 | igcm_prec_haze=0 |
---|
71 | igcm_co_gas=0 |
---|
72 | igcm_co_ice=0 |
---|
73 | |
---|
74 | nqhaze(:)=0 |
---|
75 | i=0 |
---|
76 | DO iq=1,nqmx |
---|
77 | txt=noms(iq) |
---|
78 | IF (txt(1:4).eq."haze") THEN |
---|
79 | i=i+1 |
---|
80 | nqhaze(i)=iq |
---|
81 | ENDIF |
---|
82 | ENDDO |
---|
83 | if ((haze.or.fasthaze).and.i==0) then |
---|
84 | print*, 'Haze active but no haze tracer in traceur.def' |
---|
85 | stop |
---|
86 | endif |
---|
87 | igcm_haze=0 |
---|
88 | igcm_haze10=0 |
---|
89 | igcm_haze30=0 |
---|
90 | igcm_haze50=0 |
---|
91 | igcm_haze100=0 |
---|
92 | |
---|
93 | ! Eddy diffusion tracers |
---|
94 | igcm_eddy1e6=0 |
---|
95 | igcm_eddy1e7=0 |
---|
96 | igcm_eddy5e7=0 |
---|
97 | igcm_eddy1e8=0 |
---|
98 | igcm_eddy5e8=0 |
---|
99 | write(*,*) 'initracer: noms() ', noms |
---|
100 | |
---|
101 | c Radius and densities |
---|
102 | rho_n2=1000 ! n2 ice |
---|
103 | rho_ch4_ice=520. ! rho ch4 ice |
---|
104 | rho_co_ice=520. ! rho ch4 ice |
---|
105 | rho_haze=800. ! haze |
---|
106 | ! first initialization |
---|
107 | call zerophys(nqmx,rho_q) |
---|
108 | call zerophys(nqmx,radius) |
---|
109 | |
---|
110 | ! find tracers |
---|
111 | count=0 |
---|
112 | do iq=1,nqmx |
---|
113 | if (noms(iq).eq."n2") then |
---|
114 | igcm_n2=iq |
---|
115 | mmol(igcm_n2)=28. |
---|
116 | count=count+1 |
---|
117 | write(*,*) 'Tracer ',count,' = n2' |
---|
118 | endif |
---|
119 | if (noms(iq).eq."ch4_gas") then |
---|
120 | igcm_ch4_gas=iq |
---|
121 | mmol(igcm_ch4_gas)=16. |
---|
122 | count=count+1 |
---|
123 | write(*,*) 'Tracer ',count,' = ch4 gas' |
---|
124 | endif |
---|
125 | if (noms(iq).eq."ch4_ice") then |
---|
126 | igcm_ch4_ice=iq |
---|
127 | mmol(igcm_ch4_ice)=16. |
---|
128 | radius(iq)=3.e-6 |
---|
129 | rho_q(iq)=rho_ch4_ice |
---|
130 | count=count+1 |
---|
131 | write(*,*) 'Tracer ',count,' = ch4 ice' |
---|
132 | endif |
---|
133 | if (noms(iq).eq."co_gas") then |
---|
134 | igcm_co_gas=iq |
---|
135 | mmol(igcm_co_gas)=28. |
---|
136 | count=count+1 |
---|
137 | write(*,*) 'Tracer ',count,' = co gas' |
---|
138 | endif |
---|
139 | if (noms(iq).eq."co_ice") then |
---|
140 | igcm_co_ice=iq |
---|
141 | mmol(igcm_co_ice)=28. |
---|
142 | radius(iq)=3.e-6 |
---|
143 | rho_q(iq)=rho_co_ice |
---|
144 | count=count+1 |
---|
145 | write(*,*) 'Tracer ',count,' = co ice' |
---|
146 | endif |
---|
147 | if (noms(iq).eq."prec_haze") then |
---|
148 | igcm_prec_haze=iq |
---|
149 | count=count+1 |
---|
150 | write(*,*) 'Tracer ',count,' = prec haze' |
---|
151 | endif |
---|
152 | if (noms(iq).eq."haze") then |
---|
153 | igcm_haze=iq |
---|
154 | count=count+1 |
---|
155 | radius(iq)=rad_haze |
---|
156 | rho_q(iq)=rho_haze |
---|
157 | write(*,*) 'Tracer ',count,' = haze' |
---|
158 | endif |
---|
159 | if (noms(iq).eq."haze10") then |
---|
160 | igcm_haze10=iq |
---|
161 | count=count+1 |
---|
162 | radius(iq)=10.e-9 |
---|
163 | rho_q(iq)=rho_haze |
---|
164 | write(*,*) 'Tracer ',count,' = haze10' |
---|
165 | endif |
---|
166 | if (noms(iq).eq."haze30") then |
---|
167 | igcm_haze30=iq |
---|
168 | count=count+1 |
---|
169 | radius(iq)=30.e-9 |
---|
170 | rho_q(iq)=rho_haze |
---|
171 | write(*,*) 'Tracer ',count,' = haze30' |
---|
172 | endif |
---|
173 | if (noms(iq).eq."haze50") then |
---|
174 | igcm_haze50=iq |
---|
175 | count=count+1 |
---|
176 | radius(iq)=50.e-9 |
---|
177 | rho_q(iq)=rho_haze |
---|
178 | write(*,*) 'Tracer ',count,' = haze50' |
---|
179 | endif |
---|
180 | if (noms(iq).eq."haze100") then |
---|
181 | igcm_haze100=iq |
---|
182 | count=count+1 |
---|
183 | radius(iq)=100.e-9 |
---|
184 | rho_q(iq)=rho_haze |
---|
185 | write(*,*) 'Tracer ',count,' = haze100' |
---|
186 | endif |
---|
187 | ! Eddy diffusion tracers |
---|
188 | if (noms(iq).eq."eddy1e6") then |
---|
189 | igcm_eddy1e6=iq |
---|
190 | count=count+1 |
---|
191 | write(*,*) 'Tracer ',count,' = eddy1e6' |
---|
192 | endif |
---|
193 | if (noms(iq).eq."eddy1e7") then |
---|
194 | igcm_eddy1e7=iq |
---|
195 | count=count+1 |
---|
196 | write(*,*) 'Tracer ',count,' = eddy1e7' |
---|
197 | endif |
---|
198 | if (noms(iq).eq."eddy5e7") then |
---|
199 | igcm_eddy5e7=iq |
---|
200 | count=count+1 |
---|
201 | write(*,*) 'Tracer ',count,' = eddy5e7' |
---|
202 | endif |
---|
203 | if (noms(iq).eq."eddy1e8") then |
---|
204 | igcm_eddy1e8=iq |
---|
205 | count=count+1 |
---|
206 | write(*,*) 'Tracer ',count,' = eddy1e8' |
---|
207 | endif |
---|
208 | if (noms(iq).eq."eddy5e8") then |
---|
209 | igcm_eddy5e8=iq |
---|
210 | count=count+1 |
---|
211 | write(*,*) 'Tracer ',count,' = eddy5e8' |
---|
212 | endif |
---|
213 | enddo ! of do iq=1,nqmx |
---|
214 | |
---|
215 | ! check that we identified all tracers: |
---|
216 | if (count.ne.nqmx) then |
---|
217 | write(*,*) "initracer: found only ",count," tracers" |
---|
218 | write(*,*) " expected ",nqmx |
---|
219 | do iq=1,count |
---|
220 | write(*,*)' ',iq,' ',trim(noms(iq)) |
---|
221 | enddo |
---|
222 | stop |
---|
223 | else |
---|
224 | write(*,*) "initracer: found all expected tracers, namely:" |
---|
225 | do iq=1,nqmx |
---|
226 | write(*,*)' ',iq,' ',trim(noms(iq)) |
---|
227 | enddo |
---|
228 | endif |
---|
229 | |
---|
230 | c------------------------------------------------------------ |
---|
231 | c Initialisation tracers .... |
---|
232 | c------------------------------------------------------------ |
---|
233 | |
---|
234 | c Other initializations |
---|
235 | c ------------------------------ |
---|
236 | |
---|
237 | c Latent heat : |
---|
238 | lw_co=274000. |
---|
239 | lw_ch4=586700. |
---|
240 | lw_n2=2.5e5 |
---|
241 | |
---|
242 | c HAZE: |
---|
243 | if (haze) then |
---|
244 | ! the sedimentation radius remains radius(igcm_haze) |
---|
245 | if (fractal) then |
---|
246 | nmono=nb_monomer |
---|
247 | else |
---|
248 | nmono=1 |
---|
249 | endif |
---|
250 | |
---|
251 | ia=0 |
---|
252 | if (aerohaze) then |
---|
253 | ia=ia+1 |
---|
254 | iaero_haze=ia |
---|
255 | write(*,*) '--- number of haze aerosol = ', iaero_haze |
---|
256 | |
---|
257 | block=0 ! Only one type of haze is active : the first one set in traceur.def |
---|
258 | do iq=1,nqmx |
---|
259 | tracername=noms(iq) |
---|
260 | write(*,*) "--> tracername ",iq,'/',nqmx,' = ',tracername |
---|
261 | if (tracername(1:4).eq."haze".and.block.eq.0) then |
---|
262 | i_haze=iq |
---|
263 | block=1 |
---|
264 | write(*,*) "i_haze=",i_haze |
---|
265 | write(*,*) "Careful: if you set many haze traceurs in |
---|
266 | & traceur.def,only ",tracername," will be radiatively active |
---|
267 | & (first one in traceur.def)" |
---|
268 | endif |
---|
269 | enddo |
---|
270 | endif |
---|
271 | endif |
---|
272 | |
---|
273 | c Output for records: |
---|
274 | c ~~~~~~~~~~~~~~~~~~ |
---|
275 | write(*,*) |
---|
276 | Write(*,*) '******** initracer : parameters :' |
---|
277 | write(*,*) 'radius = ', radius |
---|
278 | write(*,*) 'density = ', rho_q |
---|
279 | write(*,*) |
---|
280 | write(*,*) 'monomers = ', nmono |
---|
281 | |
---|
282 | end |
---|