/[lmdze]/trunk/phylmd/pbl_surface.f
ViewVC logotype

Contents of /trunk/phylmd/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 228 - (show annotations)
Fri Nov 3 12:38:47 2017 UTC (6 years, 6 months ago) by guez
Original Path: trunk/Sources/phylmd/clmain.f
File size: 19718 byte(s)
Bug fix in dynetat0: phisinit to phis.

gcm explodes (stops in hgardfou) in less than one day with iflag_pbl =
7 (Mellor and Yamada 2.0 Fournier) and 11 (corresponding to iflag_pbl
= 31 in LMDZ, call to vdif_kcay). So remove those choices. Not much
used in LMDZ either. Remaining useful choices are iflag = 0, 1, 6, 8,
9.

Remove procedure yamada, which was not used.

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

  ViewVC Help
Powered by ViewVC 1.1.21