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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 239 - (hide annotations)
Fri Nov 10 15:16:48 2017 UTC (6 years, 6 months ago) by guez
File size: 20628 byte(s)
In procedure coefkzmin, dummy argument km is equal to dummy argument
kn. Remove it.

Bug fix in clmain. If iflag_pbl /= 1 and ok_kzmin then
ycoef[mh]0(:knon, 1) are not defined and used for computation of
ycdrag[mh](:knon). Remove the lines (following LMDZ).

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

  ViewVC Help
Powered by ViewVC 1.1.21