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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 298 - (show annotations)
Thu Jul 26 16:45:51 2018 UTC (5 years, 10 months ago) by guez
File size: 17737 byte(s)
Use directly dtphys from module comconst when possible instead of
having it trickle down through procedure arguments.

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

  ViewVC Help
Powered by ViewVC 1.1.21