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

Annotation of /trunk/phylmd/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 276 - (hide annotations)
Thu Jul 12 14:49:20 2018 UTC (5 years, 10 months ago) by guez
File size: 17933 byte(s)
Move procedure read_serre from module read_serre_m to module
dynetat0_m, to avoid side effet on variables of module dynetat0_m.

Create procedure set_unit_nml to avoid side effect on variable of
module unit_nml_m.

Downgrade pctsrf from variable of module etat0_m to argument of etat0
and limit to avoid side effect on pctsrf.

Move variable zmasq from module dimphy to module phyetat0_m to avoid
side effect on zmasq.

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

  ViewVC Help
Powered by ViewVC 1.1.21