/[lmdze]/trunk/Sources/phylmd/phytrac.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/phytrac.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 159 - (hide annotations)
Tue Jul 21 15:29:52 2015 UTC (8 years, 10 months ago) by guez
File size: 15086 byte(s)
Write variables from phytrac to "histins.nc" instead of
"histrac.nc". The idea is to have different output files only if they
have different coordinates, and not according to content (following LMDZ).

1 guez 3 module phytrac_m
2    
3     IMPLICIT none
4    
5     private
6     public phytrac
7    
8     contains
9    
10 guez 98 SUBROUTINE phytrac(itap, lmt_pas, julien, gmtime, firstcal, lafin, pdtphys, &
11 guez 118 t_seri, paprs, pplay, pmfu, pmfd, pde_u, pen_d, coefh, fm_therm, &
12 guez 159 entr_therm, yu1, yv1, ftsol, pctsrf, frac_impa, frac_nucl, da, phi, &
13     mp, upwd, dnwd, tr_seri, zmasse, ncid_startphy, nid_ins)
14 guez 3
15 guez 47 ! From phylmd/phytrac.F, version 1.15 2006/02/21 08:08:30 (SVN revision 679)
16 guez 3
17 guez 90 ! Authors: Fr\'ed\'eric Hourdin, Abderrahmane Idelkadi, Marie-Alice
18 guez 3 ! Foujols, Olivia
19 guez 78
20 guez 90 ! Objet : moniteur g\'en\'eral des tendances des traceurs
21 guez 3
22 guez 78 ! L'appel de "phytrac" se fait avec "nqmx - 2" donc nous avons
23 guez 98 ! bien les vrais traceurs, sans la vapeur d'eau ni l'eau liquide.
24 guez 3
25 guez 47 ! Modifications pour les traceurs :
26 guez 62 ! - uniformisation des parametrisations dans phytrac
27 guez 90 ! - stockage des moyennes des champs n\'ecessaires en mode traceur off-line
28 guez 47
29 guez 78 use abort_gcm_m, only: abort_gcm
30 guez 12 use clesphys, only: ecrit_tra
31     use clesphys2, only: iflag_con
32 guez 120 use cltrac_m, only: cltrac
33 guez 78 use cltracrn_m, only: cltracrn
34 guez 3 use ctherm, only: iflag_thermals
35 guez 120 use cvltr_m, only: cvltr
36 guez 98 use dimens_m, only: llm, nqmx
37     use dimphy, only: klon
38 guez 78 use indicesol, only: nbsrf
39 guez 98 use initrrnpb_m, only: initrrnpb
40 guez 17 use minmaxqfi_m, only: minmaxqfi
41 guez 157 use netcdf95, only: nf95_inq_varid, nf95_get_var, nf95_put_var
42 guez 78 use nflxtr_m, only: nflxtr
43 guez 36 use nr_util, only: assert
44 guez 78 use o3_chem_m, only: o3_chem
45     use phyetat0_m, only: rlat
46 guez 157 use phyredem0_m, only: ncid_restartphy
47 guez 17 use press_coefoz_m, only: press_coefoz
48 guez 78 use radiornpb_m, only: radiornpb
49     use regr_pr_comb_coefoz_m, only: regr_pr_comb_coefoz
50     use SUPHEC_M, only: rg
51 guez 3
52 guez 78 integer, intent(in):: itap ! number of calls to "physiq"
53 guez 7 integer, intent(in):: lmt_pas ! number of time steps of "physics" per day
54 guez 3 integer, intent(in):: julien !jour julien, 1 <= julien <= 360
55 guez 90 real, intent(in):: gmtime ! heure de la journ\'ee en fraction de jour
56 guez 78 logical, intent(in):: firstcal ! first call to "calfis"
57     logical, intent(in):: lafin ! fin de la physique
58     real, intent(in):: pdtphys ! pas d'integration pour la physique (s)
59     real, intent(in):: t_seri(klon, llm) ! temperature, in K
60 guez 3
61     real, intent(in):: paprs(klon, llm+1)
62     ! (pression pour chaque inter-couche, en Pa)
63    
64 guez 10 real, intent(in):: pplay(klon, llm)
65     ! (pression pour le mileu de chaque couche, en Pa)
66    
67 guez 78 ! convection:
68 guez 3
69 guez 62 REAL, intent(in):: pmfu(klon, llm) ! flux de masse dans le panache montant
70 guez 72
71     REAL, intent(in):: pmfd(klon, llm)
72     ! flux de masse dans le panache descendant
73    
74 guez 78 REAL pde_u(klon, llm) ! flux detraine dans le panache montant
75     REAL pen_d(klon, llm) ! flux entraine dans le panache descendant
76     REAL coefh(klon, llm) ! coeff melange couche limite
77 guez 3
78 guez 78 ! thermiques:
79 guez 3 real fm_therm(klon, llm+1), entr_therm(klon, llm)
80    
81 guez 78 ! Couche limite:
82     REAL yu1(klon) ! vents au premier niveau
83     REAL yv1(klon) ! vents au premier niveau
84 guez 3
85 guez 90 ! Arguments n\'ecessaires pour les sources et puits de traceur :
86 guez 104 real, intent(in):: ftsol(klon, nbsrf) ! Temperature du sol (surf)(Kelvin)
87 guez 78 real pctsrf(klon, nbsrf) ! Pourcentage de sol f(nature du sol)
88 guez 3
89 guez 78 ! Lessivage pour le on-line
90     REAL frac_impa(klon, llm) ! fraction d'aerosols impactes
91     REAL frac_nucl(klon, llm) ! fraction d'aerosols nuclees
92 guez 3
93 guez 78 ! Kerry Emanuel
94 guez 99 real, intent(in):: da(klon, llm), phi(klon, llm, llm), mp(klon, llm)
95 guez 78 REAL, intent(in):: upwd(klon, llm) ! saturated updraft mass flux
96     REAL, intent(in):: dnwd(klon, llm) ! saturated downdraft mass flux
97 guez 3
98 guez 98 real, intent(inout):: tr_seri(:, :, :) ! (klon, llm, nqmx - 2)
99 guez 78 ! (mass fractions of tracers, excluding water, at mid-layers)
100 guez 3
101 guez 78 real, intent(in):: zmasse(:, :) ! (klon, llm)
102 guez 17 ! (column-density of mass of air in a cell, in kg m-2)
103 guez 3
104 guez 159 integer, intent(in):: ncid_startphy, nid_ins
105 guez 3
106 guez 157 ! Local:
107    
108 guez 17 integer nsplit
109    
110 guez 78 ! TRACEURS
111 guez 17
112 guez 3 ! Sources et puits des traceurs:
113    
114     ! Pour l'instant seuls les cas du rn et du pb ont ete envisages.
115    
116 guez 78 REAL source(klon) ! a voir lorsque le flux est prescrit
117 guez 3 !
118     ! Pour la source de radon et son reservoir de sol
119    
120 guez 156 REAL, save:: trs(klon, nqmx - 2) ! Concentration de traceur dans le sol
121 guez 3
122 guez 98 REAL masktr(klon, nqmx - 2) ! Masque reservoir de sol traceur
123 guez 78 ! Masque de l'echange avec la surface
124     ! (1 = reservoir) ou (possible => 1)
125 guez 3 SAVE masktr
126 guez 98 REAL fshtr(klon, nqmx - 2) ! Flux surfacique dans le reservoir de sol
127 guez 3 SAVE fshtr
128 guez 98 REAL hsoltr(nqmx - 2) ! Epaisseur equivalente du reservoir de sol
129 guez 3 SAVE hsoltr
130 guez 98 REAL tautr(nqmx - 2) ! Constante de decroissance radioactive
131 guez 3 SAVE tautr
132 guez 98 REAL vdeptr(nqmx - 2) ! Vitesse de depot sec dans la couche Brownienne
133 guez 3 SAVE vdeptr
134 guez 98 REAL scavtr(nqmx - 2) ! Coefficient de lessivage
135 guez 3 SAVE scavtr
136    
137     CHARACTER itn
138    
139     ! nature du traceur
140    
141 guez 98 logical aerosol(nqmx - 2) ! Nature du traceur
142 guez 78 ! ! aerosol(it) = true => aerosol
143     ! ! aerosol(it) = false => gaz
144 guez 98 logical clsol(nqmx - 2) ! couche limite sol calcul\'ee
145     logical radio(nqmx - 2) ! d\'ecroisssance radioactive
146 guez 3 save aerosol, clsol, radio
147    
148     ! convection tiedtke
149     INTEGER i, k, it
150     REAL delp(klon, llm)
151    
152     ! Variables liees a l'ecriture de la bande histoire physique
153    
154     ! Variables locales pour effectuer les appels en serie
155    
156     REAL d_tr(klon, llm), d_trs(klon) ! tendances de traceurs
157 guez 98 REAL d_tr_cl(klon, llm, nqmx - 2) ! tendance de traceurs couche limite
158 guez 156
159     REAL d_tr_cv(klon, llm, nqmx - 2)
160     ! tendance de traceurs conv pour chq traceur
161    
162 guez 98 REAL d_tr_th(klon, llm, nqmx - 2) ! la tendance des thermiques
163 guez 3 REAL d_tr_dec(klon, llm, 2) ! la tendance de la decroissance
164 guez 78 ! ! radioactive du rn - > pb
165 guez 98 REAL d_tr_lessi_impa(klon, llm, nqmx - 2) ! la tendance du lessivage
166 guez 78 ! ! par impaction
167 guez 98 REAL d_tr_lessi_nucl(klon, llm, nqmx - 2) ! la tendance du lessivage
168 guez 78 ! ! par nucleation
169 guez 98 REAL flestottr(klon, llm, nqmx - 2) ! flux de lessivage
170 guez 78 ! ! dans chaque couche
171 guez 3
172     real ztra_th(klon, llm)
173 guez 157 integer isplit, varid
174 guez 3
175     ! Controls:
176     logical:: couchelimite = .true.
177     logical:: convection = .true.
178     logical:: lessivage = .true.
179     logical, save:: inirnpb
180    
181     !--------------------------------------
182    
183 guez 18 call assert(shape(zmasse) == (/klon, llm/), "phytrac zmasse")
184 guez 98 call assert(shape(tr_seri) == (/klon, llm, nqmx - 2/), "phytrac tr_seri")
185 guez 3
186 guez 7 if (firstcal) then
187 guez 3 print *, 'phytrac: pdtphys = ', pdtphys
188 guez 91 PRINT *, 'Frequency of tracer output: ecrit_tra = ', ecrit_tra
189 guez 98 inirnpb = .true.
190 guez 3
191     ! Initialisation de certaines variables pour le radon et le plomb
192     ! Initialisation du traceur dans le sol (couche limite radonique)
193 guez 157 trs(:, 2:) = 0.
194 guez 3
195 guez 157 call nf95_inq_varid(ncid_startphy, "trs", varid)
196     call nf95_get_var(ncid_startphy, varid, trs(:, 1))
197 guez 3
198     ! Initialisation de la fraction d'aerosols lessivee
199    
200 guez 98 d_tr_lessi_impa = 0.
201     d_tr_lessi_nucl = 0.
202 guez 3
203     ! Initialisation de la nature des traceurs
204    
205 guez 98 DO it = 1, nqmx - 2
206 guez 78 aerosol(it) = .FALSE. ! Tous les traceurs sont des gaz par defaut
207 guez 90 radio(it) = .FALSE. ! par d\'efaut pas de passage par "radiornpb"
208 guez 78 clsol(it) = .FALSE. ! Par defaut couche limite avec flux prescrit
209 guez 3 ENDDO
210 guez 17
211 guez 98 if (nqmx >= 5) then
212 guez 17 call press_coefoz ! read input pressure levels for ozone coefficients
213     end if
214 guez 3 ENDIF
215    
216     if (inirnpb) THEN
217 guez 62 ! Initialisation du traceur dans le sol (couche limite radonique)
218 guez 3 radio(1)= .true.
219     radio(2)= .true.
220     clsol(1)= .true.
221     clsol(2)= .true.
222     aerosol(2) = .TRUE. ! le Pb est un aerosol
223 guez 98 call initrrnpb(pctsrf, masktr, fshtr, hsoltr, tautr, vdeptr, scavtr)
224 guez 3 inirnpb=.false.
225     endif
226    
227     if (convection) then
228 guez 62 ! Calcul de l'effet de la convection
229 guez 98 DO it=1, nqmx - 2
230 guez 62 if (iflag_con == 2) then
231     ! Tiedke
232 guez 78 CALL nflxtr(pdtphys, pmfu, pmfd, pde_u, pen_d, paprs, &
233     tr_seri(:, :, it), d_tr_cv(:, :, it))
234 guez 62 else if (iflag_con == 3) then
235     ! Emanuel
236 guez 120 call cvltr(pdtphys, da, phi, mp, paprs, tr_seri(:, :, it), upwd, &
237     dnwd, d_tr_cv(:, :, it))
238 guez 3 endif
239    
240     DO k = 1, llm
241     DO i = 1, klon
242     tr_seri(i, k, it) = tr_seri(i, k, it) + d_tr_cv(i, k, it)
243     ENDDO
244     ENDDO
245     WRITE(unit=itn, fmt='(i1)') it
246 guez 78 CALL minmaxqfi(tr_seri(:, :, it), 0., 1e33, &
247 guez 3 'convection, tracer index = ' // itn)
248     ENDDO
249     endif
250    
251     ! Calcul de l'effet des thermiques
252    
253 guez 98 do it=1, nqmx - 2
254 guez 3 do k=1, llm
255     do i=1, klon
256     d_tr_th(i, k, it)=0.
257     tr_seri(i, k, it)=max(tr_seri(i, k, it), 0.)
258 guez 78 tr_seri(i, k, it)=min(tr_seri(i, k, it), 1e10)
259 guez 3 enddo
260     enddo
261     enddo
262    
263     if (iflag_thermals > 0) then
264     nsplit=10
265 guez 98 DO it=1, nqmx - 2
266 guez 3 do isplit=1, nsplit
267     ! Thermiques
268     call dqthermcell(klon, llm, pdtphys/nsplit &
269     , fm_therm, entr_therm, zmasse &
270     , tr_seri(1:klon, 1:llm, it), d_tr, ztra_th)
271    
272     do k=1, llm
273     do i=1, klon
274     d_tr(i, k)=pdtphys*d_tr(i, k)/nsplit
275     d_tr_th(i, k, it)=d_tr_th(i, k, it)+d_tr(i, k)
276     tr_seri(i, k, it)=max(tr_seri(i, k, it)+d_tr(i, k), 0.)
277     enddo
278     enddo
279     enddo
280     ENDDO
281     endif
282    
283 guez 78 ! Calcul de l'effet de la couche limite
284 guez 3
285     if (couchelimite) then
286     DO k = 1, llm
287     DO i = 1, klon
288     delp(i, k) = paprs(i, k)-paprs(i, k+1)
289     ENDDO
290     ENDDO
291    
292 guez 98 ! MAF modif pour tenir compte du cas traceur
293     DO it=1, nqmx - 2
294 guez 3 if (clsol(it)) then
295     ! couche limite avec quantite dans le sol calculee
296 guez 156 CALL cltracrn(it, pdtphys, yu1, yv1, coefh, t_seri, ftsol, &
297     pctsrf, tr_seri(:, :, it), trs(:, it), paprs, pplay, delp, &
298     masktr(1, it), fshtr(1, it), hsoltr(it), tautr(it), &
299     vdeptr(it), rlat, d_tr_cl(1, 1, it), d_trs)
300 guez 3 DO k = 1, llm
301     DO i = 1, klon
302     tr_seri(i, k, it) = tr_seri(i, k, it) + d_tr_cl(i, k, it)
303     ENDDO
304     ENDDO
305    
306 guez 156 trs(:, it) = trs(:, it) + d_trs
307     else
308     ! couche limite avec flux prescrit
309 guez 3 !MAF provisoire source / traceur a creer
310     DO i=1, klon
311 guez 156 source(i) = 0. ! pas de source, pour l'instant
312 guez 3 ENDDO
313    
314 guez 120 CALL cltrac(pdtphys, coefh, t_seri, tr_seri(:, :, it), source, &
315     paprs, pplay, delp, d_tr_cl(1, 1, it))
316 guez 3 DO k = 1, llm
317     DO i = 1, klon
318     tr_seri(i, k, it) = tr_seri(i, k, it) + d_tr_cl(i, k, it)
319     ENDDO
320     ENDDO
321     endif
322     ENDDO
323 guez 98 endif
324 guez 3
325 guez 78 ! Calcul de l'effet du puits radioactif
326 guez 3
327     ! MAF il faudrait faire une modification pour passer dans radiornpb
328 guez 98 ! si radio=true
329     d_tr_dec = radiornpb(tr_seri, pdtphys, tautr)
330     DO it = 1, nqmx - 2
331     if (radio(it)) then
332     tr_seri(:, :, it) = tr_seri(:, :, it) + d_tr_dec(:, :, it)
333     WRITE(unit=itn, fmt='(i1)') it
334     CALL minmaxqfi(tr_seri(:, :, it), 0., 1e33, 'puits rn it='//itn)
335     endif
336     ENDDO
337 guez 3
338 guez 98 if (nqmx >= 5) then
339 guez 6 ! Ozone as a tracer:
340 guez 7 if (mod(itap - 1, lmt_pas) == 0) then
341     ! Once per day, update the coefficients for ozone chemistry:
342     call regr_pr_comb_coefoz(julien)
343     end if
344 guez 6 call o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, tr_seri(:, :, 3))
345     end if
346 guez 3
347     ! Calcul de l'effet de la precipitation
348    
349     IF (lessivage) THEN
350 guez 98 d_tr_lessi_nucl = 0.
351     d_tr_lessi_impa = 0.
352     flestottr = 0.
353 guez 3
354     ! tendance des aerosols nuclees et impactes
355    
356 guez 98 DO it = 1, nqmx - 2
357 guez 3 IF (aerosol(it)) THEN
358     DO k = 1, llm
359     DO i = 1, klon
360     d_tr_lessi_nucl(i, k, it) = d_tr_lessi_nucl(i, k, it) + &
361 guez 78 (1 - frac_nucl(i, k))*tr_seri(i, k, it)
362 guez 3 d_tr_lessi_impa(i, k, it) = d_tr_lessi_impa(i, k, it) + &
363 guez 78 (1 - frac_impa(i, k))*tr_seri(i, k, it)
364 guez 3 ENDDO
365     ENDDO
366     ENDIF
367     ENDDO
368    
369     ! Mises a jour des traceurs + calcul des flux de lessivage
370     ! Mise a jour due a l'impaction et a la nucleation
371    
372 guez 98 DO it = 1, nqmx - 2
373 guez 3 IF (aerosol(it)) THEN
374     DO k = 1, llm
375     DO i = 1, klon
376 guez 78 tr_seri(i, k, it) = tr_seri(i, k, it) * frac_impa(i, k) &
377     * frac_nucl(i, k)
378 guez 3 ENDDO
379     ENDDO
380     ENDIF
381     ENDDO
382    
383     ! Flux lessivage total
384    
385 guez 98 DO it = 1, nqmx - 2
386 guez 3 DO k = 1, llm
387     DO i = 1, klon
388 guez 78 flestottr(i, k, it) = flestottr(i, k, it) &
389     - (d_tr_lessi_nucl(i, k, it) + d_tr_lessi_impa(i, k, it)) &
390     * (paprs(i, k)-paprs(i, k+1)) / (RG * pdtphys)
391 guez 3 ENDDO
392     ENDDO
393     ENDDO
394     ENDIF
395    
396 guez 78 ! Ecriture des sorties
397 guez 159 call write_histrac(lessivage, itap, nid_ins)
398 guez 3
399     if (lafin) then
400 guez 157 call nf95_inq_varid(ncid_restartphy, "trs", varid)
401     call nf95_put_var(ncid_restartphy, varid, trs(:, 1))
402 guez 3 endif
403    
404     contains
405    
406 guez 159 subroutine write_histrac(lessivage, itap, nid_ins)
407 guez 3
408     ! From phylmd/write_histrac.h, version 1.9 2006/02/21 08:08:30
409    
410     use dimens_m, only: iim, jjm, llm
411 guez 61 use histsync_m, only: histsync
412 guez 30 use histwrite_m, only: histwrite
413 guez 3 use temps, only: itau_phy
414 guez 131 use iniadvtrac_m, only: tname
415 guez 3 use dimphy, only: klon
416 guez 32 use grid_change, only: gr_phy_write_2d
417     use gr_phy_write_3d_m, only: gr_phy_write_3d
418 guez 3
419     logical, intent(in):: lessivage
420 guez 78 integer, intent(in):: itap ! number of calls to "physiq"
421 guez 159 integer, intent(in):: nid_ins
422 guez 3
423     ! Variables local to the procedure:
424     integer it
425 guez 78 integer itau_w ! pas de temps ecriture
426 guez 3
427     !-----------------------------------------------------
428    
429 guez 7 itau_w = itau_phy + itap
430 guez 3
431 guez 159 CALL histwrite(nid_ins, "zmasse", itau_w, gr_phy_write_3d(zmasse))
432 guez 3
433 guez 98 DO it=1, nqmx - 2
434 guez 159 CALL histwrite(nid_ins, tname(it+2), itau_w, &
435 guez 20 gr_phy_write_3d(tr_seri(:, :, it)))
436 guez 3 if (lessivage) THEN
437 guez 159 CALL histwrite(nid_ins, "fl"//tname(it+2), itau_w, &
438 guez 20 gr_phy_write_3d(flestottr(:, :, it)))
439 guez 3 endif
440 guez 159 CALL histwrite(nid_ins, "d_tr_th_"//tname(it+2), itau_w, &
441 guez 20 gr_phy_write_3d(d_tr_th(:, :, it)))
442 guez 159 CALL histwrite(nid_ins, "d_tr_cv_"//tname(it+2), itau_w, &
443 guez 20 gr_phy_write_3d(d_tr_cv(:, :, it)))
444 guez 159 CALL histwrite(nid_ins, "d_tr_cl_"//tname(it+2), itau_w, &
445 guez 20 gr_phy_write_3d(d_tr_cl(:, :, it)))
446 guez 3 ENDDO
447    
448     end subroutine write_histrac
449    
450     END SUBROUTINE phytrac
451    
452     end module phytrac_m

  ViewVC Help
Powered by ViewVC 1.1.21