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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 208 - (show annotations)
Wed Dec 7 16:44:53 2016 UTC (7 years, 5 months ago) by guez
File size: 20777 byte(s)
Module academic was not used.

Useful values for iflag_phys were only 0 and 1 so changed type to logical.

Definition of fmagic was duplicated in procedures alboc and alboc_cd
so moved it up to interfsurf_hq and also moved multiplication by
fmagic (following LMDZ).

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

  ViewVC Help
Powered by ViewVC 1.1.21