/[lmdze]/trunk/phylmd/pbl_surface.f
ViewVC logotype

Annotation of /trunk/phylmd/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 246 - (hide annotations)
Wed Nov 15 13:56:45 2017 UTC (6 years, 6 months ago) by guez
Original Path: trunk/Sources/phylmd/clmain.f
File size: 19827 byte(s)
In procedure clmain, no need for intermediary variables ykmm and ykmn.

In module coefcdrag_m, remove unused procedures fsta and fins.

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 244 flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, coefh, t2m, q2m, &
12 guez 226 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 244 REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
110 guez 226 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
111 guez 244 ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
112 guez 226 ! 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 244 REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
168 guez 237 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 240 REAL ycoefm0(klon, 2:klev), ycoefh0(klon, 2:klev)
173 guez 227 REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev)
174 guez 225 REAL yq2(klon, klev + 1)
175 guez 38 REAL delp(klon, klev)
176     INTEGER i, k, nsrf
177     INTEGER ni(klon), knon, j
178 guez 40
179 guez 38 REAL pctsrf_pot(klon, nbsrf)
180 guez 145 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
181 guez 40 ! apparitions ou disparitions de la glace de mer
182 guez 15
183 guez 227 REAL yt2m(klon), yq2m(klon), wind10m(klon)
184     REAL ustar(klon)
185 guez 15
186 guez 38 REAL yt10m(klon), yq10m(klon)
187     REAL ypblh(klon)
188     REAL ylcl(klon)
189     REAL ycapcl(klon)
190     REAL yoliqcl(klon)
191     REAL ycteicl(klon)
192     REAL ypblt(klon)
193     REAL ytherm(klon)
194     REAL ytrmb1(klon)
195     REAL ytrmb2(klon)
196     REAL ytrmb3(klon)
197 guez 227 REAL u1(klon), v1(klon)
198 guez 38 REAL tair1(klon), qair1(klon), tairsol(klon)
199     REAL psfce(klon), patm(klon)
200 guez 15
201 guez 38 REAL qairsol(klon), zgeo1(klon)
202     REAL rugo1(klon)
203 guez 15
204 guez 38 !------------------------------------------------------------
205 guez 15
206 guez 38 ytherm = 0.
207 guez 15
208 guez 38 DO k = 1, klev ! epaisseur de couche
209     DO i = 1, klon
210 guez 225 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
211 guez 38 END DO
212     END DO
213 guez 15
214 guez 40 ! Initialization:
215     rugmer = 0.
216     cdragh = 0.
217     cdragm = 0.
218     dflux_t = 0.
219     dflux_q = 0.
220     ypct = 0.
221     yqsurf = 0.
222     yrain_f = 0.
223     ysnow_f = 0.
224     yrugos = 0.
225     ypaprs = 0.
226     ypplay = 0.
227     ydelp = 0.
228     yu = 0.
229     yv = 0.
230     yt = 0.
231     yq = 0.
232     y_dflux_t = 0.
233     y_dflux_q = 0.
234 guez 38 yrugoro = 0.
235 guez 40 d_ts = 0.
236 guez 38 flux_t = 0.
237     flux_q = 0.
238     flux_u = 0.
239     flux_v = 0.
240 guez 214 fluxlat = 0.
241 guez 40 d_t = 0.
242     d_q = 0.
243     d_u = 0.
244     d_v = 0.
245 guez 244 coefh = 0.
246 guez 15
247 guez 145 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
248     ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
249     ! (\`a affiner)
250 guez 15
251 guez 202 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
252     pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
253 guez 38 pctsrf_pot(:, is_oce) = 1. - zmasq
254     pctsrf_pot(:, is_sic) = 1. - zmasq
255 guez 15
256 guez 202 ! Tester si c'est le moment de lire le fichier:
257     if (mod(itap - 1, lmt_pas) == 0) then
258 guez 221 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
259 guez 202 endif
260    
261 guez 99 ! Boucler sur toutes les sous-fractions du sol:
262    
263 guez 49 loop_surface: DO nsrf = 1, nbsrf
264     ! Chercher les indices :
265 guez 38 ni = 0
266     knon = 0
267     DO i = 1, klon
268 guez 145 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
269 guez 38 ! "potentielles"
270     IF (pctsrf_pot(i, nsrf) > epsfra) THEN
271     knon = knon + 1
272     ni(knon) = i
273     END IF
274     END DO
275 guez 15
276 guez 62 if_knon: IF (knon /= 0) then
277 guez 38 DO j = 1, knon
278     i = ni(j)
279 guez 62 ypct(j) = pctsrf(i, nsrf)
280 guez 207 yts(j) = ftsol(i, nsrf)
281 guez 215 snow(j) = fsnow(i, nsrf)
282 guez 62 yqsurf(j) = qsurf(i, nsrf)
283 guez 155 yalb(j) = falbe(i, nsrf)
284 guez 62 yrain_f(j) = rain_fall(i)
285     ysnow_f(j) = snow_f(i)
286     yagesno(j) = agesno(i, nsrf)
287 guez 222 yrugos(j) = frugs(i, nsrf)
288 guez 62 yrugoro(j) = rugoro(i)
289 guez 222 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
290 guez 225 ypaprs(j, klev + 1) = paprs(i, klev + 1)
291 guez 62 y_run_off_lic_0(j) = run_off_lic_0(i)
292 guez 38 END DO
293 guez 3
294 guez 99 ! For continent, copy soil water content
295 guez 225 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
296 guez 3
297 guez 208 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
298 guez 3
299 guez 38 DO k = 1, klev
300     DO j = 1, knon
301     i = ni(j)
302 guez 62 ypaprs(j, k) = paprs(i, k)
303     ypplay(j, k) = pplay(i, k)
304     ydelp(j, k) = delp(i, k)
305     yu(j, k) = u(i, k)
306     yv(j, k) = v(i, k)
307     yt(j, k) = t(i, k)
308     yq(j, k) = q(i, k)
309 guez 38 END DO
310     END DO
311 guez 3
312 guez 221 CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), &
313 guez 244 yrugos, yu, yv, yt, yq, yqsurf(:knon), ycoefm(:knon, :), &
314     ycoefh(:knon, :), ycdragm(:knon), ycdragh(:knon))
315 guez 228
316 guez 62 IF (iflag_pbl == 1) THEN
317 guez 240 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0(:knon, :), &
318     ycoefh0(:knon, :))
319 guez 244 ycoefm(:knon, :) = max(ycoefm(:knon, :), ycoefm0(:knon, :))
320     ycoefh(:knon, :) = max(ycoefh(:knon, :), ycoefh0(:knon, :))
321 guez 238 ycdragm(:knon) = max(ycdragm(:knon), 0.)
322     ycdragh(:knon) = max(ycdragh(:knon), 0.)
323 guez 62 END IF
324 guez 3
325 guez 237 ! on met un seuil pour ycdragm et ycdragh
326 guez 62 IF (nsrf == is_oce) THEN
327 guez 237 ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
328     ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
329 guez 38 END IF
330 guez 3
331 guez 62 IF (ok_kzmin) THEN
332     ! Calcul d'une diffusion minimale pour les conditions tres stables
333     CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
334 guez 240 ycdragm(:knon), ycoefh0(:knon, :))
335     ycoefm0(:knon, :) = ycoefh0(:knon, :)
336 guez 244 ycoefm(:knon, :) = max(ycoefm(:knon, :), ycoefm0(:knon, :))
337     ycoefh(:knon, :) = max(ycoefh(:knon, :), ycoefh0(:knon, :))
338 guez 98 END IF
339 guez 3
340 guez 228 IF (iflag_pbl >= 6) THEN
341 guez 145 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
342     ! Fr\'ed\'eric Hourdin
343 guez 62 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
344     + ypplay(:knon, 1))) &
345     * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
346 guez 228
347 guez 62 DO k = 2, klev
348 guez 227 yzlay(:knon, k) = yzlay(:knon, k-1) &
349 guez 62 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
350     / ypaprs(1:knon, k) &
351     * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
352     END DO
353 guez 227
354 guez 62 DO k = 1, klev
355 guez 225 yteta(1:knon, k) = yt(1:knon, k) * (ypaprs(1:knon, 1) &
356     / ypplay(1:knon, k))**rkappa * (1. + 0.61 * yq(1:knon, k))
357 guez 62 END DO
358 guez 227
359     zlev(:knon, 1) = 0.
360     zlev(:knon, klev + 1) = 2. * yzlay(:knon, klev) &
361 guez 62 - yzlay(:knon, klev - 1)
362 guez 227
363 guez 62 DO k = 2, klev
364 guez 227 zlev(:knon, k) = 0.5 * (yzlay(:knon, k) + yzlay(:knon, k-1))
365 guez 62 END DO
366 guez 227
367 guez 62 DO k = 1, klev + 1
368     DO j = 1, knon
369     i = ni(j)
370     yq2(j, k) = q2(i, k, nsrf)
371     END DO
372     END DO
373    
374 guez 237 ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), ycdragm(:knon))
375 guez 228 CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), &
376 guez 238 yu(:knon, :), yv(:knon, :), yteta(:knon, :), yq2(:knon, :), &
377 guez 246 ycoefm(:knon, :), ycoefh(:knon, :), ustar(:knon))
378 guez 38 END IF
379 guez 3
380 guez 244 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
381 guez 237 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
382 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
383 guez 225 y_flux_u(:knon))
384 guez 244 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
385 guez 237 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
386 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
387 guez 225 y_flux_v(:knon))
388 guez 3
389 guez 62 ! calculer la diffusion de "q" et de "h"
390 guez 221 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
391 guez 225 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
392 guez 244 yu(:knon, 1), yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), &
393 guez 236 yt, yq, yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), &
394     yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &
395     yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, &
396     y_d_ts(:knon), yz0_new, y_flux_t(:knon), y_flux_q(:knon), &
397     y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving, y_ffonte, &
398     y_run_off_lic_0)
399 guez 3
400 guez 62 ! calculer la longueur de rugosite sur ocean
401     yrugm = 0.
402     IF (nsrf == is_oce) THEN
403     DO j = 1, knon
404 guez 237 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
405 guez 225 / rg + 0.11 * 14E-6 &
406 guez 237 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
407 guez 62 yrugm(j) = max(1.5E-05, yrugm(j))
408     END DO
409     END IF
410 guez 38 DO j = 1, knon
411 guez 225 y_dflux_t(j) = y_dflux_t(j) * ypct(j)
412     y_dflux_q(j) = y_dflux_q(j) * ypct(j)
413 guez 38 END DO
414 guez 3
415 guez 237 DO k = 1, klev
416     DO j = 1, knon
417     i = ni(j)
418 guez 225 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
419     y_d_q(j, k) = y_d_q(j, k) * ypct(j)
420     y_d_u(j, k) = y_d_u(j, k) * ypct(j)
421     y_d_v(j, k) = y_d_v(j, k) * ypct(j)
422 guez 62 END DO
423 guez 38 END DO
424 guez 3
425 guez 214 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
426     flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
427     flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
428     flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
429 guez 15
430 guez 206 evap(:, nsrf) = -flux_q(:, nsrf)
431    
432 guez 155 falbe(:, nsrf) = 0.
433 guez 215 fsnow(:, nsrf) = 0.
434 guez 62 qsurf(:, nsrf) = 0.
435 guez 222 frugs(:, nsrf) = 0.
436 guez 38 DO j = 1, knon
437     i = ni(j)
438 guez 62 d_ts(i, nsrf) = y_d_ts(j)
439 guez 155 falbe(i, nsrf) = yalb(j)
440 guez 215 fsnow(i, nsrf) = snow(j)
441 guez 62 qsurf(i, nsrf) = yqsurf(j)
442 guez 222 frugs(i, nsrf) = yz0_new(j)
443 guez 62 fluxlat(i, nsrf) = yfluxlat(j)
444     IF (nsrf == is_oce) THEN
445     rugmer(i) = yrugm(j)
446 guez 222 frugs(i, nsrf) = yrugm(j)
447 guez 62 END IF
448     agesno(i, nsrf) = yagesno(j)
449     fqcalving(i, nsrf) = y_fqcalving(j)
450     ffonte(i, nsrf) = y_ffonte(j)
451 guez 243 cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
452     cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
453 guez 62 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
454     dflux_q(i) = dflux_q(i) + y_dflux_q(j)
455 guez 38 END DO
456 guez 62 IF (nsrf == is_ter) THEN
457 guez 99 qsol(ni(:knon)) = yqsol(:knon)
458     else IF (nsrf == is_lic) THEN
459 guez 62 DO j = 1, knon
460     i = ni(j)
461     run_off_lic_0(i) = y_run_off_lic_0(j)
462     END DO
463     END IF
464 guez 118
465 guez 62 ftsoil(:, :, nsrf) = 0.
466 guez 208 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
467 guez 62
468 guez 38 DO j = 1, knon
469     i = ni(j)
470 guez 62 DO k = 1, klev
471     d_t(i, k) = d_t(i, k) + y_d_t(j, k)
472     d_q(i, k) = d_q(i, k) + y_d_q(j, k)
473     d_u(i, k) = d_u(i, k) + y_d_u(j, k)
474     d_v(i, k) = d_v(i, k) + y_d_v(j, k)
475 guez 237 END DO
476     END DO
477 guez 62
478 guez 244 forall (k = 2:klev) coefh(ni(:knon), k) &
479     = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
480 guez 242
481 guez 99 ! diagnostic t, q a 2m et u, v a 10m
482 guez 62
483 guez 38 DO j = 1, knon
484     i = ni(j)
485 guez 227 u1(j) = yu(j, 1) + y_d_u(j, 1)
486     v1(j) = yv(j, 1) + y_d_v(j, 1)
487 guez 62 tair1(j) = yt(j, 1) + y_d_t(j, 1)
488     qair1(j) = yq(j, 1) + y_d_q(j, 1)
489 guez 225 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
490     1))) * (ypaprs(j, 1)-ypplay(j, 1))
491 guez 62 tairsol(j) = yts(j) + y_d_ts(j)
492     rugo1(j) = yrugos(j)
493     IF (nsrf == is_oce) THEN
494 guez 222 rugo1(j) = frugs(i, nsrf)
495 guez 62 END IF
496     psfce(j) = ypaprs(j, 1)
497     patm(j) = ypplay(j, 1)
498 guez 15
499 guez 62 qairsol(j) = yqsurf(j)
500 guez 38 END DO
501 guez 15
502 guez 227 CALL stdlevvar(klon, knon, nsrf, u1(:knon), v1(:knon), tair1(:knon), &
503     qair1, zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, &
504 guez 246 yq2m, yt10m, yq10m, wind10m(:knon), ustar(:knon))
505 guez 3
506 guez 62 DO j = 1, knon
507     i = ni(j)
508     t2m(i, nsrf) = yt2m(j)
509     q2m(i, nsrf) = yq2m(j)
510 guez 3
511 guez 227 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
512     / sqrt(u1(j)**2 + v1(j)**2)
513     v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
514     / sqrt(u1(j)**2 + v1(j)**2)
515 guez 62 END DO
516 guez 15
517 guez 227 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
518 guez 206 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
519     yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
520 guez 15
521 guez 38 DO j = 1, knon
522     i = ni(j)
523 guez 62 pblh(i, nsrf) = ypblh(j)
524     plcl(i, nsrf) = ylcl(j)
525     capcl(i, nsrf) = ycapcl(j)
526     oliqcl(i, nsrf) = yoliqcl(j)
527     cteicl(i, nsrf) = ycteicl(j)
528     pblt(i, nsrf) = ypblt(j)
529     therm(i, nsrf) = ytherm(j)
530     trmb1(i, nsrf) = ytrmb1(j)
531     trmb2(i, nsrf) = ytrmb2(j)
532     trmb3(i, nsrf) = ytrmb3(j)
533 guez 38 END DO
534 guez 3
535 guez 38 DO j = 1, knon
536 guez 62 DO k = 1, klev + 1
537     i = ni(j)
538     q2(i, k, nsrf) = yq2(j, k)
539     END DO
540 guez 38 END DO
541 guez 215 else
542     fsnow(:, nsrf) = 0.
543 guez 62 end IF if_knon
544 guez 49 END DO loop_surface
545 guez 15
546 guez 38 ! On utilise les nouvelles surfaces
547 guez 222 frugs(:, is_oce) = rugmer
548 guez 202 pctsrf(:, is_oce) = pctsrf_new_oce
549     pctsrf(:, is_sic) = pctsrf_new_sic
550 guez 15
551 guez 202 firstcal = .false.
552    
553 guez 38 END SUBROUTINE clmain
554 guez 15
555 guez 38 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21