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

Contents of /trunk/phylmd/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 248 - (show annotations)
Fri Jan 5 16:40:13 2018 UTC (6 years, 4 months ago) by guez
Original Path: trunk/Sources/phylmd/clmain.f
File size: 20629 byte(s)
Move the call to clcdrag up from coefkz to clmain (folllowing
LMDZ). As both clcdrag and coefkz need zgeop, also move the
computation of zgeop from coefkz to clmain.

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

  ViewVC Help
Powered by ViewVC 1.1.21