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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 307 - (hide annotations)
Tue Sep 11 12:52:28 2018 UTC (5 years, 9 months ago) by guez
File size: 18409 byte(s)
Move computation of albsol, fsollw and fsolsw from physiq to pbl_surface
(following LMDZ).

1 guez 267 module pbl_surface_m
2 guez 3
3 guez 38 IMPLICIT NONE
4 guez 3
5 guez 38 contains
6 guez 3
7 guez 298 SUBROUTINE pbl_surface(pctsrf, t, q, u, v, julien, mu0, ftsol, cdmmax, &
8 guez 304 cdhmax, ftsoil, qsol, paprs, pplay, fsnow, qsurf, falbe, fluxlat, &
9 guez 307 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 guez 3
15 guez 99 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
16 guez 302 ! Author: Z. X. Li (LMD/CNRS)
17     ! Date: Aug. 18th, 1993
18 guez 62 ! Objet : interface de couche limite (diffusion verticale)
19 guez 3
20 guez 62 ! 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 guez 145 ! ne tient pas compte de la diff\'erentiation des sous-fractions
23     ! de sol.
24 guez 3
25 guez 275 use cdrag_m, only: cdrag
26 guez 49 use clqh_m, only: clqh
27 guez 62 use clvent_m, only: clvent
28 guez 250 use coef_diff_turb_m, only: coef_diff_turb
29 guez 227 USE conf_gcm_m, ONLY: lmt_pas
30 guez 62 USE conf_phys_m, ONLY: iflag_pbl
31 guez 276 USE dimphy, ONLY: klev, klon
32 guez 62 USE dimsoil, ONLY: nsoilmx
33 guez 47 use hbtm_m, only: hbtm
34 guez 301 USE histwrite_phy_m, ONLY: histwrite_phy
35 guez 62 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
36 guez 202 USE interfoce_lim_m, ONLY: interfoce_lim
37 guez 276 use phyetat0_m, only: zmasq
38 guez 104 use stdlevvar_m, only: stdlevvar
39 guez 307 USE suphec_m, ONLY: rd, rg, rsigma
40 guez 202 use time_phylmdz, only: itap
41 guez 15
42 guez 62 REAL, INTENT(inout):: pctsrf(klon, nbsrf)
43 guez 202 ! tableau des pourcentages de surface de chaque maille
44 guez 62
45     REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
46 guez 225 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
47 guez 62 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
48 guez 221 INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
49 guez 213 REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal
50 guez 222 REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
51 guez 71 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
52 guez 101
53 guez 118 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
54     ! soil temperature of surface fraction
55    
56 guez 225 REAL, INTENT(inout):: qsol(:) ! (klon)
57 guez 101 ! column-density of water in soil, in kg m-2
58    
59 guez 225 REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
60 guez 62 REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
61 guez 215 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
62 guez 304 REAL, INTENT(inout):: qsurf(klon, nbsrf)
63 guez 155 REAL, intent(inout):: falbe(klon, nbsrf)
64 guez 214 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
65 guez 70
66 guez 101 REAL, intent(in):: rain_fall(klon)
67 guez 225 ! liquid water mass flux (kg / m2 / s), positive down
68 guez 101
69 guez 304 REAL, intent(in):: snow_fall(klon)
70 guez 225 ! solid water mass flux (kg / m2 / s), positive down
71 guez 101
72 guez 222 REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
73 guez 70 real agesno(klon, nbsrf)
74     REAL, INTENT(IN):: rugoro(klon)
75    
76 guez 298 REAL, intent(out):: d_t(:, :), d_q(:, :) ! (klon, klev)
77 guez 279 ! changement pour t et q
78 guez 62
79     REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
80     ! changement pour "u" et "v"
81    
82 guez 221 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
83 guez 70
84 guez 206 REAL, intent(out):: flux_t(klon, nbsrf)
85 guez 302 ! flux de chaleur sensible (c_p T) (W / m2) (orientation positive
86     ! vers le bas) à la surface
87 guez 70
88 guez 206 REAL, intent(out):: flux_q(klon, nbsrf)
89 guez 225 ! flux de vapeur d'eau (kg / m2 / s) à la surface
90 guez 70
91 guez 206 REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
92 guez 229 ! tension du vent (flux turbulent de vent) à la surface, en Pa
93 guez 206
94 guez 70 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
95 guez 225 real q2(klon, klev + 1, nbsrf)
96 guez 70
97 guez 302 ! 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 guez 70
101 guez 244 REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
102 guez 226 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
103 guez 244 ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
104 guez 226 ! ce champ sur les quatre sous-surfaces du mod\`ele.
105    
106 guez 221 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
107 guez 70
108 guez 225 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 guez 191 REAL pblh(klon, nbsrf) ! height of planetary boundary layer
115 guez 70 REAL capcl(klon, nbsrf)
116     REAL oliqcl(klon, nbsrf)
117     REAL cteicl(klon, nbsrf)
118 guez 221 REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
119 guez 70 REAL therm(klon, nbsrf)
120     REAL plcl(klon, nbsrf)
121 guez 279
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 guez 301 real ffonte(klon, nbsrf) ! flux thermique utilise pour fondre la neige
127 guez 300 REAL, intent(inout):: run_off_lic_0(:) ! (klon)
128 guez 70
129 guez 307 REAL, intent(out):: albsol(:) ! (klon)
130     ! albedo du sol total, visible, moyen par maille
131    
132     REAL, intent(in):: sollw(:) ! (klon)
133     ! rayonnement infrarouge montant \`a la surface
134    
135     REAL, intent(in):: solsw(:) ! (klon)
136     REAL, intent(in):: tsol(:) ! (klon)
137    
138 guez 70 ! Local:
139 guez 15
140 guez 307 REAL fsollw(klon, nbsrf) ! bilan flux IR pour chaque sous-surface
141     REAL fsolsw(klon, nbsrf) ! flux solaire absorb\'e pour chaque sous-surface
142    
143 guez 202 ! la nouvelle repartition des surfaces sortie de l'interface
144     REAL, save:: pctsrf_new_oce(klon)
145     REAL, save:: pctsrf_new_sic(klon)
146    
147 guez 70 REAL y_fqcalving(klon), y_ffonte(klon)
148 guez 301 real y_run_off_lic_0(klon), y_run_off_lic(klon)
149     REAL run_off_lic(klon) ! ruissellement total
150 guez 70 REAL rugmer(klon)
151 guez 38 REAL ytsoil(klon, nsoilmx)
152 guez 248 REAL yts(klon), ypct(klon), yz0_new(klon)
153 guez 282 real yrugos(klon) ! longueur de rugosite (en m)
154 guez 38 REAL yalb(klon)
155 guez 215 REAL snow(klon), yqsurf(klon), yagesno(klon)
156 guez 225 real yqsol(klon) ! column-density of water in soil, in kg m-2
157 guez 305 REAL yrain_fall(klon) ! liquid water mass flux (kg / m2 / s), positive down
158     REAL ysnow_fall(klon) ! solid water mass flux (kg / m2 / s), positive down
159 guez 38 REAL yrugm(klon), yrads(klon), yrugoro(klon)
160     REAL yfluxlat(klon)
161     REAL y_d_ts(klon)
162     REAL y_d_t(klon, klev), y_d_q(klon, klev)
163     REAL y_d_u(klon, klev), y_d_v(klon, klev)
164 guez 206 REAL y_flux_t(klon), y_flux_q(klon)
165     REAL y_flux_u(klon), y_flux_v(klon)
166 guez 38 REAL y_dflux_t(klon), y_dflux_q(klon)
167 guez 244 REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
168 guez 237 real ycdragh(klon), ycdragm(klon)
169 guez 38 REAL yu(klon, klev), yv(klon, klev)
170     REAL yt(klon, klev), yq(klon, klev)
171 guez 225 REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
172     REAL yq2(klon, klev + 1)
173 guez 38 REAL delp(klon, klev)
174     INTEGER i, k, nsrf
175     INTEGER ni(klon), knon, j
176 guez 40
177 guez 38 REAL pctsrf_pot(klon, nbsrf)
178 guez 145 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
179 guez 40 ! apparitions ou disparitions de la glace de mer
180 guez 15
181 guez 227 REAL yt2m(klon), yq2m(klon), wind10m(klon)
182     REAL ustar(klon)
183 guez 15
184 guez 38 REAL yt10m(klon), yq10m(klon)
185     REAL ypblh(klon)
186     REAL ylcl(klon)
187     REAL ycapcl(klon)
188     REAL yoliqcl(klon)
189     REAL ycteicl(klon)
190     REAL ypblt(klon)
191     REAL ytherm(klon)
192 guez 227 REAL u1(klon), v1(klon)
193 guez 38 REAL tair1(klon), qair1(klon), tairsol(klon)
194     REAL psfce(klon), patm(klon)
195 guez 304 REAL zgeo1(klon)
196 guez 38 REAL rugo1(klon)
197 guez 248 REAL zgeop(klon, klev)
198 guez 15
199 guez 38 !------------------------------------------------------------
200 guez 15
201 guez 307 albsol = sum(falbe * pctsrf, dim = 2)
202    
203     ! R\'epartition sous maille des flux longwave et shortwave
204     ! R\'epartition du longwave par sous-surface lin\'earis\'ee
205    
206     forall (nsrf = 1:nbsrf)
207     fsollw(:, nsrf) = sollw + 4. * RSIGMA * tsol**3 &
208     * (tsol - ftsol(:, nsrf))
209     fsolsw(:, nsrf) = solsw * (1. - falbe(:, nsrf)) / (1. - albsol)
210     END forall
211    
212 guez 38 ytherm = 0.
213 guez 15
214 guez 38 DO k = 1, klev ! epaisseur de couche
215     DO i = 1, klon
216 guez 225 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
217 guez 38 END DO
218     END DO
219 guez 15
220 guez 40 ! Initialization:
221     rugmer = 0.
222     cdragh = 0.
223     cdragm = 0.
224     dflux_t = 0.
225     dflux_q = 0.
226     ypct = 0.
227     yrugos = 0.
228     ypaprs = 0.
229     ypplay = 0.
230     ydelp = 0.
231 guez 38 yrugoro = 0.
232 guez 40 d_ts = 0.
233 guez 38 flux_t = 0.
234     flux_q = 0.
235     flux_u = 0.
236     flux_v = 0.
237 guez 214 fluxlat = 0.
238 guez 40 d_t = 0.
239     d_q = 0.
240     d_u = 0.
241     d_v = 0.
242 guez 244 coefh = 0.
243 guez 279 fqcalving = 0.
244 guez 301 run_off_lic = 0.
245 guez 15
246 guez 145 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
247     ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
248 guez 301 ! (\`a affiner).
249 guez 15
250 guez 202 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
251     pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
252 guez 38 pctsrf_pot(:, is_oce) = 1. - zmasq
253     pctsrf_pot(:, is_sic) = 1. - zmasq
254 guez 15
255 guez 202 ! Tester si c'est le moment de lire le fichier:
256     if (mod(itap - 1, lmt_pas) == 0) then
257 guez 221 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
258 guez 202 endif
259    
260 guez 99 ! Boucler sur toutes les sous-fractions du sol:
261    
262 guez 49 loop_surface: DO nsrf = 1, nbsrf
263 guez 303 ! Define ni and knon:
264    
265 guez 38 ni = 0
266     knon = 0
267 guez 303
268 guez 38 DO i = 1, klon
269 guez 145 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
270 guez 38 ! "potentielles"
271     IF (pctsrf_pot(i, nsrf) > epsfra) THEN
272     knon = knon + 1
273     ni(knon) = i
274     END IF
275     END DO
276 guez 15
277 guez 62 if_knon: IF (knon /= 0) then
278 guez 38 DO j = 1, knon
279     i = ni(j)
280 guez 62 ypct(j) = pctsrf(i, nsrf)
281 guez 207 yts(j) = ftsol(i, nsrf)
282 guez 215 snow(j) = fsnow(i, nsrf)
283 guez 62 yqsurf(j) = qsurf(i, nsrf)
284 guez 155 yalb(j) = falbe(i, nsrf)
285 guez 305 yrain_fall(j) = rain_fall(i)
286     ysnow_fall(j) = snow_fall(i)
287 guez 62 yagesno(j) = agesno(i, nsrf)
288 guez 222 yrugos(j) = frugs(i, nsrf)
289 guez 62 yrugoro(j) = rugoro(i)
290 guez 222 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
291 guez 225 ypaprs(j, klev + 1) = paprs(i, klev + 1)
292 guez 62 y_run_off_lic_0(j) = run_off_lic_0(i)
293 guez 38 END DO
294 guez 3
295 guez 99 ! For continent, copy soil water content
296 guez 225 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
297 guez 3
298 guez 208 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
299 guez 3
300 guez 38 DO k = 1, klev
301     DO j = 1, knon
302     i = ni(j)
303 guez 62 ypaprs(j, k) = paprs(i, k)
304     ypplay(j, k) = pplay(i, k)
305     ydelp(j, k) = delp(i, k)
306     yu(j, k) = u(i, k)
307     yv(j, k) = v(i, k)
308     yt(j, k) = t(i, k)
309     yq(j, k) = q(i, k)
310 guez 38 END DO
311     END DO
312 guez 3
313 guez 248 ! Calculer les géopotentiels de chaque couche:
314 guez 228
315 guez 248 zgeop(:knon, 1) = RD * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
316     + ypplay(:knon, 1))) * (ypaprs(:knon, 1) - ypplay(:knon, 1))
317    
318     DO k = 2, klev
319     zgeop(:knon, k) = zgeop(:knon, k - 1) + RD * 0.5 &
320     * (yt(:knon, k - 1) + yt(:knon, k)) / ypaprs(:knon, k) &
321     * (ypplay(:knon, k - 1) - ypplay(:knon, k))
322     ENDDO
323    
324 guez 275 CALL cdrag(nsrf, sqrt(yu(:knon, 1)**2 + yv(:knon, 1)**2), &
325 guez 272 yt(:knon, 1), yq(:knon, 1), zgeop(:knon, 1), ypaprs(:knon, 1), &
326     yts(:knon), yqsurf(:knon), yrugos(:knon), ycdragm(:knon), &
327     ycdragh(:knon))
328 guez 248
329 guez 249 IF (iflag_pbl == 1) THEN
330     ycdragm(:knon) = max(ycdragm(:knon), 0.)
331     ycdragh(:knon) = max(ycdragh(:knon), 0.)
332     end IF
333 guez 250
334 guez 249 ! on met un seuil pour ycdragm et ycdragh
335     IF (nsrf == is_oce) THEN
336     ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
337     ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
338     END IF
339    
340 guez 303 IF (iflag_pbl >= 6) yq2(:knon, :) = q2(ni(:knon), :, nsrf)
341 guez 298 call coef_diff_turb(nsrf, ni(:knon), ypaprs(:knon, :), &
342 guez 251 ypplay(:knon, :), yu(:knon, :), yv(:knon, :), yq(:knon, :), &
343     yt(:knon, :), yts(:knon), ycdragm(:knon), zgeop(:knon, :), &
344     ycoefm(:knon, :), ycoefh(:knon, :), yq2(:knon, :))
345 guez 303
346 guez 298 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
347 guez 237 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
348 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
349 guez 225 y_flux_u(:knon))
350 guez 298 CALL clvent(yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
351 guez 237 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
352 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
353 guez 225 y_flux_v(:knon))
354 guez 3
355 guez 301 CALL clqh(julien, nsrf, ni(:knon), ytsoil(:knon, :), yqsol(:knon), &
356     mu0(ni(:knon)), yrugos(:knon), yrugoro(:knon), yu(:knon, 1), &
357     yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), yt(:knon, :), &
358     yq(:knon, :), yts(:knon), ypaprs(:knon, :), ypplay(:knon, :), &
359     ydelp(:knon, :), yrads(:knon), yalb(:knon), snow(:knon), &
360 guez 305 yqsurf(:knon), yrain_fall(:knon), ysnow_fall(:knon), &
361     yfluxlat(:knon), pctsrf_new_sic(ni(:knon)), yagesno(:knon), &
362     y_d_t(:knon, :), y_d_q(:knon, :), y_d_ts(:knon), &
363     yz0_new(:knon), y_flux_t(:knon), y_flux_q(:knon), &
364     y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving(:knon), &
365     y_ffonte(:knon), y_run_off_lic_0(:knon), y_run_off_lic(:knon))
366 guez 3
367 guez 62 ! calculer la longueur de rugosite sur ocean
368 guez 283
369 guez 62 yrugm = 0.
370 guez 283
371 guez 62 IF (nsrf == is_oce) THEN
372     DO j = 1, knon
373 guez 237 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
374 guez 225 / rg + 0.11 * 14E-6 &
375 guez 237 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
376 guez 62 yrugm(j) = max(1.5E-05, yrugm(j))
377     END DO
378     END IF
379 guez 3
380 guez 237 DO k = 1, klev
381     DO j = 1, knon
382     i = ni(j)
383 guez 225 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
384     y_d_q(j, k) = y_d_q(j, k) * ypct(j)
385     y_d_u(j, k) = y_d_u(j, k) * ypct(j)
386     y_d_v(j, k) = y_d_v(j, k) * ypct(j)
387 guez 62 END DO
388 guez 38 END DO
389 guez 3
390 guez 214 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
391     flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
392     flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
393     flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
394 guez 15
395 guez 155 falbe(:, nsrf) = 0.
396 guez 215 fsnow(:, nsrf) = 0.
397 guez 62 qsurf(:, nsrf) = 0.
398 guez 222 frugs(:, nsrf) = 0.
399 guez 38 DO j = 1, knon
400     i = ni(j)
401 guez 62 d_ts(i, nsrf) = y_d_ts(j)
402 guez 155 falbe(i, nsrf) = yalb(j)
403 guez 215 fsnow(i, nsrf) = snow(j)
404 guez 62 qsurf(i, nsrf) = yqsurf(j)
405 guez 222 frugs(i, nsrf) = yz0_new(j)
406 guez 62 fluxlat(i, nsrf) = yfluxlat(j)
407     IF (nsrf == is_oce) THEN
408     rugmer(i) = yrugm(j)
409 guez 222 frugs(i, nsrf) = yrugm(j)
410 guez 62 END IF
411     agesno(i, nsrf) = yagesno(j)
412     fqcalving(i, nsrf) = y_fqcalving(j)
413     ffonte(i, nsrf) = y_ffonte(j)
414 guez 243 cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
415     cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
416 guez 283 dflux_t(i) = dflux_t(i) + y_dflux_t(j) * ypct(j)
417     dflux_q(i) = dflux_q(i) + y_dflux_q(j) * ypct(j)
418 guez 38 END DO
419 guez 62 IF (nsrf == is_ter) THEN
420 guez 99 qsol(ni(:knon)) = yqsol(:knon)
421     else IF (nsrf == is_lic) THEN
422 guez 62 DO j = 1, knon
423     i = ni(j)
424     run_off_lic_0(i) = y_run_off_lic_0(j)
425 guez 301 run_off_lic(i) = y_run_off_lic(j)
426 guez 62 END DO
427     END IF
428 guez 118
429 guez 62 ftsoil(:, :, nsrf) = 0.
430 guez 208 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
431 guez 62
432 guez 38 DO j = 1, knon
433     i = ni(j)
434 guez 62 DO k = 1, klev
435     d_t(i, k) = d_t(i, k) + y_d_t(j, k)
436     d_q(i, k) = d_q(i, k) + y_d_q(j, k)
437     d_u(i, k) = d_u(i, k) + y_d_u(j, k)
438     d_v(i, k) = d_v(i, k) + y_d_v(j, k)
439 guez 237 END DO
440     END DO
441 guez 62
442 guez 244 forall (k = 2:klev) coefh(ni(:knon), k) &
443     = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
444 guez 242
445 guez 99 ! diagnostic t, q a 2m et u, v a 10m
446 guez 62
447 guez 38 DO j = 1, knon
448     i = ni(j)
449 guez 227 u1(j) = yu(j, 1) + y_d_u(j, 1)
450     v1(j) = yv(j, 1) + y_d_v(j, 1)
451 guez 62 tair1(j) = yt(j, 1) + y_d_t(j, 1)
452     qair1(j) = yq(j, 1) + y_d_q(j, 1)
453 guez 225 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
454     1))) * (ypaprs(j, 1)-ypplay(j, 1))
455 guez 62 tairsol(j) = yts(j) + y_d_ts(j)
456     rugo1(j) = yrugos(j)
457     IF (nsrf == is_oce) THEN
458 guez 222 rugo1(j) = frugs(i, nsrf)
459 guez 62 END IF
460     psfce(j) = ypaprs(j, 1)
461     patm(j) = ypplay(j, 1)
462 guez 38 END DO
463 guez 15
464 guez 272 CALL stdlevvar(nsrf, u1(:knon), v1(:knon), tair1(:knon), qair1, &
465 guez 304 zgeo1, tairsol, yqsurf(:knon), rugo1, psfce, patm, yt2m, yq2m, &
466     yt10m, yq10m, wind10m(:knon), ustar(:knon))
467 guez 3
468 guez 62 DO j = 1, knon
469     i = ni(j)
470     t2m(i, nsrf) = yt2m(j)
471     q2m(i, nsrf) = yq2m(j)
472 guez 3
473 guez 227 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
474     / sqrt(u1(j)**2 + v1(j)**2)
475     v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
476     / sqrt(u1(j)**2 + v1(j)**2)
477 guez 62 END DO
478 guez 15
479 guez 227 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
480 guez 298 y_flux_q(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
481     yq(:knon, :), ypblh(:knon), ycapcl, yoliqcl, ycteicl, ypblt, &
482     ytherm, ylcl)
483 guez 15
484 guez 38 DO j = 1, knon
485     i = ni(j)
486 guez 62 pblh(i, nsrf) = ypblh(j)
487     plcl(i, nsrf) = ylcl(j)
488     capcl(i, nsrf) = ycapcl(j)
489     oliqcl(i, nsrf) = yoliqcl(j)
490     cteicl(i, nsrf) = ycteicl(j)
491     pblt(i, nsrf) = ypblt(j)
492     therm(i, nsrf) = ytherm(j)
493 guez 38 END DO
494 guez 3
495 guez 303 IF (iflag_pbl >= 6) q2(ni(:knon), :, nsrf) = yq2(:knon, :)
496 guez 215 else
497     fsnow(:, nsrf) = 0.
498 guez 62 end IF if_knon
499 guez 49 END DO loop_surface
500 guez 15
501 guez 38 ! On utilise les nouvelles surfaces
502 guez 222 frugs(:, is_oce) = rugmer
503 guez 202 pctsrf(:, is_oce) = pctsrf_new_oce
504     pctsrf(:, is_sic) = pctsrf_new_sic
505 guez 15
506 guez 301 CALL histwrite_phy("run_off_lic", run_off_lic)
507 guez 202
508 guez 267 END SUBROUTINE pbl_surface
509 guez 15
510 guez 267 end module pbl_surface_m

  ViewVC Help
Powered by ViewVC 1.1.21