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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 61 - (show annotations)
Fri Apr 20 14:58:43 2012 UTC (12 years ago) by guez
Original Path: trunk/libf/phylmd/clmain.f90
File size: 25733 byte(s)
No more included file in LMDZE, not even "netcdf.inc".

Created a variable containing the list of common source files in
GNUmakefile. So we now also see clearly files that are specific to
each program.

Split module "histcom". Assembled resulting files in directory
"Histcom".

Removed aliasing in calls to "laplacien".

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

  ViewVC Help
Powered by ViewVC 1.1.21