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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

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

Added some "intent" attributes.

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

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

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.21