/[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 344 - (show annotations)
Tue Nov 12 15:18:14 2019 UTC (4 years, 6 months ago) by guez
File size: 18938 byte(s)
Replace pi / 180 by `deg_to_rad`

In procedure etat0, rename variable tsoil to ftsoil, which is the
corresponding name in the gcm program.

In `laplacien_gam`, replace call to scopy by array assignment.

Replace pi / 180 by `deg_to_rad` in `start_init_phys`.

Encapsulate diagcld1 and orolift in modules.

Avoid duplicated computation in `interfsurf_hq`.

Promote internal function fz of procedure soil to function of module
`soil_m`.  Use `new_unit` in procedure soil.

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 ! 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_seri et q_seri
86
87 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
88 ! changement pour "u_seri" et "v_seri"
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) temp\'erature 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 rugosit\'e, 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)
204 REAL rugo1(klon)
205 REAL zgeop(klon, klev)
206
207 !------------------------------------------------------------
208
209 albsol = sum(falbe * pctsrf, dim = 2)
210
211 ! R\'epartition sous maille des flux longwave et shortwave
212 ! R\'epartition du longwave par sous-surface lin\'earis\'ee
213
214 forall (nsrf = 1:nbsrf)
215 fsollw(:, nsrf) = sollw + 4. * RSIGMA * tsol**3 &
216 * (tsol - ftsol(:, nsrf))
217 fsolsw(:, nsrf) = solsw * (1. - falbe(:, nsrf)) / (1. - albsol)
218 END forall
219
220 ytherm = 0.
221
222 DO k = 1, klev ! epaisseur de couche
223 DO i = 1, klon
224 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
225 END DO
226 END DO
227
228 ! Initialization:
229 rugmer = 0.
230 cdragh = 0.
231 cdragm = 0.
232 dflux_t = 0.
233 dflux_q = 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_seri(i, k)
310 yv(j, k) = v_seri(i, k)
311 yt(j, k) = t_seri(i, k)
312 yq(j, k) = q_seri(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 IF (nsrf == is_oce) THEN
338 ! On met un seuil pour ycdragm et ycdragh :
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 y_d_t(j, k) = y_d_t(j, k) * ypctsrf(j)
386 y_d_q(j, k) = y_d_q(j, k) * ypctsrf(j)
387 y_d_u(j, k) = y_d_u(j, k) * ypctsrf(j)
388 y_d_v(j, k) = y_d_v(j, k) * ypctsrf(j)
389 END DO
390 END DO
391
392 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
393 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
394 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
395 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
396
397 falbe(:, nsrf) = 0.
398 fsnow(:, nsrf) = 0.
399 fqsurf(:, nsrf) = 0.
400 frugs(:, nsrf) = 0.
401 DO j = 1, knon
402 i = ni(j)
403 d_ts(i, nsrf) = y_d_ts(j)
404 falbe(i, nsrf) = yalb(j)
405 fsnow(i, nsrf) = snow(j)
406 fqsurf(i, nsrf) = yqsurf(j)
407 frugs(i, nsrf) = yz0_new(j)
408 fluxlat(i, nsrf) = yfluxlat(j)
409 IF (nsrf == is_oce) THEN
410 rugmer(i) = yrugm(j)
411 frugs(i, nsrf) = yrugm(j)
412 END IF
413 agesno(i, nsrf) = yagesno(j)
414 fqcalving(i, nsrf) = y_fqcalving(j)
415 ffonte(i, nsrf) = y_ffonte(j)
416 cdragh(i) = cdragh(i) + ycdragh(j) * ypctsrf(j)
417 cdragm(i) = cdragm(i) + ycdragm(j) * ypctsrf(j)
418 dflux_t(i) = dflux_t(i) + y_dflux_t(j) * ypctsrf(j)
419 dflux_q(i) = dflux_q(i) + y_dflux_q(j) * ypctsrf(j)
420 END DO
421 IF (nsrf == is_ter) THEN
422 qsol(ni(:knon)) = yqsol(:knon)
423 else IF (nsrf == is_lic) THEN
424 DO j = 1, knon
425 i = ni(j)
426 run_off_lic_0(i) = y_run_off_lic_0(j)
427 run_off_lic(i) = y_run_off_lic(j)
428 END DO
429 END IF
430
431 ftsoil(:, :, nsrf) = 0.
432 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
433
434 DO j = 1, knon
435 i = ni(j)
436 DO k = 1, klev
437 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
438 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
439 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
440 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
441 END DO
442 END DO
443
444 forall (k = 2:klev) coefh(ni(:knon), k) &
445 = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypctsrf(:knon)
446
447 ! Diagnostic temp\'erature, q \`a 2 m et u, v \`a 10 m:
448
449 u1(:knon) = yu(:knon, 1) + y_d_u(:knon, 1)
450 v1(:knon) = yv(:knon, 1) + y_d_v(:knon, 1)
451 tair1(:knon) = yt(:knon, 1) + y_d_t(:knon, 1)
452
453 IF (nsrf == is_oce) THEN
454 rugo1(:knon) = frugs(ni(:knon), is_oce)
455 else
456 rugo1(:knon) = yrugos(:knon)
457 END IF
458
459 CALL stdlevvar(nsrf, u1(:knon), v1(:knon), tair1(:knon), &
460 yq(:knon, 1) + y_d_q(:knon, 1), rd * tair1(:knon) &
461 / (0.5 * (ypaprs(:knon, 1) + ypplay(:knon, 1))) &
462 * (ypaprs(:knon, 1) - ypplay(:knon, 1)), &
463 yts(:knon) + y_d_ts(:knon), yqsurf(:knon), rugo1, &
464 ypaprs(:knon, 1), ypplay(:knon, 1), yt2m, yq2m, yt10m, yq10m, &
465 wind10m(:knon), ustar(:knon))
466
467 DO j = 1, knon
468 i = ni(j)
469 t2m(i, nsrf) = yt2m(j)
470 q2m(i, nsrf) = yq2m(j)
471
472 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
473 / sqrt(u1(j)**2 + v1(j)**2)
474 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
475 / sqrt(u1(j)**2 + v1(j)**2)
476 END DO
477
478 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
479 y_flux_q(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
480 yq(:knon, :), ypblh(:knon), ycapcl, yoliqcl, ycteicl, ypblt, &
481 ytherm, ylcl)
482
483 DO j = 1, knon
484 i = ni(j)
485 pblh(i, nsrf) = ypblh(j)
486 plcl(i, nsrf) = ylcl(j)
487 capcl(i, nsrf) = ycapcl(j)
488 oliqcl(i, nsrf) = yoliqcl(j)
489 cteicl(i, nsrf) = ycteicl(j)
490 pblt(i, nsrf) = ypblt(j)
491 therm(i, nsrf) = ytherm(j)
492 END DO
493
494 IF (iflag_pbl >= 6) q2(ni(:knon), :, nsrf) = yq2(:knon, :)
495 else
496 fsnow(:, nsrf) = 0.
497 end IF if_knon
498 END DO loop_surface
499
500 ! On utilise les nouvelles surfaces
501 frugs(:, is_oce) = rugmer
502 pctsrf(:, is_oce) = pctsrf_new_oce
503 pctsrf(:, is_sic) = pctsrf_new_sic
504
505 CALL histwrite_phy("run_off_lic", run_off_lic)
506 ftsol = ftsol + d_ts ! update surface temperature
507 CALL histwrite_phy("dtsvdfo", d_ts(:, is_oce))
508 CALL histwrite_phy("dtsvdft", d_ts(:, is_ter))
509 CALL histwrite_phy("dtsvdfg", d_ts(:, is_lic))
510 CALL histwrite_phy("dtsvdfi", d_ts(:, is_sic))
511
512 END SUBROUTINE pbl_surface
513
514 end module pbl_surface_m

  ViewVC Help
Powered by ViewVC 1.1.21