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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 214 - (show annotations)
Wed Mar 22 13:40:27 2017 UTC (7 years, 1 month ago) by guez
File size: 20669 byte(s)
fluxlat, not yfluxlat, should be set to 0 at the beginning of
clmain. So fluxlat is defined for a given type of surface even if
there is no point of this type at the current time step.

fluxlat is defined at each time step in physiq, no need for the save
attribute.

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, snow, &
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):: snow(klon, nbsrf)
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 REAL yu1(klon), yv1(klon)
159 ! on rajoute en output yu1 et yv1 qui sont les vents dans
160 ! la premiere couche
161 REAL ysnow(klon), yqsurf(klon), yagesno(klon)
162
163 real yqsol(klon)
164 ! column-density of water in soil, in kg m-2
165
166 REAL yrain_f(klon)
167 ! liquid water mass flux (kg/m2/s), positive down
168
169 REAL ysnow_f(klon)
170 ! solid water mass flux (kg/m2/s), positive down
171
172 REAL yfder(klon)
173 REAL yrugm(klon), yrads(klon), yrugoro(klon)
174 REAL yfluxlat(klon)
175 REAL y_d_ts(klon)
176 REAL y_d_t(klon, klev), y_d_q(klon, klev)
177 REAL y_d_u(klon, klev), y_d_v(klon, klev)
178 REAL y_flux_t(klon), y_flux_q(klon)
179 REAL y_flux_u(klon), y_flux_v(klon)
180 REAL y_dflux_t(klon), y_dflux_q(klon)
181 REAL coefh(klon, klev), coefm(klon, klev)
182 REAL yu(klon, klev), yv(klon, klev)
183 REAL yt(klon, klev), yq(klon, klev)
184 REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
185
186 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
187
188 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
189 REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
190 REAL ykmq(klon, klev+1)
191 REAL yq2(klon, klev+1)
192 REAL q2diag(klon, klev+1)
193
194 REAL u1lay(klon), v1lay(klon)
195 REAL delp(klon, klev)
196 INTEGER i, k, nsrf
197
198 INTEGER ni(klon), knon, j
199
200 REAL pctsrf_pot(klon, nbsrf)
201 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
202 ! apparitions ou disparitions de la glace de mer
203
204 REAL zx_alf1, zx_alf2 ! valeur ambiante par extrapolation
205
206 REAL yt2m(klon), yq2m(klon), yu10m(klon)
207 REAL yustar(klon)
208
209 REAL yt10m(klon), yq10m(klon)
210 REAL ypblh(klon)
211 REAL ylcl(klon)
212 REAL ycapcl(klon)
213 REAL yoliqcl(klon)
214 REAL ycteicl(klon)
215 REAL ypblt(klon)
216 REAL ytherm(klon)
217 REAL ytrmb1(klon)
218 REAL ytrmb2(klon)
219 REAL ytrmb3(klon)
220 REAL uzon(klon), vmer(klon)
221 REAL tair1(klon), qair1(klon), tairsol(klon)
222 REAL psfce(klon), patm(klon)
223
224 REAL qairsol(klon), zgeo1(klon)
225 REAL rugo1(klon)
226
227 ! utiliser un jeu de fonctions simples
228 LOGICAL zxli
229 PARAMETER (zxli=.FALSE.)
230
231 !------------------------------------------------------------
232
233 ytherm = 0.
234
235 DO k = 1, klev ! epaisseur de couche
236 DO i = 1, klon
237 delp(i, k) = paprs(i, k) - paprs(i, k+1)
238 END DO
239 END DO
240 DO i = 1, klon ! vent de la premiere couche
241 zx_alf1 = 1.0
242 zx_alf2 = 1.0 - zx_alf1
243 u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
244 v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
245 END DO
246
247 ! Initialization:
248 rugmer = 0.
249 cdragh = 0.
250 cdragm = 0.
251 dflux_t = 0.
252 dflux_q = 0.
253 zu1 = 0.
254 zv1 = 0.
255 ypct = 0.
256 yts = 0.
257 ysnow = 0.
258 yqsurf = 0.
259 yrain_f = 0.
260 ysnow_f = 0.
261 yfder = 0.
262 yrugos = 0.
263 yu1 = 0.
264 yv1 = 0.
265 yrads = 0.
266 ypaprs = 0.
267 ypplay = 0.
268 ydelp = 0.
269 yu = 0.
270 yv = 0.
271 yt = 0.
272 yq = 0.
273 y_dflux_t = 0.
274 y_dflux_q = 0.
275 yrugoro = 0.
276 d_ts = 0.
277 flux_t = 0.
278 flux_q = 0.
279 flux_u = 0.
280 flux_v = 0.
281 fluxlat = 0.
282 d_t = 0.
283 d_q = 0.
284 d_u = 0.
285 d_v = 0.
286 ycoefh = 0.
287
288 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
289 ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
290 ! (\`a affiner)
291
292 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
293 pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
294 pctsrf_pot(:, is_oce) = 1. - zmasq
295 pctsrf_pot(:, is_sic) = 1. - zmasq
296
297 ! Tester si c'est le moment de lire le fichier:
298 if (mod(itap - 1, lmt_pas) == 0) then
299 CALL interfoce_lim(jour, pctsrf_new_oce, pctsrf_new_sic)
300 endif
301
302 ! Boucler sur toutes les sous-fractions du sol:
303
304 loop_surface: DO nsrf = 1, nbsrf
305 ! Chercher les indices :
306 ni = 0
307 knon = 0
308 DO i = 1, klon
309 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
310 ! "potentielles"
311 IF (pctsrf_pot(i, nsrf) > epsfra) THEN
312 knon = knon + 1
313 ni(knon) = i
314 END IF
315 END DO
316
317 if_knon: IF (knon /= 0) then
318 DO j = 1, knon
319 i = ni(j)
320 ypct(j) = pctsrf(i, nsrf)
321 yts(j) = ftsol(i, nsrf)
322 ysnow(j) = snow(i, nsrf)
323 yqsurf(j) = qsurf(i, nsrf)
324 yalb(j) = falbe(i, nsrf)
325 yrain_f(j) = rain_fall(i)
326 ysnow_f(j) = snow_f(i)
327 yagesno(j) = agesno(i, nsrf)
328 yfder(j) = fder(i)
329 yrugos(j) = rugos(i, nsrf)
330 yrugoro(j) = rugoro(i)
331 yu1(j) = u1lay(i)
332 yv1(j) = v1lay(i)
333 yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
334 ypaprs(j, klev+1) = paprs(i, klev+1)
335 y_run_off_lic_0(j) = run_off_lic_0(i)
336 END DO
337
338 ! For continent, copy soil water content
339 IF (nsrf == is_ter) THEN
340 yqsol(:knon) = qsol(ni(:knon))
341 ELSE
342 yqsol = 0.
343 END IF
344
345 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
346
347 DO k = 1, klev
348 DO j = 1, knon
349 i = ni(j)
350 ypaprs(j, k) = paprs(i, k)
351 ypplay(j, k) = pplay(i, k)
352 ydelp(j, k) = delp(i, k)
353 yu(j, k) = u(i, k)
354 yv(j, k) = v(i, k)
355 yt(j, k) = t(i, k)
356 yq(j, k) = q(i, k)
357 END DO
358 END DO
359
360 ! calculer Cdrag et les coefficients d'echange
361 CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts, yrugos, yu, &
362 yv, yt, yq, yqsurf, coefm(:knon, :), coefh(:knon, :))
363 IF (iflag_pbl == 1) THEN
364 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
365 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
366 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
367 END IF
368
369 ! on met un seuil pour coefm et coefh
370 IF (nsrf == is_oce) THEN
371 coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
372 coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
373 END IF
374
375 IF (ok_kzmin) THEN
376 ! Calcul d'une diffusion minimale pour les conditions tres stables
377 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
378 coefm(:knon, 1), ycoefm0, ycoefh0)
379 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
380 coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
381 END IF
382
383 IF (iflag_pbl >= 3) THEN
384 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
385 ! Fr\'ed\'eric Hourdin
386 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
387 + ypplay(:knon, 1))) &
388 * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
389 DO k = 2, klev
390 yzlay(1:knon, k) = yzlay(1:knon, k-1) &
391 + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
392 / ypaprs(1:knon, k) &
393 * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
394 END DO
395 DO k = 1, klev
396 yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
397 / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
398 END DO
399 yzlev(1:knon, 1) = 0.
400 yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
401 - yzlay(:knon, klev - 1)
402 DO k = 2, klev
403 yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
404 END DO
405 DO k = 1, klev + 1
406 DO j = 1, knon
407 i = ni(j)
408 yq2(j, k) = q2(i, k, nsrf)
409 END DO
410 END DO
411
412 CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
413 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
414
415 ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
416
417 IF (iflag_pbl >= 11) THEN
418 CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
419 yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
420 iflag_pbl)
421 ELSE
422 CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
423 coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
424 END IF
425
426 coefm(:knon, 2:) = ykmm(:knon, 2:klev)
427 coefh(:knon, 2:) = ykmn(:knon, 2:klev)
428 END IF
429
430 ! calculer la diffusion des vitesses "u" et "v"
431 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
432 ypplay, ydelp, y_d_u, y_flux_u(:knon))
433 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
434 ypplay, ydelp, y_d_v, y_flux_v(:knon))
435
436 ! calculer la diffusion de "q" et de "h"
437 CALL clqh(dtime, jour, firstcal, nsrf, ni(:knon), ytsoil(:knon, :), &
438 yqsol, mu0, yrugos, yrugoro, yu1, yv1, coefh(:knon, :), yt, &
439 yq, yts(:knon), ypaprs, ypplay, ydelp, yrads, yalb(:knon), &
440 ysnow, yqsurf, yrain_f, ysnow_f, yfder, yfluxlat(:knon), &
441 pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, y_d_ts(:knon), &
442 yz0_new, y_flux_t(:knon), y_flux_q(:knon), y_dflux_t, &
443 y_dflux_q, y_fqcalving, y_ffonte, y_run_off_lic_0)
444
445 ! calculer la longueur de rugosite sur ocean
446 yrugm = 0.
447 IF (nsrf == is_oce) THEN
448 DO j = 1, knon
449 yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
450 0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
451 yrugm(j) = max(1.5E-05, yrugm(j))
452 END DO
453 END IF
454 DO j = 1, knon
455 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
456 y_dflux_q(j) = y_dflux_q(j)*ypct(j)
457 yu1(j) = yu1(j)*ypct(j)
458 yv1(j) = yv1(j)*ypct(j)
459 END DO
460
461 DO k = 1, klev
462 DO j = 1, knon
463 i = ni(j)
464 coefh(j, k) = coefh(j, k)*ypct(j)
465 coefm(j, k) = coefm(j, k)*ypct(j)
466 y_d_t(j, k) = y_d_t(j, k)*ypct(j)
467 y_d_q(j, k) = y_d_q(j, k)*ypct(j)
468 y_d_u(j, k) = y_d_u(j, k)*ypct(j)
469 y_d_v(j, k) = y_d_v(j, k)*ypct(j)
470 END DO
471 END DO
472
473 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
474 flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
475 flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
476 flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
477
478 evap(:, nsrf) = -flux_q(:, nsrf)
479
480 falbe(:, nsrf) = 0.
481 snow(:, nsrf) = 0.
482 qsurf(:, nsrf) = 0.
483 rugos(:, nsrf) = 0.
484 DO j = 1, knon
485 i = ni(j)
486 d_ts(i, nsrf) = y_d_ts(j)
487 falbe(i, nsrf) = yalb(j)
488 snow(i, nsrf) = ysnow(j)
489 qsurf(i, nsrf) = yqsurf(j)
490 rugos(i, nsrf) = yz0_new(j)
491 fluxlat(i, nsrf) = yfluxlat(j)
492 IF (nsrf == is_oce) THEN
493 rugmer(i) = yrugm(j)
494 rugos(i, nsrf) = yrugm(j)
495 END IF
496 agesno(i, nsrf) = yagesno(j)
497 fqcalving(i, nsrf) = y_fqcalving(j)
498 ffonte(i, nsrf) = y_ffonte(j)
499 cdragh(i) = cdragh(i) + coefh(j, 1)
500 cdragm(i) = cdragm(i) + coefm(j, 1)
501 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
502 dflux_q(i) = dflux_q(i) + y_dflux_q(j)
503 zu1(i) = zu1(i) + yu1(j)
504 zv1(i) = zv1(i) + yv1(j)
505 END DO
506 IF (nsrf == is_ter) THEN
507 qsol(ni(:knon)) = yqsol(:knon)
508 else IF (nsrf == is_lic) THEN
509 DO j = 1, knon
510 i = ni(j)
511 run_off_lic_0(i) = y_run_off_lic_0(j)
512 END DO
513 END IF
514
515 ftsoil(:, :, nsrf) = 0.
516 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
517
518 DO j = 1, knon
519 i = ni(j)
520 DO k = 1, klev
521 d_t(i, k) = d_t(i, k) + y_d_t(j, k)
522 d_q(i, k) = d_q(i, k) + y_d_q(j, k)
523 d_u(i, k) = d_u(i, k) + y_d_u(j, k)
524 d_v(i, k) = d_v(i, k) + y_d_v(j, k)
525 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
526 END DO
527 END DO
528
529 ! diagnostic t, q a 2m et u, v a 10m
530
531 DO j = 1, knon
532 i = ni(j)
533 uzon(j) = yu(j, 1) + y_d_u(j, 1)
534 vmer(j) = yv(j, 1) + y_d_v(j, 1)
535 tair1(j) = yt(j, 1) + y_d_t(j, 1)
536 qair1(j) = yq(j, 1) + y_d_q(j, 1)
537 zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
538 1)))*(ypaprs(j, 1)-ypplay(j, 1))
539 tairsol(j) = yts(j) + y_d_ts(j)
540 rugo1(j) = yrugos(j)
541 IF (nsrf == is_oce) THEN
542 rugo1(j) = rugos(i, nsrf)
543 END IF
544 psfce(j) = ypaprs(j, 1)
545 patm(j) = ypplay(j, 1)
546
547 qairsol(j) = yqsurf(j)
548 END DO
549
550 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
551 zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
552 yt10m, yq10m, yu10m, yustar)
553
554 DO j = 1, knon
555 i = ni(j)
556 t2m(i, nsrf) = yt2m(j)
557 q2m(i, nsrf) = yq2m(j)
558
559 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
560 u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
561 v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
562 END DO
563
564 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t(:knon), &
565 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
566 yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
567
568 DO j = 1, knon
569 i = ni(j)
570 pblh(i, nsrf) = ypblh(j)
571 plcl(i, nsrf) = ylcl(j)
572 capcl(i, nsrf) = ycapcl(j)
573 oliqcl(i, nsrf) = yoliqcl(j)
574 cteicl(i, nsrf) = ycteicl(j)
575 pblt(i, nsrf) = ypblt(j)
576 therm(i, nsrf) = ytherm(j)
577 trmb1(i, nsrf) = ytrmb1(j)
578 trmb2(i, nsrf) = ytrmb2(j)
579 trmb3(i, nsrf) = ytrmb3(j)
580 END DO
581
582 DO j = 1, knon
583 DO k = 1, klev + 1
584 i = ni(j)
585 q2(i, k, nsrf) = yq2(j, k)
586 END DO
587 END DO
588 end IF if_knon
589 END DO loop_surface
590
591 ! On utilise les nouvelles surfaces
592 rugos(:, is_oce) = rugmer
593 pctsrf(:, is_oce) = pctsrf_new_oce
594 pctsrf(:, is_sic) = pctsrf_new_sic
595
596 firstcal = .false.
597
598 END SUBROUTINE clmain
599
600 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21