/[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 305 - (hide annotations)
Tue Sep 11 11:08:38 2018 UTC (5 years, 8 months ago) by guez
File size: 17636 byte(s)
We want to keep the same variable names throughout procedures. In
pbl_surface, rain_fall and snow_fall were passed to clqh and became
precip_rain and precip_snow. Which name should we choose?
Precipitation normally refers to water in all phases. Rainfall and
snowfall seem to be more common names to distinguish liquid water and
snow. Cf. CF standard names. So change everywhere precip_rain to
rain_fall and precip_snow to snow_fall.

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

  ViewVC Help
Powered by ViewVC 1.1.21