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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 155 - (show annotations)
Wed Jul 8 17:03:45 2015 UTC (8 years, 9 months ago) by guez
File size: 22387 byte(s)
Do not write any longer to startphy.nc nor read from restartphy.nc the
NetCDF variable ALBLW: it was the same than ALBE. ALBE was for the
visible and ALBLW for the near infrared. In physiq, use only variables
falbe and albsol, removed falblw and albsollw. See revision 888 of
LMDZ.

Removed unused arguments pdp of SUBROUTINE lwbv, ptave of SUBROUTINE
lwv, kuaer of SUBROUTINE lwvd, nq of SUBROUTINE initphysto.

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

  ViewVC Help
Powered by ViewVC 1.1.21