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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 101 - (show annotations)
Mon Jul 7 17:45:21 2014 UTC (9 years, 9 months ago) by guez
Original Path: trunk/phylmd/clmain.f
File size: 22472 byte(s)
Removed unused files "interfoce_slab.f" and "gath2cpl.f". Removed
unused variables coastalflow and riverflow of module
interface_surf. Removed unused arguments cal, radsol, dif_grnd,
fluxlat, fluxsens, dflux_s, dflux_l of procedure fonte_neige. Removed
unused arguments tslab, seaice of procedure interfsurf_hq and
clqh. Removed unused arguments seaice of procedure clmain.

In interfsurf_hq, used variable soil_model of module clesphys2 instead
of cascading it as an argument from physiq.

In phyetat0, stop if masque not found.

Variable TS instead of "TS[0-9][0-9]" in "(re)startphy.nc", with
additional dimension nbsrf.

1 module clmain_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE clmain(dtime, itap, pctsrf, pctsrf_new, t, q, u, v, jour, rmu0, &
8 co2_ppm, ts, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, &
9 paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat, rain_fall, &
10 snow_f, solsw, sollw, fder, rlat, rugos, debut, agesno, rugoro, d_t, &
11 d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, &
12 q2, dflux_t, dflux_q, ycoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh, &
13 capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl, &
14 fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab)
15
16 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
17 ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
18 ! Objet : interface de couche limite (diffusion verticale)
19
20 ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
21 ! de la couche limite pour les traceurs se fait avec "cltrac" et
22 ! ne tient pas compte de la différentiation des sous-fractions de
23 ! sol.
24
25 ! Pour pouvoir extraire les coefficients d'échanges et le vent
26 ! dans la première couche, trois champs ont été créés : "ycoefh",
27 ! "zu1" et "zv1". Nous avons moyenné les valeurs de ces trois
28 ! champs sur les quatre sous-surfaces du modèle.
29
30 use clqh_m, only: clqh
31 use clvent_m, only: clvent
32 use coefkz_m, only: coefkz
33 use coefkzmin_m, only: coefkzmin
34 USE conf_gcm_m, ONLY: prt_level
35 USE conf_phys_m, ONLY: iflag_pbl
36 USE dimens_m, ONLY: iim, jjm
37 USE dimphy, ONLY: klev, klon, zmasq
38 USE dimsoil, ONLY: nsoilmx
39 use hbtm_m, only: hbtm
40 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
41 USE suphec_m, ONLY: rd, rg, rkappa
42 use ustarhb_m, only: ustarhb
43 use vdif_kcay_m, only: vdif_kcay
44 use yamada4_m, only: yamada4
45
46 REAL, INTENT(IN):: dtime ! interval du temps (secondes)
47 INTEGER, INTENT(IN):: itap ! numero du pas de temps
48 REAL, INTENT(inout):: pctsrf(klon, nbsrf)
49
50 ! la nouvelle repartition des surfaces sortie de l'interface
51 REAL, INTENT(out):: pctsrf_new(klon, nbsrf)
52
53 REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
54 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg/kg)
55 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
56 INTEGER, INTENT(IN):: jour ! jour de l'annee en cours
57 REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal
58 REAL, intent(in):: co2_ppm ! taux CO2 atmosphere
59 REAL, INTENT(IN):: ts(klon, nbsrf) ! input-R- temperature du sol (en Kelvin)
60 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
61 REAL, INTENT(IN):: ksta, ksta_ter
62 LOGICAL, INTENT(IN):: ok_kzmin
63 REAL ftsoil(klon, nsoilmx, nbsrf)
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 snow(klon, nbsrf)
71 REAL qsurf(klon, nbsrf)
72 REAL evap(klon, nbsrf)
73 REAL albe(klon, nbsrf)
74 REAL alblw(klon, nbsrf)
75
76 REAL fluxlat(klon, nbsrf)
77
78 REAL, intent(in):: rain_fall(klon)
79 ! liquid water mass flux (kg/m2/s), positive down
80
81 REAL, intent(in):: snow_f(klon)
82 ! solid water mass flux (kg/m2/s), positive down
83
84 REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)
85 REAL fder(klon)
86 REAL, INTENT(IN):: rlat(klon) ! latitude en degrés
87
88 REAL rugos(klon, nbsrf)
89 ! rugos----input-R- longeur de rugosite (en m)
90
91 LOGICAL, INTENT(IN):: debut
92 real agesno(klon, nbsrf)
93 REAL, INTENT(IN):: rugoro(klon)
94
95 REAL d_t(klon, klev), d_q(klon, klev)
96 ! d_t------output-R- le changement pour "t"
97 ! d_q------output-R- le changement pour "q"
98
99 REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
100 ! changement pour "u" et "v"
101
102 REAL d_ts(klon, nbsrf)
103 ! d_ts-----output-R- le changement pour "ts"
104
105 REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
106 ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)
107 ! (orientation positive vers le bas)
108 ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)
109
110 REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)
111 ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal
112 ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal
113
114 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
115 real q2(klon, klev+1, nbsrf)
116
117 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
118 ! dflux_t derive du flux sensible
119 ! dflux_q derive du flux latent
120 !IM "slab" ocean
121
122 REAL, intent(out):: ycoefh(klon, klev)
123 REAL, intent(out):: zu1(klon)
124 REAL zv1(klon)
125 REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
126 REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
127
128 !IM cf. AM : pbl, hbtm (Comme les autres diagnostics on cumule ds
129 ! physiq ce qui permet de sortir les grdeurs par sous surface)
130 REAL pblh(klon, nbsrf)
131 ! pblh------- HCL
132 REAL capcl(klon, nbsrf)
133 REAL oliqcl(klon, nbsrf)
134 REAL cteicl(klon, nbsrf)
135 REAL pblt(klon, nbsrf)
136 ! pblT------- T au nveau HCL
137 REAL therm(klon, nbsrf)
138 REAL trmb1(klon, nbsrf)
139 ! trmb1-------deep_cape
140 REAL trmb2(klon, nbsrf)
141 ! trmb2--------inhibition
142 REAL trmb3(klon, nbsrf)
143 ! trmb3-------Point Omega
144 REAL plcl(klon, nbsrf)
145 REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
146 ! ffonte----Flux thermique utilise pour fondre la neige
147 ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
148 ! hauteur de neige, en kg/m2/s
149 REAL run_off_lic_0(klon)
150
151 REAL flux_o(klon), flux_g(klon)
152 !IM "slab" ocean
153 ! flux_g---output-R- flux glace (pour OCEAN='slab ')
154 ! flux_o---output-R- flux ocean (pour OCEAN='slab ')
155
156 REAL tslab(klon)
157 ! tslab-in/output-R temperature du slab ocean (en Kelvin)
158 ! uniqmnt pour slab
159
160 ! Local:
161
162 REAL y_flux_o(klon), y_flux_g(klon)
163 real ytslab(klon)
164 REAL y_fqcalving(klon), y_ffonte(klon)
165 real y_run_off_lic_0(klon)
166
167 REAL rugmer(klon)
168
169 REAL ytsoil(klon, nsoilmx)
170
171 REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
172 REAL yalb(klon)
173 REAL yalblw(klon)
174 REAL yu1(klon), yv1(klon)
175 ! on rajoute en output yu1 et yv1 qui sont les vents dans
176 ! la premiere couche
177 REAL ysnow(klon), yqsurf(klon), yagesno(klon)
178
179 real yqsol(klon)
180 ! column-density of water in soil, in kg m-2
181
182 REAL yrain_f(klon)
183 ! liquid water mass flux (kg/m2/s), positive down
184
185 REAL ysnow_f(klon)
186 ! solid water mass flux (kg/m2/s), positive down
187
188 REAL ysollw(klon), ysolsw(klon)
189 REAL yfder(klon)
190 REAL yrugm(klon), yrads(klon), yrugoro(klon)
191
192 REAL yfluxlat(klon)
193
194 REAL y_d_ts(klon)
195 REAL y_d_t(klon, klev), y_d_q(klon, klev)
196 REAL y_d_u(klon, klev), y_d_v(klon, klev)
197 REAL y_flux_t(klon, klev), y_flux_q(klon, klev)
198 REAL y_flux_u(klon, klev), y_flux_v(klon, klev)
199 REAL y_dflux_t(klon), y_dflux_q(klon)
200 REAL coefh(klon, klev), coefm(klon, klev)
201 REAL yu(klon, klev), yv(klon, klev)
202 REAL yt(klon, klev), yq(klon, klev)
203 REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
204
205 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
206
207 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
208 REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
209 REAL ykmq(klon, klev+1)
210 REAL yq2(klon, klev+1)
211 REAL q2diag(klon, klev+1)
212
213 REAL u1lay(klon), v1lay(klon)
214 REAL delp(klon, klev)
215 INTEGER i, k, nsrf
216
217 INTEGER ni(klon), knon, j
218
219 REAL pctsrf_pot(klon, nbsrf)
220 ! "pourcentage potentiel" pour tenir compte des éventuelles
221 ! apparitions ou disparitions de la glace de mer
222
223 REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
224
225 REAL yt2m(klon), yq2m(klon), yu10m(klon)
226 REAL yustar(klon)
227 ! -- LOOP
228 REAL yu10mx(klon)
229 REAL yu10my(klon)
230 REAL ywindsp(klon)
231 ! -- LOOP
232
233 REAL yt10m(klon), yq10m(klon)
234 REAL ypblh(klon)
235 REAL ylcl(klon)
236 REAL ycapcl(klon)
237 REAL yoliqcl(klon)
238 REAL ycteicl(klon)
239 REAL ypblt(klon)
240 REAL ytherm(klon)
241 REAL ytrmb1(klon)
242 REAL ytrmb2(klon)
243 REAL ytrmb3(klon)
244 REAL uzon(klon), vmer(klon)
245 REAL tair1(klon), qair1(klon), tairsol(klon)
246 REAL psfce(klon), patm(klon)
247
248 REAL qairsol(klon), zgeo1(klon)
249 REAL rugo1(klon)
250
251 ! utiliser un jeu de fonctions simples
252 LOGICAL zxli
253 PARAMETER (zxli=.FALSE.)
254
255 !------------------------------------------------------------
256
257 ytherm = 0.
258
259 DO k = 1, klev ! epaisseur de couche
260 DO i = 1, klon
261 delp(i, k) = paprs(i, k) - paprs(i, k+1)
262 END DO
263 END DO
264 DO i = 1, klon ! vent de la premiere couche
265 zx_alf1 = 1.0
266 zx_alf2 = 1.0 - zx_alf1
267 u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
268 v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
269 END DO
270
271 ! Initialization:
272 rugmer = 0.
273 cdragh = 0.
274 cdragm = 0.
275 dflux_t = 0.
276 dflux_q = 0.
277 zu1 = 0.
278 zv1 = 0.
279 ypct = 0.
280 yts = 0.
281 ysnow = 0.
282 yqsurf = 0.
283 yalb = 0.
284 yalblw = 0.
285 yrain_f = 0.
286 ysnow_f = 0.
287 yfder = 0.
288 ysolsw = 0.
289 ysollw = 0.
290 yrugos = 0.
291 yu1 = 0.
292 yv1 = 0.
293 yrads = 0.
294 ypaprs = 0.
295 ypplay = 0.
296 ydelp = 0.
297 yu = 0.
298 yv = 0.
299 yt = 0.
300 yq = 0.
301 pctsrf_new = 0.
302 y_flux_u = 0.
303 y_flux_v = 0.
304 y_dflux_t = 0.
305 y_dflux_q = 0.
306 ytsoil = 999999.
307 yrugoro = 0.
308 ! -- LOOP
309 yu10mx = 0.
310 yu10my = 0.
311 ywindsp = 0.
312 ! -- LOOP
313 d_ts = 0.
314 yfluxlat = 0.
315 flux_t = 0.
316 flux_q = 0.
317 flux_u = 0.
318 flux_v = 0.
319 d_t = 0.
320 d_q = 0.
321 d_u = 0.
322 d_v = 0.
323 ycoefh = 0.
324
325 ! Initialisation des "pourcentages potentiels". On considère ici qu'on
326 ! peut avoir potentiellement de la glace sur tout le domaine océanique
327 ! (à affiner)
328
329 pctsrf_pot = pctsrf
330 pctsrf_pot(:, is_oce) = 1. - zmasq
331 pctsrf_pot(:, is_sic) = 1. - zmasq
332
333 ! Boucler sur toutes les sous-fractions du sol:
334
335 loop_surface: DO nsrf = 1, nbsrf
336 ! Chercher les indices :
337 ni = 0
338 knon = 0
339 DO i = 1, klon
340 ! Pour déterminer le domaine à traiter, on utilise les surfaces
341 ! "potentielles"
342 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
343 knon = knon + 1
344 ni(knon) = i
345 END IF
346 END DO
347
348 if_knon: IF (knon /= 0) then
349 DO j = 1, knon
350 i = ni(j)
351 ypct(j) = pctsrf(i, nsrf)
352 yts(j) = ts(i, nsrf)
353 ytslab(i) = tslab(i)
354 ysnow(j) = snow(i, nsrf)
355 yqsurf(j) = qsurf(i, nsrf)
356 yalb(j) = albe(i, nsrf)
357 yalblw(j) = alblw(i, nsrf)
358 yrain_f(j) = rain_fall(i)
359 ysnow_f(j) = snow_f(i)
360 yagesno(j) = agesno(i, nsrf)
361 yfder(j) = fder(i)
362 ysolsw(j) = solsw(i, nsrf)
363 ysollw(j) = sollw(i, nsrf)
364 yrugos(j) = rugos(i, nsrf)
365 yrugoro(j) = rugoro(i)
366 yu1(j) = u1lay(i)
367 yv1(j) = v1lay(i)
368 yrads(j) = ysolsw(j) + ysollw(j)
369 ypaprs(j, klev+1) = paprs(i, klev+1)
370 y_run_off_lic_0(j) = run_off_lic_0(i)
371 yu10mx(j) = u10m(i, nsrf)
372 yu10my(j) = v10m(i, nsrf)
373 ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))
374 END DO
375
376 ! For continent, copy soil water content
377 IF (nsrf == is_ter) THEN
378 yqsol(:knon) = qsol(ni(:knon))
379 ELSE
380 yqsol = 0.
381 END IF
382
383 DO k = 1, nsoilmx
384 DO j = 1, knon
385 i = ni(j)
386 ytsoil(j, k) = ftsoil(i, k, nsrf)
387 END DO
388 END DO
389
390 DO k = 1, klev
391 DO j = 1, knon
392 i = ni(j)
393 ypaprs(j, k) = paprs(i, k)
394 ypplay(j, k) = pplay(i, k)
395 ydelp(j, k) = delp(i, k)
396 yu(j, k) = u(i, k)
397 yv(j, k) = v(i, k)
398 yt(j, k) = t(i, k)
399 yq(j, k) = q(i, k)
400 END DO
401 END DO
402
403 ! calculer Cdrag et les coefficients d'echange
404 CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &
405 yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
406 IF (iflag_pbl == 1) THEN
407 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
408 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
409 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
410 END IF
411
412 ! on met un seuil pour coefm et coefh
413 IF (nsrf == is_oce) THEN
414 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
415 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
416 END IF
417
418 IF (ok_kzmin) THEN
419 ! Calcul d'une diffusion minimale pour les conditions tres stables
420 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
421 coefm(:knon, 1), ycoefm0, ycoefh0)
422 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
423 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
424 END IF
425
426 IF (iflag_pbl >= 3) THEN
427 ! Mellor et Yamada adapté à Mars, Richard Fournier et
428 ! Frédéric Hourdin
429 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
430 + ypplay(:knon, 1))) &
431 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
432 DO k = 2, klev
433 yzlay(1:knon, k) = yzlay(1:knon, k-1) &
434 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
435 / ypaprs(1:knon, k) &
436 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
437 END DO
438 DO k = 1, klev
439 yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
440 / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
441 END DO
442 yzlev(1:knon, 1) = 0.
443 yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
444 - yzlay(:knon, klev - 1)
445 DO k = 2, klev
446 yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
447 END DO
448 DO k = 1, klev + 1
449 DO j = 1, knon
450 i = ni(j)
451 yq2(j, k) = q2(i, k, nsrf)
452 END DO
453 END DO
454
455 CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
456 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
457
458 ! iflag_pbl peut être utilisé comme longueur de mélange
459
460 IF (iflag_pbl >= 11) THEN
461 CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &
462 yu, yv, yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, &
463 yustar, iflag_pbl)
464 ELSE
465 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
466 coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
467 END IF
468
469 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
470 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
471 END IF
472
473 ! calculer la diffusion des vitesses "u" et "v"
474 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
475 ypplay, ydelp, y_d_u, y_flux_u)
476 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
477 ypplay, ydelp, y_d_v, y_flux_v)
478
479 ! calculer la diffusion de "q" et de "h"
480 CALL clqh(dtime, itap, jour, debut, rlat, knon, nsrf, ni, pctsrf, &
481 ytsoil, yqsol, rmu0, co2_ppm, yrugos, yrugoro, &
482 yu1, yv1, coefh(:knon, :), yt, yq, yts, ypaprs, ypplay, ydelp, &
483 yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, yfder, &
484 ysolsw, yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts, &
485 yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q, &
486 y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g)
487
488 ! calculer la longueur de rugosite sur ocean
489 yrugm = 0.
490 IF (nsrf == is_oce) THEN
491 DO j = 1, knon
492 yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
493 0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
494 yrugm(j) = max(1.5E-05, yrugm(j))
495 END DO
496 END IF
497 DO j = 1, knon
498 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
499 y_dflux_q(j) = y_dflux_q(j)*ypct(j)
500 yu1(j) = yu1(j)*ypct(j)
501 yv1(j) = yv1(j)*ypct(j)
502 END DO
503
504 DO k = 1, klev
505 DO j = 1, knon
506 i = ni(j)
507 coefh(j, k) = coefh(j, k)*ypct(j)
508 coefm(j, k) = coefm(j, k)*ypct(j)
509 y_d_t(j, k) = y_d_t(j, k)*ypct(j)
510 y_d_q(j, k) = y_d_q(j, k)*ypct(j)
511 flux_t(i, k, nsrf) = y_flux_t(j, k)
512 flux_q(i, k, nsrf) = y_flux_q(j, k)
513 flux_u(i, k, nsrf) = y_flux_u(j, k)
514 flux_v(i, k, nsrf) = y_flux_v(j, k)
515 y_d_u(j, k) = y_d_u(j, k)*ypct(j)
516 y_d_v(j, k) = y_d_v(j, k)*ypct(j)
517 END DO
518 END DO
519
520 evap(:, nsrf) = -flux_q(:, 1, nsrf)
521
522 albe(:, nsrf) = 0.
523 alblw(:, nsrf) = 0.
524 snow(:, nsrf) = 0.
525 qsurf(:, nsrf) = 0.
526 rugos(:, nsrf) = 0.
527 fluxlat(:, nsrf) = 0.
528 DO j = 1, knon
529 i = ni(j)
530 d_ts(i, nsrf) = y_d_ts(j)
531 albe(i, nsrf) = yalb(j)
532 alblw(i, nsrf) = yalblw(j)
533 snow(i, nsrf) = ysnow(j)
534 qsurf(i, nsrf) = yqsurf(j)
535 rugos(i, nsrf) = yz0_new(j)
536 fluxlat(i, nsrf) = yfluxlat(j)
537 IF (nsrf == is_oce) THEN
538 rugmer(i) = yrugm(j)
539 rugos(i, nsrf) = yrugm(j)
540 END IF
541 agesno(i, nsrf) = yagesno(j)
542 fqcalving(i, nsrf) = y_fqcalving(j)
543 ffonte(i, nsrf) = y_ffonte(j)
544 cdragh(i) = cdragh(i) + coefh(j, 1)
545 cdragm(i) = cdragm(i) + coefm(j, 1)
546 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
547 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
548 zu1(i) = zu1(i) + yu1(j)
549 zv1(i) = zv1(i) + yv1(j)
550 END DO
551 IF (nsrf == is_ter) THEN
552 qsol(ni(:knon)) = yqsol(:knon)
553 else IF (nsrf == is_lic) THEN
554 DO j = 1, knon
555 i = ni(j)
556 run_off_lic_0(i) = y_run_off_lic_0(j)
557 END DO
558 END IF
559 !$$$ PB ajout pour soil
560 ftsoil(:, :, nsrf) = 0.
561 DO k = 1, nsoilmx
562 DO j = 1, knon
563 i = ni(j)
564 ftsoil(i, k, nsrf) = ytsoil(j, k)
565 END DO
566 END DO
567
568 DO j = 1, knon
569 i = ni(j)
570 DO k = 1, klev
571 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
572 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
573 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
574 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
575 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
576 END DO
577 END DO
578
579 ! diagnostic t, q a 2m et u, v a 10m
580
581 DO j = 1, knon
582 i = ni(j)
583 uzon(j) = yu(j, 1) + y_d_u(j, 1)
584 vmer(j) = yv(j, 1) + y_d_v(j, 1)
585 tair1(j) = yt(j, 1) + y_d_t(j, 1)
586 qair1(j) = yq(j, 1) + y_d_q(j, 1)
587 zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
588 1)))*(ypaprs(j, 1)-ypplay(j, 1))
589 tairsol(j) = yts(j) + y_d_ts(j)
590 rugo1(j) = yrugos(j)
591 IF (nsrf == is_oce) THEN
592 rugo1(j) = rugos(i, nsrf)
593 END IF
594 psfce(j) = ypaprs(j, 1)
595 patm(j) = ypplay(j, 1)
596
597 qairsol(j) = yqsurf(j)
598 END DO
599
600 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
601 zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
602 yt10m, yq10m, yu10m, yustar)
603
604 DO j = 1, knon
605 i = ni(j)
606 t2m(i, nsrf) = yt2m(j)
607 q2m(i, nsrf) = yq2m(j)
608
609 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
610 u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
611 v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
612
613 END DO
614
615 CALL hbtm(knon, ypaprs, ypplay, yt2m, yt10m, yq2m, yq10m, yustar, &
616 y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &
617 ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
618
619 DO j = 1, knon
620 i = ni(j)
621 pblh(i, nsrf) = ypblh(j)
622 plcl(i, nsrf) = ylcl(j)
623 capcl(i, nsrf) = ycapcl(j)
624 oliqcl(i, nsrf) = yoliqcl(j)
625 cteicl(i, nsrf) = ycteicl(j)
626 pblt(i, nsrf) = ypblt(j)
627 therm(i, nsrf) = ytherm(j)
628 trmb1(i, nsrf) = ytrmb1(j)
629 trmb2(i, nsrf) = ytrmb2(j)
630 trmb3(i, nsrf) = ytrmb3(j)
631 END DO
632
633 DO j = 1, knon
634 DO k = 1, klev + 1
635 i = ni(j)
636 q2(i, k, nsrf) = yq2(j, k)
637 END DO
638 END DO
639 !IM "slab" ocean
640 IF (nsrf == is_oce) THEN
641 DO j = 1, knon
642 ! on projette sur la grille globale
643 i = ni(j)
644 IF (pctsrf_new(i, is_oce)>epsfra) THEN
645 flux_o(i) = y_flux_o(j)
646 ELSE
647 flux_o(i) = 0.
648 END IF
649 END DO
650 END IF
651
652 IF (nsrf == is_sic) THEN
653 DO j = 1, knon
654 i = ni(j)
655 ! On pondère lorsque l'on fait le bilan au sol :
656 IF (pctsrf_new(i, is_sic)>epsfra) THEN
657 flux_g(i) = y_flux_g(j)
658 ELSE
659 flux_g(i) = 0.
660 END IF
661 END DO
662
663 END IF
664 end IF if_knon
665 END DO loop_surface
666
667 ! On utilise les nouvelles surfaces
668
669 rugos(:, is_oce) = rugmer
670 pctsrf = pctsrf_new
671
672 END SUBROUTINE clmain
673
674 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21