/[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 309 - (show annotations)
Thu Sep 27 14:58:10 2018 UTC (5 years, 7 months ago) by guez
File size: 18514 byte(s)
Remove variable pourc_* in histins.nc, redundant with fract_*.

In procedure physiq, change the meaning of variable "sens" to avoid
changing the sign several times needlessly. Also the meaning of
variable "sens" in physiq is now the same than the meaning of netCDF
variable "sens". Also the convention for "sens" is now the same than
for radsol, zxfluxlat, and flux_t.

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: zmasq
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 REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
51 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
52
53 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
54 ! soil temperature of surface fraction
55
56 REAL, INTENT(inout):: qsol(:) ! (klon)
57 ! column-density of water in soil, in kg m-2
58
59 REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
60 REAL, INTENT(IN):: play(klon, klev) ! pression au milieu de couche (Pa)
61 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
62 REAL, INTENT(inout):: fqsurf(klon, nbsrf)
63 REAL, intent(inout):: falbe(klon, nbsrf)
64 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
65
66 REAL, intent(in):: rain_fall(klon)
67 ! liquid water mass flux (kg / m2 / s), positive down
68
69 REAL, intent(in):: snow_fall(klon)
70 ! solid water mass flux (kg / m2 / s), positive down
71
72 REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
73 real agesno(klon, nbsrf)
74 REAL, INTENT(IN):: rugoro(klon)
75
76 REAL, intent(out):: d_t(:, :), d_q(:, :) ! (klon, klev)
77 ! changement pour t et q
78
79 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
80 ! changement pour "u" et "v"
81
82 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
83
84 REAL, intent(out):: flux_t(klon, nbsrf)
85 ! flux de chaleur sensible (c_p T) (W / m2) (orientation positive
86 ! vers le bas) à la surface
87
88 REAL, intent(out):: flux_q(klon, nbsrf)
89 ! flux de vapeur d'eau (kg / m2 / s) à la surface
90
91 REAL, intent(out):: flux_u(:, :), flux_v(:, :) ! (klon, nbsrf)
92 ! tension du vent (flux turbulent de vent) à la surface, en Pa
93
94 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
95 real q2(klon, klev + 1, nbsrf)
96
97 ! Ocean slab:
98 REAL, INTENT(out):: dflux_t(klon) ! derive du flux sensible
99 REAL, INTENT(out):: dflux_q(klon) ! derive du flux latent
100
101 REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
102 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
103 ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
104 ! ce champ sur les quatre sous-surfaces du mod\`ele.
105
106 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
107
108 REAL, INTENT(inout):: u10m_srf(:, :), v10m_srf(:, :) ! (klon, nbsrf)
109 ! composantes du vent \`a 10m sans spirale d'Ekman
110
111 ! Ionela Musat. Cf. Anne Mathieu : planetary boundary layer, hbtm.
112 ! Comme les autres diagnostics on cumule dans physiq ce qui permet
113 ! de sortir les grandeurs par sous-surface.
114 REAL pblh(klon, nbsrf) ! height of planetary boundary layer
115 REAL capcl(klon, nbsrf)
116 REAL oliqcl(klon, nbsrf)
117 REAL cteicl(klon, nbsrf)
118 REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
119 REAL therm(klon, nbsrf)
120 REAL plcl(klon, nbsrf)
121
122 REAL, intent(out):: fqcalving(klon, nbsrf)
123 ! flux d'eau "perdue" par la surface et necessaire pour limiter la
124 ! hauteur de neige, en kg / m2 / s
125
126 real ffonte(klon, nbsrf) ! flux thermique utilise pour fondre la neige
127 REAL, intent(inout):: run_off_lic_0(:) ! (klon)
128
129 REAL, intent(out):: albsol(:) ! (klon)
130 ! albedo du sol total, visible, moyen par maille
131
132 REAL, intent(in):: sollw(:) ! (klon)
133 ! surface net downward longwave flux, in W m-2
134
135 REAL, intent(in):: solsw(:) ! (klon)
136 ! surface net downward shortwave flux, in W m-2
137
138 REAL, intent(in):: tsol(:) ! (klon)
139
140 ! Local:
141
142 REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous-surface
143 REAL fsolsw(klon, nbsrf) ! flux solaire absorb\'e pour chaque sous-surface
144
145 ! la nouvelle repartition des surfaces sortie de l'interface
146 REAL, save:: pctsrf_new_oce(klon)
147 REAL, save:: pctsrf_new_sic(klon)
148
149 REAL y_fqcalving(klon), y_ffonte(klon)
150 real y_run_off_lic_0(klon), y_run_off_lic(klon)
151 REAL run_off_lic(klon) ! ruissellement total
152 REAL rugmer(klon)
153 REAL ytsoil(klon, nsoilmx)
154 REAL yts(klon), ypctsrf(klon), yz0_new(klon)
155 real yrugos(klon) ! longueur 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_fall(klon) ! liquid water mass flux (kg / m2 / s), positive down
160 REAL ysnow_fall(klon) ! solid water mass flux (kg / m2 / s), positive down
161 REAL yrugm(klon), radsol(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 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 u1(klon), v1(klon)
195 REAL tair1(klon), qair1(klon), tairsol(klon)
196 REAL psfce(klon), patm(klon)
197 REAL zgeo1(klon)
198 REAL rugo1(klon)
199 REAL zgeop(klon, klev)
200
201 !------------------------------------------------------------
202
203 albsol = sum(falbe * pctsrf, dim = 2)
204
205 ! R\'epartition sous maille des flux longwave et shortwave
206 ! R\'epartition du longwave par sous-surface lin\'earis\'ee
207
208 forall (nsrf = 1:nbsrf)
209 fsollw(:, nsrf) = sollw + 4. * RSIGMA * tsol**3 &
210 * (tsol - ftsol(:, nsrf))
211 fsolsw(:, nsrf) = solsw * (1. - falbe(:, nsrf)) / (1. - albsol)
212 END forall
213
214 ytherm = 0.
215
216 DO k = 1, klev ! epaisseur de couche
217 DO i = 1, klon
218 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
219 END DO
220 END DO
221
222 ! Initialization:
223 rugmer = 0.
224 cdragh = 0.
225 cdragm = 0.
226 dflux_t = 0.
227 dflux_q = 0.
228 yrugos = 0.
229 ypaprs = 0.
230 ypplay = 0.
231 ydelp = 0.
232 yrugoro = 0.
233 d_ts = 0.
234 flux_t = 0.
235 flux_q = 0.
236 flux_u = 0.
237 flux_v = 0.
238 fluxlat = 0.
239 d_t = 0.
240 d_q = 0.
241 d_u = 0.
242 d_v = 0.
243 coefh = 0.
244 fqcalving = 0.
245 run_off_lic = 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 ! Define ni and knon:
265
266 ni = 0
267 knon = 0
268
269 DO i = 1, klon
270 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
271 ! "potentielles"
272 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
273 knon = knon + 1
274 ni(knon) = i
275 END IF
276 END DO
277
278 if_knon: IF (knon /= 0) then
279 ypctsrf(:knon) = pctsrf(ni(:knon), nsrf)
280 yts(:knon) = ftsol(ni(:knon), nsrf)
281 snow(:knon) = fsnow(ni(:knon), nsrf)
282 yqsurf(:knon) = fqsurf(ni(:knon), nsrf)
283 yalb(:knon) = falbe(ni(:knon), nsrf)
284 yrain_fall(:knon) = rain_fall(ni(:knon))
285 ysnow_fall(:knon) = snow_fall(ni(:knon))
286 yagesno(:knon) = agesno(ni(:knon), nsrf)
287 yrugos(:knon) = frugs(ni(:knon), nsrf)
288 yrugoro(:knon) = rugoro(ni(:knon))
289 radsol(:knon) = fsolsw(ni(:knon), nsrf) + fsollw(ni(:knon), nsrf)
290 ypaprs(:knon, klev + 1) = paprs(ni(:knon), klev + 1)
291 y_run_off_lic_0(:knon) = run_off_lic_0(ni(:knon))
292
293 ! For continent, copy soil water content
294 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
295
296 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
297
298 DO k = 1, klev
299 DO j = 1, knon
300 i = ni(j)
301 ypaprs(j, k) = paprs(i, k)
302 ypplay(j, k) = play(i, k)
303 ydelp(j, k) = delp(i, k)
304 yu(j, k) = u(i, k)
305 yv(j, k) = v(i, k)
306 yt(j, k) = t(i, k)
307 yq(j, k) = q(i, k)
308 END DO
309 END DO
310
311 ! Calculer les géopotentiels de chaque couche:
312
313 zgeop(:knon, 1) = RD * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
314 + ypplay(:knon, 1))) * (ypaprs(:knon, 1) - ypplay(:knon, 1))
315
316 DO k = 2, klev
317 zgeop(:knon, k) = zgeop(:knon, k - 1) + RD * 0.5 &
318 * (yt(:knon, k - 1) + yt(:knon, k)) / ypaprs(:knon, k) &
319 * (ypplay(:knon, k - 1) - ypplay(:knon, k))
320 ENDDO
321
322 CALL cdrag(nsrf, sqrt(yu(:knon, 1)**2 + yv(:knon, 1)**2), &
323 yt(:knon, 1), yq(:knon, 1), zgeop(:knon, 1), ypaprs(:knon, 1), &
324 yts(:knon), yqsurf(:knon), yrugos(:knon), ycdragm(:knon), &
325 ycdragh(:knon))
326
327 IF (iflag_pbl == 1) THEN
328 ycdragm(:knon) = max(ycdragm(:knon), 0.)
329 ycdragh(:knon) = max(ycdragh(:knon), 0.)
330 end IF
331
332 ! on met un seuil pour ycdragm et ycdragh
333 IF (nsrf == is_oce) THEN
334 ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
335 ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
336 END IF
337
338 IF (iflag_pbl >= 6) yq2(:knon, :) = q2(ni(:knon), :, nsrf)
339 call coef_diff_turb(nsrf, ni(:knon), ypaprs(:knon, :), &
340 ypplay(:knon, :), yu(:knon, :), yv(:knon, :), yq(:knon, :), &
341 yt(:knon, :), yts(:knon), ycdragm(:knon), zgeop(:knon, :), &
342 ycoefm(:knon, :), ycoefh(:knon, :), yq2(:knon, :))
343
344 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
345 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
346 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
347 y_flux_u(:knon))
348 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
349 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
350 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
351 y_flux_v(:knon))
352
353 CALL clqh(julien, nsrf, ni(:knon), ytsoil(:knon, :), yqsol(:knon), &
354 mu0(ni(:knon)), yrugos(:knon), yrugoro(:knon), yu(:knon, 1), &
355 yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), yt(:knon, :), &
356 yq(:knon, :), yts(:knon), ypaprs(:knon, :), ypplay(:knon, :), &
357 ydelp(:knon, :), radsol(:knon), yalb(:knon), snow(:knon), &
358 yqsurf(:knon), yrain_fall(:knon), ysnow_fall(:knon), &
359 yfluxlat(:knon), pctsrf_new_sic(ni(:knon)), yagesno(:knon), &
360 y_d_t(:knon, :), y_d_q(:knon, :), y_d_ts(:knon), &
361 yz0_new(:knon), y_flux_t(:knon), y_flux_q(:knon), &
362 y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving(:knon), &
363 y_ffonte(:knon), y_run_off_lic_0(:knon), y_run_off_lic(:knon))
364
365 ! calculer la longueur de rugosite sur ocean
366
367 yrugm = 0.
368
369 IF (nsrf == is_oce) THEN
370 DO j = 1, knon
371 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
372 / rg + 0.11 * 14E-6 &
373 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
374 yrugm(j) = max(1.5E-05, yrugm(j))
375 END DO
376 END IF
377
378 DO k = 1, klev
379 DO j = 1, knon
380 i = ni(j)
381 y_d_t(j, k) = y_d_t(j, k) * ypctsrf(j)
382 y_d_q(j, k) = y_d_q(j, k) * ypctsrf(j)
383 y_d_u(j, k) = y_d_u(j, k) * ypctsrf(j)
384 y_d_v(j, k) = y_d_v(j, k) * ypctsrf(j)
385 END DO
386 END DO
387
388 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
389 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
390 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
391 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
392
393 falbe(:, nsrf) = 0.
394 fsnow(:, nsrf) = 0.
395 fqsurf(:, nsrf) = 0.
396 frugs(:, nsrf) = 0.
397 DO j = 1, knon
398 i = ni(j)
399 d_ts(i, nsrf) = y_d_ts(j)
400 falbe(i, nsrf) = yalb(j)
401 fsnow(i, nsrf) = snow(j)
402 fqsurf(i, nsrf) = yqsurf(j)
403 frugs(i, nsrf) = yz0_new(j)
404 fluxlat(i, nsrf) = yfluxlat(j)
405 IF (nsrf == is_oce) THEN
406 rugmer(i) = yrugm(j)
407 frugs(i, nsrf) = yrugm(j)
408 END IF
409 agesno(i, nsrf) = yagesno(j)
410 fqcalving(i, nsrf) = y_fqcalving(j)
411 ffonte(i, nsrf) = y_ffonte(j)
412 cdragh(i) = cdragh(i) + ycdragh(j) * ypctsrf(j)
413 cdragm(i) = cdragm(i) + ycdragm(j) * ypctsrf(j)
414 dflux_t(i) = dflux_t(i) + y_dflux_t(j) * ypctsrf(j)
415 dflux_q(i) = dflux_q(i) + y_dflux_q(j) * ypctsrf(j)
416 END DO
417 IF (nsrf == is_ter) THEN
418 qsol(ni(:knon)) = yqsol(:knon)
419 else IF (nsrf == is_lic) THEN
420 DO j = 1, knon
421 i = ni(j)
422 run_off_lic_0(i) = y_run_off_lic_0(j)
423 run_off_lic(i) = y_run_off_lic(j)
424 END DO
425 END IF
426
427 ftsoil(:, :, nsrf) = 0.
428 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
429
430 DO j = 1, knon
431 i = ni(j)
432 DO k = 1, klev
433 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
434 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
435 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
436 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
437 END DO
438 END DO
439
440 forall (k = 2:klev) coefh(ni(:knon), k) &
441 = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypctsrf(:knon)
442
443 ! diagnostic t, q a 2m et u, v a 10m
444
445 DO j = 1, knon
446 i = ni(j)
447 u1(j) = yu(j, 1) + y_d_u(j, 1)
448 v1(j) = yv(j, 1) + y_d_v(j, 1)
449 tair1(j) = yt(j, 1) + y_d_t(j, 1)
450 qair1(j) = yq(j, 1) + y_d_q(j, 1)
451 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
452 1))) * (ypaprs(j, 1)-ypplay(j, 1))
453 tairsol(j) = yts(j) + y_d_ts(j)
454 rugo1(j) = yrugos(j)
455 IF (nsrf == is_oce) THEN
456 rugo1(j) = frugs(i, nsrf)
457 END IF
458 psfce(j) = ypaprs(j, 1)
459 patm(j) = ypplay(j, 1)
460 END DO
461
462 CALL stdlevvar(nsrf, u1(:knon), v1(:knon), tair1(:knon), qair1, &
463 zgeo1, tairsol, yqsurf(:knon), rugo1, psfce, patm, yt2m, yq2m, &
464 yt10m, yq10m, wind10m(:knon), ustar(:knon))
465
466 DO j = 1, knon
467 i = ni(j)
468 t2m(i, nsrf) = yt2m(j)
469 q2m(i, nsrf) = yq2m(j)
470
471 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
472 / sqrt(u1(j)**2 + v1(j)**2)
473 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
474 / sqrt(u1(j)**2 + v1(j)**2)
475 END DO
476
477 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
478 y_flux_q(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
479 yq(:knon, :), ypblh(:knon), ycapcl, yoliqcl, ycteicl, ypblt, &
480 ytherm, ylcl)
481
482 DO j = 1, knon
483 i = ni(j)
484 pblh(i, nsrf) = ypblh(j)
485 plcl(i, nsrf) = ylcl(j)
486 capcl(i, nsrf) = ycapcl(j)
487 oliqcl(i, nsrf) = yoliqcl(j)
488 cteicl(i, nsrf) = ycteicl(j)
489 pblt(i, nsrf) = ypblt(j)
490 therm(i, nsrf) = ytherm(j)
491 END DO
492
493 IF (iflag_pbl >= 6) q2(ni(:knon), :, nsrf) = yq2(:knon, :)
494 else
495 fsnow(:, nsrf) = 0.
496 end IF if_knon
497 END DO loop_surface
498
499 ! On utilise les nouvelles surfaces
500 frugs(:, is_oce) = rugmer
501 pctsrf(:, is_oce) = pctsrf_new_oce
502 pctsrf(:, is_sic) = pctsrf_new_sic
503
504 CALL histwrite_phy("run_off_lic", run_off_lic)
505
506 END SUBROUTINE pbl_surface
507
508 end module pbl_surface_m

  ViewVC Help
Powered by ViewVC 1.1.21