/[lmdze]/trunk/Sources/phylmd/clmain.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/clmain.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 246 - (show annotations)
Wed Nov 15 13:56:45 2017 UTC (6 years, 5 months ago) by guez
File size: 19827 byte(s)
In procedure clmain, no need for intermediary variables ykmm and ykmn.

In module coefcdrag_m, remove unused procedures fsta and fins.

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, coefh, 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):: coefh(:, 2:) ! (klon, 2:klev)
110 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
111 ! "coefh" 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 ycoefh(klon, 2:klev), ycoefm(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, 2:klev), ycoefh0(klon, 2:klev)
173 REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev)
174 REAL yq2(klon, klev + 1)
175 REAL delp(klon, klev)
176 INTEGER i, k, nsrf
177 INTEGER ni(klon), knon, j
178
179 REAL pctsrf_pot(klon, nbsrf)
180 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
181 ! apparitions ou disparitions de la glace de mer
182
183 REAL yt2m(klon), yq2m(klon), wind10m(klon)
184 REAL ustar(klon)
185
186 REAL yt10m(klon), yq10m(klon)
187 REAL ypblh(klon)
188 REAL ylcl(klon)
189 REAL ycapcl(klon)
190 REAL yoliqcl(klon)
191 REAL ycteicl(klon)
192 REAL ypblt(klon)
193 REAL ytherm(klon)
194 REAL ytrmb1(klon)
195 REAL ytrmb2(klon)
196 REAL ytrmb3(klon)
197 REAL u1(klon), v1(klon)
198 REAL tair1(klon), qair1(klon), tairsol(klon)
199 REAL psfce(klon), patm(klon)
200
201 REAL qairsol(klon), zgeo1(klon)
202 REAL rugo1(klon)
203
204 !------------------------------------------------------------
205
206 ytherm = 0.
207
208 DO k = 1, klev ! epaisseur de couche
209 DO i = 1, klon
210 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
211 END DO
212 END DO
213
214 ! Initialization:
215 rugmer = 0.
216 cdragh = 0.
217 cdragm = 0.
218 dflux_t = 0.
219 dflux_q = 0.
220 ypct = 0.
221 yqsurf = 0.
222 yrain_f = 0.
223 ysnow_f = 0.
224 yrugos = 0.
225 ypaprs = 0.
226 ypplay = 0.
227 ydelp = 0.
228 yu = 0.
229 yv = 0.
230 yt = 0.
231 yq = 0.
232 y_dflux_t = 0.
233 y_dflux_q = 0.
234 yrugoro = 0.
235 d_ts = 0.
236 flux_t = 0.
237 flux_q = 0.
238 flux_u = 0.
239 flux_v = 0.
240 fluxlat = 0.
241 d_t = 0.
242 d_q = 0.
243 d_u = 0.
244 d_v = 0.
245 coefh = 0.
246
247 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
248 ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
249 ! (\`a affiner)
250
251 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
252 pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
253 pctsrf_pot(:, is_oce) = 1. - zmasq
254 pctsrf_pot(:, is_sic) = 1. - zmasq
255
256 ! Tester si c'est le moment de lire le fichier:
257 if (mod(itap - 1, lmt_pas) == 0) then
258 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
259 endif
260
261 ! Boucler sur toutes les sous-fractions du sol:
262
263 loop_surface: DO nsrf = 1, nbsrf
264 ! Chercher les indices :
265 ni = 0
266 knon = 0
267 DO i = 1, klon
268 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
269 ! "potentielles"
270 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
271 knon = knon + 1
272 ni(knon) = i
273 END IF
274 END DO
275
276 if_knon: IF (knon /= 0) then
277 DO j = 1, knon
278 i = ni(j)
279 ypct(j) = pctsrf(i, nsrf)
280 yts(j) = ftsol(i, nsrf)
281 snow(j) = fsnow(i, nsrf)
282 yqsurf(j) = qsurf(i, nsrf)
283 yalb(j) = falbe(i, nsrf)
284 yrain_f(j) = rain_fall(i)
285 ysnow_f(j) = snow_f(i)
286 yagesno(j) = agesno(i, nsrf)
287 yrugos(j) = frugs(i, nsrf)
288 yrugoro(j) = rugoro(i)
289 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
290 ypaprs(j, klev + 1) = paprs(i, klev + 1)
291 y_run_off_lic_0(j) = run_off_lic_0(i)
292 END DO
293
294 ! For continent, copy soil water content
295 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
296
297 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
298
299 DO k = 1, klev
300 DO j = 1, knon
301 i = ni(j)
302 ypaprs(j, k) = paprs(i, k)
303 ypplay(j, k) = pplay(i, k)
304 ydelp(j, k) = delp(i, k)
305 yu(j, k) = u(i, k)
306 yv(j, k) = v(i, k)
307 yt(j, k) = t(i, k)
308 yq(j, k) = q(i, k)
309 END DO
310 END DO
311
312 CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), &
313 yrugos, yu, yv, yt, yq, yqsurf(:knon), ycoefm(:knon, :), &
314 ycoefh(:knon, :), ycdragm(:knon), ycdragh(:knon))
315
316 IF (iflag_pbl == 1) THEN
317 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0(:knon, :), &
318 ycoefh0(:knon, :))
319 ycoefm(:knon, :) = max(ycoefm(:knon, :), ycoefm0(:knon, :))
320 ycoefh(:knon, :) = max(ycoefh(:knon, :), ycoefh0(:knon, :))
321 ycdragm(:knon) = max(ycdragm(:knon), 0.)
322 ycdragh(:knon) = max(ycdragh(:knon), 0.)
323 END IF
324
325 ! on met un seuil pour ycdragm et ycdragh
326 IF (nsrf == is_oce) THEN
327 ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
328 ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
329 END IF
330
331 IF (ok_kzmin) THEN
332 ! Calcul d'une diffusion minimale pour les conditions tres stables
333 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
334 ycdragm(:knon), ycoefh0(:knon, :))
335 ycoefm0(:knon, :) = ycoefh0(:knon, :)
336 ycoefm(:knon, :) = max(ycoefm(:knon, :), ycoefm0(:knon, :))
337 ycoefh(:knon, :) = max(ycoefh(:knon, :), ycoefh0(:knon, :))
338 END IF
339
340 IF (iflag_pbl >= 6) THEN
341 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
342 ! Fr\'ed\'eric Hourdin
343 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
344 + ypplay(:knon, 1))) &
345 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
346
347 DO k = 2, klev
348 yzlay(:knon, k) = yzlay(:knon, k-1) &
349 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
350 / ypaprs(1:knon, k) &
351 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
352 END DO
353
354 DO k = 1, klev
355 yteta(1:knon, k) = yt(1:knon, k) * (ypaprs(1:knon, 1) &
356 / ypplay(1:knon, k))**rkappa * (1. + 0.61 * yq(1:knon, k))
357 END DO
358
359 zlev(:knon, 1) = 0.
360 zlev(:knon, klev + 1) = 2. * yzlay(:knon, klev) &
361 - yzlay(:knon, klev - 1)
362
363 DO k = 2, klev
364 zlev(:knon, k) = 0.5 * (yzlay(:knon, k) + yzlay(:knon, k-1))
365 END DO
366
367 DO k = 1, klev + 1
368 DO j = 1, knon
369 i = ni(j)
370 yq2(j, k) = q2(i, k, nsrf)
371 END DO
372 END DO
373
374 ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), ycdragm(:knon))
375 CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), &
376 yu(:knon, :), yv(:knon, :), yteta(:knon, :), yq2(:knon, :), &
377 ycoefm(:knon, :), ycoefh(:knon, :), ustar(:knon))
378 END IF
379
380 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
381 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
382 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
383 y_flux_u(:knon))
384 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
385 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
386 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
387 y_flux_v(:knon))
388
389 ! calculer la diffusion de "q" et de "h"
390 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
391 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
392 yu(:knon, 1), yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), &
393 yt, yq, yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), &
394 yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &
395 yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, &
396 y_d_ts(:knon), yz0_new, y_flux_t(:knon), y_flux_q(:knon), &
397 y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving, y_ffonte, &
398 y_run_off_lic_0)
399
400 ! calculer la longueur de rugosite sur ocean
401 yrugm = 0.
402 IF (nsrf == is_oce) THEN
403 DO j = 1, knon
404 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
405 / rg + 0.11 * 14E-6 &
406 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
407 yrugm(j) = max(1.5E-05, yrugm(j))
408 END DO
409 END IF
410 DO j = 1, knon
411 y_dflux_t(j) = y_dflux_t(j) * ypct(j)
412 y_dflux_q(j) = y_dflux_q(j) * ypct(j)
413 END DO
414
415 DO k = 1, klev
416 DO j = 1, knon
417 i = ni(j)
418 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
419 y_d_q(j, k) = y_d_q(j, k) * ypct(j)
420 y_d_u(j, k) = y_d_u(j, k) * ypct(j)
421 y_d_v(j, k) = y_d_v(j, k) * ypct(j)
422 END DO
423 END DO
424
425 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
426 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
427 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
428 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
429
430 evap(:, nsrf) = -flux_q(:, nsrf)
431
432 falbe(:, nsrf) = 0.
433 fsnow(:, nsrf) = 0.
434 qsurf(:, nsrf) = 0.
435 frugs(:, nsrf) = 0.
436 DO j = 1, knon
437 i = ni(j)
438 d_ts(i, nsrf) = y_d_ts(j)
439 falbe(i, nsrf) = yalb(j)
440 fsnow(i, nsrf) = snow(j)
441 qsurf(i, nsrf) = yqsurf(j)
442 frugs(i, nsrf) = yz0_new(j)
443 fluxlat(i, nsrf) = yfluxlat(j)
444 IF (nsrf == is_oce) THEN
445 rugmer(i) = yrugm(j)
446 frugs(i, nsrf) = yrugm(j)
447 END IF
448 agesno(i, nsrf) = yagesno(j)
449 fqcalving(i, nsrf) = y_fqcalving(j)
450 ffonte(i, nsrf) = y_ffonte(j)
451 cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
452 cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
453 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
454 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
455 END DO
456 IF (nsrf == is_ter) THEN
457 qsol(ni(:knon)) = yqsol(:knon)
458 else IF (nsrf == is_lic) THEN
459 DO j = 1, knon
460 i = ni(j)
461 run_off_lic_0(i) = y_run_off_lic_0(j)
462 END DO
463 END IF
464
465 ftsoil(:, :, nsrf) = 0.
466 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
467
468 DO j = 1, knon
469 i = ni(j)
470 DO k = 1, klev
471 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
472 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
473 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
474 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
475 END DO
476 END DO
477
478 forall (k = 2:klev) coefh(ni(:knon), k) &
479 = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
480
481 ! diagnostic t, q a 2m et u, v a 10m
482
483 DO j = 1, knon
484 i = ni(j)
485 u1(j) = yu(j, 1) + y_d_u(j, 1)
486 v1(j) = yv(j, 1) + y_d_v(j, 1)
487 tair1(j) = yt(j, 1) + y_d_t(j, 1)
488 qair1(j) = yq(j, 1) + y_d_q(j, 1)
489 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
490 1))) * (ypaprs(j, 1)-ypplay(j, 1))
491 tairsol(j) = yts(j) + y_d_ts(j)
492 rugo1(j) = yrugos(j)
493 IF (nsrf == is_oce) THEN
494 rugo1(j) = frugs(i, nsrf)
495 END IF
496 psfce(j) = ypaprs(j, 1)
497 patm(j) = ypplay(j, 1)
498
499 qairsol(j) = yqsurf(j)
500 END DO
501
502 CALL stdlevvar(klon, knon, nsrf, u1(:knon), v1(:knon), tair1(:knon), &
503 qair1, zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, &
504 yq2m, yt10m, yq10m, wind10m(:knon), ustar(:knon))
505
506 DO j = 1, knon
507 i = ni(j)
508 t2m(i, nsrf) = yt2m(j)
509 q2m(i, nsrf) = yq2m(j)
510
511 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
512 / sqrt(u1(j)**2 + v1(j)**2)
513 v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
514 / sqrt(u1(j)**2 + v1(j)**2)
515 END DO
516
517 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
518 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
519 yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
520
521 DO j = 1, knon
522 i = ni(j)
523 pblh(i, nsrf) = ypblh(j)
524 plcl(i, nsrf) = ylcl(j)
525 capcl(i, nsrf) = ycapcl(j)
526 oliqcl(i, nsrf) = yoliqcl(j)
527 cteicl(i, nsrf) = ycteicl(j)
528 pblt(i, nsrf) = ypblt(j)
529 therm(i, nsrf) = ytherm(j)
530 trmb1(i, nsrf) = ytrmb1(j)
531 trmb2(i, nsrf) = ytrmb2(j)
532 trmb3(i, nsrf) = ytrmb3(j)
533 END DO
534
535 DO j = 1, knon
536 DO k = 1, klev + 1
537 i = ni(j)
538 q2(i, k, nsrf) = yq2(j, k)
539 END DO
540 END DO
541 else
542 fsnow(:, nsrf) = 0.
543 end IF if_knon
544 END DO loop_surface
545
546 ! On utilise les nouvelles surfaces
547 frugs(:, is_oce) = rugmer
548 pctsrf(:, is_oce) = pctsrf_new_oce
549 pctsrf(:, is_sic) = pctsrf_new_sic
550
551 firstcal = .false.
552
553 END SUBROUTINE clmain
554
555 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21