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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 51 - (hide annotations)
Tue Sep 20 09:14:34 2011 UTC (12 years, 7 months ago) by guez
Original Path: trunk/libf/phylmd/clmain.f90
File size: 25646 byte(s)
Split "getincom.f90" into "getincom.f90" and "getincom2.f90". Split
"nuage.f" into "nuage.f90", "diagcld1.f90" and "diagcld2.f90". Created
module "chem" from included file "chem.h". Moved "YOEGWD.f90" to
directory "Orography".

In "physiq", for evaporation of water, "zlsdcp" was equal to
"zlvdc". Removed useless variables.

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

  ViewVC Help
Powered by ViewVC 1.1.21