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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 222 - (show annotations)
Tue Apr 25 15:31:48 2017 UTC (7 years ago) by guez
File size: 20821 byte(s)
In interfsurf_hq, changed names of variables : tsurf becomes ts (name of
actual argument), tsurf_temp  can then become simply tsurf.

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

  ViewVC Help
Powered by ViewVC 1.1.21