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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 207 - (hide annotations)
Thu Sep 1 10:30:53 2016 UTC (7 years, 7 months ago) by guez
File size: 21026 byte(s)
New philosophy on compiler options.

Removed source code for thermcep = f. (Not used in LMDZ either.)

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

  ViewVC Help
Powered by ViewVC 1.1.21