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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 61 - (hide 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 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 use calendar, ONLY : ymds2ju
37 guez 49 use clqh_m, only: clqh
38 guez 47 use coefkz_m, only: coefkz
39     use coefkzmin_m, only: coefkzmin
40     USE conf_phys_m, ONLY : iflag_pbl
41 guez 38 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 guez 47 USE gath_cpl, ONLY : gath2cpl
46     use hbtm_m, only: hbtm
47 guez 61 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 guez 47 use histwrite_m, only: histwrite
52     USE indicesol, ONLY : epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
53 guez 57 USE conf_gcm_m, ONLY : prt_level
54 guez 38 USE suphec_m, ONLY : rd, rg, rkappa
55 guez 47 USE temps, ONLY : annee_ref, itau_phy
56     use yamada4_m, only: yamada4
57 guez 15
58 guez 49 ! Arguments:
59    
60     REAL, INTENT (IN) :: dtime ! interval du temps (secondes)
61 guez 38 REAL date0
62 guez 49 ! date0----input-R- jour initial
63 guez 38 INTEGER, INTENT (IN) :: itap
64 guez 49 ! itap-----input-I- numero du pas de temps
65 guez 51 REAL, INTENT(IN):: t(klon, klev), q(klon, klev)
66 guez 49 ! t--------input-R- temperature (K)
67     ! q--------input-R- vapeur d'eau (kg/kg)
68 guez 47 REAL, INTENT (IN):: u(klon, klev), v(klon, klev)
69 guez 49 ! u--------input-R- vitesse u
70     ! v--------input-R- vitesse v
71 guez 47 REAL, INTENT (IN):: paprs(klon, klev+1)
72 guez 49 ! paprs----input-R- pression a intercouche (Pa)
73 guez 47 REAL, INTENT (IN):: pplay(klon, klev)
74 guez 49 ! pplay----input-R- pression au milieu de couche (Pa)
75 guez 47 REAL, INTENT (IN):: rlon(klon), rlat(klon)
76 guez 49 ! rlat-----input-R- latitude en degree
77 guez 38 REAL cufi(klon), cvfi(klon)
78 guez 49 ! cufi-----input-R- resolution des mailles en x (m)
79     ! cvfi-----input-R- resolution des mailles en y (m)
80 guez 38 REAL d_t(klon, klev), d_q(klon, klev)
81 guez 49 ! d_t------output-R- le changement pour "t"
82     ! d_q------output-R- le changement pour "q"
83 guez 38 REAL d_u(klon, klev), d_v(klon, klev)
84 guez 49 ! d_u------output-R- le changement pour "u"
85     ! d_v------output-R- le changement pour "v"
86 guez 38 REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
87 guez 49 ! 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 guez 38 REAL dflux_t(klon), dflux_q(klon)
91 guez 49 ! dflux_t derive du flux sensible
92     ! dflux_q derive du flux latent
93 guez 38 !IM "slab" ocean
94     REAL flux_o(klon), flux_g(klon)
95 guez 49 !IM "slab" ocean
96     ! flux_g---output-R- flux glace (pour OCEAN='slab ')
97     ! flux_o---output-R- flux ocean (pour OCEAN='slab ')
98 guez 38 REAL y_flux_o(klon), y_flux_g(klon)
99     REAL tslab(klon), ytslab(klon)
100 guez 49 ! tslab-in/output-R temperature du slab ocean (en Kelvin)
101     ! uniqmnt pour slab
102 guez 38 REAL seaice(klon), y_seaice(klon)
103 guez 49 ! seaice---output-R- glace de mer (kg/m2) (pour OCEAN='slab ')
104 guez 38 REAL y_fqcalving(klon), y_ffonte(klon)
105     REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
106 guez 49 ! 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 guez 38 REAL run_off_lic_0(klon), y_run_off_lic_0(klon)
110 guez 15
111 guez 38 REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)
112 guez 49 ! 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 guez 38 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 guez 15
128 guez 38 REAL pctsrf(klon, nbsrf)
129     REAL ts(klon, nbsrf)
130 guez 49 ! ts-------input-R- temperature du sol (en Kelvin)
131 guez 38 REAL d_ts(klon, nbsrf)
132 guez 49 ! d_ts-----output-R- le changement pour "ts"
133 guez 38 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 guez 15
139 guez 38 REAL fluxlat(klon, nbsrf)
140 guez 15
141 guez 38 REAL rain_f(klon), snow_f(klon)
142     REAL fder(klon)
143 guez 15
144 guez 38 REAL sollw(klon, nbsrf), solsw(klon, nbsrf), sollwdown(klon)
145     REAL rugos(klon, nbsrf)
146 guez 49 ! rugos----input-R- longeur de rugosite (en m)
147 guez 38 ! la nouvelle repartition des surfaces sortie de l'interface
148     REAL pctsrf_new(klon, nbsrf)
149 guez 15
150 guez 38 REAL zcoefh(klon, klev)
151     REAL zu1(klon)
152     REAL zv1(klon)
153 guez 15
154 guez 38 !$$$ PB ajout pour soil
155     LOGICAL, INTENT (IN) :: soil_model
156     !IM ajout seuils cdrm, cdrh
157     REAL cdmmax, cdhmax
158 guez 15
159 guez 38 REAL ksta, ksta_ter
160     LOGICAL ok_kzmin
161 guez 15
162 guez 38 REAL ftsoil(klon, nsoilmx, nbsrf)
163     REAL ytsoil(klon, nsoilmx)
164     REAL qsol(klon)
165 guez 15
166 guez 49 EXTERNAL clvent, calbeta, cltrac
167 guez 15
168 guez 38 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 guez 49 ! on rajoute en output yu1 et yv1 qui sont les vents dans
173     ! la premiere couche
174 guez 38 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 guez 15
180 guez 38 REAL yfluxlat(klon)
181 guez 15
182 guez 38 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 guez 15
193 guez 38 LOGICAL ok_nonloc
194     PARAMETER (ok_nonloc=.FALSE.)
195     REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
196 guez 15
197 guez 38 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 guez 15
203 guez 38 REAL u1lay(klon), v1lay(klon)
204     REAL delp(klon, klev)
205     INTEGER i, k, nsrf
206 guez 15
207 guez 38 INTEGER ni(klon), knon, j
208 guez 40
209 guez 38 REAL pctsrf_pot(klon, nbsrf)
210 guez 40 ! "pourcentage potentiel" pour tenir compte des éventuelles
211     ! apparitions ou disparitions de la glace de mer
212 guez 15
213 guez 38 REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
214 guez 15
215 guez 38 ! maf pour sorties IOISPL en cas de debugagage
216 guez 15
217 guez 38 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 guez 15
235 guez 38 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 guez 15
243 guez 38 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 guez 49 ! pblh------- HCL
248 guez 38 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 guez 49 ! pblT------- T au nveau HCL
254 guez 38 REAL therm(klon, nbsrf)
255     REAL trmb1(klon, nbsrf)
256 guez 49 ! trmb1-------deep_cape
257 guez 38 REAL trmb2(klon, nbsrf)
258 guez 49 ! trmb2--------inhibition
259 guez 38 REAL trmb3(klon, nbsrf)
260 guez 49 ! trmb3-------Point Omega
261 guez 38 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 guez 15
276 guez 38 REAL qairsol(klon), zgeo1(klon)
277     REAL rugo1(klon)
278 guez 15
279 guez 38 ! utiliser un jeu de fonctions simples
280     LOGICAL zxli
281     PARAMETER (zxli=.FALSE.)
282 guez 15
283 guez 38 REAL zt, zqs, zdelta, zcor
284     REAL t_coup
285     PARAMETER (t_coup=273.15)
286 guez 15
287 guez 38 CHARACTER (len=20) :: modname = 'clmain'
288 guez 15
289 guez 38 !------------------------------------------------------------
290 guez 15
291 guez 38 ytherm = 0.
292 guez 15
293 guez 38 IF (debugindex .AND. first_appel) THEN
294     first_appel = .FALSE.
295 guez 15
296 guez 38 ! initialisation sorties netcdf
297 guez 15
298 guez 38 idayref = day_ini
299 guez 40 CALL ymds2ju(annee_ref, 1, idayref, 0., zjulian)
300 guez 38 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 guez 15
322 guez 38 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 guez 15
334 guez 40 ! 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 guez 38 !$$ PB
371 guez 40 y_dflux_t = 0.
372     y_dflux_q = 0.
373 guez 38 ytsoil = 999999.
374     yrugoro = 0.
375     ! -- LOOP
376 guez 40 yu10mx = 0.
377     yu10my = 0.
378     ywindsp = 0.
379 guez 38 ! -- LOOP
380 guez 40 d_ts = 0.
381 guez 38 !§§§ PB
382     yfluxlat = 0.
383     flux_t = 0.
384     flux_q = 0.
385     flux_u = 0.
386     flux_v = 0.
387 guez 40 d_t = 0.
388     d_q = 0.
389     d_u = 0.
390     d_v = 0.
391     zcoefh = 0.
392 guez 15
393 guez 38 ! Boucler sur toutes les sous-fractions du sol:
394 guez 15
395 guez 38 ! 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 guez 15
399 guez 38 pctsrf_pot = pctsrf
400     pctsrf_pot(:, is_oce) = 1. - zmasq
401     pctsrf_pot(:, is_sic) = 1. - zmasq
402 guez 15
403 guez 49 loop_surface: DO nsrf = 1, nbsrf
404     ! Chercher les indices :
405 guez 38 ni = 0
406     knon = 0
407     DO i = 1, klon
408 guez 40 ! Pour déterminer le domaine à traiter, on utilise les surfaces
409 guez 38 ! "potentielles"
410     IF (pctsrf_pot(i, nsrf) > epsfra) THEN
411     knon = knon + 1
412     ni(knon) = i
413     END IF
414     END DO
415 guez 15
416 guez 38 ! 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 guez 15
428 guez 47 IF (knon == 0) CYCLE
429 guez 15
430 guez 38 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 guez 3
460 guez 47 ! IF bucket model for continent, copy soil water content
461     IF (nsrf == is_ter .AND. .NOT. ok_veget) THEN
462 guez 38 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 guez 3
489 guez 38 ! 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 guez 47 IF (iflag_pbl == 1) THEN
493 guez 38 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 guez 3
502 guez 47 ! on seuille ycoefm et ycoefh
503     IF (nsrf == is_oce) THEN
504 guez 38 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 guez 3
510 guez 38 IF (ok_kzmin) THEN
511 guez 47 ! Calcul d'une diffusion minimale pour les conditions tres stables
512     CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycoefm(:, 1), &
513 guez 38 ycoefm0, ycoefh0)
514 guez 3
515 guez 47 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 guez 38 END DO
520 guez 47 END DO
521     END IF
522 guez 3
523 guez 47 IF (iflag_pbl >= 3) THEN
524 guez 38 ! 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 guez 3
549 guez 47 y_cd_m(1:knon) = ycoefm(1:knon, 1)
550     y_cd_h(1:knon) = ycoefh(1:knon, 1)
551 guez 38 CALL ustarhb(knon, yu, yv, y_cd_m, yustar)
552 guez 3
553 guez 38 IF (prt_level>9) THEN
554     PRINT *, 'USTAR = ', yustar
555     END IF
556 guez 3
557 guez 47 ! iflag_pbl peut être utilisé comme longueur de mélange
558 guez 3
559 guez 47 IF (iflag_pbl >= 11) THEN
560 guez 38 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 guez 47 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
565     y_cd_m, yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
566 guez 38 END IF
567 guez 3
568 guez 38 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 guez 3
574 guez 38 ! 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 guez 3
580 guez 38 ! pour le couplage
581     ytaux = y_flux_u(:, 1)
582     ytauy = y_flux_v(:, 1)
583 guez 3
584 guez 38 ! 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 guez 3
596 guez 38 ! calculer la longueur de rugosite sur ocean
597     yrugm = 0.
598 guez 47 IF (nsrf == is_oce) THEN
599 guez 38 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 guez 3
612 guez 38 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 guez 3
628 guez 38 evap(:, nsrf) = -flux_q(:, 1, nsrf)
629 guez 15
630 guez 38 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 guez 47 IF (nsrf == is_oce) THEN
646 guez 38 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 guez 47 IF (nsrf == is_ter) THEN
660 guez 38 DO j = 1, knon
661     i = ni(j)
662     qsol(i) = yqsol(j)
663     END DO
664     END IF
665 guez 47 IF (nsrf == is_lic) THEN
666 guez 38 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 guez 15
680 guez 38 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 guez 15
691 guez 38 !cc diagnostic t, q a 2m et u, v a 10m
692 guez 3
693 guez 38 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 guez 47 IF (nsrf == is_oce) THEN
704 guez 38 rugo1(j) = rugos(i, nsrf)
705     END IF
706     psfce(j) = ypaprs(j, 1)
707     patm(j) = ypplay(j, 1)
708 guez 3
709 guez 38 qairsol(j) = yqsurf(j)
710     END DO
711 guez 15
712 guez 38 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 guez 15
716 guez 38 DO j = 1, knon
717     i = ni(j)
718     t2m(i, nsrf) = yt2m(j)
719     q2m(i, nsrf) = yq2m(j)
720 guez 15
721 guez 38 ! 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 guez 15
725 guez 38 END DO
726 guez 15
727 guez 38 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 guez 15
735 guez 38 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 guez 15
749 guez 38 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 guez 47 IF (nsrf == is_oce) THEN
757 guez 38 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 guez 3
768 guez 47 IF (nsrf == is_sic) THEN
769 guez 38 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 guez 3
779 guez 38 END IF
780 guez 47 IF (ocean == 'slab ') THEN
781     IF (nsrf == is_oce) THEN
782 guez 38 tslab(1:klon) = ytslab(1:klon)
783     seaice(1:klon) = y_seaice(1:klon)
784     END IF
785     END IF
786 guez 49 END DO loop_surface
787 guez 15
788 guez 38 ! On utilise les nouvelles surfaces
789 guez 15
790 guez 38 rugos(:, is_oce) = rugmer
791     pctsrf = pctsrf_new
792 guez 15
793 guez 38 END SUBROUTINE clmain
794 guez 15
795 guez 38 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21