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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 324 - (show annotations)
Wed Feb 6 15:58:03 2019 UTC (5 years, 3 months ago) by guez
File size: 18580 byte(s)
Rename variable zmasq of module phyetat0_m to masque, which was
already its name in "restartphy.nc". Rename variable fraclic of
procedure etat0 to landice, which was already its name in
"landiceref.nc". Style guide: we try to have the same names for
identical data objects across the program.

In procedure interfsurf_hq, in case is_sic, define tsurf instead of
tsurf_new, avoiding a copy from tsurf_new to tsurf.

1 module pbl_surface_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE pbl_surface(pctsrf, t, q, u, v, julien, mu0, ftsol, cdmmax, &
8 cdhmax, ftsoil, qsol, paprs, play, fsnow, fqsurf, falbe, fluxlat, &
9 rain_fall, snow_fall, frugs, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, &
10 flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, &
11 coefh, t2m, q2m, u10m_srf, v10m_srf, pblh, capcl, oliqcl, cteicl, pblt, &
12 therm, plcl, fqcalving, ffonte, run_off_lic_0, albsol, sollw, solsw, &
13 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(klon, klev) ! temperature (K)
46 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
47 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
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(IN):: 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 ! 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):: play(klon, klev) ! pression au milieu de couche (Pa)
64 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
65 REAL, INTENT(inout):: fqsurf(klon, nbsrf)
66 REAL, intent(inout):: falbe(klon, nbsrf)
67
68 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
69 ! flux de chaleur latente, en W m-2
70
71 REAL, intent(in):: rain_fall(klon)
72 ! liquid water mass flux (kg / m2 / s), positive down
73
74 REAL, intent(in):: snow_fall(klon)
75 ! solid water mass flux (kg / m2 / s), positive down
76
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, intent(out):: d_t(:, :), d_q(:, :) ! (klon, klev)
82 ! changement pour t et q
83
84 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
85 ! changement pour "u" et "v"
86
87 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
88
89 REAL, intent(out):: flux_t(klon, nbsrf)
90 ! flux de chaleur sensible (c_p T) (W / m2) (orientation positive
91 ! vers le bas) à la surface
92
93 REAL, intent(out):: flux_q(klon, nbsrf)
94 ! flux de vapeur d'eau (kg / m2 / s) à la surface
95
96 REAL, intent(out):: flux_u(:, :), flux_v(:, :) ! (klon, nbsrf)
97 ! tension du vent (flux turbulent de vent) à la surface, en Pa
98
99 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
100 real q2(klon, klev + 1, nbsrf)
101
102 ! Ocean slab:
103 REAL, INTENT(out):: dflux_t(klon) ! derive du flux sensible
104 REAL, INTENT(out):: dflux_q(klon) ! derive du flux latent
105
106 REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
107 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
108 ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
109 ! ce champ sur les quatre sous-surfaces du mod\`ele.
110
111 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
112
113 REAL, INTENT(inout):: u10m_srf(:, :), v10m_srf(:, :) ! (klon, nbsrf)
114 ! composantes du vent \`a 10m sans spirale d'Ekman
115
116 ! Ionela Musat. Cf. Anne Mathieu : planetary boundary layer, hbtm.
117 ! Comme les autres diagnostics on cumule dans physiq ce qui permet
118 ! de sortir les grandeurs par sous-surface.
119 REAL pblh(klon, nbsrf) ! height of planetary boundary layer
120 REAL capcl(klon, nbsrf)
121 REAL oliqcl(klon, nbsrf)
122 REAL cteicl(klon, nbsrf)
123 REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
124 REAL therm(klon, nbsrf)
125 REAL plcl(klon, nbsrf)
126
127 REAL, intent(out):: fqcalving(klon, nbsrf)
128 ! flux d'eau "perdue" par la surface et necessaire pour limiter la
129 ! hauteur de neige, en kg / m2 / s
130
131 real ffonte(klon, nbsrf) ! flux thermique utilise pour fondre la neige
132 REAL, intent(inout):: run_off_lic_0(:) ! (klon)
133
134 REAL, intent(out):: albsol(:) ! (klon)
135 ! albedo du sol total, visible, moyen par maille
136
137 REAL, intent(in):: sollw(:) ! (klon)
138 ! surface net downward longwave flux, in W m-2
139
140 REAL, intent(in):: solsw(:) ! (klon)
141 ! surface net downward shortwave flux, in W m-2
142
143 REAL, intent(in):: tsol(:) ! (klon)
144
145 ! Local:
146
147 REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous-surface
148 REAL fsolsw(klon, nbsrf) ! flux solaire absorb\'e pour chaque sous-surface
149
150 ! la nouvelle repartition des surfaces sortie de l'interface
151 REAL, save:: pctsrf_new_oce(klon)
152 REAL, save:: pctsrf_new_sic(klon)
153
154 REAL y_fqcalving(klon), y_ffonte(klon)
155 real y_run_off_lic_0(klon), y_run_off_lic(klon)
156 REAL run_off_lic(klon) ! ruissellement total
157 REAL rugmer(klon)
158 REAL ytsoil(klon, nsoilmx)
159 REAL yts(klon), ypctsrf(klon), yz0_new(klon)
160 real yrugos(klon) ! longueur de rugosite (en m)
161 REAL yalb(klon)
162 REAL snow(klon), yqsurf(klon), yagesno(klon)
163 real yqsol(klon) ! column-density of water in soil, in kg m-2
164 REAL yrain_fall(klon) ! liquid water mass flux (kg / m2 / s), positive down
165 REAL ysnow_fall(klon) ! solid water mass flux (kg / m2 / s), positive down
166 REAL yrugm(klon), radsol(klon), yrugoro(klon)
167 REAL yfluxlat(klon)
168 REAL y_d_ts(klon)
169 REAL y_d_t(klon, klev), y_d_q(klon, klev)
170 REAL y_d_u(klon, klev), y_d_v(klon, klev)
171 REAL y_flux_t(klon), y_flux_q(klon)
172 REAL y_flux_u(klon), y_flux_v(klon)
173 REAL y_dflux_t(klon), y_dflux_q(klon)
174 REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
175 real ycdragh(klon), ycdragm(klon)
176 REAL yu(klon, klev), yv(klon, klev)
177 REAL yt(klon, klev), yq(klon, klev)
178 REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
179 REAL yq2(klon, klev + 1)
180 REAL delp(klon, klev)
181 INTEGER i, k, nsrf
182 INTEGER ni(klon), knon, j
183
184 REAL pctsrf_pot(klon, nbsrf)
185 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
186 ! apparitions ou disparitions de la glace de mer
187
188 REAL yt2m(klon), yq2m(klon), wind10m(klon)
189 REAL ustar(klon)
190
191 REAL yt10m(klon), yq10m(klon)
192 REAL ypblh(klon)
193 REAL ylcl(klon)
194 REAL ycapcl(klon)
195 REAL yoliqcl(klon)
196 REAL ycteicl(klon)
197 REAL ypblt(klon)
198 REAL ytherm(klon)
199 REAL u1(klon), v1(klon)
200 REAL tair1(klon), qair1(klon), tairsol(klon)
201 REAL psfce(klon), patm(klon)
202 REAL zgeo1(klon)
203 REAL rugo1(klon)
204 REAL zgeop(klon, klev)
205
206 !------------------------------------------------------------
207
208 albsol = sum(falbe * pctsrf, dim = 2)
209
210 ! R\'epartition sous maille des flux longwave et shortwave
211 ! R\'epartition du longwave par sous-surface lin\'earis\'ee
212
213 forall (nsrf = 1:nbsrf)
214 fsollw(:, nsrf) = sollw + 4. * RSIGMA * tsol**3 &
215 * (tsol - ftsol(:, nsrf))
216 fsolsw(:, nsrf) = solsw * (1. - falbe(:, nsrf)) / (1. - albsol)
217 END forall
218
219 ytherm = 0.
220
221 DO k = 1, klev ! epaisseur de couche
222 DO i = 1, klon
223 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
224 END DO
225 END DO
226
227 ! Initialization:
228 rugmer = 0.
229 cdragh = 0.
230 cdragm = 0.
231 dflux_t = 0.
232 dflux_q = 0.
233 yrugos = 0.
234 ypaprs = 0.
235 ypplay = 0.
236 ydelp = 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 fqcalving = 0.
250 run_off_lic = 0.
251
252 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
253 ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
254 ! (\`a affiner).
255
256 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
257 pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
258 pctsrf_pot(:, is_oce) = 1. - masque
259 pctsrf_pot(:, is_sic) = 1. - masque
260
261 ! Tester si c'est le moment de lire le fichier:
262 if (mod(itap - 1, lmt_pas) == 0) then
263 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
264 endif
265
266 ! Boucler sur toutes les sous-fractions du sol:
267
268 loop_surface: DO nsrf = 1, nbsrf
269 ! Define ni and knon:
270
271 ni = 0
272 knon = 0
273
274 DO i = 1, klon
275 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
276 ! "potentielles"
277 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
278 knon = knon + 1
279 ni(knon) = i
280 END IF
281 END DO
282
283 if_knon: IF (knon /= 0) then
284 ypctsrf(:knon) = pctsrf(ni(:knon), nsrf)
285 yts(:knon) = ftsol(ni(:knon), nsrf)
286 snow(:knon) = fsnow(ni(:knon), nsrf)
287 yqsurf(:knon) = fqsurf(ni(:knon), nsrf)
288 yalb(:knon) = falbe(ni(:knon), nsrf)
289 yrain_fall(:knon) = rain_fall(ni(:knon))
290 ysnow_fall(:knon) = snow_fall(ni(:knon))
291 yagesno(:knon) = agesno(ni(:knon), nsrf)
292 yrugos(:knon) = frugs(ni(:knon), nsrf)
293 yrugoro(:knon) = rugoro(ni(:knon))
294 radsol(:knon) = fsolsw(ni(:knon), nsrf) + fsollw(ni(:knon), nsrf)
295 ypaprs(:knon, klev + 1) = paprs(ni(:knon), klev + 1)
296 y_run_off_lic_0(:knon) = run_off_lic_0(ni(:knon))
297
298 ! For continent, copy soil water content
299 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
300
301 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
302
303 DO k = 1, klev
304 DO j = 1, knon
305 i = ni(j)
306 ypaprs(j, k) = paprs(i, k)
307 ypplay(j, k) = play(i, k)
308 ydelp(j, k) = delp(i, k)
309 yu(j, k) = u(i, k)
310 yv(j, k) = v(i, k)
311 yt(j, k) = t(i, k)
312 yq(j, k) = q(i, k)
313 END DO
314 END DO
315
316 ! Calculer les géopotentiels de chaque couche:
317
318 zgeop(:knon, 1) = RD * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
319 + ypplay(:knon, 1))) * (ypaprs(:knon, 1) - ypplay(:knon, 1))
320
321 DO k = 2, klev
322 zgeop(:knon, k) = zgeop(:knon, k - 1) + RD * 0.5 &
323 * (yt(:knon, k - 1) + yt(:knon, k)) / ypaprs(:knon, k) &
324 * (ypplay(:knon, k - 1) - ypplay(:knon, k))
325 ENDDO
326
327 CALL cdrag(nsrf, sqrt(yu(:knon, 1)**2 + yv(:knon, 1)**2), &
328 yt(:knon, 1), yq(:knon, 1), zgeop(:knon, 1), ypaprs(:knon, 1), &
329 yts(:knon), yqsurf(:knon), yrugos(:knon), ycdragm(:knon), &
330 ycdragh(:knon))
331
332 IF (iflag_pbl == 1) THEN
333 ycdragm(:knon) = max(ycdragm(:knon), 0.)
334 ycdragh(:knon) = max(ycdragh(:knon), 0.)
335 end IF
336
337 ! on met un seuil pour ycdragm et ycdragh
338 IF (nsrf == is_oce) THEN
339 ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
340 ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
341 END IF
342
343 IF (iflag_pbl >= 6) yq2(:knon, :) = q2(ni(:knon), :, nsrf)
344 call coef_diff_turb(nsrf, ni(:knon), ypaprs(:knon, :), &
345 ypplay(:knon, :), yu(:knon, :), yv(:knon, :), yq(:knon, :), &
346 yt(:knon, :), yts(:knon), ycdragm(:knon), zgeop(:knon, :), &
347 ycoefm(:knon, :), ycoefh(:knon, :), yq2(:knon, :))
348
349 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
350 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
351 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
352 y_flux_u(:knon))
353 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
354 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
355 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
356 y_flux_v(:knon))
357
358 CALL clqh(julien, nsrf, ni(:knon), ytsoil(:knon, :), yqsol(:knon), &
359 mu0(ni(:knon)), yrugos(:knon), yrugoro(:knon), yu(:knon, 1), &
360 yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), yt(:knon, :), &
361 yq(:knon, :), yts(:knon), ypaprs(:knon, :), ypplay(:knon, :), &
362 ydelp(:knon, :), radsol(:knon), yalb(:knon), snow(:knon), &
363 yqsurf(:knon), yrain_fall(:knon), ysnow_fall(:knon), &
364 yfluxlat(:knon), pctsrf_new_sic(ni(:knon)), yagesno(:knon), &
365 y_d_t(:knon, :), y_d_q(:knon, :), y_d_ts(:knon), &
366 yz0_new(:knon), y_flux_t(:knon), y_flux_q(:knon), &
367 y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving(:knon), &
368 y_ffonte(:knon), y_run_off_lic_0(:knon), y_run_off_lic(:knon))
369
370 ! calculer la longueur de rugosite sur ocean
371
372 yrugm = 0.
373
374 IF (nsrf == is_oce) THEN
375 DO j = 1, knon
376 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
377 / rg + 0.11 * 14E-6 &
378 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
379 yrugm(j) = max(1.5E-05, yrugm(j))
380 END DO
381 END IF
382
383 DO k = 1, klev
384 DO j = 1, knon
385 i = ni(j)
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 t, q a 2m et u, v a 10m
449
450 DO j = 1, knon
451 i = ni(j)
452 u1(j) = yu(j, 1) + y_d_u(j, 1)
453 v1(j) = yv(j, 1) + y_d_v(j, 1)
454 tair1(j) = yt(j, 1) + y_d_t(j, 1)
455 qair1(j) = yq(j, 1) + y_d_q(j, 1)
456 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
457 1))) * (ypaprs(j, 1)-ypplay(j, 1))
458 tairsol(j) = yts(j) + y_d_ts(j)
459 rugo1(j) = yrugos(j)
460 IF (nsrf == is_oce) THEN
461 rugo1(j) = frugs(i, nsrf)
462 END IF
463 psfce(j) = ypaprs(j, 1)
464 patm(j) = ypplay(j, 1)
465 END DO
466
467 CALL stdlevvar(nsrf, u1(:knon), v1(:knon), tair1(:knon), qair1, &
468 zgeo1, tairsol, yqsurf(:knon), rugo1, psfce, patm, yt2m, yq2m, &
469 yt10m, yq10m, wind10m(:knon), ustar(:knon))
470
471 DO j = 1, knon
472 i = ni(j)
473 t2m(i, nsrf) = yt2m(j)
474 q2m(i, nsrf) = yq2m(j)
475
476 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
477 / sqrt(u1(j)**2 + v1(j)**2)
478 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
479 / sqrt(u1(j)**2 + v1(j)**2)
480 END DO
481
482 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
483 y_flux_q(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
484 yq(:knon, :), ypblh(:knon), ycapcl, yoliqcl, ycteicl, ypblt, &
485 ytherm, ylcl)
486
487 DO j = 1, knon
488 i = ni(j)
489 pblh(i, nsrf) = ypblh(j)
490 plcl(i, nsrf) = ylcl(j)
491 capcl(i, nsrf) = ycapcl(j)
492 oliqcl(i, nsrf) = yoliqcl(j)
493 cteicl(i, nsrf) = ycteicl(j)
494 pblt(i, nsrf) = ypblt(j)
495 therm(i, nsrf) = ytherm(j)
496 END DO
497
498 IF (iflag_pbl >= 6) q2(ni(:knon), :, nsrf) = yq2(:knon, :)
499 else
500 fsnow(:, nsrf) = 0.
501 end IF if_knon
502 END DO loop_surface
503
504 ! On utilise les nouvelles surfaces
505 frugs(:, is_oce) = rugmer
506 pctsrf(:, is_oce) = pctsrf_new_oce
507 pctsrf(:, is_sic) = pctsrf_new_sic
508
509 CALL histwrite_phy("run_off_lic", run_off_lic)
510
511 END SUBROUTINE pbl_surface
512
513 end module pbl_surface_m

  ViewVC Help
Powered by ViewVC 1.1.21