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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 225 - (show annotations)
Mon Oct 16 12:35:41 2017 UTC (6 years, 6 months ago) by guez
File size: 20563 byte(s)
LMDZE is now in Fortran 2003 (use of allocatable arguments).

gradsdef was not used.

Change names: [uv]10m to [uv]10m_srf in clmain, y[uv]1 to
[uv]1lay. Remove useless complication: zx_alf[12]. Do not modify
[uv]1lay after initial definition from [uv].

Add [uv]10m_srf to output.

Change names in physiq: [uv]10m to [uv]10m_srf, z[uv]10m to [uv]10m,
corresponding to NetCDF output names.

Remove unused complication couchelimite and useless variable inirnpb
in phytrac.

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

  ViewVC Help
Powered by ViewVC 1.1.21