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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 222 - (hide annotations)
Tue Apr 25 15:31:48 2017 UTC (7 years ago) by guez
File size: 20821 byte(s)
In interfsurf_hq, changed names of variables : tsurf becomes ts (name of
actual argument), tsurf_temp  can then become simply tsurf.

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

  ViewVC Help
Powered by ViewVC 1.1.21