/[lmdze]/trunk/phylmd/Interface_surf/pbl_surface.f90
ViewVC logotype

Contents of /trunk/phylmd/Interface_surf/pbl_surface.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 346 - (show annotations)
Mon Dec 9 20:15:29 2019 UTC (4 years, 6 months ago) by guez
File size: 18995 byte(s)
Rename block to `my_block` in procedure `CLOUDS_GNO` because block is
a Fortran keyword.

Remove computation of palpbla in procedure sw. It was not used nor
output. (Not used nor output either in LMDZ.)

In procedure physiq, define `d_[uv]_con` and add them to `[uv]_seri`
only if `conv_Emanuel`. Thus, we do not need to initialize
`d_[uv]_con` to 0, we do not have to save them and we do not add 0 to
`[uv]_seri`.

In procedure physiq, no need to initialize rnebcon to 0, it is defined
by phyetat0 afterwards.

Check that `iflag_cldcon` is between - 2 and 3.

1 module pbl_surface_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE pbl_surface(pctsrf, t_seri, q_seri, u_seri, v_seri, julien, mu0, &
8 ftsol, cdmmax, cdhmax, ftsoil, qsol, paprs, play, fsnow, fqsurf, falbe, &
9 fluxlat, rain_fall, snow_fall, frugs, agesno, rugoro, d_t, d_q, d_u, &
10 d_v, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2, dflux_t, &
11 dflux_q, coefh, t2m, q2m, u10m_srf, v10m_srf, pblh, capcl, oliqcl, &
12 cteicl, pblt, therm, plcl, fqcalving, ffonte, run_off_lic_0, albsol, &
13 sollw, solsw, tsol)
14
15 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
16 ! Author: Z. X. Li (LMD/CNRS)
17 ! Date: Aug. 18th, 1993
18 ! Objet : interface de couche limite (diffusion verticale)
19
20 ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
21 ! de la couche limite pour les traceurs se fait avec "cltrac" et
22 ! ne tient pas compte de la diff\'erentiation des sous-fractions
23 ! de sol.
24
25 use cdrag_m, only: cdrag
26 use clqh_m, only: clqh
27 use clvent_m, only: clvent
28 use coef_diff_turb_m, only: coef_diff_turb
29 USE conf_gcm_m, ONLY: lmt_pas
30 USE conf_phys_m, ONLY: iflag_pbl
31 USE dimphy, ONLY: klev, klon
32 USE dimsoil, ONLY: nsoilmx
33 use hbtm_m, only: hbtm
34 USE histwrite_phy_m, ONLY: histwrite_phy
35 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
36 USE interfoce_lim_m, ONLY: interfoce_lim
37 use phyetat0_m, only: masque
38 use stdlevvar_m, only: stdlevvar
39 USE suphec_m, ONLY: rd, rg, rsigma
40 use time_phylmdz, only: itap
41
42 REAL, INTENT(inout):: pctsrf(:, :) ! (klon, nbsrf)
43 ! pourcentages de surface de chaque maille
44
45 REAL, INTENT(IN):: t_seri(:, :) ! (klon, klev) air temperature, in K
46 REAL, INTENT(IN):: q_seri(:, :) ! (klon, klev) mass fraction of water vapor
47 REAL, INTENT(IN):: u_seri(:, :), v_seri(:, :) ! (klon, klev) wind, in m s -1
48 INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
49 REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal
50
51 REAL, INTENT(INout):: ftsol(:, :) ! (klon, nbsrf)
52 ! skin temperature of surface fraction, in K
53
54 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
55
56 REAL, INTENT(inout):: ftsoil(:, :, :) ! (klon, nsoilmx, nbsrf)
57 ! temperature of surface fraction inside the ground, in K, layer 1
58 ! nearest to the surface
59
60 REAL, INTENT(inout):: qsol(:) ! (klon)
61 ! column-density of water in soil, in kg m-2
62
63 REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
64 REAL, INTENT(IN):: play(klon, klev) ! pression au milieu de couche (Pa)
65
66 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf)
67 ! column-density of mass of snow at the surface, in kg m-2
68
69 REAL, INTENT(inout):: fqsurf(klon, nbsrf)
70 REAL, intent(inout):: falbe(klon, nbsrf)
71
72 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
73 ! flux de chaleur latente, en W m-2
74
75 REAL, intent(in):: rain_fall(klon)
76 ! liquid water mass flux (kg / m2 / s), positive down
77
78 REAL, intent(in):: snow_fall(klon)
79 ! solid water mass flux (kg / m2 / s), positive down
80
81 REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
82 real, intent(inout):: agesno(:, :) ! (klon, nbsrf)
83 REAL, INTENT(IN):: rugoro(klon)
84
85 REAL, intent(out):: d_t(:, :), d_q(:, :) ! (klon, klev)
86 ! changement pour t_seri et q_seri
87
88 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
89 ! changement pour "u_seri" et "v_seri"
90
91 REAL, intent(out):: flux_t(klon, nbsrf)
92 ! flux de chaleur sensible (c_p T) (W / m2) (orientation positive
93 ! vers le bas) à la surface
94
95 REAL, intent(out):: flux_q(klon, nbsrf)
96 ! flux de vapeur d'eau (kg / m2 / s) à la surface
97
98 REAL, intent(out):: flux_u(:, :), flux_v(:, :) ! (klon, nbsrf)
99 ! tension du vent (flux turbulent de vent) à la surface, en Pa
100
101 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
102 real q2(klon, klev + 1, nbsrf)
103
104 ! Ocean slab:
105 REAL, INTENT(out):: dflux_t(klon) ! derive du flux sensible
106 REAL, INTENT(out):: dflux_q(klon) ! derive du flux latent
107
108 REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
109 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
110 ! "coefh" 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) temp\'erature au nveau HCL
126 REAL therm(klon, nbsrf)
127 REAL plcl(klon, nbsrf)
128
129 REAL, intent(out):: fqcalving(klon, nbsrf)
130 ! flux d'eau "perdue" par la surface et necessaire pour limiter la
131 ! hauteur de neige, en kg / m2 / s
132
133 real ffonte(klon, nbsrf) ! flux thermique utilise pour fondre la neige
134 REAL, intent(inout):: run_off_lic_0(:) ! (klon)
135
136 REAL, intent(out):: albsol(:) ! (klon)
137 ! albedo du sol total, visible, moyen par maille
138
139 REAL, intent(in):: sollw(:) ! (klon)
140 ! surface net downward longwave flux, in W m-2
141
142 REAL, intent(in):: solsw(:) ! (klon)
143 ! surface net downward shortwave flux, in W m-2
144
145 REAL, intent(in):: tsol(:) ! (klon)
146
147 ! Local:
148
149 REAL d_ts(klon, nbsrf) ! variation of ftsol
150 REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous-surface
151 REAL fsolsw(klon, nbsrf) ! flux solaire absorb\'e pour chaque sous-surface
152
153 ! la nouvelle repartition des surfaces sortie de l'interface
154 REAL, save:: pctsrf_new_oce(klon)
155 REAL, save:: pctsrf_new_sic(klon)
156
157 REAL y_fqcalving(klon), y_ffonte(klon)
158 real y_run_off_lic_0(klon), y_run_off_lic(klon)
159 REAL run_off_lic(klon) ! ruissellement total
160 REAL rugmer(klon)
161 REAL ytsoil(klon, nsoilmx)
162 REAL yts(klon), ypctsrf(klon), yz0_new(klon)
163 real yrugos(klon) ! longueur de rugosit\'e, en m
164 REAL yalb(klon)
165 REAL snow(klon) ! column-density of mass of snow at the surface, in kg m-2
166 real yqsurf(klon), yagesno(klon)
167 real yqsol(klon) ! column-density of water in soil, in kg m-2
168 REAL yrain_fall(klon) ! liquid water mass flux (kg / m2 / s), positive down
169 REAL ysnow_fall(klon) ! solid water mass flux (kg / m2 / s), positive down
170 REAL yrugm(klon), radsol(klon), yrugoro(klon)
171 REAL yfluxlat(klon)
172 REAL y_d_ts(klon)
173 REAL y_d_t(klon, klev), y_d_q(klon, klev)
174 REAL y_d_u(klon, klev), y_d_v(klon, klev)
175 REAL y_flux_t(klon), y_flux_q(klon)
176 REAL y_flux_u(klon), y_flux_v(klon)
177 REAL y_dflux_t(klon), y_dflux_q(klon)
178 REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
179 real ycdragh(klon), ycdragm(klon)
180 REAL yu(klon, klev), yv(klon, klev)
181 REAL yt(klon, klev), yq(klon, klev)
182 REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
183 REAL yq2(klon, klev + 1)
184 REAL delp(klon, klev)
185 INTEGER i, k, nsrf
186 INTEGER ni(klon), knon, j
187
188 REAL pctsrf_pot(klon, nbsrf)
189 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
190 ! apparitions ou disparitions de la glace de mer
191
192 REAL yt2m(klon), yq2m(klon), wind10m(klon)
193 REAL ustar(klon)
194
195 REAL yt10m(klon), yq10m(klon)
196 REAL ypblh(klon)
197 REAL ylcl(klon)
198 REAL ycapcl(klon)
199 REAL yoliqcl(klon)
200 REAL ycteicl(klon)
201 REAL ypblt(klon)
202 REAL ytherm(klon)
203 REAL u1(klon), v1(klon)
204 REAL tair1(klon)
205 REAL rugo1(klon)
206 REAL zgeop(klon, klev)
207
208 !------------------------------------------------------------
209
210 albsol = sum(falbe * pctsrf, dim = 2)
211
212 ! R\'epartition sous maille des flux longwave et shortwave
213 ! R\'epartition du longwave par sous-surface lin\'earis\'ee
214
215 forall (nsrf = 1:nbsrf)
216 fsollw(:, nsrf) = sollw + 4. * RSIGMA * tsol**3 &
217 * (tsol - ftsol(:, nsrf))
218 fsolsw(:, nsrf) = solsw * (1. - falbe(:, nsrf)) / (1. - albsol)
219 END forall
220
221 ytherm = 0.
222
223 DO k = 1, klev ! epaisseur de couche
224 DO i = 1, klon
225 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
226 END DO
227 END DO
228
229 ! Initialization:
230 rugmer = 0.
231 cdragh = 0.
232 cdragm = 0.
233 dflux_t = 0.
234 dflux_q = 0.
235 ypaprs = 0.
236 ypplay = 0.
237 ydelp = 0.
238 yrugoro = 0.
239 d_ts = 0.
240 flux_t = 0.
241 flux_q = 0.
242 flux_u = 0.
243 flux_v = 0.
244 fluxlat = 0.
245 d_t = 0.
246 d_q = 0.
247 d_u = 0.
248 d_v = 0.
249 coefh = 0.
250 fqcalving = 0.
251 run_off_lic = 0.
252
253 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
254 ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
255 ! (\`a affiner).
256
257 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
258 pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
259 pctsrf_pot(:, is_oce) = 1. - masque
260 pctsrf_pot(:, is_sic) = 1. - masque
261
262 ! Tester si c'est le moment de lire le fichier:
263 if (mod(itap - 1, lmt_pas) == 0) then
264 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
265 endif
266
267 ! Boucler sur toutes les sous-fractions du sol:
268
269 loop_surface: DO nsrf = 1, nbsrf
270 ! Define ni and knon:
271
272 ni = 0
273 knon = 0
274
275 DO i = 1, klon
276 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
277 ! "potentielles"
278 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
279 knon = knon + 1
280 ni(knon) = i
281 END IF
282 END DO
283
284 if_knon: IF (knon /= 0) then
285 ypctsrf(:knon) = pctsrf(ni(:knon), nsrf)
286 yts(:knon) = ftsol(ni(:knon), nsrf)
287 snow(:knon) = fsnow(ni(:knon), nsrf)
288 yqsurf(:knon) = fqsurf(ni(:knon), nsrf)
289 yalb(:knon) = falbe(ni(:knon), nsrf)
290 yrain_fall(:knon) = rain_fall(ni(:knon))
291 ysnow_fall(:knon) = snow_fall(ni(:knon))
292 yagesno(:knon) = agesno(ni(:knon), nsrf)
293 yrugos(:knon) = frugs(ni(:knon), nsrf)
294 yrugoro(:knon) = rugoro(ni(:knon))
295 radsol(:knon) = fsolsw(ni(:knon), nsrf) + fsollw(ni(:knon), nsrf)
296 ypaprs(:knon, klev + 1) = paprs(ni(:knon), klev + 1)
297 y_run_off_lic_0(:knon) = run_off_lic_0(ni(:knon))
298
299 ! For continent, copy soil water content
300 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
301
302 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
303
304 DO k = 1, klev
305 DO j = 1, knon
306 i = ni(j)
307 ypaprs(j, k) = paprs(i, k)
308 ypplay(j, k) = play(i, k)
309 ydelp(j, k) = delp(i, k)
310 yu(j, k) = u_seri(i, k)
311 yv(j, k) = v_seri(i, k)
312 yt(j, k) = t_seri(i, k)
313 yq(j, k) = q_seri(i, k)
314 END DO
315 END DO
316
317 ! Calculer les géopotentiels de chaque couche:
318
319 zgeop(:knon, 1) = RD * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
320 + ypplay(:knon, 1))) * (ypaprs(:knon, 1) - ypplay(:knon, 1))
321
322 DO k = 2, klev
323 zgeop(:knon, k) = zgeop(:knon, k - 1) + RD * 0.5 &
324 * (yt(:knon, k - 1) + yt(:knon, k)) / ypaprs(:knon, k) &
325 * (ypplay(:knon, k - 1) - ypplay(:knon, k))
326 ENDDO
327
328 CALL cdrag(nsrf, sqrt(yu(:knon, 1)**2 + yv(:knon, 1)**2), &
329 yt(:knon, 1), yq(:knon, 1), zgeop(:knon, 1), ypaprs(:knon, 1), &
330 yts(:knon), yqsurf(:knon), yrugos(:knon), ycdragm(:knon), &
331 ycdragh(:knon))
332
333 IF (iflag_pbl == 1) THEN
334 ycdragm(:knon) = max(ycdragm(:knon), 0.)
335 ycdragh(:knon) = max(ycdragh(:knon), 0.)
336 end IF
337
338 IF (nsrf == is_oce) THEN
339 ! On met un seuil pour ycdragm et ycdragh :
340 ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
341 ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
342 END IF
343
344 IF (iflag_pbl >= 6) yq2(:knon, :) = q2(ni(:knon), :, nsrf)
345 call coef_diff_turb(nsrf, ni(:knon), ypaprs(:knon, :), &
346 ypplay(:knon, :), yu(:knon, :), yv(:knon, :), yq(:knon, :), &
347 yt(:knon, :), yts(:knon), ycdragm(:knon), zgeop(:knon, :), &
348 ycoefm(:knon, :), ycoefh(:knon, :), yq2(:knon, :))
349
350 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
351 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
352 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
353 y_flux_u(:knon))
354 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
355 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
356 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
357 y_flux_v(:knon))
358
359 CALL clqh(julien, nsrf, ni(:knon), ytsoil(:knon, :), yqsol(:knon), &
360 mu0(ni(:knon)), yrugos(:knon), yrugoro(:knon), yu(:knon, 1), &
361 yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), yt(:knon, :), &
362 yq(:knon, :), yts(:knon), ypaprs(:knon, :), ypplay(:knon, :), &
363 ydelp(:knon, :), radsol(:knon), yalb(:knon), snow(:knon), &
364 yqsurf(:knon), yrain_fall(:knon), ysnow_fall(:knon), &
365 yfluxlat(:knon), pctsrf_new_sic(ni(:knon)), yagesno(:knon), &
366 y_d_t(:knon, :), y_d_q(:knon, :), y_d_ts(:knon), &
367 yz0_new(:knon), y_flux_t(:knon), y_flux_q(:knon), &
368 y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving(:knon), &
369 y_ffonte(:knon), y_run_off_lic_0(:knon), y_run_off_lic(:knon))
370
371 ! calculer la longueur de rugosite sur ocean
372
373 yrugm = 0.
374
375 IF (nsrf == is_oce) THEN
376 DO j = 1, knon
377 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
378 / rg + 0.11 * 14E-6 &
379 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
380 yrugm(j) = max(1.5E-05, yrugm(j))
381 END DO
382 END IF
383
384 DO k = 1, klev
385 DO j = 1, knon
386 y_d_t(j, k) = y_d_t(j, k) * ypctsrf(j)
387 y_d_q(j, k) = y_d_q(j, k) * ypctsrf(j)
388 y_d_u(j, k) = y_d_u(j, k) * ypctsrf(j)
389 y_d_v(j, k) = y_d_v(j, k) * ypctsrf(j)
390 END DO
391 END DO
392
393 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
394 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
395 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
396 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
397
398 falbe(:, nsrf) = 0.
399 fsnow(:, nsrf) = 0.
400 fqsurf(:, nsrf) = 0.
401 frugs(:, nsrf) = 0.
402 DO j = 1, knon
403 i = ni(j)
404 d_ts(i, nsrf) = y_d_ts(j)
405 falbe(i, nsrf) = yalb(j)
406 fsnow(i, nsrf) = snow(j)
407 fqsurf(i, nsrf) = yqsurf(j)
408 frugs(i, nsrf) = yz0_new(j)
409 fluxlat(i, nsrf) = yfluxlat(j)
410 IF (nsrf == is_oce) THEN
411 rugmer(i) = yrugm(j)
412 frugs(i, nsrf) = yrugm(j)
413 END IF
414 agesno(i, nsrf) = yagesno(j)
415 fqcalving(i, nsrf) = y_fqcalving(j)
416 ffonte(i, nsrf) = y_ffonte(j)
417 cdragh(i) = cdragh(i) + ycdragh(j) * ypctsrf(j)
418 cdragm(i) = cdragm(i) + ycdragm(j) * ypctsrf(j)
419 dflux_t(i) = dflux_t(i) + y_dflux_t(j) * ypctsrf(j)
420 dflux_q(i) = dflux_q(i) + y_dflux_q(j) * ypctsrf(j)
421 END DO
422 IF (nsrf == is_ter) THEN
423 qsol(ni(:knon)) = yqsol(:knon)
424 else IF (nsrf == is_lic) THEN
425 DO j = 1, knon
426 i = ni(j)
427 run_off_lic_0(i) = y_run_off_lic_0(j)
428 run_off_lic(i) = y_run_off_lic(j)
429 END DO
430 END IF
431
432 ftsoil(:, :, nsrf) = 0.
433 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
434
435 DO j = 1, knon
436 i = ni(j)
437 DO k = 1, klev
438 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
439 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
440 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
441 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
442 END DO
443 END DO
444
445 forall (k = 2:klev) coefh(ni(:knon), k) &
446 = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypctsrf(:knon)
447
448 ! Diagnostic temp\'erature, q \`a 2 m et u, v \`a 10 m:
449
450 u1(:knon) = yu(:knon, 1) + y_d_u(:knon, 1)
451 v1(:knon) = yv(:knon, 1) + y_d_v(:knon, 1)
452 tair1(:knon) = yt(:knon, 1) + y_d_t(:knon, 1)
453
454 IF (nsrf == is_oce) THEN
455 rugo1(:knon) = frugs(ni(:knon), is_oce)
456 else
457 rugo1(:knon) = yrugos(:knon)
458 END IF
459
460 CALL stdlevvar(nsrf, u1(:knon), v1(:knon), tair1(:knon), &
461 yq(:knon, 1) + y_d_q(:knon, 1), rd * tair1(:knon) &
462 / (0.5 * (ypaprs(:knon, 1) + ypplay(:knon, 1))) &
463 * (ypaprs(:knon, 1) - ypplay(:knon, 1)), &
464 yts(:knon) + y_d_ts(:knon), yqsurf(:knon), rugo1, &
465 ypaprs(:knon, 1), ypplay(:knon, 1), yt2m, yq2m, yt10m, yq10m, &
466 wind10m(:knon), ustar(:knon))
467
468 DO j = 1, knon
469 i = ni(j)
470 t2m(i, nsrf) = yt2m(j)
471 q2m(i, nsrf) = yq2m(j)
472
473 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
474 / sqrt(u1(j)**2 + v1(j)**2)
475 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
476 / sqrt(u1(j)**2 + v1(j)**2)
477 END DO
478
479 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
480 y_flux_q(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
481 yq(:knon, :), ypblh(:knon), ycapcl, yoliqcl, ycteicl, ypblt, &
482 ytherm, ylcl)
483
484 DO j = 1, knon
485 i = ni(j)
486 pblh(i, nsrf) = ypblh(j)
487 plcl(i, nsrf) = ylcl(j)
488 capcl(i, nsrf) = ycapcl(j)
489 oliqcl(i, nsrf) = yoliqcl(j)
490 cteicl(i, nsrf) = ycteicl(j)
491 pblt(i, nsrf) = ypblt(j)
492 therm(i, nsrf) = ytherm(j)
493 END DO
494
495 IF (iflag_pbl >= 6) q2(ni(:knon), :, nsrf) = yq2(:knon, :)
496 else
497 fsnow(:, nsrf) = 0.
498 end IF if_knon
499 END DO loop_surface
500
501 ! On utilise les nouvelles surfaces
502 frugs(:, is_oce) = rugmer
503 pctsrf(:, is_oce) = pctsrf_new_oce
504 pctsrf(:, is_sic) = pctsrf_new_sic
505
506 CALL histwrite_phy("run_off_lic", run_off_lic)
507 ftsol = ftsol + d_ts ! update surface temperature
508 CALL histwrite_phy("dtsvdfo", d_ts(:, is_oce))
509 CALL histwrite_phy("dtsvdft", d_ts(:, is_ter))
510 CALL histwrite_phy("dtsvdfg", d_ts(:, is_lic))
511 CALL histwrite_phy("dtsvdfi", d_ts(:, is_sic))
512
513 END SUBROUTINE pbl_surface
514
515 end module pbl_surface_m

  ViewVC Help
Powered by ViewVC 1.1.21