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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (show annotations)
Tue Aug 5 13:31:32 2008 UTC (15 years, 8 months ago) by guez
Original Path: trunk/libf/phylmd/clmain.f90
File size: 27750 byte(s)
Created rule for "compare_sampl_*" files in
"Documentation/Manuel_LMDZE.texfol/Graphiques/GNUmakefile".

Extracted "qcheck", "radiornpb", "minmaxqfi" into separate files.

Read pressure coordinate of ozone coefficients once per run instead of
every day.

Added some "intent" attributes.

Added argument "nq" to "ini_histday". Replaced calls to "gr_fi_ecrit"
by calls to "gr_phy_write_2d". "Sigma_O3_Royer" is written to
"histday.nc" only if "nq >= 4". Moved "ini_histrac" to module
"ini_hist".

Compute "zmasse" in "physiq", pass it to "phytrac".

Removed computations of "pftsol*" and "ppsrf*" in "phytrac".

Do not use variable "rg" from module "YOMCST" in "TLIFT".

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

  ViewVC Help
Powered by ViewVC 1.1.21