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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 223 - (show annotations)
Fri Apr 28 13:22:36 2017 UTC (6 years, 11 months ago) by guez
File size: 20708 byte(s)
In clmain, local variable yfder was computed but not used. I think it
was useful for coupling only. Variable fder_print of pbl_surface in
LMDZ, which is output by LMDZ, corresponds to variable fder of physiq
in LMDZ and LMDZE.

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

  ViewVC Help
Powered by ViewVC 1.1.21