1 | SUBROUTINE phytrac (firstcall,lastcall, |
---|
2 | . nqmax,nmicro,ptimestep,appkim,dtkim, |
---|
3 | . pplev,pplay,delp,ptemp,pmu0,pfract,pdecli, |
---|
4 | . lonsol,tr_seri,qaer,d_tr_mph,d_tr_kim) |
---|
5 | |
---|
6 | c====================================================================== |
---|
7 | c S. Lebonnois, mai 2008 |
---|
8 | c |
---|
9 | c Arguments: |
---|
10 | c |
---|
11 | c firstcall----input-L-variable logique indiquant le premier passage |
---|
12 | c lastcall-----input-L-variable logique indiquant le dernier passage |
---|
13 | c nqmax--------input-I-nombre de traceurs (total) |
---|
14 | c nmicro-------input-I-nombre de traceurs microphysiques !! doivent etre toujours en premiers!! |
---|
15 | c ptimestep----input-R-pas d'integration pour la physique (seconde) |
---|
16 | c appkim-------input-I-appel a la chimie |
---|
17 | c dtkim--------input-R-pas de temps chimique (seconde) |
---|
18 | c pplev--------input-R-pression pour chaque inter-couche (en Pa) |
---|
19 | c pplay--------input-R-pression pour chaque couche (en Pa) |
---|
20 | c delp---------input-R-epaisseur d'une couche (en Pa) |
---|
21 | c ptemp--------input-R-temperature (K) |
---|
22 | c pmu0---------input-R-cos angle zenithal |
---|
23 | c pfract-------input-R-fractional day |
---|
24 | c pdecli-------input-R-declinaison en radian |
---|
25 | c lonsol-------input-R-longitude solaire en radian |
---|
26 | c tr_seri------input-R-mass mixing ratio traceurs (kg/kg) |
---|
27 | c d_tr_mph----output-R-tendance microphysique de "qx" (kg/kg/s) |
---|
28 | c d_tr_kim----output-R-tendance chimique de "qx" (kg/kg/s) |
---|
29 | c====================================================================== |
---|
30 | USE infotrac |
---|
31 | use dimphy |
---|
32 | IMPLICIT none |
---|
33 | #include "dimensions.h" |
---|
34 | #include "clesphys.h" |
---|
35 | #include "YOMCST.h" |
---|
36 | |
---|
37 | c====================================================================== |
---|
38 | c Variables argument: |
---|
39 | c |
---|
40 | LOGICAL firstcall,lastcall |
---|
41 | INTEGER nqmax,nmicro,nlat,appkim |
---|
42 | REAL ptimestep,dtkim |
---|
43 | REAL pplev(klon,klev+1),pplay(klon,klev+1),delp(klon,klev) |
---|
44 | REAL ptemp(klon,klev) |
---|
45 | REAL pmu0(klon), pfract(klon), pdecli, lonsol |
---|
46 | REAL tr_seri(klon,klev,nqmax) |
---|
47 | REAL qaer(klon,klev,nqmax) |
---|
48 | REAL d_tr_mph(klon,klev,nqmax),d_tr_kim(klon,klev,nqmax) |
---|
49 | |
---|
50 | c====================================================================== |
---|
51 | c Local variables |
---|
52 | |
---|
53 | c grandeurs en moyennes zonales |
---|
54 | REAL zplev(jjm+1,klev+1),zplay(jjm+1,klev) |
---|
55 | REAL ztemp(jjm+1,klev),zmu0(jjm+1),zfract(jjm+1) |
---|
56 | real temp_eq(klev),press_eq(klev) |
---|
57 | REAL zqaer(jjm+1,klev,nqmax) ! et non nmicro... Permet nmicro=0. |
---|
58 | REAL zqaer0(jjm+1,klev,nqmax) |
---|
59 | REAL pdqmfi(jjm+1,klev,nqmax) |
---|
60 | REAL ychim(jjm+1,klev,nqmax-nmicro) |
---|
61 | c La saturation n est calculee qu une seule fois: sauvegarde qysat |
---|
62 | c La chimie n est pas calculee tous les pas, il faut donc |
---|
63 | c sauvegarder les sorties de la chimie |
---|
64 | REAL,save,allocatable :: qysat(:,:),pdyfi(:,:,:) |
---|
65 | |
---|
66 | character*10 nomqy(nqmax-nmicro+1) |
---|
67 | integer i,j,l,iq,ig0 |
---|
68 | |
---|
69 | c====================================================================== |
---|
70 | c====================================================================== |
---|
71 | |
---|
72 | if (firstcall) then |
---|
73 | allocate(qysat(klev,nqmax-nmicro),pdyfi(jjm+1,klev,nqmax-nmicro)) |
---|
74 | endif |
---|
75 | |
---|
76 | c----------------------------------------------------------------------- |
---|
77 | c convertion moyennes zonales et changement d unites pour microphy |
---|
78 | c --------------------------------- |
---|
79 | |
---|
80 | c print*,'CONVERSION 2D ET CHANGEMENT UNITES (PHYTRAC)' |
---|
81 | |
---|
82 | zplev = 0.0 |
---|
83 | zplay = 0.0 |
---|
84 | ztemp = 0.0 |
---|
85 | zqaer = 0.0 |
---|
86 | ychim = 0.0 |
---|
87 | zmu0 = 0.0 |
---|
88 | zfract= 0.0 |
---|
89 | |
---|
90 | do l=1,llm+1 |
---|
91 | zplev(1,l) = pplev(1,l) |
---|
92 | do j=2,jjm |
---|
93 | ig0=1+(j-2)*iim |
---|
94 | do i=1,iim |
---|
95 | zplev(j,l) = zplev(j,l) + pplev(ig0+i,l)/iim |
---|
96 | enddo |
---|
97 | enddo |
---|
98 | zplev(jjm+1,l) = pplev(klon,l) |
---|
99 | enddo |
---|
100 | |
---|
101 | do l=1,llm |
---|
102 | ztemp(1,l) = ptemp(1,l) |
---|
103 | zplay(1,l) = pplay(1,l) |
---|
104 | do j=2,jjm |
---|
105 | ig0=1+(j-2)*iim |
---|
106 | do i=1,iim |
---|
107 | ztemp(j,l) = ztemp(j,l) + ptemp(ig0+i,l)/iim |
---|
108 | zplay(j,l) = zplay(j,l) + pplay(ig0+i,l)/iim |
---|
109 | enddo |
---|
110 | enddo |
---|
111 | ztemp(jjm+1,l) = ptemp(klon,l) |
---|
112 | zplay(jjm+1,l) = pplay(klon,l) |
---|
113 | temp_eq = ztemp((jjm+1)/2,:) |
---|
114 | press_eq = zplay((jjm+1)/2,:)/100. ! en mbar |
---|
115 | enddo |
---|
116 | |
---|
117 | zmu0(1) = pmu0(1) |
---|
118 | zfract(1) = pfract(1) |
---|
119 | do j=2,jjm |
---|
120 | ig0=1+(j-2)*iim |
---|
121 | do i=1,iim |
---|
122 | zmu0(j) = zmu0(j) + pmu0(ig0+i)/iim |
---|
123 | zfract(j) = zfract(j) + pfract(ig0+i)/iim |
---|
124 | enddo |
---|
125 | enddo |
---|
126 | zmu0(jjm+1) = pmu0(klon) |
---|
127 | zfract(jjm+1) = pfract(klon) |
---|
128 | |
---|
129 | c TRACEURS MICROPHYSIQUES |
---|
130 | |
---|
131 | if (microfi.eq.1) then |
---|
132 | |
---|
133 | do iq=1,nmicro |
---|
134 | c print*,tname(iq) |
---|
135 | |
---|
136 | c Traceurs microphysiques: passage en extensif: n/kg --> n/m^2 |
---|
137 | DO l=1,llm |
---|
138 | DO i = 1, klon |
---|
139 | qaer(i,l,iq) = tr_seri(i,l,iq)*delp(i,l)/RG |
---|
140 | ENDDO |
---|
141 | ENDDO |
---|
142 | |
---|
143 | do l=1,llm |
---|
144 | zqaer(1,l,iq) = qaer(1,l,iq) |
---|
145 | do j=2,jjm |
---|
146 | ig0=1+(j-2)*iim |
---|
147 | do i=1,iim |
---|
148 | zqaer(j,l,iq) = zqaer(j,l,iq) + qaer(ig0+i,l,iq)/iim |
---|
149 | enddo |
---|
150 | enddo |
---|
151 | zqaer(jjm+1,l,iq) = qaer(klon,l,iq) |
---|
152 | enddo |
---|
153 | enddo |
---|
154 | |
---|
155 | endif ! microfi |
---|
156 | |
---|
157 | c AUTRES TRACEURS |
---|
158 | |
---|
159 | if (nqmax.gt.nmicro) then |
---|
160 | do iq=nmicro+1,nqmax |
---|
161 | do l=1,llm |
---|
162 | ychim(1,l,iq-nmicro) = tr_seri(1,l,iq) |
---|
163 | do j=2,jjm |
---|
164 | ig0=1+(j-2)*iim |
---|
165 | do i=1,iim |
---|
166 | ychim(j,l,iq-nmicro) = ychim(j,l,iq-nmicro) |
---|
167 | . + tr_seri(ig0+i,l,iq)/iim |
---|
168 | enddo |
---|
169 | enddo |
---|
170 | ychim(jjm+1,l,iq-nmicro) = tr_seri(klon,l,iq) |
---|
171 | enddo |
---|
172 | nomqy(iq-nmicro) = tname(iq) |
---|
173 | |
---|
174 | c print*,iq-nmicro,nomqy(iq-nmicro) |
---|
175 | |
---|
176 | enddo |
---|
177 | nomqy(nqmax-nmicro+1) = "HV" |
---|
178 | endif |
---|
179 | |
---|
180 | c----------------------------------------------------------------------- |
---|
181 | c initialisation des qysat au premier appel: |
---|
182 | c --------------------------------- |
---|
183 | |
---|
184 | c!! ATTENTION, qysat pris uniquement a l'equateur |
---|
185 | c!! justifie puisque dans cette region, les var de t et p sont faibles... |
---|
186 | |
---|
187 | if (firstcall .and. chimi .and.(nqmax.gt.nmicro)) then |
---|
188 | call inicondens(nqmax-nmicro,press_eq,temp_eq,nomqy,qysat) |
---|
189 | endif |
---|
190 | |
---|
191 | c----------------------------------------------------------------------- |
---|
192 | c Appel de la microphysique |
---|
193 | c -------------------------- |
---|
194 | |
---|
195 | pdqmfi = 0. |
---|
196 | zqaer0 = zqaer |
---|
197 | |
---|
198 | IF(firstcall) THEN |
---|
199 | print*,'MICROPHYSIQUE ',MICROFI |
---|
200 | ENDIF |
---|
201 | |
---|
202 | IF(MICROFI.eq.1) THEN |
---|
203 | |
---|
204 | IF(firstcall) THEN |
---|
205 | print*,'OH! On passe dans la microphysique' |
---|
206 | ENDIF |
---|
207 | |
---|
208 | CALL pg2(zplev,ztemp,zqaer,pdqmfi ! tendances 2D, /s |
---|
209 | & ,nmicro,ptimestep,zmu0,zfract,lastcall) |
---|
210 | |
---|
211 | ELSE |
---|
212 | |
---|
213 | IF(firstcall) THEN |
---|
214 | print*,'MICROPHYSIQUE OFF-LINE',MICROFI |
---|
215 | if (nmicro.gt.0) then |
---|
216 | CALL pg2(zplev,ztemp,zqaer,pdqmfi |
---|
217 | & ,nmicro,ptimestep,zmu0,zfract,lastcall) |
---|
218 | endif |
---|
219 | ENDIF |
---|
220 | |
---|
221 | ENDIF |
---|
222 | |
---|
223 | zqaer = zqaer+pdqmfi*ptimestep |
---|
224 | pdqmfi = (zqaer-zqaer0)/ptimestep |
---|
225 | |
---|
226 | c----------------------------------------------------------------------- |
---|
227 | c Condensation |
---|
228 | c ------------- |
---|
229 | |
---|
230 | if ((chimi).and.(nqmax.gt.nmicro)) then |
---|
231 | |
---|
232 | c tendance (en /s) passee sur pdqmfi(nmicro+1 a nqmax) |
---|
233 | c print*,'Condensation' |
---|
234 | |
---|
235 | do iq=1,nqmax-nmicro |
---|
236 | do l=1,llm |
---|
237 | do j=1,jjm+1 |
---|
238 | if (ychim(j,l,iq).gt.qysat(l,iq)) then |
---|
239 | pdqmfi(j,l,nmicro+iq)= (-ychim(j,l,iq)+qysat(l,iq)) !delta y |
---|
240 | . / ptimestep ! / dt |
---|
241 | endif |
---|
242 | enddo |
---|
243 | enddo |
---|
244 | enddo |
---|
245 | |
---|
246 | ENDIF |
---|
247 | |
---|
248 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
249 | c eventuellement, modif initiale de la compo |
---|
250 | c |
---|
251 | c tendance (en /s) passee sur pdqmfi(nmicro+1 a nqmax) |
---|
252 | c |
---|
253 | c if (firstcall .and. chimi .and.(nqmax.gt.nmicro)) then |
---|
254 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
255 | c!!!remise de CH4 a 1.5%!!!!!!!!!!!!!!!!!!!!!! |
---|
256 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
257 | c do iq=1,nqmax-nmicro |
---|
258 | c if (nomqy(iq).eq."CH4") then |
---|
259 | c do l=1,llm |
---|
260 | c do j=1,jjm+1 |
---|
261 | c if (ychim(j,l,iq).le.0.015) then |
---|
262 | c pdqmfi(j,l,nmicro+iq)= (-ychim(j,l,iq)+0.015) !delta y |
---|
263 | c . / ptimestep ! / dt |
---|
264 | c endif |
---|
265 | c enddo |
---|
266 | c enddo |
---|
267 | c endif |
---|
268 | c enddo |
---|
269 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
270 | c |
---|
271 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
272 | c!!!remise de C2H2 a 1.e-5 max !!!!!!!!!!!!! |
---|
273 | c!!!remise de C2H6 a 3.e-5 max !!!!!!!!!!!!! |
---|
274 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
275 | c do iq=1,nqmax-nmicro |
---|
276 | c if (nomqy(iq).eq."C2H2") then |
---|
277 | c do l=1,llm |
---|
278 | c do j=1,jjm+1 |
---|
279 | c if (ychim(j,l,iq).gt.1.e-5) then |
---|
280 | c pdqmfi(j,l,nmicro+iq)= (-ychim(j,l,iq)+1.e-5) !delta y |
---|
281 | c . / ptimestep ! / dt |
---|
282 | c endif |
---|
283 | c enddo |
---|
284 | c enddo |
---|
285 | c endif |
---|
286 | c if (nomqy(iq).eq."C2H6") then |
---|
287 | c do l=1,llm |
---|
288 | c do j=1,jjm+1 |
---|
289 | c if (ychim(j,l,iq).gt.3.e-5) then |
---|
290 | c pdqmfi(j,l,nmicro+iq)= (-ychim(j,l,iq)+3.e-5) !delta y |
---|
291 | c . / ptimestep ! / dt |
---|
292 | c endif |
---|
293 | c enddo |
---|
294 | c enddo |
---|
295 | c endif |
---|
296 | c enddo |
---|
297 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
298 | c endif |
---|
299 | c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
---|
300 | |
---|
301 | c----------------------------------------------------------------------- |
---|
302 | c Appel de la chimie |
---|
303 | c -------------------------- |
---|
304 | |
---|
305 | if((appkim.eq.1).and.(chimi)) then |
---|
306 | print*,'On passe dans la CHIMIE' |
---|
307 | |
---|
308 | c do iq=1,nqmax-nmicro |
---|
309 | c if (nomqy(iq).eq."C2H2") then |
---|
310 | c print*,"C2H2top=",ychim(:,klev,iq) |
---|
311 | c endif |
---|
312 | c enddo |
---|
313 | |
---|
314 | c Appel Chimie |
---|
315 | c ------------ |
---|
316 | CALL calchim(nqmax-nmicro,ychim,nomqy,pdecli,lonsol,dtkim, |
---|
317 | . ztemp,zplay,zplev, |
---|
318 | . pdyfi) |
---|
319 | c ychim ne doit pas etre modifie, pdyfi en /s |
---|
320 | |
---|
321 | endif |
---|
322 | |
---|
323 | c----------------------------------------------------------------------- |
---|
324 | c retour des tendances vers 3D |
---|
325 | c --------------------------------- |
---|
326 | |
---|
327 | c TRACEURS MICROPHYSIQUES |
---|
328 | |
---|
329 | if (microfi.eq.1) then |
---|
330 | |
---|
331 | DO iq=1,nmicro |
---|
332 | DO l=1,llm |
---|
333 | d_tr_mph(1,l,iq) = pdqmfi(1,l,iq) |
---|
334 | ig0 = 2 |
---|
335 | DO j=2,jjm |
---|
336 | DO i = 1, iim |
---|
337 | d_tr_mph(ig0,l,iq) = pdqmfi(j,l,iq) |
---|
338 | & *qaer(ig0,l,iq)/zqaer0(j,l,iq) |
---|
339 | ig0 = ig0 + 1 |
---|
340 | ENDDO |
---|
341 | ENDDO |
---|
342 | d_tr_mph(ig0,l,iq) = pdqmfi(jjm+1,l,iq) |
---|
343 | ENDDO |
---|
344 | ENDDO |
---|
345 | |
---|
346 | do iq=1,nmicro |
---|
347 | DO l=1,llm |
---|
348 | DO i = 1, klon |
---|
349 | c Traceurs microphysiques: passage en intensif: n/m^2 --> n/kg |
---|
350 | d_tr_mph(i,l,iq) = d_tr_mph(i,l,iq)*RG/delp(i,l) |
---|
351 | ENDDO |
---|
352 | ENDDO |
---|
353 | enddo |
---|
354 | |
---|
355 | endif ! microfi |
---|
356 | |
---|
357 | c AUTRES TRACEURS |
---|
358 | |
---|
359 | if ((chimi).and.(nqmax.gt.nmicro)) then |
---|
360 | c on passe de pdyfi (tendance chimique en /s calculee quand chimie appelee) |
---|
361 | c a d_tr_kim (tendance chimique 3D en /s, passee a physiq) |
---|
362 | c et de pdqmfi a d_tr_mph (tendance condensation 3D en /s passee a physiq) |
---|
363 | |
---|
364 | DO iq=nmicro+1,nqmax |
---|
365 | DO l=1,llm |
---|
366 | d_tr_kim(1,l,iq) = pdyfi(1,l,iq-nmicro) |
---|
367 | d_tr_mph(1,l,iq) = pdqmfi(1,l,iq) |
---|
368 | ig0 = 2 |
---|
369 | DO j=2,jjm |
---|
370 | DO i = 1, iim |
---|
371 | d_tr_kim(ig0,l,iq) = pdyfi(j,l,iq-nmicro) |
---|
372 | & *tr_seri(ig0,l,iq)/ychim(j,l,iq-nmicro) |
---|
373 | d_tr_mph(ig0,l,iq) = pdqmfi(j,l,iq) |
---|
374 | & *tr_seri(ig0,l,iq)/ychim(j,l,iq-nmicro) |
---|
375 | ig0 = ig0 + 1 |
---|
376 | ENDDO |
---|
377 | ENDDO |
---|
378 | d_tr_kim(ig0,l,iq) = pdyfi(jjm+1,l,iq-nmicro) |
---|
379 | d_tr_mph(ig0,l,iq) = pdqmfi(jjm+1,l,iq) |
---|
380 | ENDDO |
---|
381 | ENDDO |
---|
382 | |
---|
383 | endif ! chimi |
---|
384 | |
---|
385 | RETURN |
---|
386 | END |
---|