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

Contents of /trunk/phylmd/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 279 - (show annotations)
Fri Jul 20 14:30:23 2018 UTC (5 years, 10 months ago) by guez
File size: 17916 byte(s)
fqcalving was saved in physiq and had intent inout in pbl_surface. So
we could set fqcalving to 0 only once per run. The point is fqcalving
must be defined everywhere for the computation of the average over all
surfaces, even values that get multiplied by pctsrf = 0. I find it
clearer to set fqcalving to 0 at every call of pbl_surface. This is
more expensive but allows to give intent out to fqcalving in
pbl_surface and remove the save attribute in physiq.

Add zxfqcalving output netCDF variable (following LMDZ).

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

  ViewVC Help
Powered by ViewVC 1.1.21