/[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 298 - (hide annotations)
Thu Jul 26 16:45:51 2018 UTC (5 years, 10 months ago) by guez
File size: 17737 byte(s)
Use directly dtphys from module comconst when possible instead of
having it trickle down through procedure arguments.

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 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(inout):: pctsrf(klon, nbsrf)
40 guez 202 ! tableau des pourcentages de surface de chaque maille
41 guez 62
42     REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
43 guez 225 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
44 guez 62 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
45 guez 221 INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
46 guez 213 REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal
47 guez 222 REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
48 guez 71 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
49 guez 101
50 guez 118 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
51     ! soil temperature of surface fraction
52    
53 guez 225 REAL, INTENT(inout):: qsol(:) ! (klon)
54 guez 101 ! column-density of water in soil, in kg m-2
55    
56 guez 225 REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
57 guez 62 REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
58 guez 215 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
59 guez 70 REAL qsurf(klon, nbsrf)
60     REAL evap(klon, nbsrf)
61 guez 155 REAL, intent(inout):: falbe(klon, nbsrf)
62 guez 214 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
63 guez 70
64 guez 101 REAL, intent(in):: rain_fall(klon)
65 guez 225 ! liquid water mass flux (kg / m2 / s), positive down
66 guez 101
67     REAL, intent(in):: snow_f(klon)
68 guez 225 ! solid water mass flux (kg / m2 / s), positive down
69 guez 101
70 guez 222 REAL, INTENT(IN):: fsolsw(klon, nbsrf), fsollw(klon, nbsrf)
71     REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
72 guez 70 real agesno(klon, nbsrf)
73     REAL, INTENT(IN):: rugoro(klon)
74    
75 guez 298 REAL, intent(out):: d_t(:, :), d_q(:, :) ! (klon, klev)
76 guez 279 ! changement pour t et q
77 guez 62
78     REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
79     ! changement pour "u" et "v"
80    
81 guez 221 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
82 guez 70
83 guez 206 REAL, intent(out):: flux_t(klon, nbsrf)
84 guez 225 ! flux de chaleur sensible (Cp T) (W / m2) (orientation positive vers
85 guez 206 ! le bas) à la surface
86 guez 70
87 guez 206 REAL, intent(out):: flux_q(klon, nbsrf)
88 guez 225 ! flux de vapeur d'eau (kg / m2 / s) à la surface
89 guez 70
90 guez 206 REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
91 guez 229 ! tension du vent (flux turbulent de vent) à la surface, en Pa
92 guez 206
93 guez 70 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
94 guez 225 real q2(klon, klev + 1, nbsrf)
95 guez 70
96 guez 99 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
97 guez 49 ! dflux_t derive du flux sensible
98     ! dflux_q derive du flux latent
99 guez 191 ! IM "slab" ocean
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     real ffonte(klon, nbsrf)
127 guez 70 ! ffonte----Flux thermique utilise pour fondre la neige
128     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 guez 282 real yrugos(klon) ! longueur 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 guez 38 yrugoro = 0.
215 guez 40 d_ts = 0.
216 guez 38 flux_t = 0.
217     flux_q = 0.
218     flux_u = 0.
219     flux_v = 0.
220 guez 214 fluxlat = 0.
221 guez 40 d_t = 0.
222     d_q = 0.
223     d_u = 0.
224     d_v = 0.
225 guez 244 coefh = 0.
226 guez 279 fqcalving = 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     ! (\`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 298 CALL clqh(julien, firstcal, nsrf, ni(:knon), ytsoil(:knon, :), &
344     yqsol(:knon), mu0, 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, ysnow_f, yfluxlat(:knon), &
349     pctsrf_new_sic, 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, y_run_off_lic_0)
353 guez 3
354 guez 62 ! calculer la longueur de rugosite sur ocean
355 guez 283
356 guez 62 yrugm = 0.
357 guez 283
358 guez 62 IF (nsrf == is_oce) THEN
359     DO j = 1, knon
360 guez 237 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
361 guez 225 / rg + 0.11 * 14E-6 &
362 guez 237 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
363 guez 62 yrugm(j) = max(1.5E-05, yrugm(j))
364     END DO
365     END IF
366 guez 3
367 guez 237 DO k = 1, klev
368     DO j = 1, knon
369     i = ni(j)
370 guez 225 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
371     y_d_q(j, k) = y_d_q(j, k) * ypct(j)
372     y_d_u(j, k) = y_d_u(j, k) * ypct(j)
373     y_d_v(j, k) = y_d_v(j, k) * ypct(j)
374 guez 62 END DO
375 guez 38 END DO
376 guez 3
377 guez 214 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
378     flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
379     flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
380     flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
381 guez 15
382 guez 206 evap(:, nsrf) = -flux_q(:, nsrf)
383    
384 guez 155 falbe(:, nsrf) = 0.
385 guez 215 fsnow(:, nsrf) = 0.
386 guez 62 qsurf(:, nsrf) = 0.
387 guez 222 frugs(:, nsrf) = 0.
388 guez 38 DO j = 1, knon
389     i = ni(j)
390 guez 62 d_ts(i, nsrf) = y_d_ts(j)
391 guez 155 falbe(i, nsrf) = yalb(j)
392 guez 215 fsnow(i, nsrf) = snow(j)
393 guez 62 qsurf(i, nsrf) = yqsurf(j)
394 guez 222 frugs(i, nsrf) = yz0_new(j)
395 guez 62 fluxlat(i, nsrf) = yfluxlat(j)
396     IF (nsrf == is_oce) THEN
397     rugmer(i) = yrugm(j)
398 guez 222 frugs(i, nsrf) = yrugm(j)
399 guez 62 END IF
400     agesno(i, nsrf) = yagesno(j)
401     fqcalving(i, nsrf) = y_fqcalving(j)
402     ffonte(i, nsrf) = y_ffonte(j)
403 guez 243 cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
404     cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
405 guez 283 dflux_t(i) = dflux_t(i) + y_dflux_t(j) * ypct(j)
406     dflux_q(i) = dflux_q(i) + y_dflux_q(j) * ypct(j)
407 guez 38 END DO
408 guez 62 IF (nsrf == is_ter) THEN
409 guez 99 qsol(ni(:knon)) = yqsol(:knon)
410     else IF (nsrf == is_lic) THEN
411 guez 62 DO j = 1, knon
412     i = ni(j)
413     run_off_lic_0(i) = y_run_off_lic_0(j)
414     END DO
415     END IF
416 guez 118
417 guez 62 ftsoil(:, :, nsrf) = 0.
418 guez 208 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
419 guez 62
420 guez 38 DO j = 1, knon
421     i = ni(j)
422 guez 62 DO k = 1, klev
423     d_t(i, k) = d_t(i, k) + y_d_t(j, k)
424     d_q(i, k) = d_q(i, k) + y_d_q(j, k)
425     d_u(i, k) = d_u(i, k) + y_d_u(j, k)
426     d_v(i, k) = d_v(i, k) + y_d_v(j, k)
427 guez 237 END DO
428     END DO
429 guez 62
430 guez 244 forall (k = 2:klev) coefh(ni(:knon), k) &
431     = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
432 guez 242
433 guez 99 ! diagnostic t, q a 2m et u, v a 10m
434 guez 62
435 guez 38 DO j = 1, knon
436     i = ni(j)
437 guez 227 u1(j) = yu(j, 1) + y_d_u(j, 1)
438     v1(j) = yv(j, 1) + y_d_v(j, 1)
439 guez 62 tair1(j) = yt(j, 1) + y_d_t(j, 1)
440     qair1(j) = yq(j, 1) + y_d_q(j, 1)
441 guez 225 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
442     1))) * (ypaprs(j, 1)-ypplay(j, 1))
443 guez 62 tairsol(j) = yts(j) + y_d_ts(j)
444     rugo1(j) = yrugos(j)
445     IF (nsrf == is_oce) THEN
446 guez 222 rugo1(j) = frugs(i, nsrf)
447 guez 62 END IF
448     psfce(j) = ypaprs(j, 1)
449     patm(j) = ypplay(j, 1)
450 guez 15
451 guez 62 qairsol(j) = yqsurf(j)
452 guez 38 END DO
453 guez 15
454 guez 272 CALL stdlevvar(nsrf, u1(:knon), v1(:knon), tair1(:knon), qair1, &
455     zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, yt10m, &
456     yq10m, wind10m(:knon), ustar(:knon))
457 guez 3
458 guez 62 DO j = 1, knon
459     i = ni(j)
460     t2m(i, nsrf) = yt2m(j)
461     q2m(i, nsrf) = yq2m(j)
462 guez 3
463 guez 227 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
464     / sqrt(u1(j)**2 + v1(j)**2)
465     v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
466     / sqrt(u1(j)**2 + v1(j)**2)
467 guez 62 END DO
468 guez 15
469 guez 227 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
470 guez 298 y_flux_q(:knon), yu(:knon, :), yv(:knon, :), yt(:knon, :), &
471     yq(:knon, :), ypblh(:knon), ycapcl, yoliqcl, ycteicl, ypblt, &
472     ytherm, ylcl)
473 guez 15
474 guez 38 DO j = 1, knon
475     i = ni(j)
476 guez 62 pblh(i, nsrf) = ypblh(j)
477     plcl(i, nsrf) = ylcl(j)
478     capcl(i, nsrf) = ycapcl(j)
479     oliqcl(i, nsrf) = yoliqcl(j)
480     cteicl(i, nsrf) = ycteicl(j)
481     pblt(i, nsrf) = ypblt(j)
482     therm(i, nsrf) = ytherm(j)
483 guez 38 END DO
484 guez 3
485 guez 38 DO j = 1, knon
486 guez 62 DO k = 1, klev + 1
487     i = ni(j)
488     q2(i, k, nsrf) = yq2(j, k)
489     END DO
490 guez 38 END DO
491 guez 215 else
492     fsnow(:, nsrf) = 0.
493 guez 62 end IF if_knon
494 guez 49 END DO loop_surface
495 guez 15
496 guez 38 ! On utilise les nouvelles surfaces
497 guez 222 frugs(:, is_oce) = rugmer
498 guez 202 pctsrf(:, is_oce) = pctsrf_new_oce
499     pctsrf(:, is_sic) = pctsrf_new_sic
500 guez 15
501 guez 202 firstcal = .false.
502    
503 guez 267 END SUBROUTINE pbl_surface
504 guez 15
505 guez 267 end module pbl_surface_m

  ViewVC Help
Powered by ViewVC 1.1.21