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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 207 - (show annotations)
Thu Sep 1 10:30:53 2016 UTC (7 years, 7 months ago) by guez
File size: 21026 byte(s)
New philosophy on compiler options.

Removed source code for thermcep = f. (Not used in LMDZ either.)

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) ! temperature du sol (en Kelvin)
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 ytsoil = 999999.
282 yrugoro = 0.
283 d_ts = 0.
284 yfluxlat = 0.
285 flux_t = 0.
286 flux_q = 0.
287 flux_u = 0.
288 flux_v = 0.
289 d_t = 0.
290 d_q = 0.
291 d_u = 0.
292 d_v = 0.
293 ycoefh = 0.
294
295 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
296 ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
297 ! (\`a affiner)
298
299 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
300 pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
301 pctsrf_pot(:, is_oce) = 1. - zmasq
302 pctsrf_pot(:, is_sic) = 1. - zmasq
303
304 ! Tester si c'est le moment de lire le fichier:
305 if (mod(itap - 1, lmt_pas) == 0) then
306 CALL interfoce_lim(jour, pctsrf_new_oce, pctsrf_new_sic)
307 endif
308
309 ! Boucler sur toutes les sous-fractions du sol:
310
311 loop_surface: DO nsrf = 1, nbsrf
312 ! Chercher les indices :
313 ni = 0
314 knon = 0
315 DO i = 1, klon
316 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
317 ! "potentielles"
318 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
319 knon = knon + 1
320 ni(knon) = i
321 END IF
322 END DO
323
324 if_knon: IF (knon /= 0) then
325 DO j = 1, knon
326 i = ni(j)
327 ypct(j) = pctsrf(i, nsrf)
328 yts(j) = ftsol(i, nsrf)
329 ysnow(j) = snow(i, nsrf)
330 yqsurf(j) = qsurf(i, nsrf)
331 yalb(j) = falbe(i, nsrf)
332 yrain_f(j) = rain_fall(i)
333 ysnow_f(j) = snow_f(i)
334 yagesno(j) = agesno(i, nsrf)
335 yfder(j) = fder(i)
336 yrugos(j) = rugos(i, nsrf)
337 yrugoro(j) = rugoro(i)
338 yu1(j) = u1lay(i)
339 yv1(j) = v1lay(i)
340 yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
341 ypaprs(j, klev+1) = paprs(i, klev+1)
342 y_run_off_lic_0(j) = run_off_lic_0(i)
343 END DO
344
345 ! For continent, copy soil water content
346 IF (nsrf == is_ter) THEN
347 yqsol(:knon) = qsol(ni(:knon))
348 ELSE
349 yqsol = 0.
350 END IF
351
352 DO k = 1, nsoilmx
353 DO j = 1, knon
354 i = ni(j)
355 ytsoil(j, k) = ftsoil(i, k, nsrf)
356 END DO
357 END DO
358
359 DO k = 1, klev
360 DO j = 1, knon
361 i = ni(j)
362 ypaprs(j, k) = paprs(i, k)
363 ypplay(j, k) = pplay(i, k)
364 ydelp(j, k) = delp(i, k)
365 yu(j, k) = u(i, k)
366 yv(j, k) = v(i, k)
367 yt(j, k) = t(i, k)
368 yq(j, k) = q(i, k)
369 END DO
370 END DO
371
372 ! calculer Cdrag et les coefficients d'echange
373 CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &
374 yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
375 IF (iflag_pbl == 1) THEN
376 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
377 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
378 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
379 END IF
380
381 ! on met un seuil pour coefm et coefh
382 IF (nsrf == is_oce) THEN
383 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
384 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
385 END IF
386
387 IF (ok_kzmin) THEN
388 ! Calcul d'une diffusion minimale pour les conditions tres stables
389 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
390 coefm(:knon, 1), ycoefm0, ycoefh0)
391 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
392 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
393 END IF
394
395 IF (iflag_pbl >= 3) THEN
396 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
397 ! Fr\'ed\'eric Hourdin
398 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
399 + ypplay(:knon, 1))) &
400 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
401 DO k = 2, klev
402 yzlay(1:knon, k) = yzlay(1:knon, k-1) &
403 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
404 / ypaprs(1:knon, k) &
405 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
406 END DO
407 DO k = 1, klev
408 yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
409 / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
410 END DO
411 yzlev(1:knon, 1) = 0.
412 yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
413 - yzlay(:knon, klev - 1)
414 DO k = 2, klev
415 yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
416 END DO
417 DO k = 1, klev + 1
418 DO j = 1, knon
419 i = ni(j)
420 yq2(j, k) = q2(i, k, nsrf)
421 END DO
422 END DO
423
424 CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
425 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
426
427 ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
428
429 IF (iflag_pbl >= 11) THEN
430 CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
431 yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
432 iflag_pbl)
433 ELSE
434 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
435 coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
436 END IF
437
438 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
439 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
440 END IF
441
442 ! calculer la diffusion des vitesses "u" et "v"
443 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
444 ypplay, ydelp, y_d_u, y_flux_u(:knon))
445 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
446 ypplay, ydelp, y_d_v, y_flux_v(:knon))
447
448 ! calculer la diffusion de "q" et de "h"
449 CALL clqh(dtime, jour, firstcal, rlat, nsrf, ni(:knon), ytsoil, &
450 yqsol, rmu0, yrugos, yrugoro, yu1, yv1, coefh(:knon, :), yt, &
451 yq, yts(:knon), ypaprs, ypplay, ydelp, yrads, yalb(:knon), &
452 ysnow, yqsurf, yrain_f, ysnow_f, yfder, yfluxlat, &
453 pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), &
454 yz0_new, y_flux_t(:knon), y_flux_q(:knon), y_dflux_t, &
455 y_dflux_q, y_fqcalving, y_ffonte, y_run_off_lic_0)
456
457 ! calculer la longueur de rugosite sur ocean
458 yrugm = 0.
459 IF (nsrf == is_oce) THEN
460 DO j = 1, knon
461 yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
462 0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
463 yrugm(j) = max(1.5E-05, yrugm(j))
464 END DO
465 END IF
466 DO j = 1, knon
467 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
468 y_dflux_q(j) = y_dflux_q(j)*ypct(j)
469 yu1(j) = yu1(j)*ypct(j)
470 yv1(j) = yv1(j)*ypct(j)
471 END DO
472
473 DO k = 1, klev
474 DO j = 1, knon
475 i = ni(j)
476 coefh(j, k) = coefh(j, k)*ypct(j)
477 coefm(j, k) = coefm(j, k)*ypct(j)
478 y_d_t(j, k) = y_d_t(j, k)*ypct(j)
479 y_d_q(j, k) = y_d_q(j, k)*ypct(j)
480 y_d_u(j, k) = y_d_u(j, k)*ypct(j)
481 y_d_v(j, k) = y_d_v(j, k)*ypct(j)
482 END DO
483 END DO
484
485 DO j = 1, knon
486 i = ni(j)
487 flux_t(i, nsrf) = y_flux_t(j)
488 flux_q(i, nsrf) = y_flux_q(j)
489 flux_u(i, nsrf) = y_flux_u(j)
490 flux_v(i, nsrf) = y_flux_v(j)
491 END DO
492
493 evap(:, nsrf) = -flux_q(:, nsrf)
494
495 falbe(:, nsrf) = 0.
496 snow(:, nsrf) = 0.
497 qsurf(:, nsrf) = 0.
498 rugos(:, nsrf) = 0.
499 fluxlat(:, nsrf) = 0.
500 DO j = 1, knon
501 i = ni(j)
502 d_ts(i, nsrf) = y_d_ts(j)
503 falbe(i, nsrf) = yalb(j)
504 snow(i, nsrf) = ysnow(j)
505 qsurf(i, nsrf) = yqsurf(j)
506 rugos(i, nsrf) = yz0_new(j)
507 fluxlat(i, nsrf) = yfluxlat(j)
508 IF (nsrf == is_oce) THEN
509 rugmer(i) = yrugm(j)
510 rugos(i, nsrf) = yrugm(j)
511 END IF
512 agesno(i, nsrf) = yagesno(j)
513 fqcalving(i, nsrf) = y_fqcalving(j)
514 ffonte(i, nsrf) = y_ffonte(j)
515 cdragh(i) = cdragh(i) + coefh(j, 1)
516 cdragm(i) = cdragm(i) + coefm(j, 1)
517 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
518 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
519 zu1(i) = zu1(i) + yu1(j)
520 zv1(i) = zv1(i) + yv1(j)
521 END DO
522 IF (nsrf == is_ter) THEN
523 qsol(ni(:knon)) = yqsol(:knon)
524 else IF (nsrf == is_lic) THEN
525 DO j = 1, knon
526 i = ni(j)
527 run_off_lic_0(i) = y_run_off_lic_0(j)
528 END DO
529 END IF
530
531 ftsoil(:, :, nsrf) = 0.
532 DO k = 1, nsoilmx
533 DO j = 1, knon
534 i = ni(j)
535 ftsoil(i, k, nsrf) = ytsoil(j, k)
536 END DO
537 END DO
538
539 DO j = 1, knon
540 i = ni(j)
541 DO k = 1, klev
542 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
543 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
544 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
545 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
546 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
547 END DO
548 END DO
549
550 ! diagnostic t, q a 2m et u, v a 10m
551
552 DO j = 1, knon
553 i = ni(j)
554 uzon(j) = yu(j, 1) + y_d_u(j, 1)
555 vmer(j) = yv(j, 1) + y_d_v(j, 1)
556 tair1(j) = yt(j, 1) + y_d_t(j, 1)
557 qair1(j) = yq(j, 1) + y_d_q(j, 1)
558 zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
559 1)))*(ypaprs(j, 1)-ypplay(j, 1))
560 tairsol(j) = yts(j) + y_d_ts(j)
561 rugo1(j) = yrugos(j)
562 IF (nsrf == is_oce) THEN
563 rugo1(j) = rugos(i, nsrf)
564 END IF
565 psfce(j) = ypaprs(j, 1)
566 patm(j) = ypplay(j, 1)
567
568 qairsol(j) = yqsurf(j)
569 END DO
570
571 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
572 zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
573 yt10m, yq10m, yu10m, yustar)
574
575 DO j = 1, knon
576 i = ni(j)
577 t2m(i, nsrf) = yt2m(j)
578 q2m(i, nsrf) = yq2m(j)
579
580 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
581 u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
582 v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
583
584 END DO
585
586 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t(:knon), &
587 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
588 yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
589
590 DO j = 1, knon
591 i = ni(j)
592 pblh(i, nsrf) = ypblh(j)
593 plcl(i, nsrf) = ylcl(j)
594 capcl(i, nsrf) = ycapcl(j)
595 oliqcl(i, nsrf) = yoliqcl(j)
596 cteicl(i, nsrf) = ycteicl(j)
597 pblt(i, nsrf) = ypblt(j)
598 therm(i, nsrf) = ytherm(j)
599 trmb1(i, nsrf) = ytrmb1(j)
600 trmb2(i, nsrf) = ytrmb2(j)
601 trmb3(i, nsrf) = ytrmb3(j)
602 END DO
603
604 DO j = 1, knon
605 DO k = 1, klev + 1
606 i = ni(j)
607 q2(i, k, nsrf) = yq2(j, k)
608 END DO
609 END DO
610 end IF if_knon
611 END DO loop_surface
612
613 ! On utilise les nouvelles surfaces
614 rugos(:, is_oce) = rugmer
615 pctsrf(:, is_oce) = pctsrf_new_oce
616 pctsrf(:, is_sic) = pctsrf_new_sic
617
618 firstcal = .false.
619
620 END SUBROUTINE clmain
621
622 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21