/[lmdze]/trunk/phylmd/physiq.f
ViewVC logotype

Contents of /trunk/phylmd/physiq.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 266 - (show annotations)
Thu Apr 19 17:54:55 2018 UTC (6 years ago) by guez
File size: 37402 byte(s)
Define macros of the preprocessor CPP_IIM, CPP_JJM, CPP_LLM so we can
control the resolution from the compilation command, and automate
compilation for several resolutions.

In module yoethf_m, transform variables into named constants. So we do
not need procedure yoethf any longer.

Bug fix in program test_inter_barxy, missing calls to fyhyp and fxhyp,
and definition of rlatu.

Remove variable iecri of module conf_gcm_m. The files dyn_hist*.nc are
written every time step. We are simplifying the output system, pending
replacement by a whole new system.

Modify possible value of vert_sampling from "param" to
"strato_custom", following LMDZ. Default values of corresponding
namelist variables are now the values used for LMDZ CMIP6.

1 module physiq_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE physiq(lafin, dayvrai, time, paprs, play, pphi, pphis, u, v, t, &
8 qx, omega, d_u, d_v, d_t, d_qx)
9
10 ! From phylmd/physiq.F, version 1.22 2006/02/20 09:38:28
11 ! (subversion revision 678)
12
13 ! Author: Z. X. Li (LMD/CNRS) 1993
14
15 ! This is the main procedure for the "physics" part of the program.
16
17 use aaam_bud_m, only: aaam_bud
18 USE abort_gcm_m, ONLY: abort_gcm
19 use ajsec_m, only: ajsec
20 use calltherm_m, only: calltherm
21 USE clesphys, ONLY: cdhmax, cdmmax, ecrit_ins, ok_instan
22 USE clesphys2, ONLY: conv_emanuel, nbapp_rad, new_oliq, ok_orodr, ok_orolf
23 USE clmain_m, ONLY: clmain
24 use clouds_gno_m, only: clouds_gno
25 use comconst, only: dtphys
26 USE comgeomphy, ONLY: airephy
27 USE concvl_m, ONLY: concvl
28 USE conf_gcm_m, ONLY: lmt_pas
29 USE conf_phys_m, ONLY: conf_phys
30 use conflx_m, only: conflx
31 USE ctherm, ONLY: iflag_thermals, nsplit_thermals
32 use diagcld2_m, only: diagcld2
33 USE dimensions, ONLY: llm, nqmx
34 USE dimphy, ONLY: klon
35 USE dimsoil, ONLY: nsoilmx
36 use drag_noro_m, only: drag_noro
37 use dynetat0_m, only: day_ref, annee_ref
38 USE fcttre, ONLY: foeew
39 use fisrtilp_m, only: fisrtilp
40 USE hgardfou_m, ONLY: hgardfou
41 USE histsync_m, ONLY: histsync
42 USE histwrite_phy_m, ONLY: histwrite_phy
43 USE indicesol, ONLY: clnsurf, epsfra, is_lic, is_oce, is_sic, is_ter, &
44 nbsrf
45 USE ini_histins_m, ONLY: ini_histins, nid_ins
46 use lift_noro_m, only: lift_noro
47 use netcdf95, only: NF95_CLOSE
48 use newmicro_m, only: newmicro
49 use nr_util, only: assert
50 use nuage_m, only: nuage
51 USE orbite_m, ONLY: orbite
52 USE ozonecm_m, ONLY: ozonecm
53 USE phyetat0_m, ONLY: phyetat0
54 USE phyredem_m, ONLY: phyredem
55 USE phyredem0_m, ONLY: phyredem0
56 USE phytrac_m, ONLY: phytrac
57 use radlwsw_m, only: radlwsw
58 use yoegwd, only: sugwd
59 USE suphec_m, ONLY: rcpd, retv, rg, rlvtt, romega, rsigma, rtt, rmo3, md
60 use time_phylmdz, only: itap, increment_itap
61 use transp_m, only: transp
62 use transp_lay_m, only: transp_lay
63 use unit_nml_m, only: unit_nml
64 USE ymds2ju_m, ONLY: ymds2ju
65 USE yoethf_m, ONLY: r2es, rvtmp2
66 use zenang_m, only: zenang
67
68 logical, intent(in):: lafin ! dernier passage
69
70 integer, intent(in):: dayvrai
71 ! current day number, based at value 1 on January 1st of annee_ref
72
73 REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour
74
75 REAL, intent(in):: paprs(:, :) ! (klon, llm + 1)
76 ! pression pour chaque inter-couche, en Pa
77
78 REAL, intent(in):: play(:, :) ! (klon, llm)
79 ! pression pour le mileu de chaque couche (en Pa)
80
81 REAL, intent(in):: pphi(:, :) ! (klon, llm)
82 ! géopotentiel de chaque couche (référence sol)
83
84 REAL, intent(in):: pphis(:) ! (klon) géopotentiel du sol
85
86 REAL, intent(in):: u(:, :) ! (klon, llm)
87 ! vitesse dans la direction X (de O a E) en m / s
88
89 REAL, intent(in):: v(:, :) ! (klon, llm) vitesse Y (de S a N) en m / s
90 REAL, intent(in):: t(:, :) ! (klon, llm) temperature (K)
91
92 REAL, intent(in):: qx(:, :, :) ! (klon, llm, nqmx)
93 ! (humidit\'e sp\'ecifique et fractions massiques des autres traceurs)
94
95 REAL, intent(in):: omega(:, :) ! (klon, llm) vitesse verticale en Pa / s
96 REAL, intent(out):: d_u(:, :) ! (klon, llm) tendance physique de "u" (m s-2)
97 REAL, intent(out):: d_v(:, :) ! (klon, llm) tendance physique de "v" (m s-2)
98 REAL, intent(out):: d_t(:, :) ! (klon, llm) tendance physique de "t" (K / s)
99
100 REAL, intent(out):: d_qx(:, :, :) ! (klon, llm, nqmx)
101 ! tendance physique de "qx" (s-1)
102
103 ! Local:
104
105 LOGICAL:: firstcal = .true.
106
107 LOGICAL, PARAMETER:: ok_stratus = .FALSE.
108 ! Ajouter artificiellement les stratus
109
110 ! pour phystoke avec thermiques
111 REAL fm_therm(klon, llm + 1)
112 REAL entr_therm(klon, llm)
113 real, save:: q2(klon, llm + 1, nbsrf)
114
115 INTEGER, PARAMETER:: ivap = 1 ! indice de traceur pour vapeur d'eau
116 INTEGER, PARAMETER:: iliq = 2 ! indice de traceur pour eau liquide
117
118 REAL, save:: t_ancien(klon, llm), q_ancien(klon, llm)
119 LOGICAL, save:: ancien_ok
120
121 REAL d_t_dyn(klon, llm) ! tendance dynamique pour "t" (K / s)
122 REAL d_q_dyn(klon, llm) ! tendance dynamique pour "q" (kg / kg / s)
123
124 real da(klon, llm), phi(klon, llm, llm), mp(klon, llm)
125
126 REAL, save:: swdn0(klon, llm + 1), swdn(klon, llm + 1)
127 REAL, save:: swup0(klon, llm + 1), swup(klon, llm + 1)
128
129 REAL, save:: lwdn0(klon, llm + 1), lwdn(klon, llm + 1)
130 REAL, save:: lwup0(klon, llm + 1), lwup(klon, llm + 1)
131
132 ! prw: precipitable water
133 real prw(klon)
134
135 ! flwp, fiwp = Liquid Water Path & Ice Water Path (kg / m2)
136 ! flwc, fiwc = Liquid Water Content & Ice Water Content (kg / kg)
137 REAL flwp(klon), fiwp(klon)
138 REAL flwc(klon, llm), fiwc(klon, llm)
139
140 ! Variables propres a la physique
141
142 INTEGER, save:: radpas
143 ! Radiative transfer computations are made every "radpas" call to
144 ! "physiq".
145
146 REAL, save:: radsol(klon) ! bilan radiatif au sol calcule par code radiatif
147 REAL, save:: ftsol(klon, nbsrf) ! skin temperature of surface fraction
148
149 REAL, save:: ftsoil(klon, nsoilmx, nbsrf)
150 ! soil temperature of surface fraction
151
152 REAL, save:: fevap(klon, nbsrf) ! evaporation
153 REAL fluxlat(klon, nbsrf)
154
155 REAL, save:: fqsurf(klon, nbsrf)
156 ! humidite de l'air au contact de la surface
157
158 REAL, save:: qsol(klon) ! column-density of water in soil, in kg m-2
159 REAL, save:: fsnow(klon, nbsrf) ! \'epaisseur neigeuse
160 REAL, save:: falbe(klon, nbsrf) ! albedo visible par type de surface
161
162 ! Param\`etres de l'orographie \`a l'\'echelle sous-maille (OESM) :
163 REAL, save:: zmea(klon) ! orographie moyenne
164 REAL, save:: zstd(klon) ! deviation standard de l'OESM
165 REAL, save:: zsig(klon) ! pente de l'OESM
166 REAL, save:: zgam(klon) ! anisotropie de l'OESM
167 REAL, save:: zthe(klon) ! orientation de l'OESM
168 REAL, save:: zpic(klon) ! Maximum de l'OESM
169 REAL, save:: zval(klon) ! Minimum de l'OESM
170 REAL, save:: rugoro(klon) ! longueur de rugosite de l'OESM
171 REAL zulow(klon), zvlow(klon)
172 INTEGER ktest(klon)
173
174 REAL, save:: agesno(klon, nbsrf) ! age de la neige
175 REAL, save:: run_off_lic_0(klon)
176
177 ! Variables li\'ees \`a la convection d'Emanuel :
178 REAL, save:: Ma(klon, llm) ! undilute upward mass flux
179 REAL, save:: sig1(klon, llm), w01(klon, llm)
180
181 ! Variables pour la couche limite (Alain Lahellec) :
182 REAL cdragh(klon) ! drag coefficient pour T and Q
183 REAL cdragm(klon) ! drag coefficient pour vent
184
185 REAL coefh(klon, 2:llm) ! coef d'echange pour phytrac
186
187 REAL, save:: ffonte(klon, nbsrf)
188 ! flux thermique utilise pour fondre la neige
189
190 REAL, save:: fqcalving(klon, nbsrf)
191 ! flux d'eau "perdue" par la surface et necessaire pour limiter la
192 ! hauteur de neige, en kg / m2 / s
193
194 REAL zxffonte(klon), zxfqcalving(klon)
195
196 REAL, save:: pfrac_impa(klon, llm)! Produits des coefs lessivage impaction
197 REAL, save:: pfrac_nucl(klon, llm)! Produits des coefs lessivage nucleation
198
199 REAL, save:: pfrac_1nucl(klon, llm)
200 ! Produits des coefs lessi nucl (alpha = 1)
201
202 REAL frac_impa(klon, llm) ! fraction d'a\'erosols lessiv\'es (impaction)
203 REAL frac_nucl(klon, llm) ! idem (nucleation)
204
205 REAL, save:: rain_fall(klon)
206 ! liquid water mass flux (kg / m2 / s), positive down
207
208 REAL, save:: snow_fall(klon)
209 ! solid water mass flux (kg / m2 / s), positive down
210
211 REAL rain_tiedtke(klon), snow_tiedtke(klon)
212
213 REAL evap(klon) ! flux d'\'evaporation au sol
214 real devap(klon) ! derivative of the evaporation flux at the surface
215 REAL sens(klon) ! flux de chaleur sensible au sol
216 real dsens(klon) ! derivee du flux de chaleur sensible au sol
217 REAL, save:: dlw(klon) ! derivative of infra-red flux
218 REAL bils(klon) ! bilan de chaleur au sol
219 REAL fder(klon) ! Derive de flux (sensible et latente)
220 REAL ve(klon) ! integr. verticale du transport meri. de l'energie
221 REAL vq(klon) ! integr. verticale du transport meri. de l'eau
222 REAL ue(klon) ! integr. verticale du transport zonal de l'energie
223 REAL uq(klon) ! integr. verticale du transport zonal de l'eau
224
225 REAL, save:: frugs(klon, nbsrf) ! longueur de rugosite
226 REAL zxrugs(klon) ! longueur de rugosite
227
228 ! Conditions aux limites
229
230 INTEGER julien
231 REAL, save:: pctsrf(klon, nbsrf) ! percentage of surface
232 REAL, save:: albsol(klon) ! albedo du sol total, visible, moyen par maille
233 REAL, SAVE:: wo(klon, llm) ! column density of ozone in a cell, in kDU
234 real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2
235
236 real, save:: clwcon(klon, llm), rnebcon(klon, llm)
237 real, save:: clwcon0(klon, llm), rnebcon0(klon, llm)
238
239 REAL rhcl(klon, llm) ! humidit\'e relative ciel clair
240 REAL dialiq(klon, llm) ! eau liquide nuageuse
241 REAL diafra(klon, llm) ! fraction nuageuse
242 REAL cldliq(klon, llm) ! eau liquide nuageuse
243 REAL cldfra(klon, llm) ! fraction nuageuse
244 REAL cldtau(klon, llm) ! epaisseur optique
245 REAL cldemi(klon, llm) ! emissivite infrarouge
246
247 REAL flux_q(klon, nbsrf) ! flux turbulent d'humidite à la surface
248 REAL flux_t(klon, nbsrf) ! flux turbulent de chaleur à la surface
249
250 REAL flux_u(klon, nbsrf), flux_v(klon, nbsrf)
251 ! tension du vent (flux turbulent de vent) à la surface, en Pa
252
253 ! Le rayonnement n'est pas calcul\'e tous les pas, il faut donc que
254 ! les variables soient r\'emanentes.
255 REAL, save:: heat(klon, llm) ! chauffage solaire
256 REAL, save:: heat0(klon, llm) ! chauffage solaire ciel clair
257 REAL, save:: cool(klon, llm) ! refroidissement infrarouge
258 REAL, save:: cool0(klon, llm) ! refroidissement infrarouge ciel clair
259 REAL, save:: topsw(klon), toplw(klon), solsw(klon)
260 REAL, save:: sollw(klon) ! rayonnement infrarouge montant \`a la surface
261 real, save:: sollwdown(klon) ! downward LW flux at surface
262 REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon)
263 REAL, save:: albpla(klon)
264 REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous-surface
265 REAL fsolsw(klon, nbsrf) ! flux solaire absorb\'e pour chaque sous-surface
266
267 REAL conv_q(klon, llm) ! convergence de l'humidite (kg / kg / s)
268 REAL conv_t(klon, llm) ! convergence of temperature (K / s)
269
270 REAL cldl(klon), cldm(klon), cldh(klon) ! nuages bas, moyen et haut
271 REAL cldt(klon), cldq(klon) ! nuage total, eau liquide integree
272
273 REAL zxfluxlat(klon)
274 REAL dist, mu0(klon), fract(klon)
275 real longi
276 REAL z_avant(klon), z_apres(klon), z_factor(klon)
277 REAL zb
278 REAL zx_t, zx_qs, zcor
279 real zqsat(klon, llm)
280 INTEGER i, k, iq, nsrf
281 REAL zphi(klon, llm)
282
283 ! cf. Anne Mathieu, variables pour la couche limite atmosphérique (hbtm)
284
285 REAL, SAVE:: pblh(klon, nbsrf) ! Hauteur de couche limite
286 REAL, SAVE:: plcl(klon, nbsrf) ! Niveau de condensation de la CLA
287 REAL, SAVE:: capCL(klon, nbsrf) ! CAPE de couche limite
288 REAL, SAVE:: oliqCL(klon, nbsrf) ! eau_liqu integree de couche limite
289 REAL, SAVE:: cteiCL(klon, nbsrf) ! cloud top instab. crit. couche limite
290 REAL, SAVE:: pblt(klon, nbsrf) ! T \`a la hauteur de couche limite
291 REAL, SAVE:: therm(klon, nbsrf)
292 ! Grandeurs de sorties
293 REAL s_pblh(klon), s_lcl(klon), s_capCL(klon)
294 REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon)
295 REAL s_therm(klon)
296
297 ! Variables pour la convection de K. Emanuel :
298
299 REAL upwd(klon, llm) ! saturated updraft mass flux
300 REAL dnwd(klon, llm) ! saturated downdraft mass flux
301 REAL, save:: cape(klon)
302
303 INTEGER iflagctrl(klon) ! flag fonctionnement de convect
304
305 ! Variables du changement
306
307 ! con: convection
308 ! lsc: large scale condensation
309 ! ajs: ajustement sec
310 ! eva: \'evaporation de l'eau liquide nuageuse
311 ! vdf: vertical diffusion in boundary layer
312 REAL d_t_con(klon, llm), d_q_con(klon, llm)
313 REAL, save:: d_u_con(klon, llm), d_v_con(klon, llm)
314 REAL d_t_lsc(klon, llm), d_q_lsc(klon, llm), d_ql_lsc(klon, llm)
315 REAL d_t_ajs(klon, llm), d_q_ajs(klon, llm)
316 REAL d_u_ajs(klon, llm), d_v_ajs(klon, llm)
317 REAL rneb(klon, llm)
318
319 REAL mfu(klon, llm), mfd(klon, llm)
320 REAL pen_u(klon, llm), pen_d(klon, llm)
321 REAL pde_u(klon, llm), pde_d(klon, llm)
322 INTEGER kcbot(klon), kctop(klon), kdtop(klon)
323 REAL pmflxr(klon, llm + 1), pmflxs(klon, llm + 1)
324 REAL prfl(klon, llm + 1), psfl(klon, llm + 1)
325
326 INTEGER, save:: ibas_con(klon), itop_con(klon)
327 real ema_pct(klon) ! Emanuel pressure at cloud top, in Pa
328
329 REAL, save:: rain_con(klon)
330 real rain_lsc(klon)
331 REAL, save:: snow_con(klon) ! neige (mm / s)
332 real snow_lsc(klon)
333 REAL d_ts(klon, nbsrf) ! variation of ftsol
334
335 REAL d_u_vdf(klon, llm), d_v_vdf(klon, llm)
336 REAL d_t_vdf(klon, llm), d_q_vdf(klon, llm)
337
338 REAL d_u_oro(klon, llm), d_v_oro(klon, llm)
339 REAL d_t_oro(klon, llm)
340 REAL d_u_lif(klon, llm), d_v_lif(klon, llm)
341 REAL d_t_lif(klon, llm)
342
343 REAL, save:: ratqs(klon, llm)
344 real ratqss(klon, llm), ratqsc(klon, llm)
345 real:: ratqsbas = 0.01, ratqshaut = 0.3
346
347 ! Parametres lies au nouveau schema de nuages (SB, PDF)
348 real:: fact_cldcon = 0.375
349 real:: facttemps = 1.e-4
350 logical:: ok_newmicro = .true.
351 real facteur
352
353 integer:: iflag_cldcon = 1
354 logical ptconv(klon, llm)
355
356 ! Variables pour effectuer les appels en s\'erie :
357
358 REAL t_seri(klon, llm), q_seri(klon, llm)
359 REAL ql_seri(klon, llm)
360 REAL u_seri(klon, llm), v_seri(klon, llm)
361 REAL tr_seri(klon, llm, nqmx - 2)
362
363 REAL zx_rh(klon, llm)
364
365 REAL zustrdr(klon), zvstrdr(klon)
366 REAL zustrli(klon), zvstrli(klon)
367 REAL aam, torsfc
368
369 REAL ve_lay(klon, llm) ! transport meri. de l'energie a chaque niveau vert.
370 REAL vq_lay(klon, llm) ! transport meri. de l'eau a chaque niveau vert.
371 REAL ue_lay(klon, llm) ! transport zonal de l'energie a chaque niveau vert.
372 REAL uq_lay(klon, llm) ! transport zonal de l'eau a chaque niveau vert.
373
374 REAL tsol(klon)
375
376 REAL d_t_ec(klon, llm)
377 ! tendance due \`a la conversion d'\'energie cin\'etique en
378 ! énergie thermique
379
380 REAL, save:: t2m(klon, nbsrf), q2m(klon, nbsrf)
381 ! temperature and humidity at 2 m
382
383 REAL, save:: u10m_srf(klon, nbsrf), v10m_srf(klon, nbsrf)
384 ! composantes du vent \`a 10 m
385
386 REAL zt2m(klon), zq2m(klon) ! température, humidité 2 m moyenne sur 1 maille
387 REAL u10m(klon), v10m(klon) ! vent \`a 10 m moyenn\' sur les sous-surfaces
388
389 ! Aerosol effects:
390
391 REAL, save:: topswad(klon), solswad(klon) ! aerosol direct effect
392 LOGICAL:: ok_ade = .false. ! apply aerosol direct effect
393
394 REAL:: bl95_b0 = 2., bl95_b1 = 0.2
395 ! Parameters in equation (D) of Boucher and Lohmann (1995, Tellus
396 ! B). They link cloud droplet number concentration to aerosol mass
397 ! concentration.
398
399 real zmasse(klon, llm)
400 ! (column-density of mass of air in a cell, in kg m-2)
401
402 integer, save:: ncid_startphy
403
404 namelist /physiq_nml/ fact_cldcon, facttemps, ok_newmicro, iflag_cldcon, &
405 ratqsbas, ratqshaut, ok_ade, bl95_b0, bl95_b1, iflag_thermals, &
406 nsplit_thermals
407
408 !----------------------------------------------------------------
409
410 IF (nqmx < 2) CALL abort_gcm('physiq', &
411 'eaux vapeur et liquide sont indispensables')
412
413 test_firstcal: IF (firstcal) THEN
414 ! initialiser
415 u10m_srf = 0.
416 v10m_srf = 0.
417 t2m = 0.
418 q2m = 0.
419 ffonte = 0.
420 fqcalving = 0.
421 rain_con = 0.
422 snow_con = 0.
423 d_u_con = 0.
424 d_v_con = 0.
425 rnebcon0 = 0.
426 clwcon0 = 0.
427 rnebcon = 0.
428 clwcon = 0.
429 pblh =0. ! Hauteur de couche limite
430 plcl =0. ! Niveau de condensation de la CLA
431 capCL =0. ! CAPE de couche limite
432 oliqCL =0. ! eau_liqu integree de couche limite
433 cteiCL =0. ! cloud top instab. crit. couche limite
434 pblt =0.
435 therm =0.
436
437 iflag_thermals = 0
438 nsplit_thermals = 1
439 print *, "Enter namelist 'physiq_nml'."
440 read(unit=*, nml=physiq_nml)
441 write(unit_nml, nml=physiq_nml)
442
443 call conf_phys
444
445 ! Initialiser les compteurs:
446
447 frugs = 0.
448 CALL phyetat0(pctsrf, ftsol, ftsoil, fqsurf, qsol, fsnow, falbe, &
449 fevap, rain_fall, snow_fall, solsw, sollw, dlw, radsol, frugs, &
450 agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, t_ancien, &
451 q_ancien, ancien_ok, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, &
452 w01, ncid_startphy)
453
454 ! ATTENTION : il faudra a terme relire q2 dans l'etat initial
455 q2 = 1e-8
456
457 radpas = lmt_pas / nbapp_rad
458 print *, "radpas = ", radpas
459
460 ! Initialisation pour le sch\'ema de convection d'Emanuel :
461 IF (conv_emanuel) THEN
462 ibas_con = 1
463 itop_con = 1
464 ENDIF
465
466 IF (ok_orodr) THEN
467 rugoro = MAX(1e-5, zstd * zsig / 2)
468 CALL SUGWD(paprs, play)
469 else
470 rugoro = 0.
471 ENDIF
472
473 ecrit_ins = NINT(ecrit_ins / dtphys)
474
475 ! Initialisation des sorties
476
477 call ini_histins(dtphys, ok_newmicro)
478 CALL phyredem0
479 ENDIF test_firstcal
480
481 ! We will modify variables *_seri and we will not touch variables
482 ! u, v, t, qx:
483 t_seri = t
484 u_seri = u
485 v_seri = v
486 q_seri = qx(:, :, ivap)
487 ql_seri = qx(:, :, iliq)
488 tr_seri = qx(:, :, 3:nqmx)
489
490 tsol = sum(ftsol * pctsrf, dim = 2)
491
492 ! Diagnostic de la tendance dynamique :
493 IF (ancien_ok) THEN
494 DO k = 1, llm
495 DO i = 1, klon
496 d_t_dyn(i, k) = (t_seri(i, k) - t_ancien(i, k)) / dtphys
497 d_q_dyn(i, k) = (q_seri(i, k) - q_ancien(i, k)) / dtphys
498 ENDDO
499 ENDDO
500 ELSE
501 DO k = 1, llm
502 DO i = 1, klon
503 d_t_dyn(i, k) = 0.
504 d_q_dyn(i, k) = 0.
505 ENDDO
506 ENDDO
507 ancien_ok = .TRUE.
508 ENDIF
509
510 ! Ajouter le geopotentiel du sol:
511 DO k = 1, llm
512 DO i = 1, klon
513 zphi(i, k) = pphi(i, k) + pphis(i)
514 ENDDO
515 ENDDO
516
517 ! Check temperatures:
518 CALL hgardfou(t_seri, ftsol)
519
520 call increment_itap
521 julien = MOD(dayvrai, 360)
522 if (julien == 0) julien = 360
523
524 forall (k = 1: llm) zmasse(:, k) = (paprs(:, k) - paprs(:, k + 1)) / rg
525
526 ! \'Evaporation de l'eau liquide nuageuse :
527 DO k = 1, llm
528 DO i = 1, klon
529 zb = MAX(0., ql_seri(i, k))
530 t_seri(i, k) = t_seri(i, k) &
531 - zb * RLVTT / RCPD / (1. + RVTMP2 * q_seri(i, k))
532 q_seri(i, k) = q_seri(i, k) + zb
533 ENDDO
534 ENDDO
535 ql_seri = 0.
536
537 frugs = MAX(frugs, 0.000015)
538 zxrugs = sum(frugs * pctsrf, dim = 2)
539
540 ! Calculs n\'ecessaires au calcul de l'albedo dans l'interface avec
541 ! la surface.
542
543 CALL orbite(REAL(julien), longi, dist)
544 CALL zenang(longi, time, dtphys * radpas, mu0, fract)
545 albsol = sum(falbe * pctsrf, dim = 2)
546
547 ! R\'epartition sous maille des flux longwave et shortwave
548 ! R\'epartition du longwave par sous-surface lin\'earis\'ee
549
550 forall (nsrf = 1: nbsrf)
551 fsollw(:, nsrf) = sollw + 4. * RSIGMA * tsol**3 &
552 * (tsol - ftsol(:, nsrf))
553 fsolsw(:, nsrf) = solsw * (1. - falbe(:, nsrf)) / (1. - albsol)
554 END forall
555
556 CALL clmain(dtphys, pctsrf, t_seri, q_seri, u_seri, v_seri, julien, mu0, &
557 ftsol, cdmmax, cdhmax, ftsoil, qsol, paprs, play, fsnow, fqsurf, &
558 fevap, falbe, fluxlat, rain_fall, snow_fall, fsolsw, fsollw, frugs, &
559 agesno, rugoro, d_t_vdf, d_q_vdf, d_u_vdf, d_v_vdf, d_ts, flux_t, &
560 flux_q, flux_u, flux_v, cdragh, cdragm, q2, dsens, devap, coefh, t2m, &
561 q2m, u10m_srf, v10m_srf, pblh, capCL, oliqCL, cteiCL, pblT, therm, &
562 plcl, fqcalving, ffonte, run_off_lic_0)
563
564 ! Incr\'ementation des flux
565
566 sens = - sum(flux_t * pctsrf, dim = 2)
567 evap = - sum(flux_q * pctsrf, dim = 2)
568 fder = dlw + dsens + devap
569
570 DO k = 1, llm
571 DO i = 1, klon
572 t_seri(i, k) = t_seri(i, k) + d_t_vdf(i, k)
573 q_seri(i, k) = q_seri(i, k) + d_q_vdf(i, k)
574 u_seri(i, k) = u_seri(i, k) + d_u_vdf(i, k)
575 v_seri(i, k) = v_seri(i, k) + d_v_vdf(i, k)
576 ENDDO
577 ENDDO
578
579 ! Update surface temperature:
580
581 call assert(abs(sum(pctsrf, dim = 2) - 1.) <= EPSFRA, 'physiq: pctsrf')
582 ftsol = ftsol + d_ts
583 tsol = sum(ftsol * pctsrf, dim = 2)
584 zxfluxlat = sum(fluxlat * pctsrf, dim = 2)
585 zt2m = sum(t2m * pctsrf, dim = 2)
586 zq2m = sum(q2m * pctsrf, dim = 2)
587 u10m = sum(u10m_srf * pctsrf, dim = 2)
588 v10m = sum(v10m_srf * pctsrf, dim = 2)
589 zxffonte = sum(ffonte * pctsrf, dim = 2)
590 zxfqcalving = sum(fqcalving * pctsrf, dim = 2)
591 s_pblh = sum(pblh * pctsrf, dim = 2)
592 s_lcl = sum(plcl * pctsrf, dim = 2)
593 s_capCL = sum(capCL * pctsrf, dim = 2)
594 s_oliqCL = sum(oliqCL * pctsrf, dim = 2)
595 s_cteiCL = sum(cteiCL * pctsrf, dim = 2)
596 s_pblT = sum(pblT * pctsrf, dim = 2)
597 s_therm = sum(therm * pctsrf, dim = 2)
598
599 ! Si une sous-fraction n'existe pas, elle prend la valeur moyenne :
600 DO nsrf = 1, nbsrf
601 DO i = 1, klon
602 IF (pctsrf(i, nsrf) < epsfra) then
603 ftsol(i, nsrf) = tsol(i)
604 t2m(i, nsrf) = zt2m(i)
605 q2m(i, nsrf) = zq2m(i)
606 u10m_srf(i, nsrf) = u10m(i)
607 v10m_srf(i, nsrf) = v10m(i)
608 ffonte(i, nsrf) = zxffonte(i)
609 fqcalving(i, nsrf) = zxfqcalving(i)
610 pblh(i, nsrf) = s_pblh(i)
611 plcl(i, nsrf) = s_lcl(i)
612 capCL(i, nsrf) = s_capCL(i)
613 oliqCL(i, nsrf) = s_oliqCL(i)
614 cteiCL(i, nsrf) = s_cteiCL(i)
615 pblT(i, nsrf) = s_pblT(i)
616 therm(i, nsrf) = s_therm(i)
617 end IF
618 ENDDO
619 ENDDO
620
621 dlw = - 4. * RSIGMA * tsol**3
622
623 ! Appeler la convection
624
625 if (conv_emanuel) then
626 CALL concvl(paprs, play, t_seri, q_seri, u_seri, v_seri, sig1, w01, &
627 d_t_con, d_q_con, d_u_con, d_v_con, rain_con, ibas_con, itop_con, &
628 upwd, dnwd, Ma, cape, iflagctrl, clwcon0, pmflxr, da, phi, mp)
629 snow_con = 0.
630 mfu = upwd + dnwd
631
632 zqsat = MIN(0.5, r2es * FOEEW(t_seri, rtt >= t_seri) / play)
633 zqsat = zqsat / (1. - retv * zqsat)
634
635 ! Properties of convective clouds
636 clwcon0 = fact_cldcon * clwcon0
637 call clouds_gno(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, &
638 rnebcon0)
639
640 forall (i = 1:klon) ema_pct(i) = paprs(i, itop_con(i) + 1)
641 mfd = 0.
642 pen_u = 0.
643 pen_d = 0.
644 pde_d = 0.
645 pde_u = 0.
646 else
647 conv_q = d_q_dyn + d_q_vdf / dtphys
648 conv_t = d_t_dyn + d_t_vdf / dtphys
649 z_avant = sum((q_seri + ql_seri) * zmasse, dim=2)
650 CALL conflx(dtphys, paprs, play, t_seri(:, llm:1:- 1), &
651 q_seri(:, llm:1:- 1), conv_t, conv_q, - evap, omega, d_t_con, &
652 d_q_con, rain_con, snow_con, mfu(:, llm:1:- 1), mfd(:, llm:1:- 1), &
653 pen_u, pde_u, pen_d, pde_d, kcbot, kctop, kdtop, pmflxr, pmflxs)
654 WHERE (rain_con < 0.) rain_con = 0.
655 WHERE (snow_con < 0.) snow_con = 0.
656 ibas_con = llm + 1 - kcbot
657 itop_con = llm + 1 - kctop
658 END if
659
660 DO k = 1, llm
661 DO i = 1, klon
662 t_seri(i, k) = t_seri(i, k) + d_t_con(i, k)
663 q_seri(i, k) = q_seri(i, k) + d_q_con(i, k)
664 u_seri(i, k) = u_seri(i, k) + d_u_con(i, k)
665 v_seri(i, k) = v_seri(i, k) + d_v_con(i, k)
666 ENDDO
667 ENDDO
668
669 IF (.not. conv_emanuel) THEN
670 z_apres = sum((q_seri + ql_seri) * zmasse, dim=2)
671 z_factor = (z_avant - (rain_con + snow_con) * dtphys) / z_apres
672 DO k = 1, llm
673 DO i = 1, klon
674 IF (z_factor(i) > 1. + 1E-8 .OR. z_factor(i) < 1. - 1E-8) THEN
675 q_seri(i, k) = q_seri(i, k) * z_factor(i)
676 ENDIF
677 ENDDO
678 ENDDO
679 ENDIF
680
681 ! Convection s\`eche (thermiques ou ajustement)
682
683 d_t_ajs = 0.
684 d_u_ajs = 0.
685 d_v_ajs = 0.
686 d_q_ajs = 0.
687 fm_therm = 0.
688 entr_therm = 0.
689
690 if (iflag_thermals == 0) then
691 ! Ajustement sec
692 CALL ajsec(paprs, play, t_seri, q_seri, d_t_ajs, d_q_ajs)
693 t_seri = t_seri + d_t_ajs
694 q_seri = q_seri + d_q_ajs
695 else
696 call calltherm(dtphys, play, paprs, pphi, u_seri, v_seri, t_seri, &
697 q_seri, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm)
698 endif
699
700 ! Caclul des ratqs
701
702 if (iflag_cldcon == 1) then
703 ! ratqs convectifs \`a l'ancienne en fonction de (q(z = 0) - q) / q
704 ! on \'ecrase le tableau ratqsc calcul\'e par clouds_gno
705 do k = 1, llm
706 do i = 1, klon
707 if(ptconv(i, k)) then
708 ratqsc(i, k) = ratqsbas + fact_cldcon &
709 * (q_seri(i, 1) - q_seri(i, k)) / q_seri(i, k)
710 else
711 ratqsc(i, k) = 0.
712 endif
713 enddo
714 enddo
715 endif
716
717 ! ratqs stables
718 do k = 1, llm
719 do i = 1, klon
720 ratqss(i, k) = ratqsbas + (ratqshaut - ratqsbas) &
721 * min((paprs(i, 1) - play(i, k)) / (paprs(i, 1) - 3e4), 1.)
722 enddo
723 enddo
724
725 ! ratqs final
726 if (iflag_cldcon == 1 .or. iflag_cldcon == 2) then
727 ! les ratqs sont une conbinaison de ratqss et ratqsc
728 ! ratqs final
729 ! 1e4 (en gros 3 heures), en dur pour le moment, est le temps de
730 ! relaxation des ratqs
731 ratqs = max(ratqs * exp(- dtphys * facttemps), ratqss)
732 ratqs = max(ratqs, ratqsc)
733 else
734 ! on ne prend que le ratqs stable pour fisrtilp
735 ratqs = ratqss
736 endif
737
738 CALL fisrtilp(dtphys, paprs, play, t_seri, q_seri, ptconv, ratqs, d_t_lsc, &
739 d_q_lsc, d_ql_lsc, rneb, cldliq, rain_lsc, snow_lsc, pfrac_impa, &
740 pfrac_nucl, pfrac_1nucl, frac_impa, frac_nucl, prfl, psfl, rhcl)
741
742 WHERE (rain_lsc < 0) rain_lsc = 0.
743 WHERE (snow_lsc < 0) snow_lsc = 0.
744 DO k = 1, llm
745 DO i = 1, klon
746 t_seri(i, k) = t_seri(i, k) + d_t_lsc(i, k)
747 q_seri(i, k) = q_seri(i, k) + d_q_lsc(i, k)
748 ql_seri(i, k) = ql_seri(i, k) + d_ql_lsc(i, k)
749 cldfra(i, k) = rneb(i, k)
750 IF (.NOT.new_oliq) cldliq(i, k) = ql_seri(i, k)
751 ENDDO
752 ENDDO
753
754 ! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT
755
756 ! 1. NUAGES CONVECTIFS
757
758 IF (iflag_cldcon <= - 1) THEN
759 ! seulement pour Tiedtke
760 snow_tiedtke = 0.
761 if (iflag_cldcon == - 1) then
762 rain_tiedtke = rain_con
763 else
764 rain_tiedtke = 0.
765 do k = 1, llm
766 do i = 1, klon
767 if (d_q_con(i, k) < 0.) then
768 rain_tiedtke(i) = rain_tiedtke(i) - d_q_con(i, k) / dtphys &
769 * zmasse(i, k)
770 endif
771 enddo
772 enddo
773 endif
774
775 ! Nuages diagnostiques pour Tiedtke
776 CALL diagcld1(paprs, play, rain_tiedtke, snow_tiedtke, ibas_con, &
777 itop_con, diafra, dialiq)
778 DO k = 1, llm
779 DO i = 1, klon
780 IF (diafra(i, k) > cldfra(i, k)) THEN
781 cldliq(i, k) = dialiq(i, k)
782 cldfra(i, k) = diafra(i, k)
783 ENDIF
784 ENDDO
785 ENDDO
786 ELSE IF (iflag_cldcon == 3) THEN
787 ! On prend pour les nuages convectifs le maximum du calcul de
788 ! la convection et du calcul du pas de temps pr\'ec\'edent diminu\'e
789 ! d'un facteur facttemps.
790 facteur = dtphys * facttemps
791 do k = 1, llm
792 do i = 1, klon
793 rnebcon(i, k) = rnebcon(i, k) * facteur
794 if (rnebcon0(i, k) * clwcon0(i, k) &
795 > rnebcon(i, k) * clwcon(i, k)) then
796 rnebcon(i, k) = rnebcon0(i, k)
797 clwcon(i, k) = clwcon0(i, k)
798 endif
799 enddo
800 enddo
801
802 ! On prend la somme des fractions nuageuses et des contenus en eau
803 cldfra = min(max(cldfra, rnebcon), 1.)
804 cldliq = cldliq + rnebcon * clwcon
805 ENDIF
806
807 ! 2. Nuages stratiformes
808
809 IF (ok_stratus) THEN
810 CALL diagcld2(paprs, play, t_seri, q_seri, diafra, dialiq)
811 DO k = 1, llm
812 DO i = 1, klon
813 IF (diafra(i, k) > cldfra(i, k)) THEN
814 cldliq(i, k) = dialiq(i, k)
815 cldfra(i, k) = diafra(i, k)
816 ENDIF
817 ENDDO
818 ENDDO
819 ENDIF
820
821 ! Precipitation totale
822 DO i = 1, klon
823 rain_fall(i) = rain_con(i) + rain_lsc(i)
824 snow_fall(i) = snow_con(i) + snow_lsc(i)
825 ENDDO
826
827 ! Humidit\'e relative pour diagnostic :
828 DO k = 1, llm
829 DO i = 1, klon
830 zx_t = t_seri(i, k)
831 zx_qs = r2es * FOEEW(zx_t, rtt >= zx_t) / play(i, k)
832 zx_qs = MIN(0.5, zx_qs)
833 zcor = 1. / (1. - retv * zx_qs)
834 zx_qs = zx_qs * zcor
835 zx_rh(i, k) = q_seri(i, k) / zx_qs
836 zqsat(i, k) = zx_qs
837 ENDDO
838 ENDDO
839
840 ! Param\`etres optiques des nuages et quelques param\`etres pour
841 ! diagnostics :
842 if (ok_newmicro) then
843 CALL newmicro(paprs, play, t_seri, cldliq, cldfra, cldtau, cldemi, &
844 cldh, cldl, cldm, cldt, cldq, flwp, fiwp, flwc, fiwc)
845 else
846 CALL nuage(paprs, play, t_seri, cldliq, cldfra, cldtau, cldemi, cldh, &
847 cldl, cldm, cldt, cldq)
848 endif
849
850 IF (MOD(itap - 1, radpas) == 0) THEN
851 wo = ozonecm(REAL(julien), paprs)
852 albsol = sum(falbe * pctsrf, dim = 2)
853 CALL radlwsw(dist, mu0, fract, paprs, play, tsol, albsol, t_seri, &
854 q_seri, wo, cldfra, cldemi, cldtau, heat, heat0, cool, cool0, &
855 radsol, albpla, topsw, toplw, solsw, sollw, sollwdown, topsw0, &
856 toplw0, solsw0, sollw0, lwdn0, lwdn, lwup0, lwup, swdn0, swdn, &
857 swup0, swup, ok_ade, topswad, solswad)
858 ENDIF
859
860 ! Ajouter la tendance des rayonnements (tous les pas)
861 DO k = 1, llm
862 DO i = 1, klon
863 t_seri(i, k) = t_seri(i, k) + (heat(i, k) - cool(i, k)) * dtphys &
864 / 86400.
865 ENDDO
866 ENDDO
867
868 ! Calculer le bilan du sol et la d\'erive de temp\'erature (couplage)
869 DO i = 1, klon
870 bils(i) = radsol(i) - sens(i) + zxfluxlat(i)
871 ENDDO
872
873 ! Param\'etrisation de l'orographie \`a l'\'echelle sous-maille :
874
875 IF (ok_orodr) THEN
876 ! S\'election des points pour lesquels le sch\'ema est actif :
877 DO i = 1, klon
878 ktest(i) = 0
879 IF (zpic(i) - zmea(i) > 100. .AND. zstd(i) > 10.) THEN
880 ktest(i) = 1
881 ENDIF
882 ENDDO
883
884 CALL drag_noro(dtphys, paprs, play, zmea, zstd, zsig, zgam, zthe, &
885 zpic, zval, ktest, t_seri, u_seri, v_seri, zulow, zvlow, zustrdr, &
886 zvstrdr, d_t_oro, d_u_oro, d_v_oro)
887
888 ! ajout des tendances
889 DO k = 1, llm
890 DO i = 1, klon
891 t_seri(i, k) = t_seri(i, k) + d_t_oro(i, k)
892 u_seri(i, k) = u_seri(i, k) + d_u_oro(i, k)
893 v_seri(i, k) = v_seri(i, k) + d_v_oro(i, k)
894 ENDDO
895 ENDDO
896 ENDIF
897
898 IF (ok_orolf) THEN
899 ! S\'election des points pour lesquels le sch\'ema est actif :
900 DO i = 1, klon
901 ktest(i) = 0
902 IF (zpic(i) - zmea(i) > 100.) THEN
903 ktest(i) = 1
904 ENDIF
905 ENDDO
906
907 CALL lift_noro(dtphys, paprs, play, zmea, zstd, zpic, ktest, t_seri, &
908 u_seri, v_seri, zulow, zvlow, zustrli, zvstrli, d_t_lif, &
909 d_u_lif, d_v_lif)
910
911 ! Ajout des tendances :
912 DO k = 1, llm
913 DO i = 1, klon
914 t_seri(i, k) = t_seri(i, k) + d_t_lif(i, k)
915 u_seri(i, k) = u_seri(i, k) + d_u_lif(i, k)
916 v_seri(i, k) = v_seri(i, k) + d_v_lif(i, k)
917 ENDDO
918 ENDDO
919 ENDIF
920
921 CALL aaam_bud(rg, romega, pphis, zustrdr, zustrli, &
922 sum((u_seri - u) / dtphys * zmasse, dim = 2), zvstrdr, &
923 zvstrli, sum((v_seri - v) / dtphys * zmasse, dim = 2), paprs, u, v, &
924 aam, torsfc)
925
926 ! Calcul des tendances traceurs
927 call phytrac(julien, time, firstcal, lafin, dtphys, t, paprs, play, mfu, &
928 mfd, pde_u, pen_d, coefh, cdragh, fm_therm, entr_therm, u(:, 1), &
929 v(:, 1), ftsol, pctsrf, frac_impa, frac_nucl, da, phi, mp, upwd, &
930 dnwd, tr_seri, zmasse, ncid_startphy)
931
932 ! Calculer le transport de l'eau et de l'energie (diagnostique)
933 CALL transp(paprs, t_seri, q_seri, u_seri, v_seri, zphi, ve, vq, ue, uq)
934
935 ! diag. bilKP
936
937 CALL transp_lay(paprs, t_seri, q_seri, u_seri, v_seri, zphi, &
938 ve_lay, vq_lay, ue_lay, uq_lay)
939
940 ! Accumuler les variables a stocker dans les fichiers histoire:
941
942 ! conversion Ec en énergie thermique
943 DO k = 1, llm
944 DO i = 1, klon
945 d_t_ec(i, k) = 0.5 / (RCPD * (1. + RVTMP2 * q_seri(i, k))) &
946 * (u(i, k)**2 + v(i, k)**2 - u_seri(i, k)**2 - v_seri(i, k)**2)
947 t_seri(i, k) = t_seri(i, k) + d_t_ec(i, k)
948 d_t_ec(i, k) = d_t_ec(i, k) / dtphys
949 END DO
950 END DO
951
952 ! SORTIES
953
954 ! prw = eau precipitable
955 DO i = 1, klon
956 prw(i) = 0.
957 DO k = 1, llm
958 prw(i) = prw(i) + q_seri(i, k) * zmasse(i, k)
959 ENDDO
960 ENDDO
961
962 ! Convertir les incrementations en tendances
963
964 DO k = 1, llm
965 DO i = 1, klon
966 d_u(i, k) = (u_seri(i, k) - u(i, k)) / dtphys
967 d_v(i, k) = (v_seri(i, k) - v(i, k)) / dtphys
968 d_t(i, k) = (t_seri(i, k) - t(i, k)) / dtphys
969 d_qx(i, k, ivap) = (q_seri(i, k) - qx(i, k, ivap)) / dtphys
970 d_qx(i, k, iliq) = (ql_seri(i, k) - qx(i, k, iliq)) / dtphys
971 ENDDO
972 ENDDO
973
974 DO iq = 3, nqmx
975 DO k = 1, llm
976 DO i = 1, klon
977 d_qx(i, k, iq) = (tr_seri(i, k, iq - 2) - qx(i, k, iq)) / dtphys
978 ENDDO
979 ENDDO
980 ENDDO
981
982 ! Sauvegarder les valeurs de t et q a la fin de la physique:
983 DO k = 1, llm
984 DO i = 1, klon
985 t_ancien(i, k) = t_seri(i, k)
986 q_ancien(i, k) = q_seri(i, k)
987 ENDDO
988 ENDDO
989
990 CALL histwrite_phy("phis", pphis)
991 CALL histwrite_phy("aire", airephy)
992 CALL histwrite_phy("psol", paprs(:, 1))
993 CALL histwrite_phy("precip", rain_fall + snow_fall)
994 CALL histwrite_phy("plul", rain_lsc + snow_lsc)
995 CALL histwrite_phy("pluc", rain_con + snow_con)
996 CALL histwrite_phy("tsol", tsol)
997 CALL histwrite_phy("t2m", zt2m)
998 CALL histwrite_phy("q2m", zq2m)
999 CALL histwrite_phy("u10m", u10m)
1000 CALL histwrite_phy("v10m", v10m)
1001 CALL histwrite_phy("snow", snow_fall)
1002 CALL histwrite_phy("cdrm", cdragm)
1003 CALL histwrite_phy("cdrh", cdragh)
1004 CALL histwrite_phy("topl", toplw)
1005 CALL histwrite_phy("evap", evap)
1006 CALL histwrite_phy("sols", solsw)
1007 CALL histwrite_phy("soll", sollw)
1008 CALL histwrite_phy("solldown", sollwdown)
1009 CALL histwrite_phy("bils", bils)
1010 CALL histwrite_phy("sens", - sens)
1011 CALL histwrite_phy("fder", fder)
1012 CALL histwrite_phy("dtsvdfo", d_ts(:, is_oce))
1013 CALL histwrite_phy("dtsvdft", d_ts(:, is_ter))
1014 CALL histwrite_phy("dtsvdfg", d_ts(:, is_lic))
1015 CALL histwrite_phy("dtsvdfi", d_ts(:, is_sic))
1016
1017 DO nsrf = 1, nbsrf
1018 CALL histwrite_phy("pourc_"//clnsurf(nsrf), pctsrf(:, nsrf) * 100.)
1019 CALL histwrite_phy("fract_"//clnsurf(nsrf), pctsrf(:, nsrf))
1020 CALL histwrite_phy("sens_"//clnsurf(nsrf), flux_t(:, nsrf))
1021 CALL histwrite_phy("lat_"//clnsurf(nsrf), fluxlat(:, nsrf))
1022 CALL histwrite_phy("tsol_"//clnsurf(nsrf), ftsol(:, nsrf))
1023 CALL histwrite_phy("taux_"//clnsurf(nsrf), flux_u(:, nsrf))
1024 CALL histwrite_phy("tauy_"//clnsurf(nsrf), flux_v(:, nsrf))
1025 CALL histwrite_phy("rugs_"//clnsurf(nsrf), frugs(:, nsrf))
1026 CALL histwrite_phy("albe_"//clnsurf(nsrf), falbe(:, nsrf))
1027 CALL histwrite_phy("u10m_"//clnsurf(nsrf), u10m_srf(:, nsrf))
1028 CALL histwrite_phy("v10m_"//clnsurf(nsrf), v10m_srf(:, nsrf))
1029 END DO
1030
1031 CALL histwrite_phy("albs", albsol)
1032 CALL histwrite_phy("tro3", wo * dobson_u * 1e3 / zmasse / rmo3 * md)
1033 CALL histwrite_phy("rugs", zxrugs)
1034 CALL histwrite_phy("s_pblh", s_pblh)
1035 CALL histwrite_phy("s_pblt", s_pblt)
1036 CALL histwrite_phy("s_lcl", s_lcl)
1037 CALL histwrite_phy("s_capCL", s_capCL)
1038 CALL histwrite_phy("s_oliqCL", s_oliqCL)
1039 CALL histwrite_phy("s_cteiCL", s_cteiCL)
1040 CALL histwrite_phy("s_therm", s_therm)
1041
1042 if (conv_emanuel) then
1043 CALL histwrite_phy("ptop", ema_pct)
1044 CALL histwrite_phy("dnwd0", - mp)
1045 end if
1046
1047 CALL histwrite_phy("temp", t_seri)
1048 CALL histwrite_phy("vitu", u_seri)
1049 CALL histwrite_phy("vitv", v_seri)
1050 CALL histwrite_phy("geop", zphi)
1051 CALL histwrite_phy("pres", play)
1052 CALL histwrite_phy("dtvdf", d_t_vdf)
1053 CALL histwrite_phy("dqvdf", d_q_vdf)
1054 CALL histwrite_phy("rhum", zx_rh)
1055 CALL histwrite_phy("d_t_ec", d_t_ec)
1056 CALL histwrite_phy("dtsw0", heat0 / 86400.)
1057 CALL histwrite_phy("dtlw0", - cool0 / 86400.)
1058 CALL histwrite_phy("msnow", sum(fsnow * pctsrf, dim = 2))
1059 call histwrite_phy("qsurf", sum(fqsurf * pctsrf, dim = 2))
1060
1061 if (ok_instan) call histsync(nid_ins)
1062
1063 IF (lafin) then
1064 call NF95_CLOSE(ncid_startphy)
1065 CALL phyredem(pctsrf, ftsol, ftsoil, fqsurf, qsol, &
1066 fsnow, falbe, fevap, rain_fall, snow_fall, solsw, sollw, dlw, &
1067 radsol, frugs, agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, &
1068 t_ancien, q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, &
1069 w01)
1070 end IF
1071
1072 firstcal = .FALSE.
1073
1074 END SUBROUTINE physiq
1075
1076 end module physiq_m

  ViewVC Help
Powered by ViewVC 1.1.21