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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 237 - (show annotations)
Thu Nov 9 13:26:00 2017 UTC (6 years, 6 months ago) by guez
File size: 20847 byte(s)
In procedure clmain, separate coefh(klon, klev) into coefh(klon,
2:klev) and ycdragh(klon), coefm(klon, klev) into coefm(klon,
2:klev) and ycdragm(klon).

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

  ViewVC Help
Powered by ViewVC 1.1.21