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

  ViewVC Help
Powered by ViewVC 1.1.21