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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 233 - (show annotations)
Tue Nov 7 10:52:46 2017 UTC (6 years, 6 months ago) by guez
File size: 19865 byte(s)
Use separate variables for eddy diffusion coefficient and drag
coefficient in procedure coefkz (following LMDZ). coefkzmin only
computes eddy diffusion coefficient, not drag coefficient.

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, klev), coefm(klon, klev)
168 REAL yu(klon, klev), yv(klon, klev)
169 REAL yt(klon, klev), yq(klon, klev)
170 REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
171 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
172 REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev)
173 REAL ykmm(klon, klev + 1), ykmn(klon, klev + 1)
174 REAL ykmq(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, 2:), &
316 coefh(:knon, 2:), coefm(:knon, 1), coefh(:knon, 1))
317
318 IF (iflag_pbl == 1) THEN
319 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
320 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
321 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
322 END IF
323
324 ! on met un seuil pour coefm et coefh
325 IF (nsrf == is_oce) THEN
326 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
327 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
328 END IF
329
330 IF (ok_kzmin) THEN
331 ! Calcul d'une diffusion minimale pour les conditions tres stables
332 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
333 coefm(:knon, 1), ycoefm0(:knon, 2:), ycoefh0(:knon, 2:))
334 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
335 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
336 END IF
337
338 IF (iflag_pbl >= 6) THEN
339 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
340 ! Fr\'ed\'eric Hourdin
341 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
342 + ypplay(:knon, 1))) &
343 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
344
345 DO k = 2, klev
346 yzlay(:knon, k) = yzlay(:knon, k-1) &
347 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
348 / ypaprs(1:knon, k) &
349 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
350 END DO
351
352 DO k = 1, klev
353 yteta(1:knon, k) = yt(1:knon, k) * (ypaprs(1:knon, 1) &
354 / ypplay(1:knon, k))**rkappa * (1. + 0.61 * yq(1:knon, k))
355 END DO
356
357 zlev(:knon, 1) = 0.
358 zlev(:knon, klev + 1) = 2. * yzlay(:knon, klev) &
359 - yzlay(:knon, klev - 1)
360
361 DO k = 2, klev
362 zlev(:knon, k) = 0.5 * (yzlay(:knon, k) + yzlay(:knon, k-1))
363 END DO
364
365 DO k = 1, klev + 1
366 DO j = 1, knon
367 i = ni(j)
368 yq2(j, k) = q2(i, k, nsrf)
369 END DO
370 END DO
371
372 ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), coefm(:knon, 1))
373 CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), &
374 yu(:knon, :), yv(:knon, :), yteta(:knon, :), &
375 coefm(:knon, 1), yq2(:knon, :), ykmm(:knon, :), &
376 ykmn(:knon, :), ykmq(:knon, :), ustar(:knon))
377 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
378 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
379 END IF
380
381 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, 2:), &
382 coefm(:knon, 1), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
383 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
384 y_flux_u(:knon))
385 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, 2:), &
386 coefm(:knon, 1), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
387 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
388 y_flux_v(:knon))
389
390 ! calculer la diffusion de "q" et de "h"
391 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
392 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
393 yu(:knon, 1), yv(:knon, 1), coefh(:knon, :), yt, yq, &
394 yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), yalb(:knon), &
395 snow(:knon), yqsurf, yrain_f, ysnow_f, yfluxlat(:knon), &
396 pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), &
397 yz0_new, y_flux_t(:knon), y_flux_q(:knon), y_dflux_t(:knon), &
398 y_dflux_q(:knon), y_fqcalving, y_ffonte, 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 * coefm(j, 1) * (yu(j, 1)**2 + yv(j, 1)**2) &
405 / rg + 0.11 * 14E-6 &
406 / sqrt(coefm(j, 1) * (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 coefh(j, k) = coefh(j, k) * ypct(j)
419 coefm(j, k) = coefm(j, k) * ypct(j)
420 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
421 y_d_q(j, k) = y_d_q(j, k) * ypct(j)
422 y_d_u(j, k) = y_d_u(j, k) * ypct(j)
423 y_d_v(j, k) = y_d_v(j, k) * ypct(j)
424 END DO
425 END DO
426
427 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
428 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
429 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
430 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
431
432 evap(:, nsrf) = -flux_q(:, nsrf)
433
434 falbe(:, nsrf) = 0.
435 fsnow(:, nsrf) = 0.
436 qsurf(:, nsrf) = 0.
437 frugs(:, nsrf) = 0.
438 DO j = 1, knon
439 i = ni(j)
440 d_ts(i, nsrf) = y_d_ts(j)
441 falbe(i, nsrf) = yalb(j)
442 fsnow(i, nsrf) = snow(j)
443 qsurf(i, nsrf) = yqsurf(j)
444 frugs(i, nsrf) = yz0_new(j)
445 fluxlat(i, nsrf) = yfluxlat(j)
446 IF (nsrf == is_oce) THEN
447 rugmer(i) = yrugm(j)
448 frugs(i, nsrf) = yrugm(j)
449 END IF
450 agesno(i, nsrf) = yagesno(j)
451 fqcalving(i, nsrf) = y_fqcalving(j)
452 ffonte(i, nsrf) = y_ffonte(j)
453 cdragh(i) = cdragh(i) + coefh(j, 1)
454 cdragm(i) = cdragm(i) + coefm(j, 1)
455 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
456 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
457 END DO
458 IF (nsrf == is_ter) THEN
459 qsol(ni(:knon)) = yqsol(:knon)
460 else IF (nsrf == is_lic) THEN
461 DO j = 1, knon
462 i = ni(j)
463 run_off_lic_0(i) = y_run_off_lic_0(j)
464 END DO
465 END IF
466
467 ftsoil(:, :, nsrf) = 0.
468 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
469
470 DO j = 1, knon
471 i = ni(j)
472 DO k = 1, klev
473 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
474 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
475 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
476 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
477 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
478 END DO
479 END DO
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)
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