/[MITgcm]/MITgcm/pkg/kpp/kpp_forcing_surf.F
ViewVC logotype

Contents of /MITgcm/pkg/kpp/kpp_forcing_surf.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (show annotations) (download)
Fri Dec 21 02:54:34 2007 UTC (16 years, 5 months ago) by atn
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59m, checkpoint59o, checkpoint59n, checkpoint61f, checkpoint61g, checkpoint61d, checkpoint61e, checkpoint61b, checkpoint61c, checkpoint61a, checkpoint61n, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61q
Changes since 1.2: +26 -8 lines
o pkg/kpp: added saltplume diagnostics

1 C $Header: /u/gcmpack/MITgcm/pkg/kpp/kpp_forcing_surf.F,v 1.2 2007/09/22 17:55:32 dimitri Exp $
2 C $Name: $
3
4 #include "KPP_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: KPP_FORCING_SURF
8
9 C !INTERFACE: ==========================================================
10 SUBROUTINE KPP_FORCING_SURF(
11 I rhoSurf, surfForcU, surfForcV,
12 I surfForcT, surfForcS, surfForcTice,
13 I Qsw,
14 #ifdef ALLOW_SALT_PLUME
15 I saltPlumeFlux,
16 #endif /* ALLOW_SALT_PLUME */
17 I ttalpha, ssbeta,
18 O ustar, bo, bosol,
19 #ifdef ALLOW_SALT_PLUME
20 O boplume,
21 #endif /* ALLOW_SALT_PLUME */
22 O dVsq,
23 I ikppkey, iMin, iMax, jMin, jMax, bi, bj, myTime, myThid )
24
25 C !DESCRIPTION: \bv
26 C /==========================================================\
27 C | SUBROUTINE KPP_FORCING_SURF |
28 C | o Compute all surface related KPP fields: |
29 C | - friction velocity ustar |
30 C | - turbulent and radiative surface buoyancy forcing, |
31 C | bo and bosol, and surface haline buoyancy forcing |
32 C | boplume |
33 C | - velocity shear relative to surface squared (this is |
34 C | not really a surface affected quantity unless it is |
35 C | computed with respect to some resolution independent |
36 C | reference level, that is KPP_ESTIMATE_UREF defined ) |
37 C |==========================================================|
38 C \==========================================================/
39 IMPLICIT NONE
40
41 c taux / rho = surfForcU (N/m^2)
42 c tauy / rho = surfForcV (N/m^2)
43 c ustar = sqrt( sqrt( taux^2 + tauy^2 ) / rho ) (m/s)
44 c bo = - g * ( alpha*surfForcT +
45 c beta *surfForcS ) / rho (m^2/s^3)
46 c bosol = - g * alpha * Qsw * drF(1) / rho (m^2/s^3)
47 c boplume = g * ( beta *saltPlumeFlux/rhoConst )/rho (m^2/s^3)
48 c------------------------------------------------------------------------
49
50 c \ev
51
52 C !USES: ===============================================================
53 #include "SIZE.h"
54 #include "EEPARAMS.h"
55 #include "PARAMS.h"
56 #include "GRID.h"
57 #include "DYNVARS.h"
58 #include "KPP_PARAMS.h"
59
60 C !INPUT PARAMETERS: ===================================================
61 C Routine arguments
62 C ikppkeyb - key for storing trajectory for adjoint (taf)
63 c imin, imax, jmin, jmax - array computation indices
64 C bi, bj - array indices on which to apply calculations
65 C myTime - Current time in simulation
66 C myThid - Current thread id
67 c rhoSurf- density of surface layer (kg/m^3)
68 C surfForcU units are r_unit.m/s^2 (=m^2/s^2 if r=z)
69 C surfForcV units are r_unit.m/s^2 (=m^2/s^-2 if r=z)
70 C surfForcS units are r_unit.psu/s (=psu.m/s if r=z)
71 C - EmPmR * S_surf plus salinity relaxation*drF(1)
72 C surfForcT units are r_unit.Kelvin/s (=Kelvin.m/s if r=z)
73 C - Qnet (+Qsw) plus temp. relaxation*drF(1)
74 C -> calculate -lambda*(T(model)-T(clim))
75 C Qnet assumed to be net heat flux including ShortWave rad.
76 C surfForcTice
77 C - equivalent Temperature flux in the top level that corresponds
78 C to the melting or freezing of sea-ice.
79 C Note that the surface level temperature is modified
80 C directly by the sea-ice model in order to maintain
81 C water temperature under sea-ice at the freezing
82 C point. But we need to keep track of the
83 C equivalent amount of heat that this surface-level
84 C temperature change implies because it is used by
85 C the KPP package (kpp_calc.F and kpp_transport_t.F).
86 C Units are r_unit.K/s (=Kelvin.m/s if r=z) (>0 for ocean warming).
87 C
88 C Qsw - surface shortwave radiation (upwards positive)
89 C saltPlumeFlux - salt rejected during freezing (downward = positive)
90 C ttalpha - thermal expansion coefficient without 1/rho factor
91 C d(rho{k,k})/d(T(k)) (kg/m^3/C)
92 C ssbeta - salt expansion coefficient without 1/rho factor
93 C d(rho{k,k})/d(S(k)) (kg/m^3/PSU)
94 C !OUTPUT PARAMETERS:
95 C ustar (nx,ny) - surface friction velocity (m/s)
96 C bo (nx,ny) - surface turbulent buoyancy forcing (m^2/s^3)
97 C bosol (nx,ny) - surface radiative buoyancy forcing (m^2/s^3)
98 C boplume(nx,ny) - surface haline buoyancy forcing (m^2/s^3)
99 C dVsq (nx,ny,Nr) - velocity shear re surface squared
100 C at grid levels for bldepth (m^2/s^2)
101
102 INTEGER ikppkey
103 INTEGER iMin, iMax, jMin, jMax
104 INTEGER bi, bj
105 INTEGER myThid
106 _RL myTime
107
108 _RL rhoSurf (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
109 _RL surfForcU (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
110 _RL surfForcV (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
111 _RL surfForcT (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
112 _RL surfForcS (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
113 _RL surfForcTice(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
114 _RL Qsw (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
115 _RL TTALPHA (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nrp1)
116 _RL SSBETA (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nrp1)
117
118 _RL ustar ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
119 _RL bo ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
120 _RL bosol ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
121 #ifdef ALLOW_SALT_PLUME
122 _RL saltPlumeFlux (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
123 _RL boplume(1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
124 #endif /* ALLOW_SALT_PLUME */
125 _RL dVsq ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy, Nr )
126
127 C !LOCAL VARIABLES: ====================================================
128 c Local constants
129 c minusone, p0, p5, p25, p125, p0625
130 _RL p0 , p5 , p125
131 parameter( p0=0.0, p5=0.5, p125=0.125 )
132 integer i, j, k, im1, ip1, jm1, jp1
133 _RL tempvar2
134
135 _RL work3 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
136
137 #ifdef KPP_ESTIMATE_UREF
138 _RL tempvar1, dBdz1, dBdz2, ustarX, ustarY
139 _RL z0 ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
140 _RL zRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
141 _RL uRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
142 _RL vRef ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy )
143 #endif
144 CEOP
145
146 c------------------------------------------------------------------------
147 c friction velocity, turbulent and radiative surface buoyancy forcing
148 c -------------------------------------------------------------------
149 c taux / rho = surfForcU (N/m^2)
150 c tauy / rho = surfForcV (N/m^2)
151 c ustar = sqrt( sqrt( taux^2 + tauy^2 ) / rho ) (m/s)
152 c bo = - g * ( alpha*surfForcT +
153 c beta *surfForcS ) / rho (m^2/s^3)
154 c bosol = - g * alpha * Qsw * drF(1) / rho (m^2/s^3)
155 c boplume = g * ( beta *saltPlumeFlux/rhoConst )/rho (m^2/s^3)
156 c------------------------------------------------------------------------
157
158 c initialize arrays to zero
159 DO j = 1-OLy, sNy+OLy
160 DO i = 1-OLx, sNx+OLx
161 ustar(i,j) = p0
162 bo (I,J) = p0
163 bosol(I,J) = p0
164 #ifdef ALLOW_SALT_PLUME
165 boplume(I,J) = p0
166 #endif /* ALLOW_SALT_PLUME */
167 END DO
168 END DO
169
170 DO j = jmin, jmax
171 jp1 = j + 1
172 DO i = imin, imax
173 ip1 = i+1
174 work3(i,j) =
175 & (surfForcU(i,j,bi,bj) + surfForcU(ip1,j,bi,bj)) *
176 & (surfForcU(i,j,bi,bj) + surfForcU(ip1,j,bi,bj)) +
177 & (surfForcV(i,j,bi,bj) + surfForcV(i,jp1,bi,bj)) *
178 & (surfForcV(i,j,bi,bj) + surfForcV(i,jp1,bi,bj))
179 END DO
180 END DO
181 cph(
182 CADJ store work3 = comlev1_kpp, key = ikppkey
183 cph)
184 DO j = jmin, jmax
185 jp1 = j + 1
186 DO i = imin, imax
187 ip1 = i+1
188
189 if ( work3(i,j) .lt. (phepsi*phepsi*drF(1)*drF(1)) ) then
190 ustar(i,j) = SQRT( phepsi * p5 * drF(1) )
191 else
192 tempVar2 = SQRT( work3(i,j) ) * p5
193 ustar(i,j) = SQRT( tempVar2 )
194 endif
195
196 END DO
197 END DO
198
199 DO j = jmin, jmax
200 jp1 = j + 1
201 DO i = imin, imax
202 ip1 = i+1
203 bo(I,J) = - gravity *
204 & ( TTALPHA(I,J,1) * (surfForcT(i,j,bi,bj)+
205 & surfForcTice(i,j,bi,bj)) +
206 & SSBETA(I,J,1) * surfForcS(i,j,bi,bj) )
207 & / rhoSurf(I,J)
208 bosol(I,J) = gravity * TTALPHA(I,J,1) * Qsw(i,j,bi,bj) *
209 & recip_Cp*recip_rhoConst
210 & / rhoSurf(I,J)
211 END DO
212 END DO
213
214 #ifdef ALLOW_SALT_PLUME
215 IF ( useSALT_PLUME ) THEN
216 DO j = jmin, jmax
217 jp1 = j + 1
218 DO i = imin, imax
219 ip1 = i+1
220 boplume(I,J) = - gravity * SSBETA(I,J,1)
221 & * saltPlumeFlux(i,j,bi,bj)
222 & * recip_rhoConst / rhoSurf(I,J)
223 END DO
224 END DO
225 ENDIF
226 #endif /* ALLOW_SALT_PLUME */
227
228 cph(
229 CADJ store ustar = comlev1_kpp, key = ikppkey
230 cph)
231
232 #ifdef ALLOW_DIAGNOSTICS
233 IF ( useDiagnostics ) THEN
234 CALL DIAGNOSTICS_FILL(bo ,'KPPbo ',0,1,1,bi,bj,myThid)
235 CALL DIAGNOSTICS_FILL(bosol ,'KPPbosol',0,1,1,bi,bj,myThid)
236 #ifdef ALLOW_SALT_PLUME
237 CALL DIAGNOSTICS_FILL(boplume,'KPPboplm',0,1,1,bi,bj,myThid)
238 #endif /* ALLOW_SALT_PLUME */
239 ENDIF
240 #endif /* ALLOW_DIAGNOSTICS */
241
242 c------------------------------------------------------------------------
243 c velocity shear
244 c --------------
245 c Get velocity shear squared, averaged from "u,v-grid"
246 c onto "t-grid" (in (m/s)**2):
247 c dVsq(k)=(Uref-U(k))**2+(Vref-V(k))**2 at grid levels
248 c------------------------------------------------------------------------
249
250 c initialize arrays to zero
251 DO k = 1, Nr
252 DO j = 1-OLy, sNy+OLy
253 DO i = 1-OLx, sNx+OLx
254 dVsq(i,j,k) = p0
255 END DO
256 END DO
257 END DO
258
259 c dVsq computation
260
261 #ifdef KPP_ESTIMATE_UREF
262
263 c Get rid of vertical resolution dependence of dVsq term by
264 c estimating a surface velocity that is independent of first level
265 c thickness in the model. First determine mixed layer depth hMix.
266 c Second zRef = espilon * hMix. Third determine roughness length
267 c scale z0. Third estimate reference velocity.
268
269 DO j = jmin, jmax
270 jp1 = j + 1
271 DO i = imin, imax
272 ip1 = i + 1
273
274 c Determine mixed layer depth hMix as the shallowest depth at which
275 c dB/dz exceeds 5.2e-5 s^-2.
276 work1(i,j) = nzmax(i,j,bi,bj)
277 DO k = 1, Nr
278 IF ( k .LT. nzmax(i,j,bi,bj) .AND.
279 & maskC(I,J,k,bi,bj) .GT. 0. .AND.
280 & dbloc(i,j,k) / drC(k+1) .GT. dB_dz )
281 & work1(i,j) = k
282 ENDDO
283
284 c Linearly interpolate to find hMix.
285 k = work1(i,j)
286 IF ( k .EQ. 0 .OR. nzmax(i,j,bi,bj) .EQ. 1 ) THEN
287 zRef(i,j) = p0
288 ELSEIF ( k .EQ. 1) THEN
289 dBdz2 = dbloc(i,j,1) / drC(2)
290 zRef(i,j) = drF(1) * dB_dz / dBdz2
291 ELSEIF ( k .LT. nzmax(i,j,bi,bj) ) THEN
292 dBdz1 = dbloc(i,j,k-1) / drC(k )
293 dBdz2 = dbloc(i,j,k ) / drC(k+1)
294 zRef(i,j) = rF(k) + drF(k) * (dB_dz - dBdz1) /
295 & MAX ( phepsi, dBdz2 - dBdz1 )
296 ELSE
297 zRef(i,j) = rF(k+1)
298 ENDIF
299
300 c Compute roughness length scale z0 subject to 0 < z0
301 tempVar1 = p5 * (
302 & (uVel(i, j, 1,bi,bj)-uVel(i, j, 2,bi,bj)) *
303 & (uVel(i, j, 1,bi,bj)-uVel(i, j, 2,bi,bj)) +
304 & (uVel(ip1,j, 1,bi,bj)-uVel(ip1,j, 2,bi,bj)) *
305 & (uVel(ip1,j, 1,bi,bj)-uVel(ip1,j, 2,bi,bj)) +
306 & (vVel(i, j, 1,bi,bj)-vVel(i, j, 2,bi,bj)) *
307 & (vVel(i, j, 1,bi,bj)-vVel(i, j, 2,bi,bj)) +
308 & (vVel(i, jp1,1,bi,bj)-vVel(i, jp1,2,bi,bj)) *
309 & (vVel(i, jp1,1,bi,bj)-vVel(i, jp1,2,bi,bj)) )
310 IF ( tempVar1 .lt. (epsln*epsln) ) THEN
311 tempVar2 = epsln
312 ELSE
313 tempVar2 = SQRT ( tempVar1 )
314 ENDIF
315 z0(i,j) = rF(2) *
316 & ( rF(3) * LOG ( rF(3) / rF(2) ) /
317 & ( rF(3) - rF(2) ) -
318 & tempVar2 * vonK /
319 & MAX ( ustar(i,j), phepsi ) )
320 z0(i,j) = MAX ( z0(i,j), phepsi )
321
322 c zRef is set to 0.1 * hMix subject to z0 <= zRef <= drF(1)
323 zRef(i,j) = MAX ( epsilon * zRef(i,j), z0(i,j) )
324 zRef(i,j) = MIN ( zRef(i,j), drF(1) )
325
326 c Estimate reference velocity uRef and vRef.
327 uRef(i,j) = p5 * ( uVel(i,j,1,bi,bj) + uVel(ip1,j,1,bi,bj) )
328 vRef(i,j) = p5 * ( vVel(i,j,1,bi,bj) + vVel(i,jp1,1,bi,bj) )
329 IF ( zRef(i,j) .LT. drF(1) ) THEN
330 ustarX = ( surfForcU(i, j,bi,bj) +
331 & surfForcU(ip1,j,bi,bj) ) * p5 *recip_drF(1)
332 ustarY = ( surfForcV(i,j, bi,bj) +
333 & surfForcV(i,jp1,bi,bj) ) * p5 *recip_drF(1)
334 tempVar1 = ustarX * ustarX + ustarY * ustarY
335 if ( tempVar1 .lt. (epsln*epsln) ) then
336 tempVar2 = epsln
337 else
338 tempVar2 = SQRT ( tempVar1 )
339 endif
340 tempVar2 = ustar(i,j) *
341 & ( LOG ( zRef(i,j) / rF(2) ) +
342 & z0(i,j) / zRef(i,j) - z0(i,j) / rF(2) ) /
343 & vonK / tempVar2
344 uRef(i,j) = uRef(i,j) + ustarX * tempVar2
345 vRef(i,j) = vRef(i,j) + ustarY * tempVar2
346 ENDIF
347
348 ENDDO
349 ENDDO
350
351 DO k = 1, Nr
352 DO j = jmin, jmax
353 jm1 = j - 1
354 jp1 = j + 1
355 DO i = imin, imax
356 im1 = i - 1
357 ip1 = i + 1
358 dVsq(i,j,k) = p5 * (
359 $ (uRef(i,j) - uVel(i, j, k,bi,bj)) *
360 $ (uRef(i,j) - uVel(i, j, k,bi,bj)) +
361 $ (uRef(i,j) - uVel(ip1,j, k,bi,bj)) *
362 $ (uRef(i,j) - uVel(ip1,j, k,bi,bj)) +
363 $ (vRef(i,j) - vVel(i, j, k,bi,bj)) *
364 $ (vRef(i,j) - vVel(i, j, k,bi,bj)) +
365 $ (vRef(i,j) - vVel(i, jp1,k,bi,bj)) *
366 $ (vRef(i,j) - vVel(i, jp1,k,bi,bj)) )
367 #ifdef KPP_SMOOTH_DVSQ
368 dVsq(i,j,k) = p5 * dVsq(i,j,k) + p125 * (
369 $ (uRef(i,j) - uVel(i, jm1,k,bi,bj)) *
370 $ (uRef(i,j) - uVel(i, jm1,k,bi,bj)) +
371 $ (uRef(i,j) - uVel(ip1,jm1,k,bi,bj)) *
372 $ (uRef(i,j) - uVel(ip1,jm1,k,bi,bj)) +
373 $ (uRef(i,j) - uVel(i, jp1,k,bi,bj)) *
374 $ (uRef(i,j) - uVel(i, jp1,k,bi,bj)) +
375 $ (uRef(i,j) - uVel(ip1,jp1,k,bi,bj)) *
376 $ (uRef(i,j) - uVel(ip1,jp1,k,bi,bj)) +
377 $ (vRef(i,j) - vVel(im1,j, k,bi,bj)) *
378 $ (vRef(i,j) - vVel(im1,j, k,bi,bj)) +
379 $ (vRef(i,j) - vVel(im1,jp1,k,bi,bj)) *
380 $ (vRef(i,j) - vVel(im1,jp1,k,bi,bj)) +
381 $ (vRef(i,j) - vVel(ip1,j, k,bi,bj)) *
382 $ (vRef(i,j) - vVel(ip1,j, k,bi,bj)) +
383 $ (vRef(i,j) - vVel(ip1,jp1,k,bi,bj)) *
384 $ (vRef(i,j) - vVel(ip1,jp1,k,bi,bj)) )
385 #endif /* KPP_SMOOTH_DVSQ */
386 ENDDO
387 ENDDO
388 ENDDO
389
390 #else /* KPP_ESTIMATE_UREF */
391
392 DO k = 1, Nr
393 DO j = jmin, jmax
394 jm1 = j - 1
395 jp1 = j + 1
396 DO i = imin, imax
397 im1 = i - 1
398 ip1 = i + 1
399 dVsq(i,j,k) = p5 * (
400 $ (uVel(i, j, 1,bi,bj)-uVel(i, j, k,bi,bj)) *
401 $ (uVel(i, j, 1,bi,bj)-uVel(i, j, k,bi,bj)) +
402 $ (uVel(ip1,j, 1,bi,bj)-uVel(ip1,j, k,bi,bj)) *
403 $ (uVel(ip1,j, 1,bi,bj)-uVel(ip1,j, k,bi,bj)) +
404 $ (vVel(i, j, 1,bi,bj)-vVel(i, j, k,bi,bj)) *
405 $ (vVel(i, j, 1,bi,bj)-vVel(i, j, k,bi,bj)) +
406 $ (vVel(i, jp1,1,bi,bj)-vVel(i, jp1,k,bi,bj)) *
407 $ (vVel(i, jp1,1,bi,bj)-vVel(i, jp1,k,bi,bj)) )
408 #ifdef KPP_SMOOTH_DVSQ
409 dVsq(i,j,k) = p5 * dVsq(i,j,k) + p125 * (
410 $ (uVel(i, jm1,1,bi,bj)-uVel(i, jm1,k,bi,bj)) *
411 $ (uVel(i, jm1,1,bi,bj)-uVel(i, jm1,k,bi,bj)) +
412 $ (uVel(ip1,jm1,1,bi,bj)-uVel(ip1,jm1,k,bi,bj)) *
413 $ (uVel(ip1,jm1,1,bi,bj)-uVel(ip1,jm1,k,bi,bj)) +
414 $ (uVel(i, jp1,1,bi,bj)-uVel(i, jp1,k,bi,bj)) *
415 $ (uVel(i, jp1,1,bi,bj)-uVel(i, jp1,k,bi,bj)) +
416 $ (uVel(ip1,jp1,1,bi,bj)-uVel(ip1,jp1,k,bi,bj)) *
417 $ (uVel(ip1,jp1,1,bi,bj)-uVel(ip1,jp1,k,bi,bj)) +
418 $ (vVel(im1,j, 1,bi,bj)-vVel(im1,j, k,bi,bj)) *
419 $ (vVel(im1,j, 1,bi,bj)-vVel(im1,j, k,bi,bj)) +
420 $ (vVel(im1,jp1,1,bi,bj)-vVel(im1,jp1,k,bi,bj)) *
421 $ (vVel(im1,jp1,1,bi,bj)-vVel(im1,jp1,k,bi,bj)) +
422 $ (vVel(ip1,j, 1,bi,bj)-vVel(ip1,j, k,bi,bj)) *
423 $ (vVel(ip1,j, 1,bi,bj)-vVel(ip1,j, k,bi,bj)) +
424 $ (vVel(ip1,jp1,1,bi,bj)-vVel(ip1,jp1,k,bi,bj)) *
425 $ (vVel(ip1,jp1,1,bi,bj)-vVel(ip1,jp1,k,bi,bj)) )
426 #endif /* KPP_SMOOTH_DVSQ */
427 ENDDO
428 ENDDO
429 ENDDO
430
431 #endif /* KPP_ESTIMATE_UREF */
432
433 RETURN
434 END
435

  ViewVC Help
Powered by ViewVC 1.1.22