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

Contents of /trunk/phylmd/clmain.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 118 - (show annotations)
Thu Dec 18 17:30:24 2014 UTC (9 years, 4 months ago) by guez
File size: 22523 byte(s)
In file grilles_gcm.nc, renamed variable phis to orog, deleted
variable presnivs.

Removed variable bug_ozone from module clesphys.

In procedure ozonecm, moved computation of sint and cost out of the
loops on horizontal position and vertical level. Inverted the order of
the two loops. We can then move all computations from slat to aprim
out of the loop on vertical levels. Created variable slat2, following
LMDZ. Moved the limitation of column-density of ozone in cell at 1e-12
from radlwsw to ozonecm, following LMDZ.

Removed unused arguments u, albsol, rh, cldfra, rneb, diafra, cldliq,
pmflxr, pmflxs, prfl, psfl of phytrac.

In procedure yamada4, for all the arrays, replaced the dimension klon
by ngrid. At the end of the procedure, for the computation of kmn,kn,
kq and q2, changed the upper limit of the loop index from klon to ngrid.

In radlwsw, for the calculation of pozon, removed the factor
paprs(iof+i, 1)/101325, as in LMDZ. In procedure sw, removed the
factor 101325.0/PPSOL(JL), as in LMDZ.

1 module clmain_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE clmain(dtime, itap, pctsrf, pctsrf_new, t, q, u, v, jour, rmu0, &
8 co2_ppm, ts, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, &
9 paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat, rain_fall, &
10 snow_f, solsw, sollw, fder, rlat, rugos, debut, agesno, rugoro, d_t, &
11 d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, &
12 q2, dflux_t, dflux_q, ycoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh, &
13 capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl, &
14 fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab)
15
16 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
17 ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
18 ! Objet : interface de couche limite (diffusion verticale)
19
20 ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
21 ! de la couche limite pour les traceurs se fait avec "cltrac" et
22 ! ne tient pas compte de la différentiation des sous-fractions de
23 ! sol.
24
25 ! Pour pouvoir extraire les coefficients d'échanges et le vent
26 ! dans la première couche, trois champs ont été créés : "ycoefh",
27 ! "zu1" et "zv1". Nous avons moyenné les valeurs de ces trois
28 ! champs sur les quatre sous-surfaces du modèle.
29
30 use clqh_m, only: clqh
31 use clvent_m, only: clvent
32 use coefkz_m, only: coefkz
33 use coefkzmin_m, only: coefkzmin
34 USE conf_gcm_m, ONLY: prt_level
35 USE conf_phys_m, ONLY: iflag_pbl
36 USE dimens_m, ONLY: iim, jjm
37 USE dimphy, ONLY: klev, klon, zmasq
38 USE dimsoil, ONLY: nsoilmx
39 use hbtm_m, only: hbtm
40 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
41 use stdlevvar_m, only: stdlevvar
42 USE suphec_m, ONLY: rd, rg, rkappa
43 use ustarhb_m, only: ustarhb
44 use vdif_kcay_m, only: vdif_kcay
45 use yamada4_m, only: yamada4
46
47 REAL, INTENT(IN):: dtime ! interval du temps (secondes)
48 INTEGER, INTENT(IN):: itap ! numero du pas de temps
49 REAL, INTENT(inout):: pctsrf(klon, nbsrf)
50
51 ! la nouvelle repartition des surfaces sortie de l'interface
52 REAL, INTENT(out):: pctsrf_new(klon, nbsrf)
53
54 REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
55 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg/kg)
56 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
57 INTEGER, INTENT(IN):: jour ! jour de l'annee en cours
58 REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal
59 REAL, intent(in):: co2_ppm ! taux CO2 atmosphere
60 REAL, INTENT(IN):: ts(klon, nbsrf) ! temperature du sol (en Kelvin)
61 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
62 REAL, INTENT(IN):: ksta, ksta_ter
63 LOGICAL, INTENT(IN):: ok_kzmin
64
65 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
66 ! soil temperature of surface fraction
67
68 REAL, INTENT(inout):: qsol(klon)
69 ! column-density of water in soil, in kg m-2
70
71 REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)
72 REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
73 REAL snow(klon, nbsrf)
74 REAL qsurf(klon, nbsrf)
75 REAL evap(klon, nbsrf)
76 REAL albe(klon, nbsrf)
77 REAL alblw(klon, nbsrf)
78
79 REAL fluxlat(klon, nbsrf)
80
81 REAL, intent(in):: rain_fall(klon)
82 ! liquid water mass flux (kg/m2/s), positive down
83
84 REAL, intent(in):: snow_f(klon)
85 ! solid water mass flux (kg/m2/s), positive down
86
87 REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)
88 REAL fder(klon)
89 REAL, INTENT(IN):: rlat(klon) ! latitude en degrés
90
91 REAL rugos(klon, nbsrf)
92 ! rugos----input-R- longeur de rugosite (en m)
93
94 LOGICAL, INTENT(IN):: debut
95 real agesno(klon, nbsrf)
96 REAL, INTENT(IN):: rugoro(klon)
97
98 REAL d_t(klon, klev), d_q(klon, klev)
99 ! d_t------output-R- le changement pour "t"
100 ! d_q------output-R- le changement pour "q"
101
102 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
103 ! changement pour "u" et "v"
104
105 REAL, intent(out):: d_ts(klon, nbsrf) ! le changement pour "ts"
106
107 REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
108 ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)
109 ! (orientation positive vers le bas)
110 ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)
111
112 REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)
113 ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal
114 ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal
115
116 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
117 real q2(klon, klev+1, nbsrf)
118
119 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
120 ! dflux_t derive du flux sensible
121 ! dflux_q derive du flux latent
122 !IM "slab" ocean
123
124 REAL, intent(out):: ycoefh(klon, klev)
125 REAL, intent(out):: zu1(klon)
126 REAL zv1(klon)
127 REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
128 REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
129
130 !IM cf. AM : pbl, hbtm (Comme les autres diagnostics on cumule ds
131 ! physiq ce qui permet de sortir les grdeurs par sous surface)
132 REAL pblh(klon, nbsrf)
133 ! pblh------- HCL
134 REAL capcl(klon, nbsrf)
135 REAL oliqcl(klon, nbsrf)
136 REAL cteicl(klon, nbsrf)
137 REAL pblt(klon, nbsrf)
138 ! pblT------- T au nveau HCL
139 REAL therm(klon, nbsrf)
140 REAL trmb1(klon, nbsrf)
141 ! trmb1-------deep_cape
142 REAL trmb2(klon, nbsrf)
143 ! trmb2--------inhibition
144 REAL trmb3(klon, nbsrf)
145 ! trmb3-------Point Omega
146 REAL plcl(klon, nbsrf)
147 REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
148 ! ffonte----Flux thermique utilise pour fondre la neige
149 ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
150 ! hauteur de neige, en kg/m2/s
151 REAL run_off_lic_0(klon)
152
153 REAL flux_o(klon), flux_g(klon)
154 !IM "slab" ocean
155 ! flux_g---output-R- flux glace (pour OCEAN='slab ')
156 ! flux_o---output-R- flux ocean (pour OCEAN='slab ')
157
158 REAL tslab(klon)
159 ! tslab-in/output-R temperature du slab ocean (en Kelvin)
160 ! uniqmnt pour slab
161
162 ! Local:
163
164 REAL y_flux_o(klon), y_flux_g(klon)
165 real ytslab(klon)
166 REAL y_fqcalving(klon), y_ffonte(klon)
167 real y_run_off_lic_0(klon)
168
169 REAL rugmer(klon)
170
171 REAL ytsoil(klon, nsoilmx)
172
173 REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
174 REAL yalb(klon)
175 REAL yalblw(klon)
176 REAL yu1(klon), yv1(klon)
177 ! on rajoute en output yu1 et yv1 qui sont les vents dans
178 ! la premiere couche
179 REAL ysnow(klon), yqsurf(klon), yagesno(klon)
180
181 real yqsol(klon)
182 ! column-density of water in soil, in kg m-2
183
184 REAL yrain_f(klon)
185 ! liquid water mass flux (kg/m2/s), positive down
186
187 REAL ysnow_f(klon)
188 ! solid water mass flux (kg/m2/s), positive down
189
190 REAL ysollw(klon), ysolsw(klon)
191 REAL yfder(klon)
192 REAL yrugm(klon), yrads(klon), yrugoro(klon)
193
194 REAL yfluxlat(klon)
195
196 REAL y_d_ts(klon)
197 REAL y_d_t(klon, klev), y_d_q(klon, klev)
198 REAL y_d_u(klon, klev), y_d_v(klon, klev)
199 REAL y_flux_t(klon, klev), y_flux_q(klon, klev)
200 REAL y_flux_u(klon, klev), y_flux_v(klon, klev)
201 REAL y_dflux_t(klon), y_dflux_q(klon)
202 REAL coefh(klon, klev), coefm(klon, klev)
203 REAL yu(klon, klev), yv(klon, klev)
204 REAL yt(klon, klev), yq(klon, klev)
205 REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
206
207 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
208
209 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
210 REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
211 REAL ykmq(klon, klev+1)
212 REAL yq2(klon, klev+1)
213 REAL q2diag(klon, klev+1)
214
215 REAL u1lay(klon), v1lay(klon)
216 REAL delp(klon, klev)
217 INTEGER i, k, nsrf
218
219 INTEGER ni(klon), knon, j
220
221 REAL pctsrf_pot(klon, nbsrf)
222 ! "pourcentage potentiel" pour tenir compte des éventuelles
223 ! apparitions ou disparitions de la glace de mer
224
225 REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
226
227 REAL yt2m(klon), yq2m(klon), yu10m(klon)
228 REAL yustar(klon)
229 ! -- LOOP
230 REAL yu10mx(klon)
231 REAL yu10my(klon)
232 REAL ywindsp(klon)
233 ! -- LOOP
234
235 REAL yt10m(klon), yq10m(klon)
236 REAL ypblh(klon)
237 REAL ylcl(klon)
238 REAL ycapcl(klon)
239 REAL yoliqcl(klon)
240 REAL ycteicl(klon)
241 REAL ypblt(klon)
242 REAL ytherm(klon)
243 REAL ytrmb1(klon)
244 REAL ytrmb2(klon)
245 REAL ytrmb3(klon)
246 REAL uzon(klon), vmer(klon)
247 REAL tair1(klon), qair1(klon), tairsol(klon)
248 REAL psfce(klon), patm(klon)
249
250 REAL qairsol(klon), zgeo1(klon)
251 REAL rugo1(klon)
252
253 ! utiliser un jeu de fonctions simples
254 LOGICAL zxli
255 PARAMETER (zxli=.FALSE.)
256
257 !------------------------------------------------------------
258
259 ytherm = 0.
260
261 DO k = 1, klev ! epaisseur de couche
262 DO i = 1, klon
263 delp(i, k) = paprs(i, k) - paprs(i, k+1)
264 END DO
265 END DO
266 DO i = 1, klon ! vent de la premiere couche
267 zx_alf1 = 1.0
268 zx_alf2 = 1.0 - zx_alf1
269 u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
270 v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
271 END DO
272
273 ! Initialization:
274 rugmer = 0.
275 cdragh = 0.
276 cdragm = 0.
277 dflux_t = 0.
278 dflux_q = 0.
279 zu1 = 0.
280 zv1 = 0.
281 ypct = 0.
282 yts = 0.
283 ysnow = 0.
284 yqsurf = 0.
285 yalb = 0.
286 yalblw = 0.
287 yrain_f = 0.
288 ysnow_f = 0.
289 yfder = 0.
290 ysolsw = 0.
291 ysollw = 0.
292 yrugos = 0.
293 yu1 = 0.
294 yv1 = 0.
295 yrads = 0.
296 ypaprs = 0.
297 ypplay = 0.
298 ydelp = 0.
299 yu = 0.
300 yv = 0.
301 yt = 0.
302 yq = 0.
303 pctsrf_new = 0.
304 y_flux_u = 0.
305 y_flux_v = 0.
306 y_dflux_t = 0.
307 y_dflux_q = 0.
308 ytsoil = 999999.
309 yrugoro = 0.
310 yu10mx = 0.
311 yu10my = 0.
312 ywindsp = 0.
313 d_ts = 0.
314 yfluxlat = 0.
315 flux_t = 0.
316 flux_q = 0.
317 flux_u = 0.
318 flux_v = 0.
319 d_t = 0.
320 d_q = 0.
321 d_u = 0.
322 d_v = 0.
323 ycoefh = 0.
324
325 ! Initialisation des "pourcentages potentiels". On considère ici qu'on
326 ! peut avoir potentiellement de la glace sur tout le domaine océanique
327 ! (à affiner)
328
329 pctsrf_pot = pctsrf
330 pctsrf_pot(:, is_oce) = 1. - zmasq
331 pctsrf_pot(:, is_sic) = 1. - zmasq
332
333 ! Boucler sur toutes les sous-fractions du sol:
334
335 loop_surface: DO nsrf = 1, nbsrf
336 ! Chercher les indices :
337 ni = 0
338 knon = 0
339 DO i = 1, klon
340 ! Pour déterminer le domaine à traiter, on utilise les surfaces
341 ! "potentielles"
342 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
343 knon = knon + 1
344 ni(knon) = i
345 END IF
346 END DO
347
348 if_knon: IF (knon /= 0) then
349 DO j = 1, knon
350 i = ni(j)
351 ypct(j) = pctsrf(i, nsrf)
352 yts(j) = ts(i, nsrf)
353 ytslab(i) = tslab(i)
354 ysnow(j) = snow(i, nsrf)
355 yqsurf(j) = qsurf(i, nsrf)
356 yalb(j) = albe(i, nsrf)
357 yalblw(j) = alblw(i, nsrf)
358 yrain_f(j) = rain_fall(i)
359 ysnow_f(j) = snow_f(i)
360 yagesno(j) = agesno(i, nsrf)
361 yfder(j) = fder(i)
362 ysolsw(j) = solsw(i, nsrf)
363 ysollw(j) = sollw(i, nsrf)
364 yrugos(j) = rugos(i, nsrf)
365 yrugoro(j) = rugoro(i)
366 yu1(j) = u1lay(i)
367 yv1(j) = v1lay(i)
368 yrads(j) = ysolsw(j) + ysollw(j)
369 ypaprs(j, klev+1) = paprs(i, klev+1)
370 y_run_off_lic_0(j) = run_off_lic_0(i)
371 yu10mx(j) = u10m(i, nsrf)
372 yu10my(j) = v10m(i, nsrf)
373 ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))
374 END DO
375
376 ! For continent, copy soil water content
377 IF (nsrf == is_ter) THEN
378 yqsol(:knon) = qsol(ni(:knon))
379 ELSE
380 yqsol = 0.
381 END IF
382
383 DO k = 1, nsoilmx
384 DO j = 1, knon
385 i = ni(j)
386 ytsoil(j, k) = ftsoil(i, k, nsrf)
387 END DO
388 END DO
389
390 DO k = 1, klev
391 DO j = 1, knon
392 i = ni(j)
393 ypaprs(j, k) = paprs(i, k)
394 ypplay(j, k) = pplay(i, k)
395 ydelp(j, k) = delp(i, k)
396 yu(j, k) = u(i, k)
397 yv(j, k) = v(i, k)
398 yt(j, k) = t(i, k)
399 yq(j, k) = q(i, k)
400 END DO
401 END DO
402
403 ! calculer Cdrag et les coefficients d'echange
404 CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &
405 yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
406 IF (iflag_pbl == 1) THEN
407 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
408 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
409 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
410 END IF
411
412 ! on met un seuil pour coefm et coefh
413 IF (nsrf == is_oce) THEN
414 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
415 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
416 END IF
417
418 IF (ok_kzmin) THEN
419 ! Calcul d'une diffusion minimale pour les conditions tres stables
420 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
421 coefm(:knon, 1), ycoefm0, ycoefh0)
422 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
423 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
424 END IF
425
426 IF (iflag_pbl >= 3) THEN
427 ! Mellor et Yamada adapté à Mars, Richard Fournier et
428 ! Frédéric Hourdin
429 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
430 + ypplay(:knon, 1))) &
431 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
432 DO k = 2, klev
433 yzlay(1:knon, k) = yzlay(1:knon, k-1) &
434 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
435 / ypaprs(1:knon, k) &
436 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
437 END DO
438 DO k = 1, klev
439 yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
440 / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
441 END DO
442 yzlev(1:knon, 1) = 0.
443 yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
444 - yzlay(:knon, klev - 1)
445 DO k = 2, klev
446 yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
447 END DO
448 DO k = 1, klev + 1
449 DO j = 1, knon
450 i = ni(j)
451 yq2(j, k) = q2(i, k, nsrf)
452 END DO
453 END DO
454
455 CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
456 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
457
458 ! iflag_pbl peut être utilisé comme longueur de mélange
459
460 IF (iflag_pbl >= 11) THEN
461 CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &
462 yu, yv, yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, &
463 yustar, iflag_pbl)
464 ELSE
465 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
466 coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
467 END IF
468
469 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
470 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
471 END IF
472
473 ! calculer la diffusion des vitesses "u" et "v"
474 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
475 ypplay, ydelp, y_d_u, y_flux_u)
476 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
477 ypplay, ydelp, y_d_v, y_flux_v)
478
479 ! calculer la diffusion de "q" et de "h"
480 CALL clqh(dtime, itap, jour, debut, rlat, knon, nsrf, ni(:knon), &
481 pctsrf, ytsoil, yqsol, rmu0, co2_ppm, yrugos, yrugoro, yu1, &
482 yv1, coefh(:knon, :), yt, yq, yts, ypaprs, ypplay, ydelp, &
483 yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, yfder, &
484 ysolsw, yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, &
485 y_d_ts(:knon), yz0_new, y_flux_t, y_flux_q, y_dflux_t, &
486 y_dflux_q, y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, &
487 y_flux_g)
488
489 ! calculer la longueur de rugosite sur ocean
490 yrugm = 0.
491 IF (nsrf == is_oce) THEN
492 DO j = 1, knon
493 yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
494 0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
495 yrugm(j) = max(1.5E-05, yrugm(j))
496 END DO
497 END IF
498 DO j = 1, knon
499 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
500 y_dflux_q(j) = y_dflux_q(j)*ypct(j)
501 yu1(j) = yu1(j)*ypct(j)
502 yv1(j) = yv1(j)*ypct(j)
503 END DO
504
505 DO k = 1, klev
506 DO j = 1, knon
507 i = ni(j)
508 coefh(j, k) = coefh(j, k)*ypct(j)
509 coefm(j, k) = coefm(j, k)*ypct(j)
510 y_d_t(j, k) = y_d_t(j, k)*ypct(j)
511 y_d_q(j, k) = y_d_q(j, k)*ypct(j)
512 flux_t(i, k, nsrf) = y_flux_t(j, k)
513 flux_q(i, k, nsrf) = y_flux_q(j, k)
514 flux_u(i, k, nsrf) = y_flux_u(j, k)
515 flux_v(i, k, nsrf) = y_flux_v(j, k)
516 y_d_u(j, k) = y_d_u(j, k)*ypct(j)
517 y_d_v(j, k) = y_d_v(j, k)*ypct(j)
518 END DO
519 END DO
520
521 evap(:, nsrf) = -flux_q(:, 1, nsrf)
522
523 albe(:, nsrf) = 0.
524 alblw(:, nsrf) = 0.
525 snow(:, nsrf) = 0.
526 qsurf(:, nsrf) = 0.
527 rugos(:, nsrf) = 0.
528 fluxlat(:, nsrf) = 0.
529 DO j = 1, knon
530 i = ni(j)
531 d_ts(i, nsrf) = y_d_ts(j)
532 albe(i, nsrf) = yalb(j)
533 alblw(i, nsrf) = yalblw(j)
534 snow(i, nsrf) = ysnow(j)
535 qsurf(i, nsrf) = yqsurf(j)
536 rugos(i, nsrf) = yz0_new(j)
537 fluxlat(i, nsrf) = yfluxlat(j)
538 IF (nsrf == is_oce) THEN
539 rugmer(i) = yrugm(j)
540 rugos(i, nsrf) = yrugm(j)
541 END IF
542 agesno(i, nsrf) = yagesno(j)
543 fqcalving(i, nsrf) = y_fqcalving(j)
544 ffonte(i, nsrf) = y_ffonte(j)
545 cdragh(i) = cdragh(i) + coefh(j, 1)
546 cdragm(i) = cdragm(i) + coefm(j, 1)
547 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
548 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
549 zu1(i) = zu1(i) + yu1(j)
550 zv1(i) = zv1(i) + yv1(j)
551 END DO
552 IF (nsrf == is_ter) THEN
553 qsol(ni(:knon)) = yqsol(:knon)
554 else IF (nsrf == is_lic) THEN
555 DO j = 1, knon
556 i = ni(j)
557 run_off_lic_0(i) = y_run_off_lic_0(j)
558 END DO
559 END IF
560
561 ftsoil(:, :, nsrf) = 0.
562 DO k = 1, nsoilmx
563 DO j = 1, knon
564 i = ni(j)
565 ftsoil(i, k, nsrf) = ytsoil(j, k)
566 END DO
567 END DO
568
569 DO j = 1, knon
570 i = ni(j)
571 DO k = 1, klev
572 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
573 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
574 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
575 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
576 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
577 END DO
578 END DO
579
580 ! diagnostic t, q a 2m et u, v a 10m
581
582 DO j = 1, knon
583 i = ni(j)
584 uzon(j) = yu(j, 1) + y_d_u(j, 1)
585 vmer(j) = yv(j, 1) + y_d_v(j, 1)
586 tair1(j) = yt(j, 1) + y_d_t(j, 1)
587 qair1(j) = yq(j, 1) + y_d_q(j, 1)
588 zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
589 1)))*(ypaprs(j, 1)-ypplay(j, 1))
590 tairsol(j) = yts(j) + y_d_ts(j)
591 rugo1(j) = yrugos(j)
592 IF (nsrf == is_oce) THEN
593 rugo1(j) = rugos(i, nsrf)
594 END IF
595 psfce(j) = ypaprs(j, 1)
596 patm(j) = ypplay(j, 1)
597
598 qairsol(j) = yqsurf(j)
599 END DO
600
601 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
602 zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
603 yt10m, yq10m, yu10m, yustar)
604
605 DO j = 1, knon
606 i = ni(j)
607 t2m(i, nsrf) = yt2m(j)
608 q2m(i, nsrf) = yq2m(j)
609
610 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
611 u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
612 v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
613
614 END DO
615
616 CALL hbtm(knon, ypaprs, ypplay, yt2m, yt10m, yq2m, yq10m, yustar, &
617 y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &
618 ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
619
620 DO j = 1, knon
621 i = ni(j)
622 pblh(i, nsrf) = ypblh(j)
623 plcl(i, nsrf) = ylcl(j)
624 capcl(i, nsrf) = ycapcl(j)
625 oliqcl(i, nsrf) = yoliqcl(j)
626 cteicl(i, nsrf) = ycteicl(j)
627 pblt(i, nsrf) = ypblt(j)
628 therm(i, nsrf) = ytherm(j)
629 trmb1(i, nsrf) = ytrmb1(j)
630 trmb2(i, nsrf) = ytrmb2(j)
631 trmb3(i, nsrf) = ytrmb3(j)
632 END DO
633
634 DO j = 1, knon
635 DO k = 1, klev + 1
636 i = ni(j)
637 q2(i, k, nsrf) = yq2(j, k)
638 END DO
639 END DO
640 !IM "slab" ocean
641 IF (nsrf == is_oce) THEN
642 DO j = 1, knon
643 ! on projette sur la grille globale
644 i = ni(j)
645 IF (pctsrf_new(i, is_oce)>epsfra) THEN
646 flux_o(i) = y_flux_o(j)
647 ELSE
648 flux_o(i) = 0.
649 END IF
650 END DO
651 END IF
652
653 IF (nsrf == is_sic) THEN
654 DO j = 1, knon
655 i = ni(j)
656 ! On pondère lorsque l'on fait le bilan au sol :
657 IF (pctsrf_new(i, is_sic)>epsfra) THEN
658 flux_g(i) = y_flux_g(j)
659 ELSE
660 flux_g(i) = 0.
661 END IF
662 END DO
663
664 END IF
665 end IF if_knon
666 END DO loop_surface
667
668 ! On utilise les nouvelles surfaces
669
670 rugos(:, is_oce) = rugmer
671 pctsrf = pctsrf_new
672
673 END SUBROUTINE clmain
674
675 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21