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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 221 - (show annotations)
Thu Apr 20 14:44:47 2017 UTC (7 years ago) by guez
File size: 20804 byte(s)
clcdrag is no longer used in LMDZ. Replaced by cdrag in LMDZ. In cdrag
in LMDZ, zxli is a symbolic constant, false. So removed case zxli true
in LMDZE.

read_sst is called zero (if no ocean point on the whole planet) time or
once per call of physiq. If mod(itap - 1, lmt_pas) == 0 then we have
advanced in time of lmt_pas and deja_lu is necessarily false.

qsat[sl] and dqsat[sl] were never called.

Added output of qsurf in histins, following LMDZ.

Last dummy argument dtime of phystokenc is always the same as first
dummy argument pdtphys, removed dtime.

Removed make rules for nag_xref95, since it does not exist any longer.

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, solsw, sollw, fder, &
10 rugos, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, &
11 flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, zu1, &
12 zv1, t2m, q2m, u10m, v10m, 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):: solsw(klon, nbsrf), sollw(klon, nbsrf)
83 REAL, intent(in):: fder(klon)
84 REAL, intent(inout):: rugos(klon, nbsrf) ! longueur de rugosit\'e (en m)
85 real agesno(klon, nbsrf)
86 REAL, INTENT(IN):: rugoro(klon)
87
88 REAL d_t(klon, klev), d_q(klon, klev)
89 ! d_t------output-R- le changement pour "t"
90 ! d_q------output-R- le changement pour "q"
91
92 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
93 ! changement pour "u" et "v"
94
95 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
96
97 REAL, intent(out):: flux_t(klon, nbsrf)
98 ! flux de chaleur sensible (Cp T) (W/m2) (orientation positive vers
99 ! le bas) à la surface
100
101 REAL, intent(out):: flux_q(klon, nbsrf)
102 ! flux de vapeur d'eau (kg/m2/s) à la surface
103
104 REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
105 ! tension du vent à la surface, en Pa
106
107 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
108 real q2(klon, klev+1, nbsrf)
109
110 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
111 ! dflux_t derive du flux sensible
112 ! dflux_q derive du flux latent
113 ! IM "slab" ocean
114
115 REAL, intent(out):: ycoefh(klon, klev)
116 REAL, intent(out):: zu1(klon)
117 REAL zv1(klon)
118 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
119 REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
120
121 ! Ionela Musat cf. Anne Mathieu : planetary boundary layer, hbtm
122 ! (Comme les autres diagnostics on cumule dans physiq ce qui
123 ! permet 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 yu1(klon), yv1(klon)
159 ! On ajoute en output yu1 et yv1 qui sont les vents dans
160 ! la premi\`ere couche.
161
162 REAL snow(klon), yqsurf(klon), yagesno(klon)
163
164 real yqsol(klon)
165 ! column-density of water in soil, in kg m-2
166
167 REAL yrain_f(klon)
168 ! liquid water mass flux (kg/m2/s), positive down
169
170 REAL ysnow_f(klon)
171 ! solid water mass flux (kg/m2/s), positive down
172
173 REAL yfder(klon)
174 REAL yrugm(klon), yrads(klon), yrugoro(klon)
175 REAL yfluxlat(klon)
176 REAL y_d_ts(klon)
177 REAL y_d_t(klon, klev), y_d_q(klon, klev)
178 REAL y_d_u(klon, klev), y_d_v(klon, klev)
179 REAL y_flux_t(klon), y_flux_q(klon)
180 REAL y_flux_u(klon), y_flux_v(klon)
181 REAL y_dflux_t(klon), y_dflux_q(klon)
182 REAL coefh(klon, klev), coefm(klon, klev)
183 REAL yu(klon, klev), yv(klon, klev)
184 REAL yt(klon, klev), yq(klon, klev)
185 REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
186
187 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
188
189 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
190 REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
191 REAL ykmq(klon, klev+1)
192 REAL yq2(klon, klev+1)
193 REAL q2diag(klon, klev+1)
194
195 REAL u1lay(klon), v1lay(klon)
196 REAL delp(klon, klev)
197 INTEGER i, k, nsrf
198
199 INTEGER ni(klon), knon, j
200
201 REAL pctsrf_pot(klon, nbsrf)
202 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
203 ! apparitions ou disparitions de la glace de mer
204
205 REAL zx_alf1, zx_alf2 ! valeur ambiante par extrapolation
206
207 REAL yt2m(klon), yq2m(klon), yu10m(klon)
208 REAL yustar(klon)
209
210 REAL yt10m(klon), yq10m(klon)
211 REAL ypblh(klon)
212 REAL ylcl(klon)
213 REAL ycapcl(klon)
214 REAL yoliqcl(klon)
215 REAL ycteicl(klon)
216 REAL ypblt(klon)
217 REAL ytherm(klon)
218 REAL ytrmb1(klon)
219 REAL ytrmb2(klon)
220 REAL ytrmb3(klon)
221 REAL uzon(klon), vmer(klon)
222 REAL tair1(klon), qair1(klon), tairsol(klon)
223 REAL psfce(klon), patm(klon)
224
225 REAL qairsol(klon), zgeo1(klon)
226 REAL rugo1(klon)
227
228 ! utiliser un jeu de fonctions simples
229 LOGICAL zxli
230 PARAMETER (zxli=.FALSE.)
231
232 !------------------------------------------------------------
233
234 ytherm = 0.
235
236 DO k = 1, klev ! epaisseur de couche
237 DO i = 1, klon
238 delp(i, k) = paprs(i, k) - paprs(i, k+1)
239 END DO
240 END DO
241 DO i = 1, klon ! vent de la premiere couche
242 zx_alf1 = 1.0
243 zx_alf2 = 1.0 - zx_alf1
244 u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
245 v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
246 END DO
247
248 ! Initialization:
249 rugmer = 0.
250 cdragh = 0.
251 cdragm = 0.
252 dflux_t = 0.
253 dflux_q = 0.
254 zu1 = 0.
255 zv1 = 0.
256 ypct = 0.
257 yqsurf = 0.
258 yrain_f = 0.
259 ysnow_f = 0.
260 yfder = 0.
261 yrugos = 0.
262 yu1 = 0.
263 yv1 = 0.
264 yrads = 0.
265 ypaprs = 0.
266 ypplay = 0.
267 ydelp = 0.
268 yu = 0.
269 yv = 0.
270 yt = 0.
271 yq = 0.
272 y_dflux_t = 0.
273 y_dflux_q = 0.
274 yrugoro = 0.
275 d_ts = 0.
276 flux_t = 0.
277 flux_q = 0.
278 flux_u = 0.
279 flux_v = 0.
280 fluxlat = 0.
281 d_t = 0.
282 d_q = 0.
283 d_u = 0.
284 d_v = 0.
285 ycoefh = 0.
286
287 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
288 ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
289 ! (\`a affiner)
290
291 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
292 pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
293 pctsrf_pot(:, is_oce) = 1. - zmasq
294 pctsrf_pot(:, is_sic) = 1. - zmasq
295
296 ! Tester si c'est le moment de lire le fichier:
297 if (mod(itap - 1, lmt_pas) == 0) then
298 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
299 endif
300
301 ! Boucler sur toutes les sous-fractions du sol:
302
303 loop_surface: DO nsrf = 1, nbsrf
304 ! Chercher les indices :
305 ni = 0
306 knon = 0
307 DO i = 1, klon
308 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
309 ! "potentielles"
310 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
311 knon = knon + 1
312 ni(knon) = i
313 END IF
314 END DO
315
316 if_knon: IF (knon /= 0) then
317 DO j = 1, knon
318 i = ni(j)
319 ypct(j) = pctsrf(i, nsrf)
320 yts(j) = ftsol(i, nsrf)
321 snow(j) = fsnow(i, nsrf)
322 yqsurf(j) = qsurf(i, nsrf)
323 yalb(j) = falbe(i, nsrf)
324 yrain_f(j) = rain_fall(i)
325 ysnow_f(j) = snow_f(i)
326 yagesno(j) = agesno(i, nsrf)
327 yfder(j) = fder(i)
328 yrugos(j) = rugos(i, nsrf)
329 yrugoro(j) = rugoro(i)
330 yu1(j) = u1lay(i)
331 yv1(j) = v1lay(i)
332 yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
333 ypaprs(j, klev+1) = paprs(i, klev+1)
334 y_run_off_lic_0(j) = run_off_lic_0(i)
335 END DO
336
337 ! For continent, copy soil water content
338 IF (nsrf == is_ter) THEN
339 yqsol(:knon) = qsol(ni(:knon))
340 ELSE
341 yqsol = 0.
342 END IF
343
344 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
345
346 DO k = 1, klev
347 DO j = 1, knon
348 i = ni(j)
349 ypaprs(j, k) = paprs(i, k)
350 ypplay(j, k) = pplay(i, k)
351 ydelp(j, k) = delp(i, k)
352 yu(j, k) = u(i, k)
353 yv(j, k) = v(i, k)
354 yt(j, k) = t(i, k)
355 yq(j, k) = q(i, k)
356 END DO
357 END DO
358
359 ! calculer Cdrag et les coefficients d'echange
360 CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), &
361 yrugos, yu, yv, yt, yq, yqsurf(:knon), coefm(:knon, :), &
362 coefh(:knon, :))
363 IF (iflag_pbl == 1) THEN
364 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
365 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
366 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
367 END IF
368
369 ! on met un seuil pour coefm et coefh
370 IF (nsrf == is_oce) THEN
371 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
372 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
373 END IF
374
375 IF (ok_kzmin) THEN
376 ! Calcul d'une diffusion minimale pour les conditions tres stables
377 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
378 coefm(:knon, 1), ycoefm0, ycoefh0)
379 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
380 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
381 END IF
382
383 IF (iflag_pbl >= 3) THEN
384 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
385 ! Fr\'ed\'eric Hourdin
386 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
387 + ypplay(:knon, 1))) &
388 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
389 DO k = 2, klev
390 yzlay(1:knon, k) = yzlay(1:knon, k-1) &
391 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
392 / ypaprs(1:knon, k) &
393 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
394 END DO
395 DO k = 1, klev
396 yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
397 / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
398 END DO
399 yzlev(1:knon, 1) = 0.
400 yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
401 - yzlay(:knon, klev - 1)
402 DO k = 2, klev
403 yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
404 END DO
405 DO k = 1, klev + 1
406 DO j = 1, knon
407 i = ni(j)
408 yq2(j, k) = q2(i, k, nsrf)
409 END DO
410 END DO
411
412 CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
413 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
414
415 ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
416
417 IF (iflag_pbl >= 11) THEN
418 CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
419 yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
420 iflag_pbl)
421 ELSE
422 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
423 coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
424 END IF
425
426 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
427 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
428 END IF
429
430 ! calculer la diffusion des vitesses "u" et "v"
431 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
432 ypplay, ydelp, y_d_u, y_flux_u(:knon))
433 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
434 ypplay, ydelp, y_d_v, y_flux_v(:knon))
435
436 ! calculer la diffusion de "q" et de "h"
437 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
438 ytsoil(:knon, :), yqsol, mu0, yrugos, yrugoro, yu1, yv1, &
439 coefh(:knon, :), yt, yq, yts(:knon), ypaprs, ypplay, ydelp, &
440 yrads, yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &
441 yfder, yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, &
442 y_d_q, y_d_ts(:knon), yz0_new, y_flux_t(:knon), &
443 y_flux_q(:knon), y_dflux_t, y_dflux_q, y_fqcalving, y_ffonte, &
444 y_run_off_lic_0)
445
446 ! calculer la longueur de rugosite sur ocean
447 yrugm = 0.
448 IF (nsrf == is_oce) THEN
449 DO j = 1, knon
450 yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
451 0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
452 yrugm(j) = max(1.5E-05, yrugm(j))
453 END DO
454 END IF
455 DO j = 1, knon
456 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
457 y_dflux_q(j) = y_dflux_q(j)*ypct(j)
458 yu1(j) = yu1(j)*ypct(j)
459 yv1(j) = yv1(j)*ypct(j)
460 END DO
461
462 DO k = 1, klev
463 DO j = 1, knon
464 i = ni(j)
465 coefh(j, k) = coefh(j, k)*ypct(j)
466 coefm(j, k) = coefm(j, k)*ypct(j)
467 y_d_t(j, k) = y_d_t(j, k)*ypct(j)
468 y_d_q(j, k) = y_d_q(j, k)*ypct(j)
469 y_d_u(j, k) = y_d_u(j, k)*ypct(j)
470 y_d_v(j, k) = y_d_v(j, k)*ypct(j)
471 END DO
472 END DO
473
474 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
475 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
476 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
477 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
478
479 evap(:, nsrf) = -flux_q(:, nsrf)
480
481 falbe(:, nsrf) = 0.
482 fsnow(:, nsrf) = 0.
483 qsurf(:, nsrf) = 0.
484 rugos(:, nsrf) = 0.
485 DO j = 1, knon
486 i = ni(j)
487 d_ts(i, nsrf) = y_d_ts(j)
488 falbe(i, nsrf) = yalb(j)
489 fsnow(i, nsrf) = snow(j)
490 qsurf(i, nsrf) = yqsurf(j)
491 rugos(i, nsrf) = yz0_new(j)
492 fluxlat(i, nsrf) = yfluxlat(j)
493 IF (nsrf == is_oce) THEN
494 rugmer(i) = yrugm(j)
495 rugos(i, nsrf) = yrugm(j)
496 END IF
497 agesno(i, nsrf) = yagesno(j)
498 fqcalving(i, nsrf) = y_fqcalving(j)
499 ffonte(i, nsrf) = y_ffonte(j)
500 cdragh(i) = cdragh(i) + coefh(j, 1)
501 cdragm(i) = cdragm(i) + coefm(j, 1)
502 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
503 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
504 zu1(i) = zu1(i) + yu1(j)
505 zv1(i) = zv1(i) + yv1(j)
506 END DO
507 IF (nsrf == is_ter) THEN
508 qsol(ni(:knon)) = yqsol(:knon)
509 else IF (nsrf == is_lic) THEN
510 DO j = 1, knon
511 i = ni(j)
512 run_off_lic_0(i) = y_run_off_lic_0(j)
513 END DO
514 END IF
515
516 ftsoil(:, :, nsrf) = 0.
517 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
518
519 DO j = 1, knon
520 i = ni(j)
521 DO k = 1, klev
522 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
523 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
524 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
525 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
526 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
527 END DO
528 END DO
529
530 ! diagnostic t, q a 2m et u, v a 10m
531
532 DO j = 1, knon
533 i = ni(j)
534 uzon(j) = yu(j, 1) + y_d_u(j, 1)
535 vmer(j) = yv(j, 1) + y_d_v(j, 1)
536 tair1(j) = yt(j, 1) + y_d_t(j, 1)
537 qair1(j) = yq(j, 1) + y_d_q(j, 1)
538 zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
539 1)))*(ypaprs(j, 1)-ypplay(j, 1))
540 tairsol(j) = yts(j) + y_d_ts(j)
541 rugo1(j) = yrugos(j)
542 IF (nsrf == is_oce) THEN
543 rugo1(j) = rugos(i, nsrf)
544 END IF
545 psfce(j) = ypaprs(j, 1)
546 patm(j) = ypplay(j, 1)
547
548 qairsol(j) = yqsurf(j)
549 END DO
550
551 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
552 zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
553 yt10m, yq10m, yu10m, yustar)
554
555 DO j = 1, knon
556 i = ni(j)
557 t2m(i, nsrf) = yt2m(j)
558 q2m(i, nsrf) = yq2m(j)
559
560 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
561 u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
562 v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
563 END DO
564
565 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t(:knon), &
566 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
567 yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
568
569 DO j = 1, knon
570 i = ni(j)
571 pblh(i, nsrf) = ypblh(j)
572 plcl(i, nsrf) = ylcl(j)
573 capcl(i, nsrf) = ycapcl(j)
574 oliqcl(i, nsrf) = yoliqcl(j)
575 cteicl(i, nsrf) = ycteicl(j)
576 pblt(i, nsrf) = ypblt(j)
577 therm(i, nsrf) = ytherm(j)
578 trmb1(i, nsrf) = ytrmb1(j)
579 trmb2(i, nsrf) = ytrmb2(j)
580 trmb3(i, nsrf) = ytrmb3(j)
581 END DO
582
583 DO j = 1, knon
584 DO k = 1, klev + 1
585 i = ni(j)
586 q2(i, k, nsrf) = yq2(j, k)
587 END DO
588 END DO
589 else
590 fsnow(:, nsrf) = 0.
591 end IF if_knon
592 END DO loop_surface
593
594 ! On utilise les nouvelles surfaces
595 rugos(:, is_oce) = rugmer
596 pctsrf(:, is_oce) = pctsrf_new_oce
597 pctsrf(:, is_sic) = pctsrf_new_sic
598
599 firstcal = .false.
600
601 END SUBROUTINE clmain
602
603 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21