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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

  ViewVC Help
Powered by ViewVC 1.1.21