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

Contents of /trunk/phylmd/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 239 - (show annotations)
Fri Nov 10 15:16:48 2017 UTC (6 years, 6 months ago) by guez
Original Path: trunk/Sources/phylmd/clmain.f
File size: 20628 byte(s)
In procedure coefkzmin, dummy argument km is equal to dummy argument
kn. Remove it.

Bug fix in clmain. If iflag_pbl /= 1 and ok_kzmin then
ycoef[mh]0(:knon, 1) are not defined and used for computation of
ycdrag[mh](:knon). Remove the lines (following LMDZ).

1 module clmain_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE clmain(dtime, pctsrf, t, q, u, v, julien, mu0, ftsol, cdmmax, &
8 cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, fsnow, &
9 qsurf, evap, falbe, fluxlat, rain_fall, snow_f, fsolsw, fsollw, frugs, &
10 agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, &
11 flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, t2m, q2m, &
12 u10m_srf, v10m_srf, pblh, capcl, oliqcl, cteicl, pblt, therm, trmb1, &
13 trmb2, trmb3, plcl, fqcalving, ffonte, run_off_lic_0)
14
15 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
16 ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
17 ! Objet : interface de couche limite (diffusion verticale)
18
19 ! 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 ! ne tient pas compte de la diff\'erentiation des sous-fractions
22 ! de sol.
23
24 use clqh_m, only: clqh
25 use clvent_m, only: clvent
26 use coefkz_m, only: coefkz
27 use coefkzmin_m, only: coefkzmin
28 use coefkz2_m, only: coefkz2
29 USE conf_gcm_m, ONLY: lmt_pas
30 USE conf_phys_m, ONLY: iflag_pbl
31 USE dimphy, ONLY: klev, klon, zmasq
32 USE dimsoil, ONLY: nsoilmx
33 use hbtm_m, only: hbtm
34 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
35 USE interfoce_lim_m, ONLY: interfoce_lim
36 use stdlevvar_m, only: stdlevvar
37 USE suphec_m, ONLY: rd, rg, rkappa
38 use time_phylmdz, only: itap
39 use ustarhb_m, only: ustarhb
40 use yamada4_m, only: yamada4
41
42 REAL, INTENT(IN):: dtime ! interval du temps (secondes)
43
44 REAL, INTENT(inout):: pctsrf(klon, nbsrf)
45 ! tableau des pourcentages de surface de chaque maille
46
47 REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
48 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
49 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
50 INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
51 REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal
52 REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
53 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
54 REAL, INTENT(IN):: ksta, ksta_ter
55 LOGICAL, INTENT(IN):: ok_kzmin
56
57 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
58 ! soil temperature of surface fraction
59
60 REAL, INTENT(inout):: qsol(:) ! (klon)
61 ! column-density of water in soil, in kg m-2
62
63 REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
64 REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
65 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
66 REAL qsurf(klon, nbsrf)
67 REAL evap(klon, nbsrf)
68 REAL, intent(inout):: falbe(klon, nbsrf)
69 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
70
71 REAL, intent(in):: rain_fall(klon)
72 ! liquid water mass flux (kg / m2 / s), positive down
73
74 REAL, intent(in):: snow_f(klon)
75 ! solid water mass flux (kg / m2 / s), positive down
76
77 REAL, INTENT(IN):: fsolsw(klon, nbsrf), fsollw(klon, nbsrf)
78 REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
79 real agesno(klon, nbsrf)
80 REAL, INTENT(IN):: rugoro(klon)
81
82 REAL d_t(klon, klev), d_q(klon, klev)
83 ! d_t------output-R- le changement pour "t"
84 ! d_q------output-R- le changement pour "q"
85
86 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
87 ! changement pour "u" et "v"
88
89 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
90
91 REAL, intent(out):: flux_t(klon, nbsrf)
92 ! flux de chaleur sensible (Cp T) (W / m2) (orientation positive vers
93 ! le bas) à la surface
94
95 REAL, intent(out):: flux_q(klon, nbsrf)
96 ! flux de vapeur d'eau (kg / m2 / s) à la surface
97
98 REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
99 ! tension du vent (flux turbulent de vent) à la surface, en Pa
100
101 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
102 real q2(klon, klev + 1, nbsrf)
103
104 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
105 ! dflux_t derive du flux sensible
106 ! dflux_q derive du flux latent
107 ! IM "slab" ocean
108
109 REAL, intent(out):: ycoefh(:, :) ! (klon, klev)
110 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
111 ! "ycoefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
112 ! ce champ sur les quatre sous-surfaces du mod\`ele.
113
114 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
115
116 REAL, INTENT(inout):: u10m_srf(:, :), v10m_srf(:, :) ! (klon, nbsrf)
117 ! composantes du vent \`a 10m sans spirale d'Ekman
118
119 ! Ionela Musat. Cf. Anne Mathieu : planetary boundary layer, hbtm.
120 ! Comme les autres diagnostics on cumule dans physiq ce qui permet
121 ! de sortir les grandeurs par sous-surface.
122 REAL pblh(klon, nbsrf) ! height of planetary boundary layer
123 REAL capcl(klon, nbsrf)
124 REAL oliqcl(klon, nbsrf)
125 REAL cteicl(klon, nbsrf)
126 REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
127 REAL therm(klon, nbsrf)
128 REAL trmb1(klon, nbsrf)
129 ! trmb1-------deep_cape
130 REAL trmb2(klon, nbsrf)
131 ! trmb2--------inhibition
132 REAL trmb3(klon, nbsrf)
133 ! trmb3-------Point Omega
134 REAL plcl(klon, nbsrf)
135 REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
136 ! ffonte----Flux thermique utilise pour fondre la neige
137 ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
138 ! hauteur de neige, en kg / m2 / s
139 REAL run_off_lic_0(klon)
140
141 ! Local:
142
143 LOGICAL:: firstcal = .true.
144
145 ! la nouvelle repartition des surfaces sortie de l'interface
146 REAL, save:: pctsrf_new_oce(klon)
147 REAL, save:: pctsrf_new_sic(klon)
148
149 REAL y_fqcalving(klon), y_ffonte(klon)
150 real y_run_off_lic_0(klon)
151 REAL rugmer(klon)
152 REAL ytsoil(klon, nsoilmx)
153 REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
154 REAL yalb(klon)
155 REAL snow(klon), yqsurf(klon), yagesno(klon)
156 real yqsol(klon) ! column-density of water in soil, in kg m-2
157 REAL yrain_f(klon) ! liquid water mass flux (kg / m2 / s), positive down
158 REAL ysnow_f(klon) ! solid water mass flux (kg / m2 / s), positive down
159 REAL yrugm(klon), yrads(klon), yrugoro(klon)
160 REAL yfluxlat(klon)
161 REAL y_d_ts(klon)
162 REAL y_d_t(klon, klev), y_d_q(klon, klev)
163 REAL y_d_u(klon, klev), y_d_v(klon, klev)
164 REAL y_flux_t(klon), y_flux_q(klon)
165 REAL y_flux_u(klon), y_flux_v(klon)
166 REAL y_dflux_t(klon), y_dflux_q(klon)
167 REAL coefh(klon, 2:klev), coefm(klon, 2:klev)
168 real ycdragh(klon), ycdragm(klon)
169 REAL yu(klon, klev), yv(klon, klev)
170 REAL yt(klon, klev), yq(klon, klev)
171 REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
172 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
173 REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev)
174 REAL ykmm(klon, klev + 1), ykmn(klon, klev + 1)
175 REAL yq2(klon, klev + 1)
176 REAL delp(klon, klev)
177 INTEGER i, k, nsrf
178 INTEGER ni(klon), knon, j
179
180 REAL pctsrf_pot(klon, nbsrf)
181 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
182 ! apparitions ou disparitions de la glace de mer
183
184 REAL yt2m(klon), yq2m(klon), wind10m(klon)
185 REAL ustar(klon)
186
187 REAL yt10m(klon), yq10m(klon)
188 REAL ypblh(klon)
189 REAL ylcl(klon)
190 REAL ycapcl(klon)
191 REAL yoliqcl(klon)
192 REAL ycteicl(klon)
193 REAL ypblt(klon)
194 REAL ytherm(klon)
195 REAL ytrmb1(klon)
196 REAL ytrmb2(klon)
197 REAL ytrmb3(klon)
198 REAL u1(klon), v1(klon)
199 REAL tair1(klon), qair1(klon), tairsol(klon)
200 REAL psfce(klon), patm(klon)
201
202 REAL qairsol(klon), zgeo1(klon)
203 REAL rugo1(klon)
204
205 !------------------------------------------------------------
206
207 ytherm = 0.
208
209 DO k = 1, klev ! epaisseur de couche
210 DO i = 1, klon
211 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
212 END DO
213 END DO
214
215 ! Initialization:
216 rugmer = 0.
217 cdragh = 0.
218 cdragm = 0.
219 dflux_t = 0.
220 dflux_q = 0.
221 ypct = 0.
222 yqsurf = 0.
223 yrain_f = 0.
224 ysnow_f = 0.
225 yrugos = 0.
226 ypaprs = 0.
227 ypplay = 0.
228 ydelp = 0.
229 yu = 0.
230 yv = 0.
231 yt = 0.
232 yq = 0.
233 y_dflux_t = 0.
234 y_dflux_q = 0.
235 yrugoro = 0.
236 d_ts = 0.
237 flux_t = 0.
238 flux_q = 0.
239 flux_u = 0.
240 flux_v = 0.
241 fluxlat = 0.
242 d_t = 0.
243 d_q = 0.
244 d_u = 0.
245 d_v = 0.
246 ycoefh = 0.
247
248 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
249 ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
250 ! (\`a affiner)
251
252 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
253 pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
254 pctsrf_pot(:, is_oce) = 1. - zmasq
255 pctsrf_pot(:, is_sic) = 1. - zmasq
256
257 ! Tester si c'est le moment de lire le fichier:
258 if (mod(itap - 1, lmt_pas) == 0) then
259 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
260 endif
261
262 ! Boucler sur toutes les sous-fractions du sol:
263
264 loop_surface: DO nsrf = 1, nbsrf
265 ! Chercher les indices :
266 ni = 0
267 knon = 0
268 DO i = 1, klon
269 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
270 ! "potentielles"
271 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
272 knon = knon + 1
273 ni(knon) = i
274 END IF
275 END DO
276
277 if_knon: IF (knon /= 0) then
278 DO j = 1, knon
279 i = ni(j)
280 ypct(j) = pctsrf(i, nsrf)
281 yts(j) = ftsol(i, nsrf)
282 snow(j) = fsnow(i, nsrf)
283 yqsurf(j) = qsurf(i, nsrf)
284 yalb(j) = falbe(i, nsrf)
285 yrain_f(j) = rain_fall(i)
286 ysnow_f(j) = snow_f(i)
287 yagesno(j) = agesno(i, nsrf)
288 yrugos(j) = frugs(i, nsrf)
289 yrugoro(j) = rugoro(i)
290 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
291 ypaprs(j, klev + 1) = paprs(i, klev + 1)
292 y_run_off_lic_0(j) = run_off_lic_0(i)
293 END DO
294
295 ! For continent, copy soil water content
296 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
297
298 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
299
300 DO k = 1, klev
301 DO j = 1, knon
302 i = ni(j)
303 ypaprs(j, k) = paprs(i, k)
304 ypplay(j, k) = pplay(i, k)
305 ydelp(j, k) = delp(i, k)
306 yu(j, k) = u(i, k)
307 yv(j, k) = v(i, k)
308 yt(j, k) = t(i, k)
309 yq(j, k) = q(i, k)
310 END DO
311 END DO
312
313 ! calculer Cdrag et les coefficients d'echange
314 CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), &
315 yrugos, yu, yv, yt, yq, yqsurf(:knon), coefm(:knon, :), &
316 coefh(:knon, :), ycdragm(:knon), ycdragh(:knon))
317
318 IF (iflag_pbl == 1) THEN
319 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0(:knon, 2:), &
320 ycoefh0(:knon, 2:))
321 ycoefm0(:knon, 1) = 0.
322 ycoefh0(:knon, 1) = 0.
323 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, 2:))
324 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, 2:))
325 ycdragm(:knon) = max(ycdragm(:knon), 0.)
326 ycdragh(:knon) = max(ycdragh(:knon), 0.)
327 END IF
328
329 ! on met un seuil pour ycdragm et ycdragh
330 IF (nsrf == is_oce) THEN
331 ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
332 ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
333 END IF
334
335 IF (ok_kzmin) THEN
336 ! Calcul d'une diffusion minimale pour les conditions tres stables
337 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
338 ycdragm(:knon), ycoefh0(:knon, 2:))
339 ycoefm0(:knon, 2:) = ycoefh0(:knon, 2:)
340 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, 2:))
341 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, 2:))
342 END IF
343
344 IF (iflag_pbl >= 6) THEN
345 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
346 ! Fr\'ed\'eric Hourdin
347 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
348 + ypplay(:knon, 1))) &
349 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
350
351 DO k = 2, klev
352 yzlay(:knon, k) = yzlay(:knon, k-1) &
353 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
354 / ypaprs(1:knon, k) &
355 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
356 END DO
357
358 DO k = 1, klev
359 yteta(1:knon, k) = yt(1:knon, k) * (ypaprs(1:knon, 1) &
360 / ypplay(1:knon, k))**rkappa * (1. + 0.61 * yq(1:knon, k))
361 END DO
362
363 zlev(:knon, 1) = 0.
364 zlev(:knon, klev + 1) = 2. * yzlay(:knon, klev) &
365 - yzlay(:knon, klev - 1)
366
367 DO k = 2, klev
368 zlev(:knon, k) = 0.5 * (yzlay(:knon, k) + yzlay(:knon, k-1))
369 END DO
370
371 DO k = 1, klev + 1
372 DO j = 1, knon
373 i = ni(j)
374 yq2(j, k) = q2(i, k, nsrf)
375 END DO
376 END DO
377
378 ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), ycdragm(:knon))
379 CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), &
380 yu(:knon, :), yv(:knon, :), yteta(:knon, :), yq2(:knon, :), &
381 ykmm(:knon, :), ykmn(:knon, :), ustar(:knon))
382 coefm(:knon, :) = ykmm(:knon, 2:klev)
383 coefh(:knon, :) = ykmn(:knon, 2:klev)
384 END IF
385
386 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, :), &
387 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
388 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
389 y_flux_u(:knon))
390 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, :), &
391 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
392 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
393 y_flux_v(:knon))
394
395 ! calculer la diffusion de "q" et de "h"
396 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
397 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
398 yu(:knon, 1), yv(:knon, 1), coefh(:knon, :), ycdragh(:knon), &
399 yt, yq, yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), &
400 yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &
401 yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, &
402 y_d_ts(:knon), yz0_new, y_flux_t(:knon), y_flux_q(:knon), &
403 y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving, y_ffonte, &
404 y_run_off_lic_0)
405
406 ! calculer la longueur de rugosite sur ocean
407 yrugm = 0.
408 IF (nsrf == is_oce) THEN
409 DO j = 1, knon
410 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
411 / rg + 0.11 * 14E-6 &
412 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
413 yrugm(j) = max(1.5E-05, yrugm(j))
414 END DO
415 END IF
416 DO j = 1, knon
417 y_dflux_t(j) = y_dflux_t(j) * ypct(j)
418 y_dflux_q(j) = y_dflux_q(j) * ypct(j)
419 END DO
420
421 DO k = 2, klev
422 DO j = 1, knon
423 i = ni(j)
424 coefh(j, k) = coefh(j, k) * ypct(j)
425 coefm(j, k) = coefm(j, k) * ypct(j)
426 END DO
427 END DO
428 DO j = 1, knon
429 i = ni(j)
430 ycdragh(j) = ycdragh(j) * ypct(j)
431 ycdragm(j) = ycdragm(j) * ypct(j)
432 END DO
433 DO k = 1, klev
434 DO j = 1, knon
435 i = ni(j)
436 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
437 y_d_q(j, k) = y_d_q(j, k) * ypct(j)
438 y_d_u(j, k) = y_d_u(j, k) * ypct(j)
439 y_d_v(j, k) = y_d_v(j, k) * ypct(j)
440 END DO
441 END DO
442
443 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
444 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
445 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
446 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
447
448 evap(:, nsrf) = -flux_q(:, nsrf)
449
450 falbe(:, nsrf) = 0.
451 fsnow(:, nsrf) = 0.
452 qsurf(:, nsrf) = 0.
453 frugs(:, nsrf) = 0.
454 DO j = 1, knon
455 i = ni(j)
456 d_ts(i, nsrf) = y_d_ts(j)
457 falbe(i, nsrf) = yalb(j)
458 fsnow(i, nsrf) = snow(j)
459 qsurf(i, nsrf) = yqsurf(j)
460 frugs(i, nsrf) = yz0_new(j)
461 fluxlat(i, nsrf) = yfluxlat(j)
462 IF (nsrf == is_oce) THEN
463 rugmer(i) = yrugm(j)
464 frugs(i, nsrf) = yrugm(j)
465 END IF
466 agesno(i, nsrf) = yagesno(j)
467 fqcalving(i, nsrf) = y_fqcalving(j)
468 ffonte(i, nsrf) = y_ffonte(j)
469 cdragh(i) = cdragh(i) + ycdragh(j)
470 cdragm(i) = cdragm(i) + ycdragm(j)
471 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
472 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
473 END DO
474 IF (nsrf == is_ter) THEN
475 qsol(ni(:knon)) = yqsol(:knon)
476 else IF (nsrf == is_lic) THEN
477 DO j = 1, knon
478 i = ni(j)
479 run_off_lic_0(i) = y_run_off_lic_0(j)
480 END DO
481 END IF
482
483 ftsoil(:, :, nsrf) = 0.
484 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
485
486 DO j = 1, knon
487 i = ni(j)
488 DO k = 1, klev
489 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
490 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
491 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
492 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
493 END DO
494 END DO
495
496 DO j = 1, knon
497 i = ni(j)
498 DO k = 2, klev
499 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
500 END DO
501 END DO
502
503 DO j = 1, knon
504 i = ni(j)
505 ycoefh(i, 1) = ycoefh(i, 1) + ycdragh(j)
506 END DO
507
508 ! diagnostic t, q a 2m et u, v a 10m
509
510 DO j = 1, knon
511 i = ni(j)
512 u1(j) = yu(j, 1) + y_d_u(j, 1)
513 v1(j) = yv(j, 1) + y_d_v(j, 1)
514 tair1(j) = yt(j, 1) + y_d_t(j, 1)
515 qair1(j) = yq(j, 1) + y_d_q(j, 1)
516 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
517 1))) * (ypaprs(j, 1)-ypplay(j, 1))
518 tairsol(j) = yts(j) + y_d_ts(j)
519 rugo1(j) = yrugos(j)
520 IF (nsrf == is_oce) THEN
521 rugo1(j) = frugs(i, nsrf)
522 END IF
523 psfce(j) = ypaprs(j, 1)
524 patm(j) = ypplay(j, 1)
525
526 qairsol(j) = yqsurf(j)
527 END DO
528
529 CALL stdlevvar(klon, knon, nsrf, u1(:knon), v1(:knon), tair1(:knon), &
530 qair1, zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, &
531 yq2m, yt10m, yq10m, wind10m(:knon), ustar)
532
533 DO j = 1, knon
534 i = ni(j)
535 t2m(i, nsrf) = yt2m(j)
536 q2m(i, nsrf) = yq2m(j)
537
538 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
539 / sqrt(u1(j)**2 + v1(j)**2)
540 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
541 / sqrt(u1(j)**2 + v1(j)**2)
542 END DO
543
544 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
545 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
546 yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
547
548 DO j = 1, knon
549 i = ni(j)
550 pblh(i, nsrf) = ypblh(j)
551 plcl(i, nsrf) = ylcl(j)
552 capcl(i, nsrf) = ycapcl(j)
553 oliqcl(i, nsrf) = yoliqcl(j)
554 cteicl(i, nsrf) = ycteicl(j)
555 pblt(i, nsrf) = ypblt(j)
556 therm(i, nsrf) = ytherm(j)
557 trmb1(i, nsrf) = ytrmb1(j)
558 trmb2(i, nsrf) = ytrmb2(j)
559 trmb3(i, nsrf) = ytrmb3(j)
560 END DO
561
562 DO j = 1, knon
563 DO k = 1, klev + 1
564 i = ni(j)
565 q2(i, k, nsrf) = yq2(j, k)
566 END DO
567 END DO
568 else
569 fsnow(:, nsrf) = 0.
570 end IF if_knon
571 END DO loop_surface
572
573 ! On utilise les nouvelles surfaces
574 frugs(:, is_oce) = rugmer
575 pctsrf(:, is_oce) = pctsrf_new_oce
576 pctsrf(:, is_sic) = pctsrf_new_sic
577
578 firstcal = .false.
579
580 END SUBROUTINE clmain
581
582 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21