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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 57 - (show annotations)
Mon Jan 30 12:54:02 2012 UTC (12 years, 2 months ago) by guez
Original Path: trunk/libf/phylmd/clmain.f90
File size: 25648 byte(s)
Write used namelists to file "" instead of standard output.

Avoid aliasing in "inidissip" in calls to "divgrad2", "divgrad",
"gradiv2", "gradiv", "nxgraro2" and "nxgrarot". Add a degenerate
dimension to arrays so they have rank 3, like the dummy arguments in
"divgrad2", "divgrad", "gradiv2", "gradiv", "nxgraro2" and "nxgrarot".

Extract the initialization part from "bilan_dyn" and make a separate
procedure, "init_dynzon", from it.

Move variables from modules "iniprint" and "logic" to module
"conf_gcm_m".

Promote internal procedures of "fxy" to private procedures of module
"fxy_m".

Extracted documentation from "inigeom". Removed useless "save"
attributes. Removed useless intermediate variables. Extracted
processing of poles from loop on latitudes. Write coordinates to file
"longitude_latitude.txt" instead of standard output.

Do not use ozone tracer for radiative transfer.

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

  ViewVC Help
Powered by ViewVC 1.1.21