/[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 332 - (show annotations)
Tue Aug 13 09:19:22 2019 UTC (4 years, 9 months ago) by guez
File size: 18958 byte(s)
Declare variable nent in procedures `cv_driver`, `cv30_mixing` and
`cv30_yield` with shape `(ncum, 2:nl - 1)`.

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

  ViewVC Help
Powered by ViewVC 1.1.21