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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 231 - (show annotations)
Mon Nov 6 18:00:54 2017 UTC (6 years, 6 months ago) by guez
File size: 19774 byte(s)
Use separate variables for eddy diffusion and drag coefficient in
clvent (following LMDZ).

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 (flux turbulent de 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 CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), &
373 yu(:knon, :), yv(:knon, :), yteta(:knon, :), &
374 coefm(:knon, 1), yq2(:knon, :), ykmm(:knon, :), &
375 ykmn(:knon, :), ykmq(:knon, :), ustar(:knon))
376 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
377 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
378 END IF
379
380 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, 2:), &
381 coefm(:knon, 1), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
382 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
383 y_flux_u(:knon))
384 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, 2:), &
385 coefm(:knon, 1), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
386 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
387 y_flux_v(:knon))
388
389 ! calculer la diffusion de "q" et de "h"
390 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
391 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
392 yu(:knon, 1), yv(:knon, 1), coefh(:knon, :), yt, yq, &
393 yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), yalb(:knon), &
394 snow(:knon), yqsurf, yrain_f, ysnow_f, yfluxlat(:knon), &
395 pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), &
396 yz0_new, y_flux_t(:knon), y_flux_q(:knon), y_dflux_t(:knon), &
397 y_dflux_q(:knon), y_fqcalving, y_ffonte, y_run_off_lic_0)
398
399 ! calculer la longueur de rugosite sur ocean
400 yrugm = 0.
401 IF (nsrf == is_oce) THEN
402 DO j = 1, knon
403 yrugm(j) = 0.018 * coefm(j, 1) * (yu(j, 1)**2 + yv(j, 1)**2) &
404 / rg + 0.11 * 14E-6 &
405 / sqrt(coefm(j, 1) * (yu(j, 1)**2 + yv(j, 1)**2))
406 yrugm(j) = max(1.5E-05, yrugm(j))
407 END DO
408 END IF
409 DO j = 1, knon
410 y_dflux_t(j) = y_dflux_t(j) * ypct(j)
411 y_dflux_q(j) = y_dflux_q(j) * ypct(j)
412 END DO
413
414 DO k = 1, klev
415 DO j = 1, knon
416 i = ni(j)
417 coefh(j, k) = coefh(j, k) * ypct(j)
418 coefm(j, k) = coefm(j, k) * ypct(j)
419 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
420 y_d_q(j, k) = y_d_q(j, k) * ypct(j)
421 y_d_u(j, k) = y_d_u(j, k) * ypct(j)
422 y_d_v(j, k) = y_d_v(j, k) * ypct(j)
423 END DO
424 END DO
425
426 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
427 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
428 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
429 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
430
431 evap(:, nsrf) = -flux_q(:, nsrf)
432
433 falbe(:, nsrf) = 0.
434 fsnow(:, nsrf) = 0.
435 qsurf(:, nsrf) = 0.
436 frugs(:, nsrf) = 0.
437 DO j = 1, knon
438 i = ni(j)
439 d_ts(i, nsrf) = y_d_ts(j)
440 falbe(i, nsrf) = yalb(j)
441 fsnow(i, nsrf) = snow(j)
442 qsurf(i, nsrf) = yqsurf(j)
443 frugs(i, nsrf) = yz0_new(j)
444 fluxlat(i, nsrf) = yfluxlat(j)
445 IF (nsrf == is_oce) THEN
446 rugmer(i) = yrugm(j)
447 frugs(i, nsrf) = yrugm(j)
448 END IF
449 agesno(i, nsrf) = yagesno(j)
450 fqcalving(i, nsrf) = y_fqcalving(j)
451 ffonte(i, nsrf) = y_ffonte(j)
452 cdragh(i) = cdragh(i) + coefh(j, 1)
453 cdragm(i) = cdragm(i) + coefm(j, 1)
454 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
455 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
456 END DO
457 IF (nsrf == is_ter) THEN
458 qsol(ni(:knon)) = yqsol(:knon)
459 else IF (nsrf == is_lic) THEN
460 DO j = 1, knon
461 i = ni(j)
462 run_off_lic_0(i) = y_run_off_lic_0(j)
463 END DO
464 END IF
465
466 ftsoil(:, :, nsrf) = 0.
467 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
468
469 DO j = 1, knon
470 i = ni(j)
471 DO k = 1, klev
472 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
473 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
474 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
475 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
476 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
477 END DO
478 END DO
479
480 ! diagnostic t, q a 2m et u, v a 10m
481
482 DO j = 1, knon
483 i = ni(j)
484 u1(j) = yu(j, 1) + y_d_u(j, 1)
485 v1(j) = yv(j, 1) + y_d_v(j, 1)
486 tair1(j) = yt(j, 1) + y_d_t(j, 1)
487 qair1(j) = yq(j, 1) + y_d_q(j, 1)
488 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
489 1))) * (ypaprs(j, 1)-ypplay(j, 1))
490 tairsol(j) = yts(j) + y_d_ts(j)
491 rugo1(j) = yrugos(j)
492 IF (nsrf == is_oce) THEN
493 rugo1(j) = frugs(i, nsrf)
494 END IF
495 psfce(j) = ypaprs(j, 1)
496 patm(j) = ypplay(j, 1)
497
498 qairsol(j) = yqsurf(j)
499 END DO
500
501 CALL stdlevvar(klon, knon, nsrf, u1(:knon), v1(:knon), tair1(:knon), &
502 qair1, zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, &
503 yq2m, yt10m, yq10m, wind10m(:knon), ustar)
504
505 DO j = 1, knon
506 i = ni(j)
507 t2m(i, nsrf) = yt2m(j)
508 q2m(i, nsrf) = yq2m(j)
509
510 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
511 / sqrt(u1(j)**2 + v1(j)**2)
512 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
513 / sqrt(u1(j)**2 + v1(j)**2)
514 END DO
515
516 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
517 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
518 yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
519
520 DO j = 1, knon
521 i = ni(j)
522 pblh(i, nsrf) = ypblh(j)
523 plcl(i, nsrf) = ylcl(j)
524 capcl(i, nsrf) = ycapcl(j)
525 oliqcl(i, nsrf) = yoliqcl(j)
526 cteicl(i, nsrf) = ycteicl(j)
527 pblt(i, nsrf) = ypblt(j)
528 therm(i, nsrf) = ytherm(j)
529 trmb1(i, nsrf) = ytrmb1(j)
530 trmb2(i, nsrf) = ytrmb2(j)
531 trmb3(i, nsrf) = ytrmb3(j)
532 END DO
533
534 DO j = 1, knon
535 DO k = 1, klev + 1
536 i = ni(j)
537 q2(i, k, nsrf) = yq2(j, k)
538 END DO
539 END DO
540 else
541 fsnow(:, nsrf) = 0.
542 end IF if_knon
543 END DO loop_surface
544
545 ! On utilise les nouvelles surfaces
546 frugs(:, is_oce) = rugmer
547 pctsrf(:, is_oce) = pctsrf_new_oce
548 pctsrf(:, is_sic) = pctsrf_new_sic
549
550 firstcal = .false.
551
552 END SUBROUTINE clmain
553
554 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21