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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 149 - (hide annotations)
Thu Jun 18 12:23:44 2015 UTC (8 years, 10 months ago) by guez
File size: 22549 byte(s)
In invert_zoom_x, call rtsafe instead of the equivalent coding that
was there. funcd needs to access a[0-4] and abs_y so we upgrade a[0-4]
from arguments of coefpoly to variables of module coefpoly_m and abs_y
from local variable of invert_zoom_x to private variable of module
invert_zoom_x_m.

Removed unused arguments t10m and q10m of hbtm.

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 99 SUBROUTINE clmain(dtime, itap, pctsrf, pctsrf_new, t, q, u, v, jour, rmu0, &
8 guez 101 co2_ppm, ts, cdmmax, cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, &
9     paprs, pplay, snow, qsurf, evap, albe, alblw, fluxlat, rain_fall, &
10     snow_f, solsw, sollw, fder, rlat, rugos, debut, agesno, rugoro, d_t, &
11     d_q, d_u, d_v, d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, &
12     q2, dflux_t, dflux_q, ycoefh, zu1, zv1, t2m, q2m, u10m, v10m, pblh, &
13     capcl, oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl, &
14     fqcalving, ffonte, run_off_lic_0, flux_o, flux_g, tslab)
15 guez 3
16 guez 99 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
17 guez 62 ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
18     ! Objet : interface de couche limite (diffusion verticale)
19 guez 3
20 guez 62 ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
21     ! de la couche limite pour les traceurs se fait avec "cltrac" et
22 guez 145 ! ne tient pas compte de la diff\'erentiation des sous-fractions
23     ! de sol.
24 guez 3
25 guez 145 ! Pour pouvoir extraire les coefficients d'\'echanges et le vent
26     ! dans la premi\`ere couche, trois champs ont \'et\'e cr\'e\'es : "ycoefh",
27     ! "zu1" et "zv1". Nous avons moyenn\'e les valeurs de ces trois
28     ! champs sur les quatre sous-surfaces du mod\`ele.
29 guez 3
30 guez 49 use clqh_m, only: clqh
31 guez 62 use clvent_m, only: clvent
32 guez 47 use coefkz_m, only: coefkz
33     use coefkzmin_m, only: coefkzmin
34 guez 62 USE conf_gcm_m, ONLY: prt_level
35     USE conf_phys_m, ONLY: iflag_pbl
36     USE dimens_m, ONLY: iim, jjm
37     USE dimphy, ONLY: klev, klon, zmasq
38     USE dimsoil, ONLY: nsoilmx
39 guez 47 use hbtm_m, only: hbtm
40 guez 62 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
41 guez 104 use stdlevvar_m, only: stdlevvar
42 guez 62 USE suphec_m, ONLY: rd, rg, rkappa
43     use ustarhb_m, only: ustarhb
44     use vdif_kcay_m, only: vdif_kcay
45 guez 47 use yamada4_m, only: yamada4
46 guez 15
47 guez 62 REAL, INTENT(IN):: dtime ! interval du temps (secondes)
48     INTEGER, INTENT(IN):: itap ! numero du pas de temps
49     REAL, INTENT(inout):: pctsrf(klon, nbsrf)
50    
51     ! la nouvelle repartition des surfaces sortie de l'interface
52     REAL, INTENT(out):: pctsrf_new(klon, nbsrf)
53    
54     REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
55     REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg/kg)
56     REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
57     INTEGER, INTENT(IN):: jour ! jour de l'annee en cours
58     REAL, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal
59 guez 99 REAL, intent(in):: co2_ppm ! taux CO2 atmosphere
60 guez 104 REAL, INTENT(IN):: ts(klon, nbsrf) ! temperature du sol (en Kelvin)
61 guez 71 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
62 guez 99 REAL, INTENT(IN):: ksta, ksta_ter
63     LOGICAL, INTENT(IN):: ok_kzmin
64 guez 101
65 guez 118 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
66     ! soil temperature of surface fraction
67    
68 guez 99 REAL, INTENT(inout):: qsol(klon)
69 guez 101 ! column-density of water in soil, in kg m-2
70    
71 guez 62 REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)
72     REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
73 guez 70 REAL snow(klon, nbsrf)
74     REAL qsurf(klon, nbsrf)
75     REAL evap(klon, nbsrf)
76     REAL albe(klon, nbsrf)
77     REAL alblw(klon, nbsrf)
78    
79     REAL fluxlat(klon, nbsrf)
80    
81 guez 101 REAL, intent(in):: rain_fall(klon)
82     ! liquid water mass flux (kg/m2/s), positive down
83    
84     REAL, intent(in):: snow_f(klon)
85     ! solid water mass flux (kg/m2/s), positive down
86    
87 guez 72 REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)
88 guez 70 REAL fder(klon)
89 guez 145 REAL, INTENT(IN):: rlat(klon) ! latitude en degr\'es
90 guez 70
91     REAL rugos(klon, nbsrf)
92     ! rugos----input-R- longeur de rugosite (en m)
93    
94     LOGICAL, INTENT(IN):: debut
95     real agesno(klon, nbsrf)
96     REAL, INTENT(IN):: rugoro(klon)
97    
98 guez 38 REAL d_t(klon, klev), d_q(klon, klev)
99 guez 49 ! d_t------output-R- le changement pour "t"
100     ! d_q------output-R- le changement pour "q"
101 guez 62
102     REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
103     ! changement pour "u" et "v"
104    
105 guez 104 REAL, intent(out):: d_ts(klon, nbsrf) ! le changement pour "ts"
106 guez 70
107 guez 38 REAL flux_t(klon, klev, nbsrf), flux_q(klon, klev, nbsrf)
108 guez 49 ! flux_t---output-R- flux de chaleur sensible (CpT) J/m**2/s (W/m**2)
109     ! (orientation positive vers le bas)
110     ! flux_q---output-R- flux de vapeur d'eau (kg/m**2/s)
111 guez 70
112     REAL flux_u(klon, klev, nbsrf), flux_v(klon, klev, nbsrf)
113     ! flux_u---output-R- tension du vent X: (kg m/s)/(m**2 s) ou Pascal
114     ! flux_v---output-R- tension du vent Y: (kg m/s)/(m**2 s) ou Pascal
115    
116     REAL, INTENT(out):: cdragh(klon), cdragm(klon)
117     real q2(klon, klev+1, nbsrf)
118    
119 guez 99 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
120 guez 49 ! dflux_t derive du flux sensible
121     ! dflux_q derive du flux latent
122 guez 38 !IM "slab" ocean
123 guez 70
124     REAL, intent(out):: ycoefh(klon, klev)
125     REAL, intent(out):: zu1(klon)
126     REAL zv1(klon)
127     REAL t2m(klon, nbsrf), q2m(klon, nbsrf)
128     REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
129    
130     !IM cf. AM : pbl, hbtm (Comme les autres diagnostics on cumule ds
131     ! physiq ce qui permet de sortir les grdeurs par sous surface)
132     REAL pblh(klon, nbsrf)
133     ! pblh------- HCL
134     REAL capcl(klon, nbsrf)
135     REAL oliqcl(klon, nbsrf)
136     REAL cteicl(klon, nbsrf)
137     REAL pblt(klon, nbsrf)
138     ! pblT------- T au nveau HCL
139     REAL therm(klon, nbsrf)
140     REAL trmb1(klon, nbsrf)
141     ! trmb1-------deep_cape
142     REAL trmb2(klon, nbsrf)
143     ! trmb2--------inhibition
144     REAL trmb3(klon, nbsrf)
145     ! trmb3-------Point Omega
146     REAL plcl(klon, nbsrf)
147     REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
148     ! ffonte----Flux thermique utilise pour fondre la neige
149     ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
150     ! hauteur de neige, en kg/m2/s
151     REAL run_off_lic_0(klon)
152    
153 guez 38 REAL flux_o(klon), flux_g(klon)
154 guez 49 !IM "slab" ocean
155     ! flux_g---output-R- flux glace (pour OCEAN='slab ')
156     ! flux_o---output-R- flux ocean (pour OCEAN='slab ')
157 guez 70
158     REAL tslab(klon)
159 guez 49 ! tslab-in/output-R temperature du slab ocean (en Kelvin)
160     ! uniqmnt pour slab
161 guez 70
162     ! Local:
163 guez 15
164 guez 70 REAL y_flux_o(klon), y_flux_g(klon)
165     real ytslab(klon)
166     REAL y_fqcalving(klon), y_ffonte(klon)
167     real y_run_off_lic_0(klon)
168 guez 15
169 guez 70 REAL rugmer(klon)
170 guez 15
171 guez 38 REAL ytsoil(klon, nsoilmx)
172 guez 15
173 guez 38 REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
174     REAL yalb(klon)
175     REAL yalblw(klon)
176     REAL yu1(klon), yv1(klon)
177 guez 49 ! on rajoute en output yu1 et yv1 qui sont les vents dans
178     ! la premiere couche
179 guez 101 REAL ysnow(klon), yqsurf(klon), yagesno(klon)
180    
181     real yqsol(klon)
182     ! column-density of water in soil, in kg m-2
183    
184     REAL yrain_f(klon)
185     ! liquid water mass flux (kg/m2/s), positive down
186    
187     REAL ysnow_f(klon)
188     ! solid water mass flux (kg/m2/s), positive down
189    
190 guez 72 REAL ysollw(klon), ysolsw(klon)
191 guez 99 REAL yfder(klon)
192 guez 38 REAL yrugm(klon), yrads(klon), yrugoro(klon)
193 guez 15
194 guez 38 REAL yfluxlat(klon)
195 guez 15
196 guez 38 REAL y_d_ts(klon)
197     REAL y_d_t(klon, klev), y_d_q(klon, klev)
198     REAL y_d_u(klon, klev), y_d_v(klon, klev)
199     REAL y_flux_t(klon, klev), y_flux_q(klon, klev)
200     REAL y_flux_u(klon, klev), y_flux_v(klon, klev)
201     REAL y_dflux_t(klon), y_dflux_q(klon)
202 guez 62 REAL coefh(klon, klev), coefm(klon, klev)
203 guez 38 REAL yu(klon, klev), yv(klon, klev)
204     REAL yt(klon, klev), yq(klon, klev)
205     REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
206 guez 15
207 guez 38 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
208 guez 15
209 guez 38 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
210     REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
211     REAL ykmq(klon, klev+1)
212 guez 70 REAL yq2(klon, klev+1)
213 guez 38 REAL q2diag(klon, klev+1)
214 guez 15
215 guez 38 REAL u1lay(klon), v1lay(klon)
216     REAL delp(klon, klev)
217     INTEGER i, k, nsrf
218 guez 15
219 guez 38 INTEGER ni(klon), knon, j
220 guez 40
221 guez 38 REAL pctsrf_pot(klon, nbsrf)
222 guez 145 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
223 guez 40 ! apparitions ou disparitions de la glace de mer
224 guez 15
225 guez 38 REAL zx_alf1, zx_alf2 !valeur ambiante par extrapola.
226 guez 15
227 guez 38 REAL yt2m(klon), yq2m(klon), yu10m(klon)
228     REAL yustar(klon)
229     ! -- LOOP
230     REAL yu10mx(klon)
231     REAL yu10my(klon)
232     REAL ywindsp(klon)
233     ! -- LOOP
234 guez 15
235 guez 38 REAL yt10m(klon), yq10m(klon)
236     REAL ypblh(klon)
237     REAL ylcl(klon)
238     REAL ycapcl(klon)
239     REAL yoliqcl(klon)
240     REAL ycteicl(klon)
241     REAL ypblt(klon)
242     REAL ytherm(klon)
243     REAL ytrmb1(klon)
244     REAL ytrmb2(klon)
245     REAL ytrmb3(klon)
246     REAL uzon(klon), vmer(klon)
247     REAL tair1(klon), qair1(klon), tairsol(klon)
248     REAL psfce(klon), patm(klon)
249 guez 15
250 guez 38 REAL qairsol(klon), zgeo1(klon)
251     REAL rugo1(klon)
252 guez 15
253 guez 38 ! utiliser un jeu de fonctions simples
254     LOGICAL zxli
255     PARAMETER (zxli=.FALSE.)
256 guez 15
257 guez 38 !------------------------------------------------------------
258 guez 15
259 guez 38 ytherm = 0.
260 guez 15
261 guez 38 DO k = 1, klev ! epaisseur de couche
262     DO i = 1, klon
263     delp(i, k) = paprs(i, k) - paprs(i, k+1)
264     END DO
265     END DO
266     DO i = 1, klon ! vent de la premiere couche
267     zx_alf1 = 1.0
268     zx_alf2 = 1.0 - zx_alf1
269     u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
270     v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
271     END DO
272 guez 15
273 guez 40 ! Initialization:
274     rugmer = 0.
275     cdragh = 0.
276     cdragm = 0.
277     dflux_t = 0.
278     dflux_q = 0.
279     zu1 = 0.
280     zv1 = 0.
281     ypct = 0.
282     yts = 0.
283     ysnow = 0.
284     yqsurf = 0.
285     yalb = 0.
286     yalblw = 0.
287     yrain_f = 0.
288     ysnow_f = 0.
289     yfder = 0.
290     ysolsw = 0.
291     ysollw = 0.
292     yrugos = 0.
293     yu1 = 0.
294     yv1 = 0.
295     yrads = 0.
296     ypaprs = 0.
297     ypplay = 0.
298     ydelp = 0.
299     yu = 0.
300     yv = 0.
301     yt = 0.
302     yq = 0.
303     pctsrf_new = 0.
304     y_flux_u = 0.
305     y_flux_v = 0.
306     y_dflux_t = 0.
307     y_dflux_q = 0.
308 guez 38 ytsoil = 999999.
309     yrugoro = 0.
310 guez 40 yu10mx = 0.
311     yu10my = 0.
312     ywindsp = 0.
313     d_ts = 0.
314 guez 38 yfluxlat = 0.
315     flux_t = 0.
316     flux_q = 0.
317     flux_u = 0.
318     flux_v = 0.
319 guez 40 d_t = 0.
320     d_q = 0.
321     d_u = 0.
322     d_v = 0.
323 guez 70 ycoefh = 0.
324 guez 15
325 guez 145 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
326     ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
327     ! (\`a affiner)
328 guez 15
329 guez 38 pctsrf_pot = pctsrf
330     pctsrf_pot(:, is_oce) = 1. - zmasq
331     pctsrf_pot(:, is_sic) = 1. - zmasq
332 guez 15
333 guez 99 ! Boucler sur toutes les sous-fractions du sol:
334    
335 guez 49 loop_surface: DO nsrf = 1, nbsrf
336     ! Chercher les indices :
337 guez 38 ni = 0
338     knon = 0
339     DO i = 1, klon
340 guez 145 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
341 guez 38 ! "potentielles"
342     IF (pctsrf_pot(i, nsrf) > epsfra) THEN
343     knon = knon + 1
344     ni(knon) = i
345     END IF
346     END DO
347 guez 15
348 guez 62 if_knon: IF (knon /= 0) then
349 guez 38 DO j = 1, knon
350     i = ni(j)
351 guez 62 ypct(j) = pctsrf(i, nsrf)
352     yts(j) = ts(i, nsrf)
353     ytslab(i) = tslab(i)
354     ysnow(j) = snow(i, nsrf)
355     yqsurf(j) = qsurf(i, nsrf)
356     yalb(j) = albe(i, nsrf)
357     yalblw(j) = alblw(i, nsrf)
358     yrain_f(j) = rain_fall(i)
359     ysnow_f(j) = snow_f(i)
360     yagesno(j) = agesno(i, nsrf)
361     yfder(j) = fder(i)
362     ysolsw(j) = solsw(i, nsrf)
363     ysollw(j) = sollw(i, nsrf)
364     yrugos(j) = rugos(i, nsrf)
365     yrugoro(j) = rugoro(i)
366     yu1(j) = u1lay(i)
367     yv1(j) = v1lay(i)
368     yrads(j) = ysolsw(j) + ysollw(j)
369     ypaprs(j, klev+1) = paprs(i, klev+1)
370     y_run_off_lic_0(j) = run_off_lic_0(i)
371     yu10mx(j) = u10m(i, nsrf)
372     yu10my(j) = v10m(i, nsrf)
373     ywindsp(j) = sqrt(yu10mx(j)*yu10mx(j)+yu10my(j)*yu10my(j))
374 guez 38 END DO
375 guez 3
376 guez 99 ! For continent, copy soil water content
377     IF (nsrf == is_ter) THEN
378     yqsol(:knon) = qsol(ni(:knon))
379 guez 62 ELSE
380     yqsol = 0.
381     END IF
382 guez 3
383 guez 62 DO k = 1, nsoilmx
384     DO j = 1, knon
385     i = ni(j)
386     ytsoil(j, k) = ftsoil(i, k, nsrf)
387 guez 38 END DO
388 guez 47 END DO
389 guez 3
390 guez 38 DO k = 1, klev
391     DO j = 1, knon
392     i = ni(j)
393 guez 62 ypaprs(j, k) = paprs(i, k)
394     ypplay(j, k) = pplay(i, k)
395     ydelp(j, k) = delp(i, k)
396     yu(j, k) = u(i, k)
397     yv(j, k) = v(i, k)
398     yt(j, k) = t(i, k)
399     yq(j, k) = q(i, k)
400 guez 38 END DO
401     END DO
402 guez 3
403 guez 62 ! calculer Cdrag et les coefficients d'echange
404     CALL coefkz(nsrf, knon, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, &
405     yu, yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
406     IF (iflag_pbl == 1) THEN
407     CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
408     coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
409     coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
410     END IF
411 guez 3
412 guez 70 ! on met un seuil pour coefm et coefh
413 guez 62 IF (nsrf == is_oce) THEN
414     coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
415     coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
416 guez 38 END IF
417 guez 3
418 guez 62 IF (ok_kzmin) THEN
419     ! Calcul d'une diffusion minimale pour les conditions tres stables
420     CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
421 guez 70 coefm(:knon, 1), ycoefm0, ycoefh0)
422 guez 62 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
423     coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
424 guez 98 END IF
425 guez 3
426 guez 62 IF (iflag_pbl >= 3) THEN
427 guez 145 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
428     ! Fr\'ed\'eric Hourdin
429 guez 62 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
430     + ypplay(:knon, 1))) &
431     * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
432     DO k = 2, klev
433     yzlay(1:knon, k) = yzlay(1:knon, k-1) &
434     + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
435     / ypaprs(1:knon, k) &
436     * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
437     END DO
438     DO k = 1, klev
439     yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
440     / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
441     END DO
442     yzlev(1:knon, 1) = 0.
443     yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
444     - yzlay(:knon, klev - 1)
445     DO k = 2, klev
446     yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
447     END DO
448     DO k = 1, klev + 1
449     DO j = 1, knon
450     i = ni(j)
451     yq2(j, k) = q2(i, k, nsrf)
452     END DO
453     END DO
454    
455     CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
456 guez 99 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
457 guez 62
458 guez 145 ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
459 guez 62
460     IF (iflag_pbl >= 11) THEN
461 guez 145 CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
462     yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
463     iflag_pbl)
464 guez 62 ELSE
465     CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
466     coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
467     END IF
468    
469     coefm(:knon, 2:) = ykmm(:knon, 2:klev)
470     coefh(:knon, 2:) = ykmn(:knon, 2:klev)
471 guez 38 END IF
472 guez 3
473 guez 62 ! calculer la diffusion des vitesses "u" et "v"
474 guez 70 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
475     ypplay, ydelp, y_d_u, y_flux_u)
476     CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
477     ypplay, ydelp, y_d_v, y_flux_v)
478 guez 3
479 guez 62 ! calculer la diffusion de "q" et de "h"
480 guez 118 CALL clqh(dtime, itap, jour, debut, rlat, knon, nsrf, ni(:knon), &
481     pctsrf, ytsoil, yqsol, rmu0, co2_ppm, yrugos, yrugoro, yu1, &
482     yv1, coefh(:knon, :), yt, yq, yts, ypaprs, ypplay, ydelp, &
483     yrads, yalb, yalblw, ysnow, yqsurf, yrain_f, ysnow_f, yfder, &
484     ysolsw, yfluxlat, pctsrf_new, yagesno, y_d_t, y_d_q, &
485     y_d_ts(:knon), yz0_new, y_flux_t, y_flux_q, y_dflux_t, &
486     y_dflux_q, y_fqcalving, y_ffonte, y_run_off_lic_0, y_flux_o, &
487     y_flux_g)
488 guez 3
489 guez 62 ! calculer la longueur de rugosite sur ocean
490     yrugm = 0.
491     IF (nsrf == is_oce) THEN
492     DO j = 1, knon
493     yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
494     0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
495     yrugm(j) = max(1.5E-05, yrugm(j))
496     END DO
497     END IF
498 guez 38 DO j = 1, knon
499 guez 62 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
500     y_dflux_q(j) = y_dflux_q(j)*ypct(j)
501     yu1(j) = yu1(j)*ypct(j)
502     yv1(j) = yv1(j)*ypct(j)
503 guez 38 END DO
504 guez 3
505 guez 62 DO k = 1, klev
506     DO j = 1, knon
507     i = ni(j)
508     coefh(j, k) = coefh(j, k)*ypct(j)
509     coefm(j, k) = coefm(j, k)*ypct(j)
510     y_d_t(j, k) = y_d_t(j, k)*ypct(j)
511     y_d_q(j, k) = y_d_q(j, k)*ypct(j)
512     flux_t(i, k, nsrf) = y_flux_t(j, k)
513     flux_q(i, k, nsrf) = y_flux_q(j, k)
514     flux_u(i, k, nsrf) = y_flux_u(j, k)
515     flux_v(i, k, nsrf) = y_flux_v(j, k)
516     y_d_u(j, k) = y_d_u(j, k)*ypct(j)
517     y_d_v(j, k) = y_d_v(j, k)*ypct(j)
518     END DO
519 guez 38 END DO
520 guez 3
521 guez 62 evap(:, nsrf) = -flux_q(:, 1, nsrf)
522 guez 15
523 guez 62 albe(:, nsrf) = 0.
524     alblw(:, nsrf) = 0.
525     snow(:, nsrf) = 0.
526     qsurf(:, nsrf) = 0.
527     rugos(:, nsrf) = 0.
528     fluxlat(:, nsrf) = 0.
529 guez 38 DO j = 1, knon
530     i = ni(j)
531 guez 62 d_ts(i, nsrf) = y_d_ts(j)
532     albe(i, nsrf) = yalb(j)
533     alblw(i, nsrf) = yalblw(j)
534     snow(i, nsrf) = ysnow(j)
535     qsurf(i, nsrf) = yqsurf(j)
536     rugos(i, nsrf) = yz0_new(j)
537     fluxlat(i, nsrf) = yfluxlat(j)
538     IF (nsrf == is_oce) THEN
539     rugmer(i) = yrugm(j)
540     rugos(i, nsrf) = yrugm(j)
541     END IF
542     agesno(i, nsrf) = yagesno(j)
543     fqcalving(i, nsrf) = y_fqcalving(j)
544     ffonte(i, nsrf) = y_ffonte(j)
545     cdragh(i) = cdragh(i) + coefh(j, 1)
546     cdragm(i) = cdragm(i) + coefm(j, 1)
547     dflux_t(i) = dflux_t(i) + y_dflux_t(j)
548     dflux_q(i) = dflux_q(i) + y_dflux_q(j)
549     zu1(i) = zu1(i) + yu1(j)
550     zv1(i) = zv1(i) + yv1(j)
551 guez 38 END DO
552 guez 62 IF (nsrf == is_ter) THEN
553 guez 99 qsol(ni(:knon)) = yqsol(:knon)
554     else IF (nsrf == is_lic) THEN
555 guez 62 DO j = 1, knon
556     i = ni(j)
557     run_off_lic_0(i) = y_run_off_lic_0(j)
558     END DO
559     END IF
560 guez 118
561 guez 62 ftsoil(:, :, nsrf) = 0.
562     DO k = 1, nsoilmx
563     DO j = 1, knon
564     i = ni(j)
565     ftsoil(i, k, nsrf) = ytsoil(j, k)
566     END DO
567     END DO
568    
569 guez 38 DO j = 1, knon
570     i = ni(j)
571 guez 62 DO k = 1, klev
572     d_t(i, k) = d_t(i, k) + y_d_t(j, k)
573     d_q(i, k) = d_q(i, k) + y_d_q(j, k)
574     d_u(i, k) = d_u(i, k) + y_d_u(j, k)
575     d_v(i, k) = d_v(i, k) + y_d_v(j, k)
576 guez 70 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
577 guez 62 END DO
578 guez 38 END DO
579 guez 62
580 guez 99 ! diagnostic t, q a 2m et u, v a 10m
581 guez 62
582 guez 38 DO j = 1, knon
583     i = ni(j)
584 guez 62 uzon(j) = yu(j, 1) + y_d_u(j, 1)
585     vmer(j) = yv(j, 1) + y_d_v(j, 1)
586     tair1(j) = yt(j, 1) + y_d_t(j, 1)
587     qair1(j) = yq(j, 1) + y_d_q(j, 1)
588     zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
589     1)))*(ypaprs(j, 1)-ypplay(j, 1))
590     tairsol(j) = yts(j) + y_d_ts(j)
591     rugo1(j) = yrugos(j)
592     IF (nsrf == is_oce) THEN
593     rugo1(j) = rugos(i, nsrf)
594     END IF
595     psfce(j) = ypaprs(j, 1)
596     patm(j) = ypplay(j, 1)
597 guez 15
598 guez 62 qairsol(j) = yqsurf(j)
599 guez 38 END DO
600 guez 15
601 guez 62 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
602     zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
603     yt10m, yq10m, yu10m, yustar)
604 guez 3
605 guez 62 DO j = 1, knon
606     i = ni(j)
607     t2m(i, nsrf) = yt2m(j)
608     q2m(i, nsrf) = yq2m(j)
609 guez 3
610 guez 62 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
611     u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
612     v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
613 guez 15
614 guez 62 END DO
615 guez 15
616 guez 149 CALL hbtm(knon, ypaprs, ypplay, yt2m, yq2m, yustar, &
617 guez 62 y_flux_t, y_flux_q, yu, yv, yt, yq, ypblh, ycapcl, yoliqcl, &
618     ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
619 guez 15
620 guez 38 DO j = 1, knon
621     i = ni(j)
622 guez 62 pblh(i, nsrf) = ypblh(j)
623     plcl(i, nsrf) = ylcl(j)
624     capcl(i, nsrf) = ycapcl(j)
625     oliqcl(i, nsrf) = yoliqcl(j)
626     cteicl(i, nsrf) = ycteicl(j)
627     pblt(i, nsrf) = ypblt(j)
628     therm(i, nsrf) = ytherm(j)
629     trmb1(i, nsrf) = ytrmb1(j)
630     trmb2(i, nsrf) = ytrmb2(j)
631     trmb3(i, nsrf) = ytrmb3(j)
632 guez 38 END DO
633 guez 3
634 guez 38 DO j = 1, knon
635 guez 62 DO k = 1, klev + 1
636     i = ni(j)
637     q2(i, k, nsrf) = yq2(j, k)
638     END DO
639 guez 38 END DO
640 guez 62 !IM "slab" ocean
641 guez 47 IF (nsrf == is_oce) THEN
642 guez 62 DO j = 1, knon
643     ! on projette sur la grille globale
644     i = ni(j)
645     IF (pctsrf_new(i, is_oce)>epsfra) THEN
646     flux_o(i) = y_flux_o(j)
647     ELSE
648     flux_o(i) = 0.
649     END IF
650     END DO
651 guez 38 END IF
652 guez 62
653     IF (nsrf == is_sic) THEN
654     DO j = 1, knon
655     i = ni(j)
656 guez 145 ! On pond\`ere lorsque l'on fait le bilan au sol :
657 guez 62 IF (pctsrf_new(i, is_sic)>epsfra) THEN
658     flux_g(i) = y_flux_g(j)
659     ELSE
660     flux_g(i) = 0.
661     END IF
662     END DO
663    
664     END IF
665     end IF if_knon
666 guez 49 END DO loop_surface
667 guez 15
668 guez 38 ! On utilise les nouvelles surfaces
669 guez 15
670 guez 38 rugos(:, is_oce) = rugmer
671     pctsrf = pctsrf_new
672 guez 15
673 guez 38 END SUBROUTINE clmain
674 guez 15
675 guez 38 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21