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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 1 month ago) by guez
File size: 20657 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

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

  ViewVC Help
Powered by ViewVC 1.1.21