/[lmdze]/trunk/libf/phylmd/clmain.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/clmain.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 47 - (show annotations)
Fri Jul 1 15:00:48 2011 UTC (12 years, 10 months ago) by guez
File size: 26163 byte(s)
Split "thermcell.f" and "cv3_routines.f".
Removed copies of files that are now in "L_util".
Moved "mva9" and "diagetpq" to their own files.
Unified variable names across procedures.

1 module clmain_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE clmain(dtime, itap, date0, pctsrf, pctsrf_new, t, q, u, v,&
8 jour, rmu0, co2_ppm, ok_veget, ocean, npas, nexca, ts,&
9 soil_model, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil,&
10 qsol, paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat,&
11 rain_f, snow_f, solsw, sollw, sollwdown, fder, rlon, rlat, cufi,&
12 cvfi, rugos, debut, lafin, agesno, rugoro, d_t, d_q, d_u, d_v,&
13 d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2,&
14 dflux_t, dflux_q, zcoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh,&
15 capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl,&
16 fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab, seaice)
17
18 ! From phylmd/clmain.F, version 1.6 2005/11/16 14:47:19
19 ! Author: Z.X. Li (LMD/CNRS), date: 1993/08/18
20 ! Objet : interface de "couche limite" (diffusion verticale)
21
22 ! Tout ce qui a trait aux traceurs est dans "phytrac" maintenant.
23 ! Pour l'instant le calcul de la couche limite pour les traceurs
24 ! se fait avec "cltrac" et ne tient pas compte de la différentiation
25 ! des sous-fractions de sol.
26
27 ! Pour pouvoir extraire les coefficients d'échanges et le vent
28 ! dans la première couche, trois champs supplémentaires ont été
29 ! créés : "zcoefh", "zu1" et "zv1". Pour l'instant nous avons
30 ! moyenné les valeurs de ces trois champs sur les 4 sous-surfaces
31 ! du modèle. Dans l'avenir, si les informations des sous-surfaces
32 ! doivent être prises en compte, il faudra sortir ces mêmes champs
33 ! en leur ajoutant une dimension, c'est-à-dire "nbsrf" (nombre de
34 ! sous-surfaces).
35
36 ! Arguments:
37 ! dtime----input-R- interval du temps (secondes)
38 ! itap-----input-I- numero du pas de temps
39 ! date0----input-R- jour initial
40 ! t--------input-R- temperature (K)
41 ! q--------input-R- vapeur d'eau (kg/kg)
42 ! u--------input-R- vitesse u
43 ! v--------input-R- vitesse v
44 ! ts-------input-R- temperature du sol (en Kelvin)
45 ! paprs----input-R- pression a intercouche (Pa)
46 ! pplay----input-R- pression au milieu de couche (Pa)
47 ! radsol---input-R- flux radiatif net (positif vers le sol) en W/m**2
48 ! rlat-----input-R- latitude en degree
49 ! rugos----input-R- longeur de rugosite (en m)
50 ! cufi-----input-R- resolution des mailles en x (m)
51 ! cvfi-----input-R- resolution des mailles en y (m)
52
53 ! d_t------output-R- le changement pour "t"
54 ! d_q------output-R- le changement pour "q"
55 ! d_u------output-R- le changement pour "u"
56 ! d_v------output-R- le changement pour "v"
57 ! d_ts-----output-R- le changement pour "ts"
58 ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)
59 ! (orientation positive vers le bas)
60 ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)
61 ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal
62 ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal
63 ! dflux_t derive du flux sensible
64 ! dflux_q derive du flux latent
65 !IM "slab" ocean
66 ! flux_g---output-R- flux glace (pour OCEAN='slab ')
67 ! flux_o---output-R- flux ocean (pour OCEAN='slab ')
68
69 ! tslab-in/output-R temperature du slab ocean (en Kelvin)
70 ! uniqmnt pour slab
71
72 ! seaice---output-R- glace de mer (kg/m2) (pour OCEAN='slab ')
73 !cc
74 ! ffonte----Flux thermique utilise pour fondre la neige
75 ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
76 ! hauteur de neige, en kg/m2/s
77 ! on rajoute en output yu1 et yv1 qui sont les vents dans
78 ! la premiere couche
79 ! ces 4 variables sont maintenant traites dans phytrac
80 ! itr--------input-I- nombre de traceurs
81 ! tr---------input-R- q. de traceurs
82 ! flux_surf--input-R- flux de traceurs a la surface
83 ! d_tr-------output-R tendance de traceurs
84 !IM cf. AM : PBL
85 ! trmb1-------deep_cape
86 ! trmb2--------inhibition
87 ! trmb3-------Point Omega
88 ! Cape(klon)-------Cape du thermique
89 ! EauLiq(klon)-------Eau liqu integr du thermique
90 ! ctei(klon)-------Critere d'instab d'entrainmt des nuages de CL
91 ! lcl------- Niveau de condensation
92 ! pblh------- HCL
93 ! pblT------- T au nveau HCL
94
95 use calendar, ONLY : ymds2ju
96 use coefkz_m, only: coefkz
97 use coefkzmin_m, only: coefkzmin
98 USE conf_phys_m, ONLY : iflag_pbl
99 USE dimens_m, ONLY : iim, jjm
100 USE dimphy, ONLY : klev, klon, zmasq
101 USE dimsoil, ONLY : nsoilmx
102 USE dynetat0_m, ONLY : day_ini
103 USE gath_cpl, ONLY : gath2cpl
104 use hbtm_m, only: hbtm
105 USE histcom, ONLY : histbeg_totreg, histdef, histend, histsync
106 use histwrite_m, only: histwrite
107 USE indicesol, ONLY : epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
108 USE iniprint, ONLY : prt_level
109 USE suphec_m, ONLY : rd, rg, rkappa
110 USE temps, ONLY : annee_ref, itau_phy
111 use yamada4_m, only: yamada4
112
113 REAL, INTENT (IN) :: dtime
114 REAL date0
115 INTEGER, INTENT (IN) :: itap
116 REAL t(klon, klev), q(klon, klev)
117 REAL, INTENT (IN):: u(klon, klev), v(klon, klev)
118 REAL, INTENT (IN):: paprs(klon, klev+1)
119 REAL, INTENT (IN):: pplay(klon, klev)
120 REAL, INTENT (IN):: rlon(klon), rlat(klon)
121 REAL cufi(klon), cvfi(klon)
122 REAL d_t(klon, klev), d_q(klon, klev)
123 REAL d_u(klon, klev), d_v(klon, klev)
124 REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
125 REAL dflux_t(klon), dflux_q(klon)
126 !IM "slab" ocean
127 REAL flux_o(klon), flux_g(klon)
128 REAL y_flux_o(klon), y_flux_g(klon)
129 REAL tslab(klon), ytslab(klon)
130 REAL seaice(klon), y_seaice(klon)
131 REAL y_fqcalving(klon), y_ffonte(klon)
132 REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
133 REAL run_off_lic_0(klon), y_run_off_lic_0(klon)
134
135 REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)
136 REAL rugmer(klon), agesno(klon, nbsrf)
137 REAL, INTENT (IN) :: rugoro(klon)
138 REAL cdragh(klon), cdragm(klon)
139 ! jour de l'annee en cours
140 INTEGER jour
141 REAL rmu0(klon) ! cosinus de l'angle solaire zenithal
142 ! taux CO2 atmosphere
143 REAL co2_ppm
144 LOGICAL, INTENT (IN) :: debut
145 LOGICAL, INTENT (IN) :: lafin
146 LOGICAL ok_veget
147 CHARACTER (len=*), INTENT (IN) :: ocean
148 INTEGER npas, nexca
149
150 REAL pctsrf(klon, nbsrf)
151 REAL ts(klon, nbsrf)
152 REAL d_ts(klon, nbsrf)
153 REAL snow(klon, nbsrf)
154 REAL qsurf(klon, nbsrf)
155 REAL evap(klon, nbsrf)
156 REAL albe(klon, nbsrf)
157 REAL alblw(klon, nbsrf)
158
159 REAL fluxlat(klon, nbsrf)
160
161 REAL rain_f(klon), snow_f(klon)
162 REAL fder(klon)
163
164 REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)
165 REAL rugos(klon, nbsrf)
166 ! la nouvelle repartition des surfaces sortie de l'interface
167 REAL pctsrf_new(klon, nbsrf)
168
169 REAL zcoefh(klon, klev)
170 REAL zu1(klon)
171 REAL zv1(klon)
172
173 !$$$ PB ajout pour soil
174 LOGICAL, INTENT (IN) :: soil_model
175 !IM ajout seuils cdrm, cdrh
176 REAL cdmmax, cdhmax
177
178 REAL ksta, ksta_ter
179 LOGICAL ok_kzmin
180
181 REAL ftsoil(klon, nsoilmx, nbsrf)
182 REAL ytsoil(klon, nsoilmx)
183 REAL qsol(klon)
184
185 EXTERNAL clqh, clvent, calbeta, cltrac
186
187 REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
188 REAL yalb(klon)
189 REAL yalblw(klon)
190 REAL yu1(klon), yv1(klon)
191 REAL ysnow(klon), yqsurf(klon), yagesno(klon), yqsol(klon)
192 REAL yrain_f(klon), ysnow_f(klon)
193 REAL ysollw(klon), ysolsw(klon), ysollwdown(klon)
194 REAL yfder(klon), ytaux(klon), ytauy(klon)
195 REAL yrugm(klon), yrads(klon), yrugoro(klon)
196
197 REAL yfluxlat(klon)
198
199 REAL y_d_ts(klon)
200 REAL y_d_t(klon, klev), y_d_q(klon, klev)
201 REAL y_d_u(klon, klev), y_d_v(klon, klev)
202 REAL y_flux_t(klon, klev), y_flux_q(klon, klev)
203 REAL y_flux_u(klon, klev), y_flux_v(klon, klev)
204 REAL y_dflux_t(klon), y_dflux_q(klon)
205 REAL ycoefh(klon, klev), ycoefm(klon, klev)
206 REAL yu(klon, klev), yv(klon, klev)
207 REAL yt(klon, klev), yq(klon, klev)
208 REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
209
210 LOGICAL ok_nonloc
211 PARAMETER (ok_nonloc=.FALSE.)
212 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
213
214 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
215 REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
216 REAL ykmq(klon, klev+1)
217 REAL yq2(klon, klev+1), q2(klon, klev+1, nbsrf)
218 REAL q2diag(klon, klev+1)
219
220 REAL u1lay(klon), v1lay(klon)
221 REAL delp(klon, klev)
222 INTEGER i, k, nsrf
223
224 INTEGER ni(klon), knon, j
225
226 REAL pctsrf_pot(klon, nbsrf)
227 ! "pourcentage potentiel" pour tenir compte des éventuelles
228 ! apparitions ou disparitions de la glace de mer
229
230 REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
231
232 ! maf pour sorties IOISPL en cas de debugagage
233
234 CHARACTER (80) cldebug
235 SAVE cldebug
236 CHARACTER (8) cl_surf(nbsrf)
237 SAVE cl_surf
238 INTEGER nhoridbg, nidbg
239 SAVE nhoridbg, nidbg
240 INTEGER ndexbg(iim*(jjm+1))
241 REAL zx_lon(iim, jjm+1), zx_lat(iim, jjm+1), zjulian
242 REAL tabindx(klon)
243 REAL debugtab(iim, jjm+1)
244 LOGICAL first_appel
245 SAVE first_appel
246 DATA first_appel/ .TRUE./
247 LOGICAL :: debugindex = .FALSE.
248 INTEGER idayref
249 REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
250 REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
251
252 REAL yt2m(klon), yq2m(klon), yu10m(klon)
253 REAL yustar(klon)
254 ! -- LOOP
255 REAL yu10mx(klon)
256 REAL yu10my(klon)
257 REAL ywindsp(klon)
258 ! -- LOOP
259
260 REAL yt10m(klon), yq10m(klon)
261 !IM cf. AM : pbl, hbtm (Comme les autres diagnostics on cumule ds
262 ! physiq ce qui permet de sortir les grdeurs par sous surface)
263 REAL pblh(klon, nbsrf)
264 REAL plcl(klon, nbsrf)
265 REAL capcl(klon, nbsrf)
266 REAL oliqcl(klon, nbsrf)
267 REAL cteicl(klon, nbsrf)
268 REAL pblt(klon, nbsrf)
269 REAL therm(klon, nbsrf)
270 REAL trmb1(klon, nbsrf)
271 REAL trmb2(klon, nbsrf)
272 REAL trmb3(klon, nbsrf)
273 REAL ypblh(klon)
274 REAL ylcl(klon)
275 REAL ycapcl(klon)
276 REAL yoliqcl(klon)
277 REAL ycteicl(klon)
278 REAL ypblt(klon)
279 REAL ytherm(klon)
280 REAL ytrmb1(klon)
281 REAL ytrmb2(klon)
282 REAL ytrmb3(klon)
283 REAL y_cd_h(klon), y_cd_m(klon)
284 REAL uzon(klon), vmer(klon)
285 REAL tair1(klon), qair1(klon), tairsol(klon)
286 REAL psfce(klon), patm(klon)
287
288 REAL qairsol(klon), zgeo1(klon)
289 REAL rugo1(klon)
290
291 ! utiliser un jeu de fonctions simples
292 LOGICAL zxli
293 PARAMETER (zxli=.FALSE.)
294
295 REAL zt, zqs, zdelta, zcor
296 REAL t_coup
297 PARAMETER (t_coup=273.15)
298
299 CHARACTER (len=20) :: modname = 'clmain'
300
301 !------------------------------------------------------------
302
303 ytherm = 0.
304
305 IF (debugindex .AND. first_appel) THEN
306 first_appel = .FALSE.
307
308 ! initialisation sorties netcdf
309
310 idayref = day_ini
311 CALL ymds2ju(annee_ref, 1, idayref, 0., zjulian)
312 CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlon, zx_lon)
313 DO i = 1, iim
314 zx_lon(i, 1) = rlon(i+1)
315 zx_lon(i, jjm+1) = rlon(i+1)
316 END DO
317 CALL gr_fi_ecrit(1, klon, iim, jjm+1, rlat, zx_lat)
318 cldebug = 'sous_index'
319 CALL histbeg_totreg(cldebug, zx_lon(:, 1), zx_lat(1, :), 1, &
320 iim, 1, jjm+1, itau_phy, zjulian, dtime, nhoridbg, nidbg)
321 ! no vertical axis
322 cl_surf(1) = 'ter'
323 cl_surf(2) = 'lic'
324 cl_surf(3) = 'oce'
325 cl_surf(4) = 'sic'
326 DO nsrf = 1, nbsrf
327 CALL histdef(nidbg, cl_surf(nsrf), cl_surf(nsrf), '-', iim, jjm+1, &
328 nhoridbg, 1, 1, 1, -99, 'inst', dtime, dtime)
329 END DO
330 CALL histend(nidbg)
331 CALL histsync(nidbg)
332 END IF
333
334 DO k = 1, klev ! epaisseur de couche
335 DO i = 1, klon
336 delp(i, k) = paprs(i, k) - paprs(i, k+1)
337 END DO
338 END DO
339 DO i = 1, klon ! vent de la premiere couche
340 zx_alf1 = 1.0
341 zx_alf2 = 1.0 - zx_alf1
342 u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
343 v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
344 END DO
345
346 ! Initialization:
347 rugmer = 0.
348 cdragh = 0.
349 cdragm = 0.
350 dflux_t = 0.
351 dflux_q = 0.
352 zu1 = 0.
353 zv1 = 0.
354 ypct = 0.
355 yts = 0.
356 ysnow = 0.
357 yqsurf = 0.
358 yalb = 0.
359 yalblw = 0.
360 yrain_f = 0.
361 ysnow_f = 0.
362 yfder = 0.
363 ytaux = 0.
364 ytauy = 0.
365 ysolsw = 0.
366 ysollw = 0.
367 ysollwdown = 0.
368 yrugos = 0.
369 yu1 = 0.
370 yv1 = 0.
371 yrads = 0.
372 ypaprs = 0.
373 ypplay = 0.
374 ydelp = 0.
375 yu = 0.
376 yv = 0.
377 yt = 0.
378 yq = 0.
379 pctsrf_new = 0.
380 y_flux_u = 0.
381 y_flux_v = 0.
382 !$$ PB
383 y_dflux_t = 0.
384 y_dflux_q = 0.
385 ytsoil = 999999.
386 yrugoro = 0.
387 ! -- LOOP
388 yu10mx = 0.
389 yu10my = 0.
390 ywindsp = 0.
391 ! -- LOOP
392 d_ts = 0.
393 !§§§ PB
394 yfluxlat = 0.
395 flux_t = 0.
396 flux_q = 0.
397 flux_u = 0.
398 flux_v = 0.
399 d_t = 0.
400 d_q = 0.
401 d_u = 0.
402 d_v = 0.
403 zcoefh = 0.
404
405 ! Boucler sur toutes les sous-fractions du sol:
406
407 ! Initialisation des "pourcentages potentiels". On considère ici qu'on
408 ! peut avoir potentiellement de la glace sur tout le domaine océanique
409 ! (à affiner)
410
411 pctsrf_pot = pctsrf
412 pctsrf_pot(:, is_oce) = 1. - zmasq
413 pctsrf_pot(:, is_sic) = 1. - zmasq
414
415 DO nsrf = 1, nbsrf
416 ! chercher les indices:
417 ni = 0
418 knon = 0
419 DO i = 1, klon
420 ! Pour déterminer le domaine à traiter, on utilise les surfaces
421 ! "potentielles"
422 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
423 knon = knon + 1
424 ni(knon) = i
425 END IF
426 END DO
427
428 ! variables pour avoir une sortie IOIPSL des INDEX
429 IF (debugindex) THEN
430 tabindx = 0.
431 DO i = 1, knon
432 tabindx(i) = real(i)
433 END DO
434 debugtab = 0.
435 ndexbg = 0
436 CALL gath2cpl(tabindx, debugtab, klon, knon, iim, jjm, ni)
437 CALL histwrite(nidbg, cl_surf(nsrf), itap, debugtab)
438 END IF
439
440 IF (knon == 0) CYCLE
441
442 DO j = 1, knon
443 i = ni(j)
444 ypct(j) = pctsrf(i, nsrf)
445 yts(j) = ts(i, nsrf)
446 ytslab(i) = tslab(i)
447 ysnow(j) = snow(i, nsrf)
448 yqsurf(j) = qsurf(i, nsrf)
449 yalb(j) = albe(i, nsrf)
450 yalblw(j) = alblw(i, nsrf)
451 yrain_f(j) = rain_f(i)
452 ysnow_f(j) = snow_f(i)
453 yagesno(j) = agesno(i, nsrf)
454 yfder(j) = fder(i)
455 ytaux(j) = flux_u(i, 1, nsrf)
456 ytauy(j) = flux_v(i, 1, nsrf)
457 ysolsw(j) = solsw(i, nsrf)
458 ysollw(j) = sollw(i, nsrf)
459 ysollwdown(j) = sollwdown(i)
460 yrugos(j) = rugos(i, nsrf)
461 yrugoro(j) = rugoro(i)
462 yu1(j) = u1lay(i)
463 yv1(j) = v1lay(i)
464 yrads(j) = ysolsw(j) + ysollw(j)
465 ypaprs(j, klev+1) = paprs(i, klev+1)
466 y_run_off_lic_0(j) = run_off_lic_0(i)
467 yu10mx(j) = u10m(i, nsrf)
468 yu10my(j) = v10m(i, nsrf)
469 ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))
470 END DO
471
472 ! IF bucket model for continent, copy soil water content
473 IF (nsrf == is_ter .AND. .NOT. ok_veget) THEN
474 DO j = 1, knon
475 i = ni(j)
476 yqsol(j) = qsol(i)
477 END DO
478 ELSE
479 yqsol = 0.
480 END IF
481 !$$$ PB ajour pour soil
482 DO k = 1, nsoilmx
483 DO j = 1, knon
484 i = ni(j)
485 ytsoil(j, k) = ftsoil(i, k, nsrf)
486 END DO
487 END DO
488 DO k = 1, klev
489 DO j = 1, knon
490 i = ni(j)
491 ypaprs(j, k) = paprs(i, k)
492 ypplay(j, k) = pplay(i, k)
493 ydelp(j, k) = delp(i, k)
494 yu(j, k) = u(i, k)
495 yv(j, k) = v(i, k)
496 yt(j, k) = t(i, k)
497 yq(j, k) = q(i, k)
498 END DO
499 END DO
500
501 ! calculer Cdrag et les coefficients d'echange
502 CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts,&
503 yrugos, yu, yv, yt, yq, yqsurf, ycoefm, ycoefh)
504 IF (iflag_pbl == 1) THEN
505 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
506 DO k = 1, klev
507 DO i = 1, knon
508 ycoefm(i, k) = max(ycoefm(i, k), ycoefm0(i, k))
509 ycoefh(i, k) = max(ycoefh(i, k), ycoefh0(i, k))
510 END DO
511 END DO
512 END IF
513
514 ! on seuille ycoefm et ycoefh
515 IF (nsrf == is_oce) THEN
516 DO j = 1, knon
517 ycoefm(j, 1) = min(ycoefm(j, 1), cdmmax)
518 ycoefh(j, 1) = min(ycoefh(j, 1), cdhmax)
519 END DO
520 END IF
521
522 IF (ok_kzmin) THEN
523 ! Calcul d'une diffusion minimale pour les conditions tres stables
524 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycoefm(:, 1), &
525 ycoefm0, ycoefh0)
526
527 DO k = 1, klev
528 DO i = 1, knon
529 ycoefm(i, k) = max(ycoefm(i, k), ycoefm0(i, k))
530 ycoefh(i, k) = max(ycoefh(i, k), ycoefh0(i, k))
531 END DO
532 END DO
533 END IF
534
535 IF (iflag_pbl >= 3) THEN
536 ! MELLOR ET YAMADA adapté à Mars, Richard Fournier et Frédéric Hourdin
537 yzlay(1:knon, 1) = rd*yt(1:knon, 1)/(0.5*(ypaprs(1:knon, &
538 1)+ypplay(1:knon, 1)))*(ypaprs(1:knon, 1)-ypplay(1:knon, 1))/rg
539 DO k = 2, klev
540 yzlay(1:knon, k) = yzlay(1:knon, k-1) &
541 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
542 / ypaprs(1:knon, k) &
543 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
544 END DO
545 DO k = 1, klev
546 yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
547 / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
548 END DO
549 yzlev(1:knon, 1) = 0.
550 yzlev(1:knon, klev+1) = 2.*yzlay(1:knon, klev) - yzlay(1:knon, klev-1)
551 DO k = 2, klev
552 yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
553 END DO
554 DO k = 1, klev + 1
555 DO j = 1, knon
556 i = ni(j)
557 yq2(j, k) = q2(i, k, nsrf)
558 END DO
559 END DO
560
561 y_cd_m(1:knon) = ycoefm(1:knon, 1)
562 y_cd_h(1:knon) = ycoefh(1:knon, 1)
563 CALL ustarhb(knon, yu, yv, y_cd_m, yustar)
564
565 IF (prt_level>9) THEN
566 PRINT *, 'USTAR = ', yustar
567 END IF
568
569 ! iflag_pbl peut être utilisé comme longueur de mélange
570
571 IF (iflag_pbl >= 11) THEN
572 CALL vdif_kcay(knon, dtime, rg, rd, ypaprs, yt, yzlev, yzlay, &
573 yu, yv, yteta, y_cd_m, yq2, q2diag, ykmm, ykmn, yustar, &
574 iflag_pbl)
575 ELSE
576 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
577 y_cd_m, yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
578 END IF
579
580 ycoefm(1:knon, 1) = y_cd_m(1:knon)
581 ycoefh(1:knon, 1) = y_cd_h(1:knon)
582 ycoefm(1:knon, 2:klev) = ykmm(1:knon, 2:klev)
583 ycoefh(1:knon, 2:klev) = ykmn(1:knon, 2:klev)
584 END IF
585
586 ! calculer la diffusion des vitesses "u" et "v"
587 CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yu, ypaprs, ypplay, &
588 ydelp, y_d_u, y_flux_u)
589 CALL clvent(knon, dtime, yu1, yv1, ycoefm, yt, yv, ypaprs, ypplay, &
590 ydelp, y_d_v, y_flux_v)
591
592 ! pour le couplage
593 ytaux = y_flux_u(:, 1)
594 ytauy = y_flux_v(:, 1)
595
596 ! calculer la diffusion de "q" et de "h"
597 CALL clqh(dtime, itap, date0, jour, debut, lafin, rlon, rlat,&
598 cufi, cvfi, knon, nsrf, ni, pctsrf, soil_model, ytsoil,&
599 yqsol, ok_veget, ocean, npas, nexca, rmu0, co2_ppm, yrugos,&
600 yrugoro, yu1, yv1, ycoefh, yt, yq, yts, ypaprs, ypplay,&
601 ydelp, yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, &
602 yfder, ytaux, ytauy, ywindsp, ysollw, ysollwdown, ysolsw,&
603 yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, y_d_ts,&
604 yz0_new, y_flux_t, y_flux_q, y_dflux_t, y_dflux_q,&
605 y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, y_flux_g,&
606 ytslab, y_seaice)
607
608 ! calculer la longueur de rugosite sur ocean
609 yrugm = 0.
610 IF (nsrf == is_oce) THEN
611 DO j = 1, knon
612 yrugm(j) = 0.018*ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
613 0.11*14E-6/sqrt(ycoefm(j, 1)*(yu1(j)**2+yv1(j)**2))
614 yrugm(j) = max(1.5E-05, yrugm(j))
615 END DO
616 END IF
617 DO j = 1, knon
618 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
619 y_dflux_q(j) = y_dflux_q(j)*ypct(j)
620 yu1(j) = yu1(j)*ypct(j)
621 yv1(j) = yv1(j)*ypct(j)
622 END DO
623
624 DO k = 1, klev
625 DO j = 1, knon
626 i = ni(j)
627 ycoefh(j, k) = ycoefh(j, k)*ypct(j)
628 ycoefm(j, k) = ycoefm(j, k)*ypct(j)
629 y_d_t(j, k) = y_d_t(j, k)*ypct(j)
630 y_d_q(j, k) = y_d_q(j, k)*ypct(j)
631 flux_t(i, k, nsrf) = y_flux_t(j, k)
632 flux_q(i, k, nsrf) = y_flux_q(j, k)
633 flux_u(i, k, nsrf) = y_flux_u(j, k)
634 flux_v(i, k, nsrf) = y_flux_v(j, k)
635 y_d_u(j, k) = y_d_u(j, k)*ypct(j)
636 y_d_v(j, k) = y_d_v(j, k)*ypct(j)
637 END DO
638 END DO
639
640 evap(:, nsrf) = -flux_q(:, 1, nsrf)
641
642 albe(:, nsrf) = 0.
643 alblw(:, nsrf) = 0.
644 snow(:, nsrf) = 0.
645 qsurf(:, nsrf) = 0.
646 rugos(:, nsrf) = 0.
647 fluxlat(:, nsrf) = 0.
648 DO j = 1, knon
649 i = ni(j)
650 d_ts(i, nsrf) = y_d_ts(j)
651 albe(i, nsrf) = yalb(j)
652 alblw(i, nsrf) = yalblw(j)
653 snow(i, nsrf) = ysnow(j)
654 qsurf(i, nsrf) = yqsurf(j)
655 rugos(i, nsrf) = yz0_new(j)
656 fluxlat(i, nsrf) = yfluxlat(j)
657 IF (nsrf == is_oce) THEN
658 rugmer(i) = yrugm(j)
659 rugos(i, nsrf) = yrugm(j)
660 END IF
661 agesno(i, nsrf) = yagesno(j)
662 fqcalving(i, nsrf) = y_fqcalving(j)
663 ffonte(i, nsrf) = y_ffonte(j)
664 cdragh(i) = cdragh(i) + ycoefh(j, 1)
665 cdragm(i) = cdragm(i) + ycoefm(j, 1)
666 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
667 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
668 zu1(i) = zu1(i) + yu1(j)
669 zv1(i) = zv1(i) + yv1(j)
670 END DO
671 IF (nsrf == is_ter) THEN
672 DO j = 1, knon
673 i = ni(j)
674 qsol(i) = yqsol(j)
675 END DO
676 END IF
677 IF (nsrf == is_lic) THEN
678 DO j = 1, knon
679 i = ni(j)
680 run_off_lic_0(i) = y_run_off_lic_0(j)
681 END DO
682 END IF
683 !$$$ PB ajout pour soil
684 ftsoil(:, :, nsrf) = 0.
685 DO k = 1, nsoilmx
686 DO j = 1, knon
687 i = ni(j)
688 ftsoil(i, k, nsrf) = ytsoil(j, k)
689 END DO
690 END DO
691
692 DO j = 1, knon
693 i = ni(j)
694 DO k = 1, klev
695 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
696 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
697 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
698 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
699 zcoefh(i, k) = zcoefh(i, k) + ycoefh(j, k)
700 END DO
701 END DO
702
703 !cc diagnostic t, q a 2m et u, v a 10m
704
705 DO j = 1, knon
706 i = ni(j)
707 uzon(j) = yu(j, 1) + y_d_u(j, 1)
708 vmer(j) = yv(j, 1) + y_d_v(j, 1)
709 tair1(j) = yt(j, 1) + y_d_t(j, 1)
710 qair1(j) = yq(j, 1) + y_d_q(j, 1)
711 zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
712 1)))*(ypaprs(j, 1)-ypplay(j, 1))
713 tairsol(j) = yts(j) + y_d_ts(j)
714 rugo1(j) = yrugos(j)
715 IF (nsrf == is_oce) THEN
716 rugo1(j) = rugos(i, nsrf)
717 END IF
718 psfce(j) = ypaprs(j, 1)
719 patm(j) = ypplay(j, 1)
720
721 qairsol(j) = yqsurf(j)
722 END DO
723
724 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, zgeo1, &
725 tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, yt10m, yq10m, &
726 yu10m, yustar)
727
728 DO j = 1, knon
729 i = ni(j)
730 t2m(i, nsrf) = yt2m(j)
731 q2m(i, nsrf) = yq2m(j)
732
733 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
734 u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
735 v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
736
737 END DO
738
739 DO i = 1, knon
740 y_cd_h(i) = ycoefh(i, 1)
741 y_cd_m(i) = ycoefm(i, 1)
742 END DO
743 CALL hbtm(knon, ypaprs, ypplay, yt2m, yt10m, yq2m, yq10m, yustar, &
744 y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &
745 ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
746
747 DO j = 1, knon
748 i = ni(j)
749 pblh(i, nsrf) = ypblh(j)
750 plcl(i, nsrf) = ylcl(j)
751 capcl(i, nsrf) = ycapcl(j)
752 oliqcl(i, nsrf) = yoliqcl(j)
753 cteicl(i, nsrf) = ycteicl(j)
754 pblt(i, nsrf) = ypblt(j)
755 therm(i, nsrf) = ytherm(j)
756 trmb1(i, nsrf) = ytrmb1(j)
757 trmb2(i, nsrf) = ytrmb2(j)
758 trmb3(i, nsrf) = ytrmb3(j)
759 END DO
760
761 DO j = 1, knon
762 DO k = 1, klev + 1
763 i = ni(j)
764 q2(i, k, nsrf) = yq2(j, k)
765 END DO
766 END DO
767 !IM "slab" ocean
768 IF (nsrf == is_oce) THEN
769 DO j = 1, knon
770 ! on projette sur la grille globale
771 i = ni(j)
772 IF (pctsrf_new(i, is_oce)>epsfra) THEN
773 flux_o(i) = y_flux_o(j)
774 ELSE
775 flux_o(i) = 0.
776 END IF
777 END DO
778 END IF
779
780 IF (nsrf == is_sic) THEN
781 DO j = 1, knon
782 i = ni(j)
783 ! On pondère lorsque l'on fait le bilan au sol :
784 IF (pctsrf_new(i, is_sic)>epsfra) THEN
785 flux_g(i) = y_flux_g(j)
786 ELSE
787 flux_g(i) = 0.
788 END IF
789 END DO
790
791 END IF
792 IF (ocean == 'slab ') THEN
793 IF (nsrf == is_oce) THEN
794 tslab(1:klon) = ytslab(1:klon)
795 seaice(1:klon) = y_seaice(1:klon)
796 END IF
797 END IF
798 END DO
799
800 ! On utilise les nouvelles surfaces
801
802 rugos(:, is_oce) = rugmer
803 pctsrf = pctsrf_new
804
805 END SUBROUTINE clmain
806
807 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21