/[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 301 - (hide annotations)
Thu Aug 2 17:23:07 2018 UTC (5 years, 10 months ago) by guez
File size: 18007 byte(s)
Move the call to conf_interface up to physiq, so there is no need to
test first call inside pbl_surface for this.

run_off_lic in fonte_neige was computed but not used. Pass it up to
pbl_surface so we can output it (following LMDZ).

Simplify the logic in interfsur_lim so we do not need debut.

Remove the tests on the order of surface types in interfsurf_hq. Just
add comments in indicesol.

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

  ViewVC Help
Powered by ViewVC 1.1.21