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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

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

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

Added "pressure-altitude" in "test_disvert".

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

  ViewVC Help
Powered by ViewVC 1.1.21