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

Annotation of /trunk/phylmd/Interface_surf/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 279 - (hide annotations)
Fri Jul 20 14:30:23 2018 UTC (5 years, 9 months ago) by guez
Original Path: trunk/phylmd/pbl_surface.f
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 guez 267 module pbl_surface_m
2 guez 3
3 guez 38 IMPLICIT NONE
4 guez 3
5 guez 38 contains
6 guez 3
7 guez 267 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 guez 252 oliqcl, cteicl, pblt, therm, plcl, fqcalving, ffonte, run_off_lic_0)
13 guez 3
14 guez 99 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
15 guez 279 ! Author: Z. X. Li (LMD/CNRS), date: 1993 Aug. 18th
16 guez 62 ! Objet : interface de couche limite (diffusion verticale)
17 guez 3
18 guez 62 ! 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 guez 145 ! ne tient pas compte de la diff\'erentiation des sous-fractions
21     ! de sol.
22 guez 3
23 guez 275 use cdrag_m, only: cdrag
24 guez 49 use clqh_m, only: clqh
25 guez 62 use clvent_m, only: clvent
26 guez 250 use coef_diff_turb_m, only: coef_diff_turb
27 guez 227 USE conf_gcm_m, ONLY: lmt_pas
28 guez 62 USE conf_phys_m, ONLY: iflag_pbl
29 guez 276 USE dimphy, ONLY: klev, klon
30 guez 62 USE dimsoil, ONLY: nsoilmx
31 guez 47 use hbtm_m, only: hbtm
32 guez 62 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
33 guez 202 USE interfoce_lim_m, ONLY: interfoce_lim
34 guez 276 use phyetat0_m, only: zmasq
35 guez 104 use stdlevvar_m, only: stdlevvar
36 guez 250 USE suphec_m, ONLY: rd, rg
37 guez 202 use time_phylmdz, only: itap
38 guez 15
39 guez 62 REAL, INTENT(IN):: dtime ! interval du temps (secondes)
40 guez 202
41 guez 62 REAL, INTENT(inout):: pctsrf(klon, nbsrf)
42 guez 202 ! tableau des pourcentages de surface de chaque maille
43 guez 62
44     REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
45 guez 225 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
46 guez 62 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
47 guez 221 INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
48 guez 213 REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal
49 guez 222 REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
50 guez 71 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
51 guez 101
52 guez 118 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
53     ! soil temperature of surface fraction
54    
55 guez 225 REAL, INTENT(inout):: qsol(:) ! (klon)
56 guez 101 ! column-density of water in soil, in kg m-2
57    
58 guez 225 REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
59 guez 62 REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
60 guez 215 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
61 guez 70 REAL qsurf(klon, nbsrf)
62     REAL evap(klon, nbsrf)
63 guez 155 REAL, intent(inout):: falbe(klon, nbsrf)
64 guez 214 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
65 guez 70
66 guez 101 REAL, intent(in):: rain_fall(klon)
67 guez 225 ! liquid water mass flux (kg / m2 / s), positive down
68 guez 101
69     REAL, intent(in):: snow_f(klon)
70 guez 225 ! solid water mass flux (kg / m2 / s), positive down
71 guez 101
72 guez 222 REAL, INTENT(IN):: fsolsw(klon, nbsrf), fsollw(klon, nbsrf)
73     REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
74 guez 70 real agesno(klon, nbsrf)
75     REAL, INTENT(IN):: rugoro(klon)
76    
77 guez 279 REAL, intent(out):: d_t(klon, klev), d_q(klon, klev)
78     ! changement pour t et q
79 guez 62
80     REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
81     ! changement pour "u" et "v"
82    
83 guez 221 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
84 guez 70
85 guez 206 REAL, intent(out):: flux_t(klon, nbsrf)
86 guez 225 ! flux de chaleur sensible (Cp T) (W / m2) (orientation positive vers
87 guez 206 ! le bas) à la surface
88 guez 70
89 guez 206 REAL, intent(out):: flux_q(klon, nbsrf)
90 guez 225 ! flux de vapeur d'eau (kg / m2 / s) à la surface
91 guez 70
92 guez 206 REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
93 guez 229 ! tension du vent (flux turbulent de vent) à la surface, en Pa
94 guez 206
95 guez 70 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
96 guez 225 real q2(klon, klev + 1, nbsrf)
97 guez 70
98 guez 99 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
99 guez 49 ! dflux_t derive du flux sensible
100     ! dflux_q derive du flux latent
101 guez 191 ! IM "slab" ocean
102 guez 70
103 guez 244 REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
104 guez 226 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
105 guez 244 ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
106 guez 226 ! ce champ sur les quatre sous-surfaces du mod\`ele.
107    
108 guez 221 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
109 guez 70
110 guez 225 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 guez 191 REAL pblh(klon, nbsrf) ! height of planetary boundary layer
117 guez 70 REAL capcl(klon, nbsrf)
118     REAL oliqcl(klon, nbsrf)
119     REAL cteicl(klon, nbsrf)
120 guez 221 REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
121 guez 70 REAL therm(klon, nbsrf)
122     REAL plcl(klon, nbsrf)
123 guez 279
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 guez 70 ! ffonte----Flux thermique utilise pour fondre la neige
130     REAL run_off_lic_0(klon)
131    
132     ! Local:
133 guez 15
134 guez 202 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 guez 70 REAL y_fqcalving(klon), y_ffonte(klon)
141     real y_run_off_lic_0(klon)
142     REAL rugmer(klon)
143 guez 38 REAL ytsoil(klon, nsoilmx)
144 guez 248 REAL yts(klon), ypct(klon), yz0_new(klon)
145     real yrugos(klon) ! longeur de rugosite (en m)
146 guez 38 REAL yalb(klon)
147 guez 215 REAL snow(klon), yqsurf(klon), yagesno(klon)
148 guez 225 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 guez 38 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 guez 206 REAL y_flux_t(klon), y_flux_q(klon)
157     REAL y_flux_u(klon), y_flux_v(klon)
158 guez 38 REAL y_dflux_t(klon), y_dflux_q(klon)
159 guez 244 REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
160 guez 237 real ycdragh(klon), ycdragm(klon)
161 guez 38 REAL yu(klon, klev), yv(klon, klev)
162     REAL yt(klon, klev), yq(klon, klev)
163 guez 225 REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
164     REAL yq2(klon, klev + 1)
165 guez 38 REAL delp(klon, klev)
166     INTEGER i, k, nsrf
167     INTEGER ni(klon), knon, j
168 guez 40
169 guez 38 REAL pctsrf_pot(klon, nbsrf)
170 guez 145 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
171 guez 40 ! apparitions ou disparitions de la glace de mer
172 guez 15
173 guez 227 REAL yt2m(klon), yq2m(klon), wind10m(klon)
174     REAL ustar(klon)
175 guez 15
176 guez 38 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 guez 227 REAL u1(klon), v1(klon)
185 guez 38 REAL tair1(klon), qair1(klon), tairsol(klon)
186     REAL psfce(klon), patm(klon)
187 guez 15
188 guez 38 REAL qairsol(klon), zgeo1(klon)
189     REAL rugo1(klon)
190 guez 248 REAL zgeop(klon, klev)
191 guez 15
192 guez 38 !------------------------------------------------------------
193 guez 15
194 guez 38 ytherm = 0.
195 guez 15
196 guez 38 DO k = 1, klev ! epaisseur de couche
197     DO i = 1, klon
198 guez 225 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
199 guez 38 END DO
200     END DO
201 guez 15
202 guez 40 ! 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 guez 38 yrugoro = 0.
223 guez 40 d_ts = 0.
224 guez 38 flux_t = 0.
225     flux_q = 0.
226     flux_u = 0.
227     flux_v = 0.
228 guez 214 fluxlat = 0.
229 guez 40 d_t = 0.
230     d_q = 0.
231     d_u = 0.
232     d_v = 0.
233 guez 244 coefh = 0.
234 guez 279 fqcalving = 0.
235 guez 15
236 guez 145 ! 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 guez 15
240 guez 202 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
241     pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
242 guez 38 pctsrf_pot(:, is_oce) = 1. - zmasq
243     pctsrf_pot(:, is_sic) = 1. - zmasq
244 guez 15
245 guez 202 ! Tester si c'est le moment de lire le fichier:
246     if (mod(itap - 1, lmt_pas) == 0) then
247 guez 221 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
248 guez 202 endif
249    
250 guez 99 ! Boucler sur toutes les sous-fractions du sol:
251    
252 guez 49 loop_surface: DO nsrf = 1, nbsrf
253     ! Chercher les indices :
254 guez 38 ni = 0
255     knon = 0
256     DO i = 1, klon
257 guez 145 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
258 guez 38 ! "potentielles"
259     IF (pctsrf_pot(i, nsrf) > epsfra) THEN
260     knon = knon + 1
261     ni(knon) = i
262     END IF
263     END DO
264 guez 15
265 guez 62 if_knon: IF (knon /= 0) then
266 guez 38 DO j = 1, knon
267     i = ni(j)
268 guez 62 ypct(j) = pctsrf(i, nsrf)
269 guez 207 yts(j) = ftsol(i, nsrf)
270 guez 215 snow(j) = fsnow(i, nsrf)
271 guez 62 yqsurf(j) = qsurf(i, nsrf)
272 guez 155 yalb(j) = falbe(i, nsrf)
273 guez 62 yrain_f(j) = rain_fall(i)
274     ysnow_f(j) = snow_f(i)
275     yagesno(j) = agesno(i, nsrf)
276 guez 222 yrugos(j) = frugs(i, nsrf)
277 guez 62 yrugoro(j) = rugoro(i)
278 guez 222 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
279 guez 225 ypaprs(j, klev + 1) = paprs(i, klev + 1)
280 guez 62 y_run_off_lic_0(j) = run_off_lic_0(i)
281 guez 38 END DO
282 guez 3
283 guez 99 ! For continent, copy soil water content
284 guez 225 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
285 guez 3
286 guez 208 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
287 guez 3
288 guez 38 DO k = 1, klev
289     DO j = 1, knon
290     i = ni(j)
291 guez 62 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 guez 38 END DO
299     END DO
300 guez 3
301 guez 248 ! Calculer les géopotentiels de chaque couche:
302 guez 228
303 guez 248 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 guez 275 CALL cdrag(nsrf, sqrt(yu(:knon, 1)**2 + yv(:knon, 1)**2), &
313 guez 272 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 guez 248
317 guez 249 IF (iflag_pbl == 1) THEN
318     ycdragm(:knon) = max(ycdragm(:knon), 0.)
319     ycdragh(:knon) = max(ycdragh(:knon), 0.)
320     end IF
321 guez 250
322 guez 249 ! 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 guez 250 IF (iflag_pbl >= 6) then
329 guez 62 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 guez 250 end IF
336 guez 62
337 guez 251 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 guez 3
342 guez 244 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
343 guez 237 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
344 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
345 guez 225 y_flux_u(:knon))
346 guez 244 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
347 guez 237 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
348 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
349 guez 225 y_flux_v(:knon))
350 guez 3
351 guez 62 ! calculer la diffusion de "q" et de "h"
352 guez 221 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
353 guez 225 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
354 guez 244 yu(:knon, 1), yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), &
355 guez 236 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 guez 279 y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving(:knon), &
360     y_ffonte, y_run_off_lic_0)
361 guez 3
362 guez 62 ! calculer la longueur de rugosite sur ocean
363     yrugm = 0.
364     IF (nsrf == is_oce) THEN
365     DO j = 1, knon
366 guez 237 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
367 guez 225 / rg + 0.11 * 14E-6 &
368 guez 237 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
369 guez 62 yrugm(j) = max(1.5E-05, yrugm(j))
370     END DO
371     END IF
372 guez 38 DO j = 1, knon
373 guez 225 y_dflux_t(j) = y_dflux_t(j) * ypct(j)
374     y_dflux_q(j) = y_dflux_q(j) * ypct(j)
375 guez 38 END DO
376 guez 3
377 guez 237 DO k = 1, klev
378     DO j = 1, knon
379     i = ni(j)
380 guez 225 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 guez 62 END DO
385 guez 38 END DO
386 guez 3
387 guez 214 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 guez 15
392 guez 206 evap(:, nsrf) = -flux_q(:, nsrf)
393    
394 guez 155 falbe(:, nsrf) = 0.
395 guez 215 fsnow(:, nsrf) = 0.
396 guez 62 qsurf(:, nsrf) = 0.
397 guez 222 frugs(:, nsrf) = 0.
398 guez 38 DO j = 1, knon
399     i = ni(j)
400 guez 62 d_ts(i, nsrf) = y_d_ts(j)
401 guez 155 falbe(i, nsrf) = yalb(j)
402 guez 215 fsnow(i, nsrf) = snow(j)
403 guez 62 qsurf(i, nsrf) = yqsurf(j)
404 guez 222 frugs(i, nsrf) = yz0_new(j)
405 guez 62 fluxlat(i, nsrf) = yfluxlat(j)
406     IF (nsrf == is_oce) THEN
407     rugmer(i) = yrugm(j)
408 guez 222 frugs(i, nsrf) = yrugm(j)
409 guez 62 END IF
410     agesno(i, nsrf) = yagesno(j)
411     fqcalving(i, nsrf) = y_fqcalving(j)
412     ffonte(i, nsrf) = y_ffonte(j)
413 guez 243 cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
414     cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
415 guez 62 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
416     dflux_q(i) = dflux_q(i) + y_dflux_q(j)
417 guez 38 END DO
418 guez 62 IF (nsrf == is_ter) THEN
419 guez 99 qsol(ni(:knon)) = yqsol(:knon)
420     else IF (nsrf == is_lic) THEN
421 guez 62 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 guez 118
427 guez 62 ftsoil(:, :, nsrf) = 0.
428 guez 208 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
429 guez 62
430 guez 38 DO j = 1, knon
431     i = ni(j)
432 guez 62 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 guez 237 END DO
438     END DO
439 guez 62
440 guez 244 forall (k = 2:klev) coefh(ni(:knon), k) &
441     = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
442 guez 242
443 guez 99 ! diagnostic t, q a 2m et u, v a 10m
444 guez 62
445 guez 38 DO j = 1, knon
446     i = ni(j)
447 guez 227 u1(j) = yu(j, 1) + y_d_u(j, 1)
448     v1(j) = yv(j, 1) + y_d_v(j, 1)
449 guez 62 tair1(j) = yt(j, 1) + y_d_t(j, 1)
450     qair1(j) = yq(j, 1) + y_d_q(j, 1)
451 guez 225 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
452     1))) * (ypaprs(j, 1)-ypplay(j, 1))
453 guez 62 tairsol(j) = yts(j) + y_d_ts(j)
454     rugo1(j) = yrugos(j)
455     IF (nsrf == is_oce) THEN
456 guez 222 rugo1(j) = frugs(i, nsrf)
457 guez 62 END IF
458     psfce(j) = ypaprs(j, 1)
459     patm(j) = ypplay(j, 1)
460 guez 15
461 guez 62 qairsol(j) = yqsurf(j)
462 guez 38 END DO
463 guez 15
464 guez 272 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 guez 3
468 guez 62 DO j = 1, knon
469     i = ni(j)
470     t2m(i, nsrf) = yt2m(j)
471     q2m(i, nsrf) = yq2m(j)
472 guez 3
473 guez 227 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 guez 62 END DO
478 guez 15
479 guez 227 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
480 guez 206 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
481 guez 252 yoliqcl, ycteicl, ypblt, ytherm, ylcl)
482 guez 15
483 guez 38 DO j = 1, knon
484     i = ni(j)
485 guez 62 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 guez 38 END DO
493 guez 3
494 guez 38 DO j = 1, knon
495 guez 62 DO k = 1, klev + 1
496     i = ni(j)
497     q2(i, k, nsrf) = yq2(j, k)
498     END DO
499 guez 38 END DO
500 guez 215 else
501     fsnow(:, nsrf) = 0.
502 guez 62 end IF if_knon
503 guez 49 END DO loop_surface
504 guez 15
505 guez 38 ! On utilise les nouvelles surfaces
506 guez 222 frugs(:, is_oce) = rugmer
507 guez 202 pctsrf(:, is_oce) = pctsrf_new_oce
508     pctsrf(:, is_sic) = pctsrf_new_sic
509 guez 15
510 guez 202 firstcal = .false.
511    
512 guez 267 END SUBROUTINE pbl_surface
513 guez 15
514 guez 267 end module pbl_surface_m

  ViewVC Help
Powered by ViewVC 1.1.21