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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 215 - (show annotations)
Tue Mar 28 12:46:28 2017 UTC (7 years, 1 month ago) by guez
File size: 20742 byte(s)
size(snow) is now knon in interfsurf_hq.

Renamed snow to fsnow in clmain, same name as corresponding actual
argument. We can then rename ysnow to simply snow in clmain, same name
as corresponding dummy argument of clqh. No need to initialize local
snow to 0 since it is only used with indices 1:knon and already
initialized from fsnow for each type of surface. If there is no point
for a given type of surface, fsnow should be reset to 0 for this
type. We need to give a valid value to fsnow in this case even if it
will be multiplied by pctsrf = 0 in physiq.

In physiq, no need for intermediate zxsnow for output.

Removed unused arguments tsurf, p1lay, beta, coef1lay, ps, t1lay,
q1lay, u1lay, v1lay, petAcoef, peqAcoef, petBcoef, peqBcoef of
fonte_neige, with unused computations of zx_qs and zcor. (Same was
done in LMDZ.)

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

  ViewVC Help
Powered by ViewVC 1.1.21