/[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 327 - (show annotations)
Thu Jun 13 13:59:19 2019 UTC (4 years, 11 months ago) by guez
File size: 18821 byte(s)
Move the update of ftsol by `d_ts` inside `pbl_surface` (following
LMDZ). This makes the procedure physiq lighter. And it is clearer now
that the update of ftsol does come from `pbl_surface`.

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

  ViewVC Help
Powered by ViewVC 1.1.21