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

Annotation of /trunk/phylmd/physiq.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 250 - (hide annotations)
Fri Jan 5 18:18:53 2018 UTC (6 years, 4 months ago) by guez
Original Path: trunk/Sources/phylmd/physiq.f
File size: 38371 byte(s)
Extract part of clmain into a new procedure coef_diff_turb (following LMDZ).

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

  ViewVC Help
Powered by ViewVC 1.1.21