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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 155 - (hide annotations)
Wed Jul 8 17:03:45 2015 UTC (8 years, 9 months ago) by guez
File size: 22387 byte(s)
Do not write any longer to startphy.nc nor read from restartphy.nc the
NetCDF variable ALBLW: it was the same than ALBE. ALBE was for the
visible and ALBLW for the near infrared. In physiq, use only variables
falbe and albsol, removed falblw and albsollw. See revision 888 of
LMDZ.

Removed unused arguments pdp of SUBROUTINE lwbv, ptave of SUBROUTINE
lwv, kuaer of SUBROUTINE lwvd, nq of SUBROUTINE initphysto.

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

  ViewVC Help
Powered by ViewVC 1.1.21