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

Contents of /trunk/Sources/phylmd/physiq.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 97 - (show annotations)
Fri Apr 25 14:58:31 2014 UTC (10 years, 1 month ago) by guez
Original Path: trunk/phylmd/physiq.f
File size: 65089 byte(s)
Module pressure_var is now only used in gcm. Created local variables
pls and p3d in etat0, added argument p3d to regr_pr_o3.

In leapfrog, moved computation of p3d and exner function immediately
after integrd, for clarity (does not change the execution).

Removed unused arguments: ntra, tra1 and tra of cv3_compress; ntra,
tra and traent of cv3_mixing; ntra, ftra, ftra1 of cv3_uncompress;
ntra, tra, trap of cv3_unsat; ntra, tra, trap, traent, ftra of
cv3_yield; tra, tvp, pbase, bbase, dtvpdt1, dtvpdq1, dplcldt,
dplcldr, ntra of concvl; ndp1, ntra, tra1 of cv_driver

Removed argument d_tra and computation of d_tra in concvl. Removed
argument ftra1 and computation of ftra1 in cv_driver. ftra1 was just
set to 0 in cv_driver, associated to d_tra in concvl, and set again to
zero in concvl.

1 module physiq_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE physiq(lafin, rdayvrai, time, dtphys, paprs, play, pphi, pphis, &
8 u, v, t, 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 aeropt_m, only: aeropt
20 use ajsec_m, only: ajsec
21 use calltherm_m, only: calltherm
22 USE clesphys, ONLY: cdhmax, cdmmax, co2_ppm, ecrit_hf, ecrit_ins, &
23 ecrit_mth, ecrit_reg, ecrit_tra, ksta, ksta_ter, ok_kzmin
24 USE clesphys2, ONLY: cycle_diurne, iflag_con, nbapp_rad, new_oliq, &
25 ok_orodr, ok_orolf, soil_model
26 USE clmain_m, ONLY: clmain
27 use clouds_gno_m, only: clouds_gno
28 USE comgeomphy, ONLY: airephy, cuphy, cvphy
29 USE concvl_m, ONLY: concvl
30 USE conf_gcm_m, ONLY: offline, raz_date
31 USE conf_phys_m, ONLY: conf_phys
32 use conflx_m, only: conflx
33 USE ctherm, ONLY: iflag_thermals, nsplit_thermals
34 use diagcld2_m, only: diagcld2
35 use diagetpq_m, only: diagetpq
36 use diagphy_m, only: diagphy
37 USE dimens_m, ONLY: llm, nqmx
38 USE dimphy, ONLY: klon, nbtr
39 USE dimsoil, ONLY: nsoilmx
40 use drag_noro_m, only: drag_noro
41 USE fcttre, ONLY: foeew, qsatl, qsats, thermcep
42 use fisrtilp_m, only: fisrtilp
43 USE hgardfou_m, ONLY: hgardfou
44 USE indicesol, ONLY: clnsurf, epsfra, is_lic, is_oce, is_sic, is_ter, &
45 nbsrf
46 USE ini_histins_m, ONLY: ini_histins
47 use newmicro_m, only: newmicro
48 USE oasis_m, ONLY: ok_oasis
49 USE orbite_m, ONLY: orbite, zenang
50 USE ozonecm_m, ONLY: ozonecm
51 USE phyetat0_m, ONLY: phyetat0, rlat, rlon
52 USE phyredem_m, ONLY: phyredem
53 USE phystokenc_m, ONLY: phystokenc
54 USE phytrac_m, ONLY: phytrac
55 USE qcheck_m, ONLY: qcheck
56 use radlwsw_m, only: radlwsw
57 use readsulfate_m, only: readsulfate
58 use sugwd_m, only: sugwd
59 USE suphec_m, ONLY: ra, rcpd, retv, rg, rlvtt, romega, rsigma, rtt
60 USE temps, ONLY: annee_ref, day_ref, itau_phy
61 use unit_nml_m, only: unit_nml
62 USE ymds2ju_m, ONLY: ymds2ju
63 USE yoethf_m, ONLY: r2es, rvtmp2
64
65 logical, intent(in):: lafin ! dernier passage
66
67 REAL, intent(in):: rdayvrai
68 ! (elapsed time since January 1st 0h of the starting year, in days)
69
70 REAL, intent(in):: time ! heure de la journ\'ee en fraction de jour
71 REAL, intent(in):: dtphys ! pas d'integration pour la physique (seconde)
72
73 REAL, intent(in):: paprs(klon, llm + 1)
74 ! (pression pour chaque inter-couche, en Pa)
75
76 REAL, intent(in):: play(klon, llm)
77 ! (input pression pour le mileu de chaque couche (en Pa))
78
79 REAL, intent(in):: pphi(klon, llm)
80 ! géopotentiel de chaque couche (référence sol)
81
82 REAL, intent(in):: pphis(klon) ! géopotentiel du sol
83
84 REAL, intent(in):: u(klon, llm)
85 ! vitesse dans la direction X (de O a E) en m/s
86
87 REAL, intent(in):: v(klon, llm) ! vitesse Y (de S a N) en m/s
88 REAL, intent(in):: t(klon, llm) ! input temperature (K)
89
90 REAL, intent(in):: qx(klon, llm, nqmx)
91 ! (humidit\'e sp\'ecifique et fractions massiques des autres traceurs)
92
93 REAL, intent(in):: omega(klon, llm) ! vitesse verticale en Pa/s
94 REAL, intent(out):: d_u(klon, llm) ! tendance physique de "u" (m s-2)
95 REAL, intent(out):: d_v(klon, llm) ! tendance physique de "v" (m s-2)
96 REAL, intent(out):: d_t(klon, llm) ! tendance physique de "t" (K/s)
97 REAL, intent(out):: d_qx(klon, llm, nqmx) ! tendance physique de "qx" (s-1)
98
99 ! Local:
100
101 LOGICAL:: firstcal = .true.
102
103 INTEGER nbteta
104 PARAMETER(nbteta = 3)
105
106 LOGICAL ok_gust ! pour activer l'effet des gust sur flux surface
107 PARAMETER (ok_gust = .FALSE.)
108
109 LOGICAL check ! Verifier la conservation du modele en eau
110 PARAMETER (check = .FALSE.)
111
112 LOGICAL, PARAMETER:: ok_stratus = .FALSE.
113 ! Ajouter artificiellement les stratus
114
115 ! Parametres lies au coupleur OASIS:
116 INTEGER, SAVE:: npas, nexca
117 logical rnpb
118 parameter(rnpb = .true.)
119
120 character(len = 6):: ocean = 'force '
121 ! (type de mod\`ele oc\'ean \`a utiliser: "force" ou "slab" mais
122 ! pas "couple")
123
124 ! "slab" ocean
125 REAL, save:: tslab(klon) ! temperature of ocean slab
126 REAL, save:: seaice(klon) ! glace de mer (kg/m2)
127 REAL fluxo(klon) ! flux turbulents ocean-glace de mer
128 REAL fluxg(klon) ! flux turbulents ocean-atmosphere
129
130 ! Modele thermique du sol, a activer pour le cycle diurne:
131 logical:: ok_veget = .false. ! type de modele de vegetation utilise
132
133 logical:: ok_journe = .false., ok_mensuel = .true., ok_instan = .false.
134 ! sorties journalieres, mensuelles et instantanees dans les
135 ! fichiers histday, histmth et histins
136
137 LOGICAL ok_region ! sortir le fichier regional
138 PARAMETER (ok_region = .FALSE.)
139
140 ! pour phsystoke avec thermiques
141 REAL fm_therm(klon, llm + 1)
142 REAL entr_therm(klon, llm)
143 real, save:: q2(klon, llm + 1, nbsrf)
144
145 INTEGER ivap ! indice de traceurs pour vapeur d'eau
146 PARAMETER (ivap = 1)
147 INTEGER iliq ! indice de traceurs pour eau liquide
148 PARAMETER (iliq = 2)
149
150 REAL, save:: t_ancien(klon, llm), q_ancien(klon, llm)
151 LOGICAL, save:: ancien_ok
152
153 REAL d_t_dyn(klon, llm) ! tendance dynamique pour "t" (K/s)
154 REAL d_q_dyn(klon, llm) ! tendance dynamique pour "q" (kg/kg/s)
155
156 real da(klon, llm), phi(klon, llm, llm), mp(klon, llm)
157
158 ! Amip2 PV a theta constante
159
160 CHARACTER(LEN = 3) ctetaSTD(nbteta)
161 DATA ctetaSTD/'350', '380', '405'/
162 REAL rtetaSTD(nbteta)
163 DATA rtetaSTD/350., 380., 405./
164
165 ! Amip2 PV a theta constante
166
167 REAL swdn0(klon, llm + 1), swdn(klon, llm + 1)
168 REAL swup0(klon, llm + 1), swup(klon, llm + 1)
169 SAVE swdn0, swdn, swup0, swup
170
171 REAL lwdn0(klon, llm + 1), lwdn(klon, llm + 1)
172 REAL lwup0(klon, llm + 1), lwup(klon, llm + 1)
173 SAVE lwdn0, lwdn, lwup0, lwup
174
175 ! Amip2
176 ! variables a une pression donnee
177
178 integer nlevSTD
179 PARAMETER(nlevSTD = 17)
180 real rlevSTD(nlevSTD)
181 DATA rlevSTD/100000., 92500., 85000., 70000., &
182 60000., 50000., 40000., 30000., 25000., 20000., &
183 15000., 10000., 7000., 5000., 3000., 2000., 1000./
184 CHARACTER(LEN = 4) clevSTD(nlevSTD)
185 DATA clevSTD/'1000', '925 ', '850 ', '700 ', '600 ', &
186 '500 ', '400 ', '300 ', '250 ', '200 ', '150 ', '100 ', &
187 '70 ', '50 ', '30 ', '20 ', '10 '/
188
189 ! prw: precipitable water
190 real prw(klon)
191
192 ! flwp, fiwp = Liquid Water Path & Ice Water Path (kg/m2)
193 ! flwc, fiwc = Liquid Water Content & Ice Water Content (kg/kg)
194 REAL flwp(klon), fiwp(klon)
195 REAL flwc(klon, llm), fiwc(klon, llm)
196
197 INTEGER kmax, lmax
198 PARAMETER(kmax = 8, lmax = 8)
199 INTEGER kmaxm1, lmaxm1
200 PARAMETER(kmaxm1 = kmax-1, lmaxm1 = lmax-1)
201
202 REAL zx_tau(kmaxm1), zx_pc(lmaxm1)
203 DATA zx_tau/0., 0.3, 1.3, 3.6, 9.4, 23., 60./
204 DATA zx_pc/50., 180., 310., 440., 560., 680., 800./
205
206 ! cldtopres pression au sommet des nuages
207 REAL cldtopres(lmaxm1)
208 DATA cldtopres/50., 180., 310., 440., 560., 680., 800./
209
210 ! taulev: numero du niveau de tau dans les sorties ISCCP
211 CHARACTER(LEN = 4) taulev(kmaxm1)
212
213 DATA taulev/'tau0', 'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'/
214 CHARACTER(LEN = 3) pclev(lmaxm1)
215 DATA pclev/'pc1', 'pc2', 'pc3', 'pc4', 'pc5', 'pc6', 'pc7'/
216
217 CHARACTER(LEN = 28) cnameisccp(lmaxm1, kmaxm1)
218 DATA cnameisccp/'pc< 50hPa, tau< 0.3', 'pc= 50-180hPa, tau< 0.3', &
219 'pc= 180-310hPa, tau< 0.3', 'pc= 310-440hPa, tau< 0.3', &
220 'pc= 440-560hPa, tau< 0.3', 'pc= 560-680hPa, tau< 0.3', &
221 'pc= 680-800hPa, tau< 0.3', 'pc< 50hPa, tau= 0.3-1.3', &
222 'pc= 50-180hPa, tau= 0.3-1.3', 'pc= 180-310hPa, tau= 0.3-1.3', &
223 'pc= 310-440hPa, tau= 0.3-1.3', 'pc= 440-560hPa, tau= 0.3-1.3', &
224 'pc= 560-680hPa, tau= 0.3-1.3', 'pc= 680-800hPa, tau= 0.3-1.3', &
225 'pc< 50hPa, tau= 1.3-3.6', 'pc= 50-180hPa, tau= 1.3-3.6', &
226 'pc= 180-310hPa, tau= 1.3-3.6', 'pc= 310-440hPa, tau= 1.3-3.6', &
227 'pc= 440-560hPa, tau= 1.3-3.6', 'pc= 560-680hPa, tau= 1.3-3.6', &
228 'pc= 680-800hPa, tau= 1.3-3.6', 'pc< 50hPa, tau= 3.6-9.4', &
229 'pc= 50-180hPa, tau= 3.6-9.4', 'pc= 180-310hPa, tau= 3.6-9.4', &
230 'pc= 310-440hPa, tau= 3.6-9.4', 'pc= 440-560hPa, tau= 3.6-9.4', &
231 'pc= 560-680hPa, tau= 3.6-9.4', 'pc= 680-800hPa, tau= 3.6-9.4', &
232 'pc< 50hPa, tau= 9.4-23', 'pc= 50-180hPa, tau= 9.4-23', &
233 'pc= 180-310hPa, tau= 9.4-23', 'pc= 310-440hPa, tau= 9.4-23', &
234 'pc= 440-560hPa, tau= 9.4-23', 'pc= 560-680hPa, tau= 9.4-23', &
235 'pc= 680-800hPa, tau= 9.4-23', 'pc< 50hPa, tau= 23-60', &
236 'pc= 50-180hPa, tau= 23-60', 'pc= 180-310hPa, tau= 23-60', &
237 'pc= 310-440hPa, tau= 23-60', 'pc= 440-560hPa, tau= 23-60', &
238 'pc= 560-680hPa, tau= 23-60', 'pc= 680-800hPa, tau= 23-60', &
239 'pc< 50hPa, tau> 60.', 'pc= 50-180hPa, tau> 60.', &
240 'pc= 180-310hPa, tau> 60.', 'pc= 310-440hPa, tau> 60.', &
241 'pc= 440-560hPa, tau> 60.', 'pc= 560-680hPa, tau> 60.', &
242 'pc= 680-800hPa, tau> 60.'/
243
244 ! ISCCP simulator v3.4
245
246 ! Variables propres a la physique
247
248 INTEGER, save:: radpas
249 ! (Radiative transfer computations are made every "radpas" call to
250 ! "physiq".)
251
252 REAL radsol(klon)
253 SAVE radsol ! bilan radiatif au sol calcule par code radiatif
254
255 INTEGER, SAVE:: itap ! number of calls to "physiq"
256
257 REAL, save:: ftsol(klon, nbsrf) ! skin temperature of surface fraction
258
259 REAL, save:: ftsoil(klon, nsoilmx, nbsrf)
260 ! soil temperature of surface fraction
261
262 REAL, save:: fevap(klon, nbsrf) ! evaporation
263 REAL fluxlat(klon, nbsrf)
264 SAVE fluxlat
265
266 REAL fqsurf(klon, nbsrf)
267 SAVE fqsurf ! humidite de l'air au contact de la surface
268
269 REAL, save:: qsol(klon) ! hauteur d'eau dans le sol
270
271 REAL fsnow(klon, nbsrf)
272 SAVE fsnow ! epaisseur neigeuse
273
274 REAL falbe(klon, nbsrf)
275 SAVE falbe ! albedo par type de surface
276 REAL falblw(klon, nbsrf)
277 SAVE falblw ! albedo par type de surface
278
279 ! Param\`etres de l'orographie \`a l'\'echelle sous-maille (OESM) :
280 REAL, save:: zmea(klon) ! orographie moyenne
281 REAL, save:: zstd(klon) ! deviation standard de l'OESM
282 REAL, save:: zsig(klon) ! pente de l'OESM
283 REAL, save:: zgam(klon) ! anisotropie de l'OESM
284 REAL, save:: zthe(klon) ! orientation de l'OESM
285 REAL, save:: zpic(klon) ! Maximum de l'OESM
286 REAL, save:: zval(klon) ! Minimum de l'OESM
287 REAL, save:: rugoro(klon) ! longueur de rugosite de l'OESM
288
289 REAL zulow(klon), zvlow(klon)
290
291 INTEGER igwd, idx(klon), itest(klon)
292
293 REAL agesno(klon, nbsrf)
294 SAVE agesno ! age de la neige
295
296 REAL run_off_lic_0(klon)
297 SAVE run_off_lic_0
298 !KE43
299 ! Variables liees a la convection de K. Emanuel (sb):
300
301 REAL Ma(klon, llm) ! undilute upward mass flux
302 SAVE Ma
303 REAL qcondc(klon, llm) ! in-cld water content from convect
304 SAVE qcondc
305 REAL, save:: sig1(klon, llm), w01(klon, llm)
306 REAL, save:: wd(klon)
307
308 ! Variables locales pour la couche limite (al1):
309
310 ! Variables locales:
311
312 REAL cdragh(klon) ! drag coefficient pour T and Q
313 REAL cdragm(klon) ! drag coefficient pour vent
314
315 ! Pour phytrac :
316 REAL ycoefh(klon, llm) ! coef d'echange pour phytrac
317 REAL yu1(klon) ! vents dans la premiere couche U
318 REAL yv1(klon) ! vents dans la premiere couche V
319 REAL ffonte(klon, nbsrf) !Flux thermique utilise pour fondre la neige
320 REAL fqcalving(klon, nbsrf) !Flux d'eau "perdue" par la surface
321 ! !et necessaire pour limiter la
322 ! !hauteur de neige, en kg/m2/s
323 REAL zxffonte(klon), zxfqcalving(klon)
324
325 REAL pfrac_impa(klon, llm)! Produits des coefs lessivage impaction
326 save pfrac_impa
327 REAL pfrac_nucl(klon, llm)! Produits des coefs lessivage nucleation
328 save pfrac_nucl
329 REAL pfrac_1nucl(klon, llm)! Produits des coefs lessi nucl (alpha = 1)
330 save pfrac_1nucl
331 REAL frac_impa(klon, llm) ! fractions d'aerosols lessivees (impaction)
332 REAL frac_nucl(klon, llm) ! idem (nucleation)
333
334 REAL, save:: rain_fall(klon) ! pluie
335 REAL, save:: snow_fall(klon) ! neige
336
337 REAL rain_tiedtke(klon), snow_tiedtke(klon)
338
339 REAL evap(klon), devap(klon) ! evaporation and its derivative
340 REAL sens(klon), dsens(klon) ! chaleur sensible et sa derivee
341 REAL dlw(klon) ! derivee infra rouge
342 SAVE dlw
343 REAL bils(klon) ! bilan de chaleur au sol
344 REAL fder(klon) ! Derive de flux (sensible et latente)
345 save fder
346 REAL ve(klon) ! integr. verticale du transport meri. de l'energie
347 REAL vq(klon) ! integr. verticale du transport meri. de l'eau
348 REAL ue(klon) ! integr. verticale du transport zonal de l'energie
349 REAL uq(klon) ! integr. verticale du transport zonal de l'eau
350
351 REAL frugs(klon, nbsrf) ! longueur de rugosite
352 save frugs
353 REAL zxrugs(klon) ! longueur de rugosite
354
355 ! Conditions aux limites
356
357 INTEGER julien
358
359 INTEGER, SAVE:: lmt_pas ! number of time steps of "physics" per day
360 REAL, save:: pctsrf(klon, nbsrf) ! percentage of surface
361 REAL pctsrf_new(klon, nbsrf) ! pourcentage surfaces issus d'ORCHIDEE
362
363 REAL albsol(klon)
364 SAVE albsol ! albedo du sol total
365 REAL albsollw(klon)
366 SAVE albsollw ! albedo du sol total
367
368 REAL, SAVE:: wo(klon, llm) ! column density of ozone in a cell, in kDU
369
370 ! Declaration des procedures appelees
371
372 EXTERNAL nuage ! calculer les proprietes radiatives
373 EXTERNAL transp ! transport total de l'eau et de l'energie
374
375 ! Variables locales
376
377 real, save:: clwcon(klon, llm), rnebcon(klon, llm)
378 real, save:: clwcon0(klon, llm), rnebcon0(klon, llm)
379
380 REAL rhcl(klon, llm) ! humiditi relative ciel clair
381 REAL dialiq(klon, llm) ! eau liquide nuageuse
382 REAL diafra(klon, llm) ! fraction nuageuse
383 REAL cldliq(klon, llm) ! eau liquide nuageuse
384 REAL cldfra(klon, llm) ! fraction nuageuse
385 REAL cldtau(klon, llm) ! epaisseur optique
386 REAL cldemi(klon, llm) ! emissivite infrarouge
387
388 REAL fluxq(klon, llm, nbsrf) ! flux turbulent d'humidite
389 REAL fluxt(klon, llm, nbsrf) ! flux turbulent de chaleur
390 REAL fluxu(klon, llm, nbsrf) ! flux turbulent de vitesse u
391 REAL fluxv(klon, llm, nbsrf) ! flux turbulent de vitesse v
392
393 REAL zxfluxt(klon, llm)
394 REAL zxfluxq(klon, llm)
395 REAL zxfluxu(klon, llm)
396 REAL zxfluxv(klon, llm)
397
398 ! Le rayonnement n'est pas calcul\'e tous les pas, il faut donc que
399 ! les variables soient r\'emanentes.
400 REAL, save:: heat(klon, llm) ! chauffage solaire
401 REAL heat0(klon, llm) ! chauffage solaire ciel clair
402 REAL, save:: cool(klon, llm) ! refroidissement infrarouge
403 REAL cool0(klon, llm) ! refroidissement infrarouge ciel clair
404 REAL, save:: topsw(klon), toplw(klon), solsw(klon)
405 REAL, save:: sollw(klon) ! rayonnement infrarouge montant \`a la surface
406 real, save:: sollwdown(klon) ! downward LW flux at surface
407 REAL, save:: topsw0(klon), toplw0(klon), solsw0(klon), sollw0(klon)
408 REAL albpla(klon)
409 REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous surface
410 REAL fsolsw(klon, nbsrf) ! flux solaire absorb. pour chaque sous surface
411 SAVE albpla
412 SAVE heat0, cool0
413
414 INTEGER itaprad
415 SAVE itaprad
416
417 REAL conv_q(klon, llm) ! convergence de l'humidite (kg/kg/s)
418 REAL conv_t(klon, llm) ! convergence of temperature (K/s)
419
420 REAL cldl(klon), cldm(klon), cldh(klon) !nuages bas, moyen et haut
421 REAL cldt(klon), cldq(klon) !nuage total, eau liquide integree
422
423 REAL zxtsol(klon), zxqsurf(klon), zxsnow(klon), zxfluxlat(klon)
424
425 REAL dist, rmu0(klon), fract(klon)
426 REAL zdtime ! pas de temps du rayonnement (s)
427 real zlongi
428 REAL z_avant(klon), z_apres(klon), z_factor(klon)
429 REAL za, zb
430 REAL zx_t, zx_qs, zdelta, zcor
431 real zqsat(klon, llm)
432 INTEGER i, k, iq, nsrf
433 REAL, PARAMETER:: t_coup = 234.
434 REAL zphi(klon, llm)
435
436 ! cf. AM Variables locales pour la CLA (hbtm2)
437
438 REAL, SAVE:: pblh(klon, nbsrf) ! Hauteur de couche limite
439 REAL, SAVE:: plcl(klon, nbsrf) ! Niveau de condensation de la CLA
440 REAL, SAVE:: capCL(klon, nbsrf) ! CAPE de couche limite
441 REAL, SAVE:: oliqCL(klon, nbsrf) ! eau_liqu integree de couche limite
442 REAL, SAVE:: cteiCL(klon, nbsrf) ! cloud top instab. crit. couche limite
443 REAL, SAVE:: pblt(klon, nbsrf) ! T a la Hauteur de couche limite
444 REAL, SAVE:: therm(klon, nbsrf)
445 REAL, SAVE:: trmb1(klon, nbsrf) ! deep_cape
446 REAL, SAVE:: trmb2(klon, nbsrf) ! inhibition
447 REAL, SAVE:: trmb3(klon, nbsrf) ! Point Omega
448 ! Grdeurs de sorties
449 REAL s_pblh(klon), s_lcl(klon), s_capCL(klon)
450 REAL s_oliqCL(klon), s_cteiCL(klon), s_pblt(klon)
451 REAL s_therm(klon), s_trmb1(klon), s_trmb2(klon)
452 REAL s_trmb3(klon)
453
454 ! Variables locales pour la convection de K. Emanuel :
455
456 REAL upwd(klon, llm) ! saturated updraft mass flux
457 REAL dnwd(klon, llm) ! saturated downdraft mass flux
458 REAL dnwd0(klon, llm) ! unsaturated downdraft mass flux
459 REAL cape(klon) ! CAPE
460 SAVE cape
461
462 INTEGER iflagctrl(klon) ! flag fonctionnement de convect
463
464 ! Variables du changement
465
466 ! con: convection
467 ! lsc: large scale condensation
468 ! ajs: ajustement sec
469 ! eva: \'evaporation de l'eau liquide nuageuse
470 ! vdf: vertical diffusion in boundary layer
471 REAL d_t_con(klon, llm), d_q_con(klon, llm)
472 REAL d_u_con(klon, llm), d_v_con(klon, llm)
473 REAL d_t_lsc(klon, llm), d_q_lsc(klon, llm), d_ql_lsc(klon, llm)
474 REAL d_t_ajs(klon, llm), d_q_ajs(klon, llm)
475 REAL d_u_ajs(klon, llm), d_v_ajs(klon, llm)
476 REAL rneb(klon, llm)
477
478 REAL mfu(klon, llm), mfd(klon, llm)
479 REAL pen_u(klon, llm), pen_d(klon, llm)
480 REAL pde_u(klon, llm), pde_d(klon, llm)
481 INTEGER kcbot(klon), kctop(klon), kdtop(klon)
482 REAL pmflxr(klon, llm + 1), pmflxs(klon, llm + 1)
483 REAL prfl(klon, llm + 1), psfl(klon, llm + 1)
484
485 INTEGER, save:: ibas_con(klon), itop_con(klon)
486
487 REAL rain_con(klon), rain_lsc(klon)
488 REAL snow_con(klon), snow_lsc(klon)
489 REAL d_ts(klon, nbsrf)
490
491 REAL d_u_vdf(klon, llm), d_v_vdf(klon, llm)
492 REAL d_t_vdf(klon, llm), d_q_vdf(klon, llm)
493
494 REAL d_u_oro(klon, llm), d_v_oro(klon, llm)
495 REAL d_t_oro(klon, llm)
496 REAL d_u_lif(klon, llm), d_v_lif(klon, llm)
497 REAL d_t_lif(klon, llm)
498
499 REAL, save:: ratqs(klon, llm)
500 real ratqss(klon, llm), ratqsc(klon, llm)
501 real:: ratqsbas = 0.01, ratqshaut = 0.3
502
503 ! Parametres lies au nouveau schema de nuages (SB, PDF)
504 real:: fact_cldcon = 0.375
505 real:: facttemps = 1.e-4
506 logical:: ok_newmicro = .true.
507 real facteur
508
509 integer:: iflag_cldcon = 1
510 logical ptconv(klon, llm)
511
512 ! Variables locales pour effectuer les appels en s\'erie :
513
514 REAL t_seri(klon, llm), q_seri(klon, llm)
515 REAL ql_seri(klon, llm), qs_seri(klon, llm)
516 REAL u_seri(klon, llm), v_seri(klon, llm)
517 REAL tr_seri(klon, llm, nbtr)
518
519 REAL zx_rh(klon, llm)
520
521 REAL zustrdr(klon), zvstrdr(klon)
522 REAL zustrli(klon), zvstrli(klon)
523 REAL zustrph(klon), zvstrph(klon)
524 REAL aam, torsfc
525
526 REAL zx_tmp_fi2d(klon) ! variable temporaire grille physique
527
528 INTEGER, SAVE:: nid_ins
529
530 REAL ve_lay(klon, llm) ! transport meri. de l'energie a chaque niveau vert.
531 REAL vq_lay(klon, llm) ! transport meri. de l'eau a chaque niveau vert.
532 REAL ue_lay(klon, llm) ! transport zonal de l'energie a chaque niveau vert.
533 REAL uq_lay(klon, llm) ! transport zonal de l'eau a chaque niveau vert.
534
535 REAL zsto
536 real date0
537
538 ! Variables li\'ees au bilan d'\'energie et d'enthalpie :
539 REAL ztsol(klon)
540 REAL d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec
541 REAL, SAVE:: d_h_vcol_phy
542 REAL fs_bound, fq_bound
543 REAL zero_v(klon)
544 CHARACTER(LEN = 20) tit
545 INTEGER:: ip_ebil = 0 ! print level for energy conservation diagnostics
546 INTEGER:: if_ebil = 0 ! verbosity for diagnostics of energy conservation
547
548 REAL d_t_ec(klon, llm) ! tendance due \`a la conversion Ec -> E thermique
549 REAL ZRCPD
550
551 REAL t2m(klon, nbsrf), q2m(klon, nbsrf) ! temperature and humidity at 2 m
552 REAL u10m(klon, nbsrf), v10m(klon, nbsrf) ! vents a 10 m
553 REAL zt2m(klon), zq2m(klon) ! temp., hum. 2 m moyenne s/ 1 maille
554 REAL zu10m(klon), zv10m(klon) ! vents a 10 m moyennes s/1 maille
555
556 ! Aerosol effects:
557
558 REAL sulfate(klon, llm) ! SO4 aerosol concentration (micro g/m3)
559
560 REAL, save:: sulfate_pi(klon, llm)
561 ! SO4 aerosol concentration, in micro g/m3, pre-industrial value
562
563 REAL cldtaupi(klon, llm)
564 ! cloud optical thickness for pre-industrial (pi) aerosols
565
566 REAL re(klon, llm) ! Cloud droplet effective radius
567 REAL fl(klon, llm) ! denominator of re
568
569 ! Aerosol optical properties
570 REAL, save:: tau_ae(klon, llm, 2), piz_ae(klon, llm, 2)
571 REAL, save:: cg_ae(klon, llm, 2)
572
573 REAL topswad(klon), solswad(klon) ! aerosol direct effect
574 REAL topswai(klon), solswai(klon) ! aerosol indirect effect
575
576 REAL aerindex(klon) ! POLDER aerosol index
577
578 LOGICAL:: ok_ade = .false. ! apply aerosol direct effect
579 LOGICAL:: ok_aie = .false. ! apply aerosol indirect effect
580
581 REAL:: bl95_b0 = 2., bl95_b1 = 0.2
582 ! Parameters in equation (D) of Boucher and Lohmann (1995, Tellus
583 ! B). They link cloud droplet number concentration to aerosol mass
584 ! concentration.
585
586 SAVE u10m
587 SAVE v10m
588 SAVE t2m
589 SAVE q2m
590 SAVE ffonte
591 SAVE fqcalving
592 SAVE rain_con
593 SAVE snow_con
594 SAVE topswai
595 SAVE topswad
596 SAVE solswai
597 SAVE solswad
598 SAVE d_u_con
599 SAVE d_v_con
600
601 real zmasse(klon, llm)
602 ! (column-density of mass of air in a cell, in kg m-2)
603
604 real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2
605
606 namelist /physiq_nml/ ocean, ok_veget, ok_journe, ok_mensuel, ok_instan, &
607 fact_cldcon, facttemps, ok_newmicro, iflag_cldcon, ratqsbas, &
608 ratqshaut, if_ebil, ok_ade, ok_aie, bl95_b0, bl95_b1, iflag_thermals, &
609 nsplit_thermals
610
611 !----------------------------------------------------------------
612
613 IF (if_ebil >= 1) zero_v = 0.
614 IF (nqmx < 2) CALL abort_gcm('physiq', &
615 'eaux vapeur et liquide sont indispensables', 1)
616
617 test_firstcal: IF (firstcal) THEN
618 ! initialiser
619 u10m = 0.
620 v10m = 0.
621 t2m = 0.
622 q2m = 0.
623 ffonte = 0.
624 fqcalving = 0.
625 piz_ae = 0.
626 tau_ae = 0.
627 cg_ae = 0.
628 rain_con(:) = 0.
629 snow_con(:) = 0.
630 topswai(:) = 0.
631 topswad(:) = 0.
632 solswai(:) = 0.
633 solswad(:) = 0.
634
635 d_u_con = 0.
636 d_v_con = 0.
637 rnebcon0 = 0.
638 clwcon0 = 0.
639 rnebcon = 0.
640 clwcon = 0.
641
642 pblh =0. ! Hauteur de couche limite
643 plcl =0. ! Niveau de condensation de la CLA
644 capCL =0. ! CAPE de couche limite
645 oliqCL =0. ! eau_liqu integree de couche limite
646 cteiCL =0. ! cloud top instab. crit. couche limite
647 pblt =0. ! T a la Hauteur de couche limite
648 therm =0.
649 trmb1 =0. ! deep_cape
650 trmb2 =0. ! inhibition
651 trmb3 =0. ! Point Omega
652
653 IF (if_ebil >= 1) d_h_vcol_phy = 0.
654
655 iflag_thermals = 0
656 nsplit_thermals = 1
657 print *, "Enter namelist 'physiq_nml'."
658 read(unit=*, nml=physiq_nml)
659 write(unit_nml, nml=physiq_nml)
660
661 call conf_phys
662
663 ! Initialiser les compteurs:
664
665 frugs = 0.
666 itap = 0
667 itaprad = 0
668 CALL phyetat0("startphy.nc", pctsrf, ftsol, ftsoil, ocean, tslab, &
669 seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, rain_fall, &
670 snow_fall, solsw, sollw, dlw, radsol, frugs, agesno, zmea, &
671 zstd, zsig, zgam, zthe, zpic, zval, t_ancien, q_ancien, &
672 ancien_ok, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, w01)
673
674 ! ATTENTION : il faudra a terme relire q2 dans l'etat initial
675 q2 = 1e-8
676
677 radpas = NINT(86400. / dtphys / nbapp_rad)
678
679 ! on remet le calendrier a zero
680 IF (raz_date) itau_phy = 0
681
682 PRINT *, 'cycle_diurne = ', cycle_diurne
683 CALL printflag(radpas, ocean /= 'force', ok_oasis, ok_journe, &
684 ok_instan, ok_region)
685
686 IF (dtphys * REAL(radpas) > 21600. .AND. cycle_diurne) THEN
687 print *, "Au minimum 4 appels par jour si cycle diurne"
688 call abort_gcm('physiq', &
689 "Nombre d'appels au rayonnement insuffisant", 1)
690 ENDIF
691
692 ! Initialisation pour le sch\'ema de convection d'Emanuel :
693 IF (iflag_con >= 3) THEN
694 ibas_con = 1
695 itop_con = 1
696 ENDIF
697
698 IF (ok_orodr) THEN
699 rugoro = MAX(1e-5, zstd * zsig / 2)
700 CALL SUGWD(paprs, play)
701 else
702 rugoro = 0.
703 ENDIF
704
705 lmt_pas = NINT(86400. / dtphys) ! tous les jours
706 print *, 'Number of time steps of "physics" per day: ', lmt_pas
707
708 ecrit_ins = NINT(ecrit_ins/dtphys)
709 ecrit_hf = NINT(ecrit_hf/dtphys)
710 ecrit_mth = NINT(ecrit_mth/dtphys)
711 ecrit_tra = NINT(86400.*ecrit_tra/dtphys)
712 ecrit_reg = NINT(ecrit_reg/dtphys)
713
714 ! Initialiser le couplage si necessaire
715
716 npas = 0
717 nexca = 0
718
719 ! Initialisation des sorties
720
721 call ini_histins(dtphys, ok_instan, nid_ins)
722 CALL ymds2ju(annee_ref, 1, int(day_ref), 0., date0)
723 ! Positionner date0 pour initialisation de ORCHIDEE
724 print *, 'physiq date0: ', date0
725 ENDIF test_firstcal
726
727 ! Mettre a zero des variables de sortie (pour securite)
728 da = 0.
729 mp = 0.
730 phi = 0.
731
732 ! We will modify variables *_seri and we will not touch variables
733 ! u, v, h, q:
734 DO k = 1, llm
735 DO i = 1, klon
736 t_seri(i, k) = t(i, k)
737 u_seri(i, k) = u(i, k)
738 v_seri(i, k) = v(i, k)
739 q_seri(i, k) = qx(i, k, ivap)
740 ql_seri(i, k) = qx(i, k, iliq)
741 qs_seri(i, k) = 0.
742 ENDDO
743 ENDDO
744 IF (nqmx >= 3) THEN
745 tr_seri(:, :, :nqmx-2) = qx(:, :, 3:nqmx)
746 ELSE
747 tr_seri(:, :, 1) = 0.
748 ENDIF
749
750 DO i = 1, klon
751 ztsol(i) = 0.
752 ENDDO
753 DO nsrf = 1, nbsrf
754 DO i = 1, klon
755 ztsol(i) = ztsol(i) + ftsol(i, nsrf)*pctsrf(i, nsrf)
756 ENDDO
757 ENDDO
758
759 IF (if_ebil >= 1) THEN
760 tit = 'after dynamics'
761 CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, &
762 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
763 d_ql, d_qs, d_ec)
764 ! Comme les tendances de la physique sont ajout\'es dans la
765 ! dynamique, la variation d'enthalpie par la dynamique devrait
766 ! \^etre \'egale \`a la variation de la physique au pas de temps
767 ! pr\'ec\'edent. Donc la somme de ces 2 variations devrait \^etre
768 ! nulle.
769 call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, &
770 zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol + d_h_vcol_phy, &
771 d_qt, 0., fs_bound, fq_bound)
772 END IF
773
774 ! Diagnostic de la tendance dynamique :
775 IF (ancien_ok) THEN
776 DO k = 1, llm
777 DO i = 1, klon
778 d_t_dyn(i, k) = (t_seri(i, k) - t_ancien(i, k)) / dtphys
779 d_q_dyn(i, k) = (q_seri(i, k) - q_ancien(i, k)) / dtphys
780 ENDDO
781 ENDDO
782 ELSE
783 DO k = 1, llm
784 DO i = 1, klon
785 d_t_dyn(i, k) = 0.
786 d_q_dyn(i, k) = 0.
787 ENDDO
788 ENDDO
789 ancien_ok = .TRUE.
790 ENDIF
791
792 ! Ajouter le geopotentiel du sol:
793 DO k = 1, llm
794 DO i = 1, klon
795 zphi(i, k) = pphi(i, k) + pphis(i)
796 ENDDO
797 ENDDO
798
799 ! Check temperatures:
800 CALL hgardfou(t_seri, ftsol)
801
802 ! Incrementer le compteur de la physique
803 itap = itap + 1
804 julien = MOD(NINT(rdayvrai), 360)
805 if (julien == 0) julien = 360
806
807 forall (k = 1: llm) zmasse(:, k) = (paprs(:, k)-paprs(:, k + 1)) / rg
808
809 ! Mettre en action les conditions aux limites (albedo, sst etc.).
810
811 ! Prescrire l'ozone et calculer l'albedo sur l'ocean.
812 wo = ozonecm(REAL(julien), paprs)
813
814 ! \'Evaporation de l'eau liquide nuageuse :
815 DO k = 1, llm
816 DO i = 1, klon
817 zb = MAX(0., ql_seri(i, k))
818 t_seri(i, k) = t_seri(i, k) &
819 - zb * RLVTT / RCPD / (1. + RVTMP2 * q_seri(i, k))
820 q_seri(i, k) = q_seri(i, k) + zb
821 ENDDO
822 ENDDO
823 ql_seri = 0.
824
825 IF (if_ebil >= 2) THEN
826 tit = 'after reevap'
827 CALL diagetpq(airephy, tit, ip_ebil, 2, 1, dtphys, t_seri, q_seri, &
828 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
829 d_ql, d_qs, d_ec)
830 call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, &
831 zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, &
832 fs_bound, fq_bound)
833
834 END IF
835
836 ! Appeler la diffusion verticale (programme de couche limite)
837
838 DO i = 1, klon
839 zxrugs(i) = 0.
840 ENDDO
841 DO nsrf = 1, nbsrf
842 DO i = 1, klon
843 frugs(i, nsrf) = MAX(frugs(i, nsrf), 0.000015)
844 ENDDO
845 ENDDO
846 DO nsrf = 1, nbsrf
847 DO i = 1, klon
848 zxrugs(i) = zxrugs(i) + frugs(i, nsrf)*pctsrf(i, nsrf)
849 ENDDO
850 ENDDO
851
852 ! calculs necessaires au calcul de l'albedo dans l'interface
853
854 CALL orbite(REAL(julien), zlongi, dist)
855 IF (cycle_diurne) THEN
856 zdtime = dtphys * REAL(radpas)
857 CALL zenang(zlongi, time, zdtime, rmu0, fract)
858 ELSE
859 rmu0 = -999.999
860 ENDIF
861
862 ! Calcul de l'abedo moyen par maille
863 albsol(:) = 0.
864 albsollw(:) = 0.
865 DO nsrf = 1, nbsrf
866 DO i = 1, klon
867 albsol(i) = albsol(i) + falbe(i, nsrf) * pctsrf(i, nsrf)
868 albsollw(i) = albsollw(i) + falblw(i, nsrf) * pctsrf(i, nsrf)
869 ENDDO
870 ENDDO
871
872 ! R\'epartition sous maille des flux longwave et shortwave
873 ! R\'epartition du longwave par sous-surface lin\'earis\'ee
874
875 DO nsrf = 1, nbsrf
876 DO i = 1, klon
877 fsollw(i, nsrf) = sollw(i) &
878 + 4. * RSIGMA * ztsol(i)**3 * (ztsol(i) - ftsol(i, nsrf))
879 fsolsw(i, nsrf) = solsw(i) * (1. - falbe(i, nsrf)) / (1. - albsol(i))
880 ENDDO
881 ENDDO
882
883 fder = dlw
884
885 ! Couche limite:
886
887 CALL clmain(dtphys, itap, pctsrf, pctsrf_new, t_seri, q_seri, &
888 u_seri, v_seri, julien, rmu0, co2_ppm, ok_veget, ocean, &
889 ftsol, soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, &
890 qsol, paprs, play, fsnow, fqsurf, fevap, falbe, falblw, fluxlat, &
891 rain_fall, snow_fall, fsolsw, fsollw, fder, rlon, rlat, &
892 frugs, firstcal, agesno, rugoro, d_t_vdf, &
893 d_q_vdf, d_u_vdf, d_v_vdf, d_ts, fluxt, fluxq, fluxu, fluxv, cdragh, &
894 cdragm, q2, dsens, devap, ycoefh, yu1, yv1, t2m, q2m, u10m, v10m, &
895 pblh, capCL, oliqCL, cteiCL, pblT, therm, trmb1, trmb2, trmb3, plcl, &
896 fqcalving, ffonte, run_off_lic_0, fluxo, fluxg, tslab, seaice)
897
898 ! Incr\'ementation des flux
899
900 zxfluxt = 0.
901 zxfluxq = 0.
902 zxfluxu = 0.
903 zxfluxv = 0.
904 DO nsrf = 1, nbsrf
905 DO k = 1, llm
906 DO i = 1, klon
907 zxfluxt(i, k) = zxfluxt(i, k) + fluxt(i, k, nsrf) * pctsrf(i, nsrf)
908 zxfluxq(i, k) = zxfluxq(i, k) + fluxq(i, k, nsrf) * pctsrf(i, nsrf)
909 zxfluxu(i, k) = zxfluxu(i, k) + fluxu(i, k, nsrf) * pctsrf(i, nsrf)
910 zxfluxv(i, k) = zxfluxv(i, k) + fluxv(i, k, nsrf) * pctsrf(i, nsrf)
911 END DO
912 END DO
913 END DO
914 DO i = 1, klon
915 sens(i) = - zxfluxt(i, 1) ! flux de chaleur sensible au sol
916 evap(i) = - zxfluxq(i, 1) ! flux d'\'evaporation au sol
917 fder(i) = dlw(i) + dsens(i) + devap(i)
918 ENDDO
919
920 DO k = 1, llm
921 DO i = 1, klon
922 t_seri(i, k) = t_seri(i, k) + d_t_vdf(i, k)
923 q_seri(i, k) = q_seri(i, k) + d_q_vdf(i, k)
924 u_seri(i, k) = u_seri(i, k) + d_u_vdf(i, k)
925 v_seri(i, k) = v_seri(i, k) + d_v_vdf(i, k)
926 ENDDO
927 ENDDO
928
929 IF (if_ebil >= 2) THEN
930 tit = 'after clmain'
931 CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
932 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
933 d_ql, d_qs, d_ec)
934 call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, &
935 sens, evap, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, &
936 fs_bound, fq_bound)
937 END IF
938
939 ! Update surface temperature:
940
941 DO i = 1, klon
942 zxtsol(i) = 0.
943 zxfluxlat(i) = 0.
944
945 zt2m(i) = 0.
946 zq2m(i) = 0.
947 zu10m(i) = 0.
948 zv10m(i) = 0.
949 zxffonte(i) = 0.
950 zxfqcalving(i) = 0.
951
952 s_pblh(i) = 0.
953 s_lcl(i) = 0.
954 s_capCL(i) = 0.
955 s_oliqCL(i) = 0.
956 s_cteiCL(i) = 0.
957 s_pblT(i) = 0.
958 s_therm(i) = 0.
959 s_trmb1(i) = 0.
960 s_trmb2(i) = 0.
961 s_trmb3(i) = 0.
962
963 IF (abs(pctsrf(i, is_ter) + pctsrf(i, is_lic) + pctsrf(i, is_oce) &
964 + pctsrf(i, is_sic) - 1.) > EPSFRA) print *, &
965 'physiq : probl\`eme sous surface au point ', i, &
966 pctsrf(i, 1 : nbsrf)
967 ENDDO
968 DO nsrf = 1, nbsrf
969 DO i = 1, klon
970 ftsol(i, nsrf) = ftsol(i, nsrf) + d_ts(i, nsrf)
971 zxtsol(i) = zxtsol(i) + ftsol(i, nsrf)*pctsrf(i, nsrf)
972 zxfluxlat(i) = zxfluxlat(i) + fluxlat(i, nsrf)*pctsrf(i, nsrf)
973
974 zt2m(i) = zt2m(i) + t2m(i, nsrf)*pctsrf(i, nsrf)
975 zq2m(i) = zq2m(i) + q2m(i, nsrf)*pctsrf(i, nsrf)
976 zu10m(i) = zu10m(i) + u10m(i, nsrf)*pctsrf(i, nsrf)
977 zv10m(i) = zv10m(i) + v10m(i, nsrf)*pctsrf(i, nsrf)
978 zxffonte(i) = zxffonte(i) + ffonte(i, nsrf)*pctsrf(i, nsrf)
979 zxfqcalving(i) = zxfqcalving(i) + &
980 fqcalving(i, nsrf)*pctsrf(i, nsrf)
981 s_pblh(i) = s_pblh(i) + pblh(i, nsrf)*pctsrf(i, nsrf)
982 s_lcl(i) = s_lcl(i) + plcl(i, nsrf)*pctsrf(i, nsrf)
983 s_capCL(i) = s_capCL(i) + capCL(i, nsrf) *pctsrf(i, nsrf)
984 s_oliqCL(i) = s_oliqCL(i) + oliqCL(i, nsrf) *pctsrf(i, nsrf)
985 s_cteiCL(i) = s_cteiCL(i) + cteiCL(i, nsrf) *pctsrf(i, nsrf)
986 s_pblT(i) = s_pblT(i) + pblT(i, nsrf) *pctsrf(i, nsrf)
987 s_therm(i) = s_therm(i) + therm(i, nsrf) *pctsrf(i, nsrf)
988 s_trmb1(i) = s_trmb1(i) + trmb1(i, nsrf) *pctsrf(i, nsrf)
989 s_trmb2(i) = s_trmb2(i) + trmb2(i, nsrf) *pctsrf(i, nsrf)
990 s_trmb3(i) = s_trmb3(i) + trmb3(i, nsrf) *pctsrf(i, nsrf)
991 ENDDO
992 ENDDO
993
994 ! Si une sous-fraction n'existe pas, elle prend la température moyenne :
995 DO nsrf = 1, nbsrf
996 DO i = 1, klon
997 IF (pctsrf(i, nsrf) < epsfra) ftsol(i, nsrf) = zxtsol(i)
998
999 IF (pctsrf(i, nsrf) < epsfra) t2m(i, nsrf) = zt2m(i)
1000 IF (pctsrf(i, nsrf) < epsfra) q2m(i, nsrf) = zq2m(i)
1001 IF (pctsrf(i, nsrf) < epsfra) u10m(i, nsrf) = zu10m(i)
1002 IF (pctsrf(i, nsrf) < epsfra) v10m(i, nsrf) = zv10m(i)
1003 IF (pctsrf(i, nsrf) < epsfra) ffonte(i, nsrf) = zxffonte(i)
1004 IF (pctsrf(i, nsrf) < epsfra) &
1005 fqcalving(i, nsrf) = zxfqcalving(i)
1006 IF (pctsrf(i, nsrf) < epsfra) pblh(i, nsrf) = s_pblh(i)
1007 IF (pctsrf(i, nsrf) < epsfra) plcl(i, nsrf) = s_lcl(i)
1008 IF (pctsrf(i, nsrf) < epsfra) capCL(i, nsrf) = s_capCL(i)
1009 IF (pctsrf(i, nsrf) < epsfra) oliqCL(i, nsrf) = s_oliqCL(i)
1010 IF (pctsrf(i, nsrf) < epsfra) cteiCL(i, nsrf) = s_cteiCL(i)
1011 IF (pctsrf(i, nsrf) < epsfra) pblT(i, nsrf) = s_pblT(i)
1012 IF (pctsrf(i, nsrf) < epsfra) therm(i, nsrf) = s_therm(i)
1013 IF (pctsrf(i, nsrf) < epsfra) trmb1(i, nsrf) = s_trmb1(i)
1014 IF (pctsrf(i, nsrf) < epsfra) trmb2(i, nsrf) = s_trmb2(i)
1015 IF (pctsrf(i, nsrf) < epsfra) trmb3(i, nsrf) = s_trmb3(i)
1016 ENDDO
1017 ENDDO
1018
1019 ! Calculer la derive du flux infrarouge
1020
1021 DO i = 1, klon
1022 dlw(i) = - 4. * RSIGMA * zxtsol(i)**3
1023 ENDDO
1024
1025 ! Appeler la convection (au choix)
1026
1027 DO k = 1, llm
1028 DO i = 1, klon
1029 conv_q(i, k) = d_q_dyn(i, k) + d_q_vdf(i, k)/dtphys
1030 conv_t(i, k) = d_t_dyn(i, k) + d_t_vdf(i, k)/dtphys
1031 ENDDO
1032 ENDDO
1033
1034 IF (check) THEN
1035 za = qcheck(klon, llm, paprs, q_seri, ql_seri, airephy)
1036 print *, "avantcon = ", za
1037 ENDIF
1038
1039 if (iflag_con == 2) then
1040 z_avant = sum((q_seri + ql_seri) * zmasse, dim=2)
1041 CALL conflx(dtphys, paprs, play, t_seri(:, llm:1:-1), &
1042 q_seri(:, llm:1:-1), conv_t, conv_q, zxfluxq(:, 1), omega, &
1043 d_t_con, d_q_con, rain_con, snow_con, mfu(:, llm:1:-1), &
1044 mfd(:, llm:1:-1), pen_u, pde_u, pen_d, pde_d, kcbot, kctop, &
1045 kdtop, pmflxr, pmflxs)
1046 WHERE (rain_con < 0.) rain_con = 0.
1047 WHERE (snow_con < 0.) snow_con = 0.
1048 ibas_con = llm + 1 - kcbot
1049 itop_con = llm + 1 - kctop
1050 else
1051 ! iflag_con >= 3
1052
1053 CALL concvl(dtphys, paprs, play, t_seri, q_seri, u_seri, v_seri, sig1, &
1054 w01, d_t_con, d_q_con, d_u_con, d_v_con, rain_con, snow_con, &
1055 ibas_con, itop_con, upwd, dnwd, dnwd0, Ma, cape, iflagctrl, &
1056 qcondc, wd, pmflxr, pmflxs, da, phi, mp)
1057 clwcon0 = qcondc
1058 mfu = upwd + dnwd
1059 IF (.NOT. ok_gust) wd = 0.
1060
1061 ! Calcul des propri\'et\'es des nuages convectifs
1062
1063 DO k = 1, llm
1064 DO i = 1, klon
1065 IF (thermcep) THEN
1066 zdelta = MAX(0., SIGN(1., rtt - t_seri(i, k)))
1067 zqsat(i, k) = r2es * FOEEW(t_seri(i, k), zdelta) / play(i, k)
1068 zqsat(i, k) = MIN(0.5, zqsat(i, k))
1069 zqsat(i, k) = zqsat(i, k) / (1.-retv*zqsat(i, k))
1070 ELSE
1071 IF (t_seri(i, k) < t_coup) THEN
1072 zqsat(i, k) = qsats(t_seri(i, k))/play(i, k)
1073 ELSE
1074 zqsat(i, k) = qsatl(t_seri(i, k))/play(i, k)
1075 ENDIF
1076 ENDIF
1077 ENDDO
1078 ENDDO
1079
1080 ! calcul des proprietes des nuages convectifs
1081 clwcon0 = fact_cldcon * clwcon0
1082 call clouds_gno(klon, llm, q_seri, zqsat, clwcon0, ptconv, ratqsc, &
1083 rnebcon0)
1084
1085 mfd = 0.
1086 pen_u = 0.
1087 pen_d = 0.
1088 pde_d = 0.
1089 pde_u = 0.
1090 END if
1091
1092 DO k = 1, llm
1093 DO i = 1, klon
1094 t_seri(i, k) = t_seri(i, k) + d_t_con(i, k)
1095 q_seri(i, k) = q_seri(i, k) + d_q_con(i, k)
1096 u_seri(i, k) = u_seri(i, k) + d_u_con(i, k)
1097 v_seri(i, k) = v_seri(i, k) + d_v_con(i, k)
1098 ENDDO
1099 ENDDO
1100
1101 IF (if_ebil >= 2) THEN
1102 tit = 'after convect'
1103 CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
1104 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
1105 d_ql, d_qs, d_ec)
1106 call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, &
1107 zero_v, zero_v, rain_con, snow_con, ztsol, d_h_vcol, d_qt, d_ec, &
1108 fs_bound, fq_bound)
1109 END IF
1110
1111 IF (check) THEN
1112 za = qcheck(klon, llm, paprs, q_seri, ql_seri, airephy)
1113 print *, "aprescon = ", za
1114 zx_t = 0.
1115 za = 0.
1116 DO i = 1, klon
1117 za = za + airephy(i)/REAL(klon)
1118 zx_t = zx_t + (rain_con(i)+ &
1119 snow_con(i))*airephy(i)/REAL(klon)
1120 ENDDO
1121 zx_t = zx_t/za*dtphys
1122 print *, "Precip = ", zx_t
1123 ENDIF
1124
1125 IF (iflag_con == 2) THEN
1126 z_apres = sum((q_seri + ql_seri) * zmasse, dim=2)
1127 z_factor = (z_avant - (rain_con + snow_con) * dtphys) / z_apres
1128 DO k = 1, llm
1129 DO i = 1, klon
1130 IF (z_factor(i) > 1. + 1E-8 .OR. z_factor(i) < 1. - 1E-8) THEN
1131 q_seri(i, k) = q_seri(i, k) * z_factor(i)
1132 ENDIF
1133 ENDDO
1134 ENDDO
1135 ENDIF
1136
1137 ! Convection s\`eche (thermiques ou ajustement)
1138
1139 d_t_ajs = 0.
1140 d_u_ajs = 0.
1141 d_v_ajs = 0.
1142 d_q_ajs = 0.
1143 fm_therm = 0.
1144 entr_therm = 0.
1145
1146 if (iflag_thermals == 0) then
1147 ! Ajustement sec
1148 CALL ajsec(paprs, play, t_seri, q_seri, d_t_ajs, d_q_ajs)
1149 t_seri = t_seri + d_t_ajs
1150 q_seri = q_seri + d_q_ajs
1151 else
1152 ! Thermiques
1153 call calltherm(dtphys, play, paprs, pphi, u_seri, v_seri, t_seri, &
1154 q_seri, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm)
1155 endif
1156
1157 IF (if_ebil >= 2) THEN
1158 tit = 'after dry_adjust'
1159 CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
1160 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
1161 d_ql, d_qs, d_ec)
1162 END IF
1163
1164 ! Caclul des ratqs
1165
1166 ! ratqs convectifs \`a l'ancienne en fonction de (q(z = 0) - q) / q
1167 ! on \'ecrase le tableau ratqsc calcul\'e par clouds_gno
1168 if (iflag_cldcon == 1) then
1169 do k = 1, llm
1170 do i = 1, klon
1171 if(ptconv(i, k)) then
1172 ratqsc(i, k) = ratqsbas + fact_cldcon &
1173 * (q_seri(i, 1) - q_seri(i, k)) / q_seri(i, k)
1174 else
1175 ratqsc(i, k) = 0.
1176 endif
1177 enddo
1178 enddo
1179 endif
1180
1181 ! ratqs stables
1182 do k = 1, llm
1183 do i = 1, klon
1184 ratqss(i, k) = ratqsbas + (ratqshaut - ratqsbas) &
1185 * min((paprs(i, 1) - play(i, k)) / (paprs(i, 1) - 3e4), 1.)
1186 enddo
1187 enddo
1188
1189 ! ratqs final
1190 if (iflag_cldcon == 1 .or. iflag_cldcon == 2) then
1191 ! les ratqs sont une conbinaison de ratqss et ratqsc
1192 ! ratqs final
1193 ! 1e4 (en gros 3 heures), en dur pour le moment, est le temps de
1194 ! relaxation des ratqs
1195 ratqs = max(ratqs * exp(- dtphys * facttemps), ratqss)
1196 ratqs = max(ratqs, ratqsc)
1197 else
1198 ! on ne prend que le ratqs stable pour fisrtilp
1199 ratqs = ratqss
1200 endif
1201
1202 CALL fisrtilp(dtphys, paprs, play, t_seri, q_seri, ptconv, ratqs, &
1203 d_t_lsc, d_q_lsc, d_ql_lsc, rneb, cldliq, rain_lsc, snow_lsc, &
1204 pfrac_impa, pfrac_nucl, pfrac_1nucl, frac_impa, frac_nucl, prfl, &
1205 psfl, rhcl)
1206
1207 WHERE (rain_lsc < 0) rain_lsc = 0.
1208 WHERE (snow_lsc < 0) snow_lsc = 0.
1209 DO k = 1, llm
1210 DO i = 1, klon
1211 t_seri(i, k) = t_seri(i, k) + d_t_lsc(i, k)
1212 q_seri(i, k) = q_seri(i, k) + d_q_lsc(i, k)
1213 ql_seri(i, k) = ql_seri(i, k) + d_ql_lsc(i, k)
1214 cldfra(i, k) = rneb(i, k)
1215 IF (.NOT.new_oliq) cldliq(i, k) = ql_seri(i, k)
1216 ENDDO
1217 ENDDO
1218 IF (check) THEN
1219 za = qcheck(klon, llm, paprs, q_seri, ql_seri, airephy)
1220 print *, "apresilp = ", za
1221 zx_t = 0.
1222 za = 0.
1223 DO i = 1, klon
1224 za = za + airephy(i)/REAL(klon)
1225 zx_t = zx_t + (rain_lsc(i) &
1226 + snow_lsc(i))*airephy(i)/REAL(klon)
1227 ENDDO
1228 zx_t = zx_t/za*dtphys
1229 print *, "Precip = ", zx_t
1230 ENDIF
1231
1232 IF (if_ebil >= 2) THEN
1233 tit = 'after fisrt'
1234 CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
1235 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
1236 d_ql, d_qs, d_ec)
1237 call diagphy(airephy, tit, ip_ebil, zero_v, zero_v, zero_v, zero_v, &
1238 zero_v, zero_v, rain_lsc, snow_lsc, ztsol, d_h_vcol, d_qt, d_ec, &
1239 fs_bound, fq_bound)
1240 END IF
1241
1242 ! PRESCRIPTION DES NUAGES POUR LE RAYONNEMENT
1243
1244 ! 1. NUAGES CONVECTIFS
1245
1246 IF (iflag_cldcon <= -1) THEN
1247 ! seulement pour Tiedtke
1248 snow_tiedtke = 0.
1249 if (iflag_cldcon == -1) then
1250 rain_tiedtke = rain_con
1251 else
1252 rain_tiedtke = 0.
1253 do k = 1, llm
1254 do i = 1, klon
1255 if (d_q_con(i, k) < 0.) then
1256 rain_tiedtke(i) = rain_tiedtke(i)-d_q_con(i, k)/dtphys &
1257 *zmasse(i, k)
1258 endif
1259 enddo
1260 enddo
1261 endif
1262
1263 ! Nuages diagnostiques pour Tiedtke
1264 CALL diagcld1(paprs, play, rain_tiedtke, snow_tiedtke, ibas_con, &
1265 itop_con, diafra, dialiq)
1266 DO k = 1, llm
1267 DO i = 1, klon
1268 IF (diafra(i, k) > cldfra(i, k)) THEN
1269 cldliq(i, k) = dialiq(i, k)
1270 cldfra(i, k) = diafra(i, k)
1271 ENDIF
1272 ENDDO
1273 ENDDO
1274 ELSE IF (iflag_cldcon == 3) THEN
1275 ! On prend pour les nuages convectifs le maximum du calcul de
1276 ! la convection et du calcul du pas de temps pr\'ec\'edent diminu\'e
1277 ! d'un facteur facttemps.
1278 facteur = dtphys * facttemps
1279 do k = 1, llm
1280 do i = 1, klon
1281 rnebcon(i, k) = rnebcon(i, k) * facteur
1282 if (rnebcon0(i, k) * clwcon0(i, k) &
1283 > rnebcon(i, k) * clwcon(i, k)) then
1284 rnebcon(i, k) = rnebcon0(i, k)
1285 clwcon(i, k) = clwcon0(i, k)
1286 endif
1287 enddo
1288 enddo
1289
1290 ! On prend la somme des fractions nuageuses et des contenus en eau
1291 cldfra = min(max(cldfra, rnebcon), 1.)
1292 cldliq = cldliq + rnebcon*clwcon
1293 ENDIF
1294
1295 ! 2. Nuages stratiformes
1296
1297 IF (ok_stratus) THEN
1298 CALL diagcld2(paprs, play, t_seri, q_seri, diafra, dialiq)
1299 DO k = 1, llm
1300 DO i = 1, klon
1301 IF (diafra(i, k) > cldfra(i, k)) THEN
1302 cldliq(i, k) = dialiq(i, k)
1303 cldfra(i, k) = diafra(i, k)
1304 ENDIF
1305 ENDDO
1306 ENDDO
1307 ENDIF
1308
1309 ! Precipitation totale
1310 DO i = 1, klon
1311 rain_fall(i) = rain_con(i) + rain_lsc(i)
1312 snow_fall(i) = snow_con(i) + snow_lsc(i)
1313 ENDDO
1314
1315 IF (if_ebil >= 2) CALL diagetpq(airephy, "after diagcld", ip_ebil, 2, 2, &
1316 dtphys, t_seri, q_seri, ql_seri, qs_seri, u_seri, v_seri, paprs, &
1317 d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
1318
1319 ! Humidit\'e relative pour diagnostic :
1320 DO k = 1, llm
1321 DO i = 1, klon
1322 zx_t = t_seri(i, k)
1323 IF (thermcep) THEN
1324 zdelta = MAX(0., SIGN(1., rtt-zx_t))
1325 zx_qs = r2es * FOEEW(zx_t, zdelta)/play(i, k)
1326 zx_qs = MIN(0.5, zx_qs)
1327 zcor = 1./(1.-retv*zx_qs)
1328 zx_qs = zx_qs*zcor
1329 ELSE
1330 IF (zx_t < t_coup) THEN
1331 zx_qs = qsats(zx_t)/play(i, k)
1332 ELSE
1333 zx_qs = qsatl(zx_t)/play(i, k)
1334 ENDIF
1335 ENDIF
1336 zx_rh(i, k) = q_seri(i, k)/zx_qs
1337 zqsat(i, k) = zx_qs
1338 ENDDO
1339 ENDDO
1340
1341 ! Introduce the aerosol direct and first indirect radiative forcings:
1342 IF (ok_ade .OR. ok_aie) THEN
1343 ! Get sulfate aerosol distribution :
1344 CALL readsulfate(rdayvrai, firstcal, sulfate)
1345 CALL readsulfate_preind(rdayvrai, firstcal, sulfate_pi)
1346
1347 CALL aeropt(play, paprs, t_seri, sulfate, rhcl, tau_ae, piz_ae, cg_ae, &
1348 aerindex)
1349 ELSE
1350 tau_ae = 0.
1351 piz_ae = 0.
1352 cg_ae = 0.
1353 ENDIF
1354
1355 ! Param\`etres optiques des nuages et quelques param\`etres pour
1356 ! diagnostics :
1357 if (ok_newmicro) then
1358 CALL newmicro(paprs, play, t_seri, cldliq, cldfra, cldtau, cldemi, &
1359 cldh, cldl, cldm, cldt, cldq, flwp, fiwp, flwc, fiwc, ok_aie, &
1360 sulfate, sulfate_pi, bl95_b0, bl95_b1, cldtaupi, re, fl)
1361 else
1362 CALL nuage(paprs, play, t_seri, cldliq, cldfra, cldtau, cldemi, cldh, &
1363 cldl, cldm, cldt, cldq, ok_aie, sulfate, sulfate_pi, bl95_b0, &
1364 bl95_b1, cldtaupi, re, fl)
1365 endif
1366
1367 ! Appeler le rayonnement mais calculer tout d'abord l'albedo du sol.
1368 IF (MOD(itaprad, radpas) == 0) THEN
1369 DO i = 1, klon
1370 albsol(i) = falbe(i, is_oce) * pctsrf(i, is_oce) &
1371 + falbe(i, is_lic) * pctsrf(i, is_lic) &
1372 + falbe(i, is_ter) * pctsrf(i, is_ter) &
1373 + falbe(i, is_sic) * pctsrf(i, is_sic)
1374 albsollw(i) = falblw(i, is_oce) * pctsrf(i, is_oce) &
1375 + falblw(i, is_lic) * pctsrf(i, is_lic) &
1376 + falblw(i, is_ter) * pctsrf(i, is_ter) &
1377 + falblw(i, is_sic) * pctsrf(i, is_sic)
1378 ENDDO
1379 ! Rayonnement (compatible Arpege-IFS) :
1380 CALL radlwsw(dist, rmu0, fract, paprs, play, zxtsol, albsol, &
1381 albsollw, t_seri, q_seri, wo, cldfra, cldemi, cldtau, heat, &
1382 heat0, cool, cool0, radsol, albpla, topsw, toplw, solsw, sollw, &
1383 sollwdown, topsw0, toplw0, solsw0, sollw0, lwdn0, lwdn, lwup0, &
1384 lwup, swdn0, swdn, swup0, swup, ok_ade, ok_aie, tau_ae, piz_ae, &
1385 cg_ae, topswad, solswad, cldtaupi, topswai, solswai)
1386 itaprad = 0
1387 ENDIF
1388 itaprad = itaprad + 1
1389
1390 ! Ajouter la tendance des rayonnements (tous les pas)
1391
1392 DO k = 1, llm
1393 DO i = 1, klon
1394 t_seri(i, k) = t_seri(i, k) + (heat(i, k)-cool(i, k)) * dtphys/86400.
1395 ENDDO
1396 ENDDO
1397
1398 IF (if_ebil >= 2) THEN
1399 tit = 'after rad'
1400 CALL diagetpq(airephy, tit, ip_ebil, 2, 2, dtphys, t_seri, q_seri, &
1401 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
1402 d_ql, d_qs, d_ec)
1403 call diagphy(airephy, tit, ip_ebil, topsw, toplw, solsw, sollw, &
1404 zero_v, zero_v, zero_v, zero_v, ztsol, d_h_vcol, d_qt, d_ec, &
1405 fs_bound, fq_bound)
1406 END IF
1407
1408 ! Calculer l'hydrologie de la surface
1409 DO i = 1, klon
1410 zxqsurf(i) = 0.
1411 zxsnow(i) = 0.
1412 ENDDO
1413 DO nsrf = 1, nbsrf
1414 DO i = 1, klon
1415 zxqsurf(i) = zxqsurf(i) + fqsurf(i, nsrf)*pctsrf(i, nsrf)
1416 zxsnow(i) = zxsnow(i) + fsnow(i, nsrf)*pctsrf(i, nsrf)
1417 ENDDO
1418 ENDDO
1419
1420 ! Calculer le bilan du sol et la d\'erive de temp\'erature (couplage)
1421
1422 DO i = 1, klon
1423 bils(i) = radsol(i) - sens(i) + zxfluxlat(i)
1424 ENDDO
1425
1426 ! Param\'etrisation de l'orographie \`a l'\'echelle sous-maille :
1427
1428 IF (ok_orodr) THEN
1429 ! selection des points pour lesquels le shema est actif:
1430 igwd = 0
1431 DO i = 1, klon
1432 itest(i) = 0
1433 IF (((zpic(i)-zmea(i)) > 100.).AND.(zstd(i) > 10.)) THEN
1434 itest(i) = 1
1435 igwd = igwd + 1
1436 idx(igwd) = i
1437 ENDIF
1438 ENDDO
1439
1440 CALL drag_noro(klon, llm, dtphys, paprs, play, zmea, zstd, zsig, zgam, &
1441 zthe, zpic, zval, igwd, idx, itest, t_seri, u_seri, v_seri, &
1442 zulow, zvlow, zustrdr, zvstrdr, d_t_oro, d_u_oro, d_v_oro)
1443
1444 ! ajout des tendances
1445 DO k = 1, llm
1446 DO i = 1, klon
1447 t_seri(i, k) = t_seri(i, k) + d_t_oro(i, k)
1448 u_seri(i, k) = u_seri(i, k) + d_u_oro(i, k)
1449 v_seri(i, k) = v_seri(i, k) + d_v_oro(i, k)
1450 ENDDO
1451 ENDDO
1452 ENDIF
1453
1454 IF (ok_orolf) THEN
1455 ! S\'election des points pour lesquels le sch\'ema est actif :
1456 igwd = 0
1457 DO i = 1, klon
1458 itest(i) = 0
1459 IF ((zpic(i) - zmea(i)) > 100.) THEN
1460 itest(i) = 1
1461 igwd = igwd + 1
1462 idx(igwd) = i
1463 ENDIF
1464 ENDDO
1465
1466 CALL lift_noro(klon, llm, dtphys, paprs, play, rlat, zmea, zstd, zpic, &
1467 itest, t_seri, u_seri, v_seri, zulow, zvlow, zustrli, zvstrli, &
1468 d_t_lif, d_u_lif, d_v_lif)
1469
1470 ! Ajout des tendances :
1471 DO k = 1, llm
1472 DO i = 1, klon
1473 t_seri(i, k) = t_seri(i, k) + d_t_lif(i, k)
1474 u_seri(i, k) = u_seri(i, k) + d_u_lif(i, k)
1475 v_seri(i, k) = v_seri(i, k) + d_v_lif(i, k)
1476 ENDDO
1477 ENDDO
1478 ENDIF
1479
1480 ! Stress n\'ecessaires : toute la physique
1481
1482 DO i = 1, klon
1483 zustrph(i) = 0.
1484 zvstrph(i) = 0.
1485 ENDDO
1486 DO k = 1, llm
1487 DO i = 1, klon
1488 zustrph(i) = zustrph(i) + (u_seri(i, k) - u(i, k)) / dtphys &
1489 * zmasse(i, k)
1490 zvstrph(i) = zvstrph(i) + (v_seri(i, k) - v(i, k)) / dtphys &
1491 * zmasse(i, k)
1492 ENDDO
1493 ENDDO
1494
1495 CALL aaam_bud(ra, rg, romega, rlat, rlon, pphis, zustrdr, zustrli, &
1496 zustrph, zvstrdr, zvstrli, zvstrph, paprs, u, v, aam, torsfc)
1497
1498 IF (if_ebil >= 2) CALL diagetpq(airephy, 'after orography', ip_ebil, 2, &
1499 2, dtphys, t_seri, q_seri, ql_seri, qs_seri, u_seri, v_seri, paprs, &
1500 d_h_vcol, d_qt, d_qw, d_ql, d_qs, d_ec)
1501
1502 ! Calcul des tendances traceurs
1503 call phytrac(rnpb, itap, lmt_pas, julien, time, firstcal, lafin, nqmx-2, &
1504 dtphys, u, t, paprs, play, mfu, mfd, pde_u, pen_d, ycoefh, fm_therm, &
1505 entr_therm, yu1, yv1, ftsol, pctsrf, frac_impa, frac_nucl, pphis, &
1506 albsol, rhcl, cldfra, rneb, diafra, cldliq, pmflxr, pmflxs, prfl, &
1507 psfl, da, phi, mp, upwd, dnwd, tr_seri, zmasse)
1508
1509 IF (offline) call phystokenc(dtphys, rlon, rlat, t, mfu, mfd, pen_u, &
1510 pde_u, pen_d, pde_d, fm_therm, entr_therm, ycoefh, yu1, yv1, ftsol, &
1511 pctsrf, frac_impa, frac_nucl, pphis, airephy, dtphys, itap)
1512
1513 ! Calculer le transport de l'eau et de l'energie (diagnostique)
1514 CALL transp(paprs, zxtsol, t_seri, q_seri, u_seri, v_seri, zphi, ve, vq, &
1515 ue, uq)
1516
1517 ! diag. bilKP
1518
1519 CALL transp_lay(paprs, zxtsol, t_seri, q_seri, u_seri, v_seri, zphi, &
1520 ve_lay, vq_lay, ue_lay, uq_lay)
1521
1522 ! Accumuler les variables a stocker dans les fichiers histoire:
1523
1524 ! conversion Ec -> E thermique
1525 DO k = 1, llm
1526 DO i = 1, klon
1527 ZRCPD = RCPD * (1. + RVTMP2 * q_seri(i, k))
1528 d_t_ec(i, k) = 0.5 / ZRCPD &
1529 * (u(i, k)**2 + v(i, k)**2 - u_seri(i, k)**2 - v_seri(i, k)**2)
1530 t_seri(i, k) = t_seri(i, k) + d_t_ec(i, k)
1531 d_t_ec(i, k) = d_t_ec(i, k) / dtphys
1532 END DO
1533 END DO
1534
1535 IF (if_ebil >= 1) THEN
1536 tit = 'after physic'
1537 CALL diagetpq(airephy, tit, ip_ebil, 1, 1, dtphys, t_seri, q_seri, &
1538 ql_seri, qs_seri, u_seri, v_seri, paprs, d_h_vcol, d_qt, d_qw, &
1539 d_ql, d_qs, d_ec)
1540 ! Comme les tendances de la physique sont ajoute dans la dynamique,
1541 ! on devrait avoir que la variation d'entalpie par la dynamique
1542 ! est egale a la variation de la physique au pas de temps precedent.
1543 ! Donc la somme de ces 2 variations devrait etre nulle.
1544 call diagphy(airephy, tit, ip_ebil, topsw, toplw, solsw, sollw, sens, &
1545 evap, rain_fall, snow_fall, ztsol, d_h_vcol, d_qt, d_ec, &
1546 fs_bound, fq_bound)
1547
1548 d_h_vcol_phy = d_h_vcol
1549
1550 END IF
1551
1552 ! SORTIES
1553
1554 ! prw = eau precipitable
1555 DO i = 1, klon
1556 prw(i) = 0.
1557 DO k = 1, llm
1558 prw(i) = prw(i) + q_seri(i, k)*zmasse(i, k)
1559 ENDDO
1560 ENDDO
1561
1562 ! Convertir les incrementations en tendances
1563
1564 DO k = 1, llm
1565 DO i = 1, klon
1566 d_u(i, k) = (u_seri(i, k) - u(i, k)) / dtphys
1567 d_v(i, k) = (v_seri(i, k) - v(i, k)) / dtphys
1568 d_t(i, k) = (t_seri(i, k) - t(i, k)) / dtphys
1569 d_qx(i, k, ivap) = (q_seri(i, k) - qx(i, k, ivap)) / dtphys
1570 d_qx(i, k, iliq) = (ql_seri(i, k) - qx(i, k, iliq)) / dtphys
1571 ENDDO
1572 ENDDO
1573
1574 IF (nqmx >= 3) THEN
1575 DO iq = 3, nqmx
1576 DO k = 1, llm
1577 DO i = 1, klon
1578 d_qx(i, k, iq) = (tr_seri(i, k, iq-2) - qx(i, k, iq)) / dtphys
1579 ENDDO
1580 ENDDO
1581 ENDDO
1582 ENDIF
1583
1584 ! Sauvegarder les valeurs de t et q a la fin de la physique:
1585 DO k = 1, llm
1586 DO i = 1, klon
1587 t_ancien(i, k) = t_seri(i, k)
1588 q_ancien(i, k) = q_seri(i, k)
1589 ENDDO
1590 ENDDO
1591
1592 ! Ecriture des sorties
1593 call write_histins
1594
1595 ! Si c'est la fin, il faut conserver l'etat de redemarrage
1596 IF (lafin) THEN
1597 itau_phy = itau_phy + itap
1598 CALL phyredem("restartphy.nc", rlat, rlon, pctsrf, ftsol, ftsoil, &
1599 tslab, seaice, fqsurf, qsol, fsnow, falbe, falblw, fevap, &
1600 rain_fall, snow_fall, solsw, sollw, dlw, radsol, frugs, &
1601 agesno, zmea, zstd, zsig, zgam, zthe, zpic, zval, t_ancien, &
1602 q_ancien, rnebcon, ratqs, clwcon, run_off_lic_0, sig1, w01)
1603 ENDIF
1604
1605 firstcal = .FALSE.
1606
1607 contains
1608
1609 subroutine write_histins
1610
1611 ! From phylmd/write_histins.h, version 1.2 2005/05/25 13:10:09
1612
1613 use dimens_m, only: iim, jjm
1614 USE histsync_m, ONLY: histsync
1615 USE histwrite_m, ONLY: histwrite
1616
1617 real zout
1618 integer itau_w ! pas de temps ecriture
1619 REAL zx_tmp_2d(iim, jjm + 1), zx_tmp_3d(iim, jjm + 1, llm)
1620
1621 !--------------------------------------------------
1622
1623 IF (ok_instan) THEN
1624 ! Champs 2D:
1625
1626 zsto = dtphys * ecrit_ins
1627 zout = dtphys * ecrit_ins
1628 itau_w = itau_phy + itap
1629
1630 i = NINT(zout/zsto)
1631 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, pphis, zx_tmp_2d)
1632 CALL histwrite(nid_ins, "phis", itau_w, zx_tmp_2d)
1633
1634 i = NINT(zout/zsto)
1635 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, airephy, zx_tmp_2d)
1636 CALL histwrite(nid_ins, "aire", itau_w, zx_tmp_2d)
1637
1638 DO i = 1, klon
1639 zx_tmp_fi2d(i) = paprs(i, 1)
1640 ENDDO
1641 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1642 CALL histwrite(nid_ins, "psol", itau_w, zx_tmp_2d)
1643
1644 DO i = 1, klon
1645 zx_tmp_fi2d(i) = rain_fall(i) + snow_fall(i)
1646 ENDDO
1647 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1648 CALL histwrite(nid_ins, "precip", itau_w, zx_tmp_2d)
1649
1650 DO i = 1, klon
1651 zx_tmp_fi2d(i) = rain_lsc(i) + snow_lsc(i)
1652 ENDDO
1653 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1654 CALL histwrite(nid_ins, "plul", itau_w, zx_tmp_2d)
1655
1656 DO i = 1, klon
1657 zx_tmp_fi2d(i) = rain_con(i) + snow_con(i)
1658 ENDDO
1659 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1660 CALL histwrite(nid_ins, "pluc", itau_w, zx_tmp_2d)
1661
1662 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zxtsol, zx_tmp_2d)
1663 CALL histwrite(nid_ins, "tsol", itau_w, zx_tmp_2d)
1664 !ccIM
1665 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zt2m, zx_tmp_2d)
1666 CALL histwrite(nid_ins, "t2m", itau_w, zx_tmp_2d)
1667
1668 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zq2m, zx_tmp_2d)
1669 CALL histwrite(nid_ins, "q2m", itau_w, zx_tmp_2d)
1670
1671 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zu10m, zx_tmp_2d)
1672 CALL histwrite(nid_ins, "u10m", itau_w, zx_tmp_2d)
1673
1674 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zv10m, zx_tmp_2d)
1675 CALL histwrite(nid_ins, "v10m", itau_w, zx_tmp_2d)
1676
1677 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, snow_fall, zx_tmp_2d)
1678 CALL histwrite(nid_ins, "snow", itau_w, zx_tmp_2d)
1679
1680 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, cdragm, zx_tmp_2d)
1681 CALL histwrite(nid_ins, "cdrm", itau_w, zx_tmp_2d)
1682
1683 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, cdragh, zx_tmp_2d)
1684 CALL histwrite(nid_ins, "cdrh", itau_w, zx_tmp_2d)
1685
1686 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, toplw, zx_tmp_2d)
1687 CALL histwrite(nid_ins, "topl", itau_w, zx_tmp_2d)
1688
1689 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, evap, zx_tmp_2d)
1690 CALL histwrite(nid_ins, "evap", itau_w, zx_tmp_2d)
1691
1692 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, solsw, zx_tmp_2d)
1693 CALL histwrite(nid_ins, "sols", itau_w, zx_tmp_2d)
1694
1695 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, sollw, zx_tmp_2d)
1696 CALL histwrite(nid_ins, "soll", itau_w, zx_tmp_2d)
1697
1698 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, sollwdown, zx_tmp_2d)
1699 CALL histwrite(nid_ins, "solldown", itau_w, zx_tmp_2d)
1700
1701 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, bils, zx_tmp_2d)
1702 CALL histwrite(nid_ins, "bils", itau_w, zx_tmp_2d)
1703
1704 zx_tmp_fi2d(1:klon) = -1*sens(1:klon)
1705 ! CALL gr_fi_ecrit(1, klon, iim, jjm + 1, sens, zx_tmp_2d)
1706 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1707 CALL histwrite(nid_ins, "sens", itau_w, zx_tmp_2d)
1708
1709 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, fder, zx_tmp_2d)
1710 CALL histwrite(nid_ins, "fder", itau_w, zx_tmp_2d)
1711
1712 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_oce), zx_tmp_2d)
1713 CALL histwrite(nid_ins, "dtsvdfo", itau_w, zx_tmp_2d)
1714
1715 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_ter), zx_tmp_2d)
1716 CALL histwrite(nid_ins, "dtsvdft", itau_w, zx_tmp_2d)
1717
1718 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_lic), zx_tmp_2d)
1719 CALL histwrite(nid_ins, "dtsvdfg", itau_w, zx_tmp_2d)
1720
1721 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, d_ts(1, is_sic), zx_tmp_2d)
1722 CALL histwrite(nid_ins, "dtsvdfi", itau_w, zx_tmp_2d)
1723
1724 DO nsrf = 1, nbsrf
1725 !XXX
1726 zx_tmp_fi2d(1 : klon) = pctsrf(1 : klon, nsrf)*100.
1727 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1728 CALL histwrite(nid_ins, "pourc_"//clnsurf(nsrf), itau_w, &
1729 zx_tmp_2d)
1730
1731 zx_tmp_fi2d(1 : klon) = pctsrf(1 : klon, nsrf)
1732 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1733 CALL histwrite(nid_ins, "fract_"//clnsurf(nsrf), itau_w, &
1734 zx_tmp_2d)
1735
1736 zx_tmp_fi2d(1 : klon) = fluxt(1 : klon, 1, nsrf)
1737 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1738 CALL histwrite(nid_ins, "sens_"//clnsurf(nsrf), itau_w, &
1739 zx_tmp_2d)
1740
1741 zx_tmp_fi2d(1 : klon) = fluxlat(1 : klon, nsrf)
1742 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1743 CALL histwrite(nid_ins, "lat_"//clnsurf(nsrf), itau_w, &
1744 zx_tmp_2d)
1745
1746 zx_tmp_fi2d(1 : klon) = ftsol(1 : klon, nsrf)
1747 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1748 CALL histwrite(nid_ins, "tsol_"//clnsurf(nsrf), itau_w, &
1749 zx_tmp_2d)
1750
1751 zx_tmp_fi2d(1 : klon) = fluxu(1 : klon, 1, nsrf)
1752 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1753 CALL histwrite(nid_ins, "taux_"//clnsurf(nsrf), itau_w, &
1754 zx_tmp_2d)
1755
1756 zx_tmp_fi2d(1 : klon) = fluxv(1 : klon, 1, nsrf)
1757 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1758 CALL histwrite(nid_ins, "tauy_"//clnsurf(nsrf), itau_w, &
1759 zx_tmp_2d)
1760
1761 zx_tmp_fi2d(1 : klon) = frugs(1 : klon, nsrf)
1762 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1763 CALL histwrite(nid_ins, "rugs_"//clnsurf(nsrf), itau_w, &
1764 zx_tmp_2d)
1765
1766 zx_tmp_fi2d(1 : klon) = falbe(1 : klon, nsrf)
1767 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zx_tmp_fi2d, zx_tmp_2d)
1768 CALL histwrite(nid_ins, "albe_"//clnsurf(nsrf), itau_w, &
1769 zx_tmp_2d)
1770
1771 END DO
1772 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, albsol, zx_tmp_2d)
1773 CALL histwrite(nid_ins, "albs", itau_w, zx_tmp_2d)
1774 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, albsollw, zx_tmp_2d)
1775 CALL histwrite(nid_ins, "albslw", itau_w, zx_tmp_2d)
1776
1777 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, zxrugs, zx_tmp_2d)
1778 CALL histwrite(nid_ins, "rugs", itau_w, zx_tmp_2d)
1779
1780 !HBTM2
1781
1782 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_pblh, zx_tmp_2d)
1783 CALL histwrite(nid_ins, "s_pblh", itau_w, zx_tmp_2d)
1784
1785 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_pblt, zx_tmp_2d)
1786 CALL histwrite(nid_ins, "s_pblt", itau_w, zx_tmp_2d)
1787
1788 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_lcl, zx_tmp_2d)
1789 CALL histwrite(nid_ins, "s_lcl", itau_w, zx_tmp_2d)
1790
1791 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_capCL, zx_tmp_2d)
1792 CALL histwrite(nid_ins, "s_capCL", itau_w, zx_tmp_2d)
1793
1794 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_oliqCL, zx_tmp_2d)
1795 CALL histwrite(nid_ins, "s_oliqCL", itau_w, zx_tmp_2d)
1796
1797 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_cteiCL, zx_tmp_2d)
1798 CALL histwrite(nid_ins, "s_cteiCL", itau_w, zx_tmp_2d)
1799
1800 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_therm, zx_tmp_2d)
1801 CALL histwrite(nid_ins, "s_therm", itau_w, zx_tmp_2d)
1802
1803 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_trmb1, zx_tmp_2d)
1804 CALL histwrite(nid_ins, "s_trmb1", itau_w, zx_tmp_2d)
1805
1806 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_trmb2, zx_tmp_2d)
1807 CALL histwrite(nid_ins, "s_trmb2", itau_w, zx_tmp_2d)
1808
1809 CALL gr_fi_ecrit(1, klon, iim, jjm + 1, s_trmb3, zx_tmp_2d)
1810 CALL histwrite(nid_ins, "s_trmb3", itau_w, zx_tmp_2d)
1811
1812 ! Champs 3D:
1813
1814 CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, t_seri, zx_tmp_3d)
1815 CALL histwrite(nid_ins, "temp", itau_w, zx_tmp_3d)
1816
1817 CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, u_seri, zx_tmp_3d)
1818 CALL histwrite(nid_ins, "vitu", itau_w, zx_tmp_3d)
1819
1820 CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, v_seri, zx_tmp_3d)
1821 CALL histwrite(nid_ins, "vitv", itau_w, zx_tmp_3d)
1822
1823 CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, zphi, zx_tmp_3d)
1824 CALL histwrite(nid_ins, "geop", itau_w, zx_tmp_3d)
1825
1826 CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, play, zx_tmp_3d)
1827 CALL histwrite(nid_ins, "pres", itau_w, zx_tmp_3d)
1828
1829 CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, d_t_vdf, zx_tmp_3d)
1830 CALL histwrite(nid_ins, "dtvdf", itau_w, zx_tmp_3d)
1831
1832 CALL gr_fi_ecrit(llm, klon, iim, jjm + 1, d_q_vdf, zx_tmp_3d)
1833 CALL histwrite(nid_ins, "dqvdf", itau_w, zx_tmp_3d)
1834
1835 call histsync(nid_ins)
1836 ENDIF
1837
1838 end subroutine write_histins
1839
1840 END SUBROUTINE physiq
1841
1842 end module physiq_m

  ViewVC Help
Powered by ViewVC 1.1.21