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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 37 - (show annotations)
Tue Dec 21 15:45:48 2010 UTC (13 years, 4 months ago) by guez
Original Path: trunk/libf/phylmd/clmain.f90
File size: 27548 byte(s)
Inlined procedure "pression".

Split "guide.f90" into "guide.f90" and "tau2alpha.f90". Split
"read_reanalyse.f" into single-procedure files in directory
"Read_reanalyse".

Useless copy of variables in "iniphysiq". Directly define module
variables in "gcm" and remove procedure "iniphysiq".

Added "pressure-altitude" in "test_disvert".

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

  ViewVC Help
Powered by ViewVC 1.1.21