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

Diff of /MITgcm/pkg/kpp/kpp_calc.F

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

revision 1.3 by heimbach, Wed Sep 13 17:07:11 2000 UTC revision 1.27 by heimbach, Tue May 11 20:57:08 2004 UTC
# Line 1  Line 1 
1  C $Header$  C $Header$
2    C $Name$
3    
4  #include "KPP_OPTIONS.h"  #include "KPP_OPTIONS.h"
5    
6    CBOP
7    C !ROUTINE: KPP_CALC
8    
9    C !INTERFACE: ==========================================================
10        subroutine KPP_CALC(        subroutine KPP_CALC(
11       I     bi, bj, myTime, myThid )       I     bi, bj, myTime, myThid )
12    
13    C !DESCRIPTION: \bv
14  C     /==========================================================\  C     /==========================================================\
15  C     | SUBROUTINE KPP_CALC                                      |  C     | SUBROUTINE KPP_CALC                                      |
16  C     | o Compute all KPP fields defined in KPP.h                |  C     | o Compute all KPP fields defined in KPP.h                |
# Line 89  c     Hence overlap region needs to be s Line 96  c     Hence overlap region needs to be s
96  c     When option FRUGAL_KPP is used, computation in overlap regions  c     When option FRUGAL_KPP is used, computation in overlap regions
97  c     is replaced with exchange calls hence reducing overlap requirements  c     is replaced with exchange calls hence reducing overlap requirements
98  c     to OLx=1, OLy=1.  c     to OLx=1, OLy=1.
99    c \ev
100    
101    C !USES: ===============================================================
102  #include "SIZE.h"  #include "SIZE.h"
103  #include "EEPARAMS.h"  #include "EEPARAMS.h"
104  #include "PARAMS.h"  #include "PARAMS.h"
# Line 98  c     to OLx=1, OLy=1. Line 107  c     to OLx=1, OLy=1.
107  #include "KPP_PARAMS.h"  #include "KPP_PARAMS.h"
108  #include "FFIELDS.h"  #include "FFIELDS.h"
109  #include "GRID.h"  #include "GRID.h"
   
110  #ifdef ALLOW_AUTODIFF_TAMC  #ifdef ALLOW_AUTODIFF_TAMC
111  #include "tamc.h"  #include "tamc.h"
112  #include "tamc_keys.h"  #include "tamc_keys.h"
       INTEGER    isbyte  
       PARAMETER( isbyte = 4 )  
113  #else /* ALLOW_AUTODIFF_TAMC */  #else /* ALLOW_AUTODIFF_TAMC */
114        integer ikey        integer ikppkey
115  #endif /* ALLOW_AUTODIFF_TAMC */  #endif /* ALLOW_AUTODIFF_TAMC */
116    
117        EXTERNAL DIFFERENT_MULTIPLE        EXTERNAL DIFFERENT_MULTIPLE
118        LOGICAL  DIFFERENT_MULTIPLE        LOGICAL  DIFFERENT_MULTIPLE
119    
120    C !INPUT PARAMETERS: ===================================================
121  c Routine arguments  c Routine arguments
122  c     bi, bj - array indices on which to apply calculations  c     bi, bj - array indices on which to apply calculations
123  c     myTime - Current time in simulation  c     myTime - Current time in simulation
# Line 121  c     myTime - Current time in simulatio Line 128  c     myTime - Current time in simulatio
128    
129  #ifdef ALLOW_KPP  #ifdef ALLOW_KPP
130    
131    C !LOCAL VARIABLES: ====================================================
132    c Local constants
133    c     minusone, p0, p5, p25, p125, p0625
134    c     imin, imax, jmin, jmax  - array computation indices
135    
136          _RL        minusone
137          parameter( minusone=-1.0)
138          _KPP_RL    p0    , p5    , p25     , p125      , p0625
139          parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )
140          integer   imin      ,imax          ,jmin      ,jmax
141    #ifdef FRUGAL_KPP
142          parameter(imin=1    ,imax=sNx      ,jmin=1    ,jmax=sNy      )
143    #else
144          parameter(imin=2-OLx,imax=sNx+OLx-1,jmin=2-OLy,jmax=sNy+OLy-1)
145    #endif
146    
147  c Local arrays and variables  c Local arrays and variables
148  c     work?  (nx,ny)       - horizontal working arrays  c     work?  (nx,ny)       - horizontal working arrays
149  c     ustar  (nx,ny)       - surface friction velocity                  (m/s)  c     ustar  (nx,ny)       - surface friction velocity                  (m/s)
# Line 135  c                            for ri_iwmi Line 158  c                            for ri_iwmi
158  c     Ritop  (nx,ny,Nr)    - numerator of bulk richardson number  c     Ritop  (nx,ny,Nr)    - numerator of bulk richardson number
159  c                            at grid levels for bldepth  c                            at grid levels for bldepth
160  c     vddiff (nx,ny,Nrp2,1)- vertical viscosity on "t-grid"           (m^2/s)  c     vddiff (nx,ny,Nrp2,1)- vertical viscosity on "t-grid"           (m^2/s)
161  c     vddiff (nx,ny,Nrp2,2)- vert. diff. on next row for temperature  (m^2/s)  c     vddiff (nx,ny,Nrp2,2)- vert. diff. on next row for salt&tracers (m^2/s)
162  c     vddiff (nx,ny,Nrp2,3)- vert. diff. on next row for salt&tracers (m^2/s)  c     vddiff (nx,ny,Nrp2,3)- vert. diff. on next row for temperature  (m^2/s)
163  c     ghat   (nx,ny,Nr)    - nonlocal transport coefficient           (s/m^2)  c     ghat   (nx,ny,Nr)    - nonlocal transport coefficient           (s/m^2)
164  c     hbl    (nx,ny)       - mixing layer depth                           (m)  c     hbl    (nx,ny)       - mixing layer depth                           (m)
165  c     kmtj   (nx,ny)       - maximum number of wet levels in each column  c     kmtj   (nx,ny)       - maximum number of wet levels in each column
# Line 145  c     zRef   (nx,ny)       - Reference d Line 168  c     zRef   (nx,ny)       - Reference d
168  c     uRef   (nx,ny)       - Reference zonal velocity                   (m/s)  c     uRef   (nx,ny)       - Reference zonal velocity                   (m/s)
169  c     vRef   (nx,ny)       - Reference meridional velocity              (m/s)  c     vRef   (nx,ny)       - Reference meridional velocity              (m/s)
170    
171        _RS worka (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        _RL     worka ( 1-OLx:sNx+OLx, 1-OLy:sNy+OLy                )
172        _RS workb (1-OLx:sNx+OLx,1-OLy:sNy+OLy)        integer work1 ( ibot:itop    , jbot:jtop                    )
173  #ifdef FRUGAL_KPP        _KPP_RL work2 ( ibot:itop    , jbot:jtop                    )
174        integer work1(sNx,sNy)        _KPP_RL work3 ( ibot:itop    , jbot:jtop                    )
175        _RS work2    (sNx,sNy)        _KPP_RL ustar ( ibot:itop    , jbot:jtop                    )
176        _RS ustar    (sNx,sNy)        _KPP_RL bo    ( ibot:itop    , jbot:jtop                    )
177        _RS bo       (sNx,sNy)        _KPP_RL bosol ( ibot:itop    , jbot:jtop                    )
178        _RS bosol    (sNx,sNy)        _KPP_RL shsq  ( ibot:itop    , jbot:jtop    , Nr            )
179        _RS shsq     (sNx,sNy,Nr)        _KPP_RL dVsq  ( ibot:itop    , jbot:jtop    , Nr            )
180        _RS dVsq     (sNx,sNy,Nr)        _KPP_RL dbloc ( ibot:itop    , jbot:jtop    , Nr            )
181        _RS dbloc    (sNx,sNy,Nr)        _KPP_RL Ritop ( ibot:itop    , jbot:jtop    , Nr            )
182        _RS Ritop    (sNx,sNy,Nr)        _KPP_RL vddiff( ibot:itop    , jbot:jtop    , 0:Nrp1, mdiff )
183        _RS vddiff   (sNx,sNy,0:Nrp1,mdiff)        _KPP_RL ghat  ( ibot:itop    , jbot:jtop    , Nr            )
184        _RS ghat     (sNx,sNy,Nr)        _KPP_RL hbl   ( ibot:itop    , jbot:jtop                    )
       _RS hbl      (sNx,sNy)  
185  #ifdef KPP_ESTIMATE_UREF  #ifdef KPP_ESTIMATE_UREF
186        _RS z0       (sNx,sNy)        _KPP_RL z0    ( ibot:itop    , jbot:jtop                    )
187        _RS zRef     (sNx,sNy)        _KPP_RL zRef  ( ibot:itop    , jbot:jtop                    )
188        _RS uRef     (sNx,sNy)        _KPP_RL uRef  ( ibot:itop    , jbot:jtop                    )
189        _RS vRef     (sNx,sNy)        _KPP_RL vRef  ( ibot:itop    , jbot:jtop                    )
190  #endif /* KPP_ESTIMATE_UREF */  #endif /* KPP_ESTIMATE_UREF */
 #else /* FRUGAL_KPP */  
       integer work1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS work2    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS ustar    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS bo       (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS bosol    (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS shsq     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)  
       _RS dVsq     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)  
       _RS dbloc    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)  
       _RS Ritop    (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)  
       _RS vddiff   (1-OLx:sNx+OLx,1-OLy:sNy+OLy,0:Nrp1,mdiff)  
       _RS ghat     (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)  
       _RS hbl      (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
 #ifdef KPP_ESTIMATE_UREF  
       _RS z0       (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS zRef     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS uRef     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
       _RS vRef     (1-OLx:sNx+OLx,1-OLy:sNy+OLy)  
 #endif /* KPP_ESTIMATE_UREF */  
 #endif /* FRUGAL_KPP */  
   
 c     imin,imax,jmin,jmax  - array indices  
       integer    imin   , imax      , jmin   , jmax  
       parameter( imin=-2, imax=sNx+3, jmin=-2, jmax=sNy+3 )  
   
 c     mixing process switches  
       logical    lri  
       parameter( lri = .true. )  
   
       _RS        m1  
       parameter( m1=-1.0)  
       _RS        p0    , p5    , p25     , p125      , p0625  
       parameter( p0=0.0, p5=0.5, p25=0.25, p125=0.125, p0625=0.0625 )  
191                
192        _RL     tempVar        _KPP_RL tempvar2
193        integer i, j, k, kp1, im1, ip1, jm1, jp1        integer i, j, k, kp1, im1, ip1, jm1, jp1
194    
195  #ifdef KPP_ESTIMATE_UREF  #ifdef KPP_ESTIMATE_UREF
196        _RS     dBdz1, dBdz2, ustarX, ustarY        _KPP_RL tempvar1, dBdz1, dBdz2, ustarX, ustarY
197  #endif  #endif
198    
199    #ifdef ALLOW_AUTODIFF_TAMC
200              act1 = bi - myBxLo(myThid)
201              max1 = myBxHi(myThid) - myBxLo(myThid) + 1
202              act2 = bj - myByLo(myThid)
203              max2 = myByHi(myThid) - myByLo(myThid) + 1
204              act3 = myThid - 1
205              max3 = nTx*nTy
206              act4 = ikey_dynamics - 1
207              ikppkey = (act1 + 1) + act2*max1
208         &                      + act3*max1*max2
209         &                      + act4*max1*max2*max3
210    #endif /* ALLOW_AUTODIFF_TAMC */
211    CEOP
212    
213  c     Check to see if new vertical mixing coefficient should be computed now?  c     Check to see if new vertical mixing coefficient should be computed now?
214        IF ( DIFFERENT_MULTIPLE(kpp_freq,myTime,myTime-deltaTClock) .OR.        IF ( DIFFERENT_MULTIPLE(kpp_freq,myTime,myTime-deltaTClock) .OR.
215       1     myTime .EQ. startTime ) THEN       1     myTime .EQ. startTime ) THEN
# Line 247  c--------------------------------------- Line 250  c---------------------------------------
250    
251        CALL TIMER_START('STATEKPP      [KPP_CALC]', myThid)        CALL TIMER_START('STATEKPP      [KPP_CALC]', myThid)
252        CALL STATEKPP(        CALL STATEKPP(
253       I       bi, bj, myThid       I       ikppkey, bi, bj, myThid
254       O     , work2, dbloc, Ritop       O     , work2, dbloc, Ritop
255  #ifdef FRUGAL_KPP       O     , vddiff(ibot,jbot,1,1), vddiff(ibot,jbot,1,2)
      O     , vddiff(1    ,1    ,1,1), vddiff(1    ,1    ,1,2)  
 #else  
      O     , vddiff(1-OLx,1-OLy,1,1), vddiff(1-OLx,1-OLy,1,2)  
 #endif  
256       &     )       &     )
257        CALL TIMER_STOP ('STATEKPP      [KPP_CALC]', myThid)        CALL TIMER_STOP ('STATEKPP      [KPP_CALC]', myThid)
258    
 #ifdef KPP_SMOOTH_DBLOC  
 c     horizontally smooth dbloc with a 121 filter  
 c     (stored in ghat to save space)  
   
       DO k = 1, Nr  
          CALL SMOOTH_HORIZ_RS (  
      I        k, bi, bj,  
      I        dbloc(1-OLx,1-OLy,k),  
      O        ghat (1-OLx,1-OLy,k) )  
       ENDDO  
   
 #else /* KPP_SMOOTH_DBLOC */  
   
259        DO k = 1, Nr        DO k = 1, Nr
260  #ifdef FRUGAL_KPP           DO j = jbot, jtop
261           DO j = 1, sNy              DO i = ibot, itop
             DO i = 1, sNx  
 #else  
          DO j = 1-OLy, sNy+OLy  
             DO i = imin, imax  
 #endif  
262                 ghat(i,j,k) = dbloc(i,j,k)                 ghat(i,j,k) = dbloc(i,j,k)
263              ENDDO              ENDDO
264           ENDDO           ENDDO
265        ENDDO        ENDDO
266    
267    #ifdef KPP_SMOOTH_DBLOC
268    c     horizontally smooth dbloc with a 121 filter
269    c     smooth dbloc stored in ghat to save space
270    c     dbloc(k) is buoyancy gradientnote between k and k+1
271    c     levels therefore k+1 mask must be used
272    
273          DO k = 1, Nr-1
274             CALL KPP_SMOOTH_HORIZ (
275         I        k+1, bi, bj,
276         U        ghat (ibot,jbot,k) )
277          ENDDO
278    
279  #endif /* KPP_SMOOTH_DBLOC */  #endif /* KPP_SMOOTH_DBLOC */
280    
281  #ifdef KPP_SMOOTH_DENS  #ifdef KPP_SMOOTH_DENS
282  c     horizontally smooth density related quantities with 121 filters  c     horizontally smooth density related quantities with 121 filters
283        CALL SMOOTH_HORIZ_RS (        CALL KPP_SMOOTH_HORIZ (
284       I     k, bi, bj,       I     1, bi, bj,
285       I     work2,       U     work2 )
      O     work2 )  
286        DO k = 1, Nr        DO k = 1, Nr
287           CALL SMOOTH_HORIZ_RS (           CALL KPP_SMOOTH_HORIZ (
288       I        k, bi, bj,       I        k+1, bi, bj,
289       I        dbloc (1-OLx,1-OLy,k)  ,       U        dbloc (ibot,jbot,k) )
290       O        dbloc (1-OLx,1-OLy,k)   )           CALL KPP_SMOOTH_HORIZ (
          CALL SMOOTH_HORIZ_RS (  
291       I        k, bi, bj,       I        k, bi, bj,
292       I        Ritop (1-OLx,1-OLy,k)  ,       U        Ritop (ibot,jbot,k)  )
293       O        Ritop (1-OLx,1-OLy,k)   )           CALL KPP_SMOOTH_HORIZ (
          CALL SMOOTH_HORIZ_RS (  
294       I        k, bi, bj,       I        k, bi, bj,
295       I        vddiff(1-OLx,1-OLy,k,1),       U        vddiff(ibot,jbot,k,1) )
296       O        vddiff(1-OLx,1-OLy,k,1) )           CALL KPP_SMOOTH_HORIZ (
          CALL SMOOTH_HORIZ_RS (  
297       I        k, bi, bj,       I        k, bi, bj,
298       I        vddiff(1-OLx,1-OLy,k,2),       U        vddiff(ibot,jbot,k,2) )
      O        vddiff(1-OLx,1-OLy,k,2) )  
299        ENDDO        ENDDO
300  #endif /* KPP_SMOOTH_DENS */  #endif /* KPP_SMOOTH_DENS */
301    
302        DO k = 1, Nr        DO k = 1, Nr
303  #ifdef FRUGAL_KPP           DO j = jbot, jtop
304           DO j = 1, sNy              DO i = ibot, itop
             DO i = 1, sNx  
 #else  
          DO j = 1-OLy, sNy+OLy  
             DO i = 1-OLx, sNx+OLx  
 #endif  
305    
306  c     zero out dbloc over land points (so that the convective  c     zero out dbloc over land points (so that the convective
307  c     part of the interior mixing can be diagnosed)  c     part of the interior mixing can be diagnosed)
# Line 340  c     so that the subroutine "bldepth" w Line 323  c     so that the subroutine "bldepth" w
323           END DO           END DO
324        END DO        END DO
325    
326    cph(
327    cph  this avoids a single or double recomp./call of statekpp
328    CADJ store work2              = comlev1_kpp, key = ikppkey
329    #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
330    CADJ store dbloc, Ritop, ghat = comlev1_kpp, key = ikppkey
331    CADJ store vddiff             = comlev1_kpp, key = ikppkey
332    #endif
333    cph)
334    
335  c------------------------------------------------------------------------  c------------------------------------------------------------------------
336  c     friction velocity, turbulent and radiative surface buoyancy forcing  c     friction velocity, turbulent and radiative surface buoyancy forcing
337  c     -------------------------------------------------------------------  c     -------------------------------------------------------------------
338  c     taux / rho = SurfaceTendencyU * delZ(1)                     (N/m^2)  c     taux / rho = SurfaceTendencyU * drF(1)                     (N/m^2)
339  c     tauy / rho = SurfaceTendencyV * delZ(1)                     (N/m^2)  c     tauy / rho = SurfaceTendencyV * drF(1)                     (N/m^2)
340  c     ustar = sqrt( sqrt( taux^2 + tauy^2 ) / rho )                 (m/s)  c     ustar = sqrt( sqrt( taux^2 + tauy^2 ) / rho )                (m/s)
341  c     bo    = - g * ( alpha*SurfaceTendencyT +  c     bo    = - g * ( alpha*SurfaceTendencyT +
342  c                     beta *SurfaceTendencyS ) * delZ(1) / rho  (m^2/s^3)  c                     beta *SurfaceTendencyS ) * drF(1) / rho  (m^2/s^3)
343  c     bosol = - g * alpha * Qsw * delZ(1) / rho                 (m^2/s^3)  c     bosol = - g * alpha * Qsw * drF(1) / rho                 (m^2/s^3)
344  c------------------------------------------------------------------------  c------------------------------------------------------------------------
345    
346  #ifdef FRUGAL_KPP  c initialize arrays to zero
347        DO j = 1, sNy        DO j = jbot, jtop
348           jp1 = j + 1           DO i = ibot, itop
349           DO i = 1, sNx              ustar(i,j) = p0
350  #else              bo   (I,J) = p0
351                bosol(I,J) = p0
352             END DO
353          END DO
354    
355        DO j = jmin, jmax        DO j = jmin, jmax
356         jp1 = j + 1         jp1 = j + 1
357         DO i = imin, imax         DO i = imin, imax
 #endif  
358          ip1 = i+1          ip1 = i+1
359          tempVar =          work3(i,j) =
360       &   (SurfaceTendencyU(i,j,bi,bj) + SurfaceTendencyU(ip1,j,bi,bj)) *       &   (SurfaceTendencyU(i,j,bi,bj) + SurfaceTendencyU(ip1,j,bi,bj)) *
361       &   (SurfaceTendencyU(i,j,bi,bj) + SurfaceTendencyU(ip1,j,bi,bj)) +       &   (SurfaceTendencyU(i,j,bi,bj) + SurfaceTendencyU(ip1,j,bi,bj)) +
362       &   (SurfaceTendencyV(i,j,bi,bj) + SurfaceTendencyV(i,jp1,bi,bj)) *       &   (SurfaceTendencyV(i,j,bi,bj) + SurfaceTendencyV(i,jp1,bi,bj)) *
363       &   (SurfaceTendencyV(i,j,bi,bj) + SurfaceTendencyV(i,jp1,bi,bj))       &   (SurfaceTendencyV(i,j,bi,bj) + SurfaceTendencyV(i,jp1,bi,bj))
364          if ( tempVar .lt. (epsln*epsln) ) then         END DO
365             ustar(i,j) = SQRT( epsln * p5 * delZ(1) )        END DO
366    cph(
367    CADJ store work3 = comlev1_kpp, key = ikppkey
368    cph)
369          DO j = jmin, jmax
370           jp1 = j + 1
371           DO i = imin, imax
372            ip1 = i+1
373    
374            if ( work3(i,j) .lt. (phepsi*phepsi) ) then
375               ustar(i,j) = SQRT( phepsi * p5 * drF(1) )
376          else          else
377             ustar(i,j) = SQRT( SQRT( tempVar ) * p5 * delZ(1) )             tempVar2 =  SQRT( work3(i,j) ) * p5 * drF(1)
378               ustar(i,j) = SQRT( tempVar2 )
379          endif          endif
380    
381          bo(I,J) = - gravity *          bo(I,J) = - gravity *
382       &       ( vddiff(I,J,1,1) * SurfaceTendencyT(i,j,bi,bj) +       &       ( vddiff(I,J,1,1) * (SurfaceTendencyT(i,j,bi,bj)+
383       &         vddiff(I,J,1,2) * SurfaceTendencyS(i,j,bi,bj)       &       SurfaceTendencyTice(i,j,bi,bj)) +
384       &       ) *       &       vddiff(I,J,1,2) * SurfaceTendencyS(i,j,bi,bj) ) *
385       &       delZ(1) / work2(I,J)       &       drF(1) / work2(I,J)
386          bosol(I,J) = - gravity * vddiff(I,J,1,1) * Qsw(i,j,bi,bj) *  
387       &       delZ(1) / work2(I,J)          bosol(I,J) = gravity * vddiff(I,J,1,1) * Qsw(i,j,bi,bj) *
388         &       recip_Cp*recip_rhoConst*recip_dRf(1) *
389         &       drF(1) / work2(I,J)
390    
391         END DO         END DO
392        END DO        END DO
393    
394  #ifndef FRUGAL_KPP  cph(
395  c     set array edges to zero  CADJ store ustar = comlev1_kpp, key = ikppkey
396        DO j = jmin, jmax  cph)
          DO i = 1-OLx, imin-1  
             ustar(i,j) = p0  
             bo   (I,J) = p0  
             bosol(I,J) = p0  
          END DO  
          DO i = imax+1, sNx+OLx  
             ustar(i,j) = p0  
             bo   (I,J) = p0  
             bosol(I,J) = p0  
          END DO  
       END DO  
       DO i = 1-OLx, sNx+OLx  
          DO j = 1-OLy, jmin-1  
             ustar(i,j) = p0  
             bo   (I,J) = p0  
             bosol(I,J) = p0  
          END DO  
          DO j = jmax+1, sNy+OLy  
             ustar(i,j) = p0  
             bo   (I,J) = p0  
             bosol(I,J) = p0  
          END DO  
       END DO  
 #endif  
397    
398  c------------------------------------------------------------------------  c------------------------------------------------------------------------
399  c     velocity shear  c     velocity shear
# Line 418  c     dVsq(k)=(Uref-U(k))**2+(Vref-V(k)) Line 404  c     dVsq(k)=(Uref-U(k))**2+(Vref-V(k))
404  c     shsq(k)=(U(k)-U(k+1))**2+(V(k)-V(k+1))**2  at interfaces  c     shsq(k)=(U(k)-U(k+1))**2+(V(k)-V(k+1))**2  at interfaces
405  c------------------------------------------------------------------------  c------------------------------------------------------------------------
406    
407    c initialize arrays to zero
408          DO k = 1, Nr
409             DO j = jbot, jtop
410                DO i = ibot, itop
411                   shsq(i,j,k) = p0
412                   dVsq(i,j,k) = p0
413                END DO
414             END DO
415          END DO
416    
417  c     dVsq computation  c     dVsq computation
418    
419  #ifdef KPP_ESTIMATE_UREF  #ifdef KPP_ESTIMATE_UREF
# Line 428  c     thickness in the model.  First det Line 424  c     thickness in the model.  First det
424  c     Second zRef = espilon * hMix.  Third determine roughness length  c     Second zRef = espilon * hMix.  Third determine roughness length
425  c     scale z0.  Third estimate reference velocity.  c     scale z0.  Third estimate reference velocity.
426    
 #ifdef FRUGAL_KPP  
       DO j = 1, sNy  
          jp1 = j + 1  
          DO i = 1, sNx  
 #else  
427        DO j = jmin, jmax        DO j = jmin, jmax
428           jp1 = j + 1           jp1 = j + 1
429           DO i = imin, imax           DO i = imin, imax
 #endif /* FRUGAL_KPP */  
430              ip1 = i + 1              ip1 = i + 1
431    
432  c     Determine mixed layer depth hMix as the shallowest depth at which  c     Determine mixed layer depth hMix as the shallowest depth at which
# Line 465  c     Linearly interpolate to find hMix. Line 455  c     Linearly interpolate to find hMix.
455              ENDIF              ENDIF
456    
457  c     Compute roughness length scale z0 subject to 0 < z0  c     Compute roughness length scale z0 subject to 0 < z0
458                 tempVar = p5 * (                 tempVar1 = p5 * (
459       &              (uVel(i,  j,  1,bi,bj)-uVel(i,  j,  2,bi,bj)) *       &              (uVel(i,  j,  1,bi,bj)-uVel(i,  j,  2,bi,bj)) *
460       &              (uVel(i,  j,  1,bi,bj)-uVel(i,  j,  2,bi,bj)) +       &              (uVel(i,  j,  1,bi,bj)-uVel(i,  j,  2,bi,bj)) +
461       &              (uVel(ip1,j,  1,bi,bj)-uVel(ip1,j,  2,bi,bj)) *       &              (uVel(ip1,j,  1,bi,bj)-uVel(ip1,j,  2,bi,bj)) *
# Line 474  c     Compute roughness length scale z0 Line 464  c     Compute roughness length scale z0
464       &              (vVel(i,  j,  1,bi,bj)-vVel(i,  j,  2,bi,bj)) +       &              (vVel(i,  j,  1,bi,bj)-vVel(i,  j,  2,bi,bj)) +
465       &              (vVel(i,  jp1,1,bi,bj)-vVel(i,  jp1,2,bi,bj)) *       &              (vVel(i,  jp1,1,bi,bj)-vVel(i,  jp1,2,bi,bj)) *
466       &              (vVel(i,  jp1,1,bi,bj)-vVel(i,  jp1,2,bi,bj)) )       &              (vVel(i,  jp1,1,bi,bj)-vVel(i,  jp1,2,bi,bj)) )
467                 if ( tempVar .lt. (epsln*epsln) ) then                 if ( tempVar1 .lt. (epsln*epsln) ) then
468                    tempVar = epsln                    tempVar2 = epsln
469                 else                 else
470                    tempVar = SQRT ( tempVar )                    tempVar2 = SQRT ( tempVar1 )
471                 endif                 endif
472                 z0(i,j) = rF(2) *                 z0(i,j) = rF(2) *
473       &                   ( rF(3) * LOG ( rF(3) / rF(2) ) /       &                   ( rF(3) * LOG ( rF(3) / rF(2) ) /
474       &                     ( rF(3) - rF(2) ) -       &                     ( rF(3) - rF(2) ) -
475       &                     tempVar * vonK /       &                     tempVar2 * vonK /
476       &                     MAX ( ustar(i,j), phepsi ) )       &                     MAX ( ustar(i,j), phepsi ) )
477                 z0(i,j) = MAX ( z0(i,j), phepsi )                 z0(i,j) = MAX ( z0(i,j), phepsi )
478    
# Line 500  c     Estimate reference velocity uRef a Line 490  c     Estimate reference velocity uRef a
490       &                       SurfaceTendencyU(ip1,j,bi,bj) ) * p5       &                       SurfaceTendencyU(ip1,j,bi,bj) ) * p5
491                    ustarY = ( SurfaceTendencyV(i,j,  bi,bj) +                    ustarY = ( SurfaceTendencyV(i,j,  bi,bj) +
492       &                       SurfaceTendencyU(i,jp1,bi,bj) ) * p5       &                       SurfaceTendencyU(i,jp1,bi,bj) ) * p5
493                    tempVar = ustarX * ustarX + ustarY * ustarY                    tempVar1 = ustarX * ustarX + ustarY * ustarY
494                    if ( tempVar .lt. (epsln*epsln) ) then                    if ( tempVar1 .lt. (epsln*epsln) ) then
495                       tempVar = epsln                       tempVar2 = epsln
496                    else                    else
497                       tempVar = SQRT ( tempVar )                       tempVar2 = SQRT ( tempVar1 )
498                    endif                    endif
499                    tempVar = ustar(i,j) *                    tempVar2 = ustar(i,j) *
500       &                 ( LOG ( zRef(i,j) / rF(2) ) +       &                 ( LOG ( zRef(i,j) / rF(2) ) +
501       &                 z0(i,j) / zRef(i,j) - z0(i,j) / rF(2) ) /       &                 z0(i,j) / zRef(i,j) - z0(i,j) / rF(2) ) /
502       &                 vonK / tempVar       &                 vonK / tempVar2
503                    uRef(i,j) = uRef(i,j) + ustarX * tempVar                    uRef(i,j) = uRef(i,j) + ustarX * tempVar2
504                    vRef(i,j) = vRef(i,j) + ustarY * tempVar                    vRef(i,j) = vRef(i,j) + ustarY * tempVar2
505                 ENDIF                 ENDIF
506    
507           END DO           END DO
508        END DO        END DO
509    
       IF (KPPmixingMaps) THEN  
 #ifdef FRUGAL_KPP  
          CALL PRINT_MAPRS(  
      I        zRef, 'zRef', PRINT_MAP_XY,  
      I        1, sNx, 1, sNy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
          CALL PRINT_MAPRS(  
      I        z0, 'z0', PRINT_MAP_XY,  
      I        1, sNx, 1, sNy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
          CALL PRINT_MAPRS(  
      I        uRef, 'uRef', PRINT_MAP_XY,  
      I        1, sNx, 1, sNy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
          CALL PRINT_MAPRS(  
      I        vRef, 'vRef', PRINT_MAP_XY,  
      I        1, sNx, 1, sNy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
 #else  
          CALL PRINT_MAPRS(  
      I        zRef, 'zRef', PRINT_MAP_XY,  
      I        1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
          CALL PRINT_MAPRS(  
      I        z0, 'z0', PRINT_MAP_XY,  
      I        1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
          CALL PRINT_MAPRS(  
      I        uRef, 'uRef', PRINT_MAP_XY,  
      I        1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
          CALL PRINT_MAPRS(  
      I        vRef, 'vRef', PRINT_MAP_XY,  
      I        1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1, 1, 1, 1,  
      I        1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
 #endif  
       ENDIF  
   
510        DO k = 1, Nr        DO k = 1, Nr
 #ifdef FRUGAL_KPP  
          DO j = 1, sNy  
             jm1 = j - 1  
             jp1 = j + 1  
             DO i = 1, sNx  
 #else  
511           DO j = jmin, jmax           DO j = jmin, jmax
512              jm1 = j - 1              jm1 = j - 1
513              jp1 = j + 1              jp1 = j + 1
514              DO i = imin, imax              DO i = imin, imax
 #endif /* FRUGAL_KPP */  
515                 im1 = i - 1                 im1 = i - 1
516                 ip1 = i + 1                 ip1 = i + 1
517                 dVsq(i,j,k) = p5 * (                 dVsq(i,j,k) = p5 * (
# Line 604  c     Estimate reference velocity uRef a Line 549  c     Estimate reference velocity uRef a
549  #else /* KPP_ESTIMATE_UREF */  #else /* KPP_ESTIMATE_UREF */
550    
551        DO k = 1, Nr        DO k = 1, Nr
 #ifdef FRUGAL_KPP  
          DO j = 1, sNy  
             jm1 = j - 1  
             jp1 = j + 1  
             DO i = 1, sNx  
 #else  
552           DO j = jmin, jmax           DO j = jmin, jmax
553              jm1 = j - 1              jm1 = j - 1
554              jp1 = j + 1              jp1 = j + 1
555              DO i = imin, imax              DO i = imin, imax
 #endif /* FRUGAL_KPP */  
556                 im1 = i - 1                 im1 = i - 1
557                 ip1 = i + 1                 ip1 = i + 1
558                 dVsq(i,j,k) = p5 * (                 dVsq(i,j,k) = p5 * (
# Line 654  c     Estimate reference velocity uRef a Line 592  c     Estimate reference velocity uRef a
592  c     shsq computation  c     shsq computation
593        DO k = 1, Nrm1        DO k = 1, Nrm1
594           kp1 = k + 1           kp1 = k + 1
 #ifdef FRUGAL_KPP  
          DO j = 1, sNy  
             jm1 = j - 1  
             jp1 = j + 1  
             DO i = 1, sNx  
 #else  
595           DO j = jmin, jmax           DO j = jmin, jmax
596              jm1 = j - 1              jm1 = j - 1
597              jp1 = j + 1              jp1 = j + 1
598              DO i = imin, imax              DO i = imin, imax
 #endif /* FRUGAL_KPP */  
599                 im1 = i - 1                 im1 = i - 1
600                 ip1 = i + 1                 ip1 = i + 1
601                 shsq(i,j,k) = p5 * (                 shsq(i,j,k) = p5 * (
# Line 699  c     shsq computation Line 630  c     shsq computation
630           END DO           END DO
631        END DO        END DO
632    
633  c     shsq @ Nr computation  cph(
634  #ifdef FRUGAL_KPP  #ifdef KPP_AUTODIFF_EXCESSIVE_STORE
635        DO j = 1, sNy  CADJ store dvsq, shsq = comlev1_kpp, key = ikppkey
          DO i = 1, sNx  
 #else  
       DO j = jmin, jmax  
          DO i = imin, imax  
 #endif  
             shsq(i,j,Nr) = p0  
          END DO  
       END DO  
   
 #ifndef FRUGAL_KPP  
 c     set array edges to zero  
       DO k = 1, Nr  
          DO j = jmin, jmax  
             DO i = 1-OLx, imin-1  
                shsq(i,j,k) = p0  
                dVsq(i,j,k) = p0  
             END DO  
             DO i = imax+1, sNx+OLx  
                shsq(i,j,k) = p0  
                dVsq(i,j,k) = p0  
             END DO  
          END DO  
          DO i = 1-OLx, sNx+OLx  
             DO j = 1-OLy, jmin-1  
                shsq(i,j,k) = p0  
                dVsq(i,j,k) = p0  
             END DO  
             DO j = jmax+1, sNy+OLy  
                shsq(i,j,k) = p0  
                dVsq(i,j,k) = p0  
             END DO  
          END DO  
       END DO  
636  #endif  #endif
637    cph)
638    
639  c-----------------------------------------------------------------------  c-----------------------------------------------------------------------
640  c     solve for viscosity, diffusivity, ghat, and hbl on "t-grid"  c     solve for viscosity, diffusivity, ghat, and hbl on "t-grid"
641  c-----------------------------------------------------------------------  c-----------------------------------------------------------------------
642    
643  #ifdef FRUGAL_KPP        DO j = jbot, jtop
644        DO j = 1, sNy           DO i = ibot, itop
          DO i = 1, sNx  
 #else  
       DO j = 1-OLy, sNy+OLy  
          DO i = 1-OLx, sNx+OLx  
 #endif  
645              work1(i,j) = nzmax(i,j,bi,bj)              work1(i,j) = nzmax(i,j,bi,bj)
646              work2(i,j) = Fcori(i,j,bi,bj)              work2(i,j) = Fcori(i,j,bi,bj)
647           END DO           END DO
648        END DO        END DO
649        CALL TIMER_START('KPPMIX [KPP_CALC]', myThid)        CALL TIMER_START('KPPMIX [KPP_CALC]', myThid)
650        CALL KPPMIX (        CALL KPPMIX (
651       I       lri, work1, shsq, dVsq, ustar       I       mytime, mythid
652         I     , work1, shsq, dVsq, ustar
653       I     , bo, bosol, dbloc, Ritop, work2       I     , bo, bosol, dbloc, Ritop, work2
654       I     , ikey       I     , ikppkey
655       O     , vddiff       O     , vddiff
656       U     , ghat       U     , ghat
657       O     , hbl       O     , hbl )
      &        )  
658    
659        CALL TIMER_STOP ('KPPMIX [KPP_CALC]', myThid)        CALL TIMER_STOP ('KPPMIX [KPP_CALC]', myThid)
660    
       IF (KPPmixingMaps) THEN  
 #ifdef FRUGAL_KPP  
        CALL PRINT_MAPRS(  
      I      hbl, 'hbl', PRINT_MAP_XY,  
      I      1, sNx, 1, sNy, 1, 1, 1, 1,  
      I      1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
 #else  
        CALL PRINT_MAPRS(  
      I      hbl, 'hbl', PRINT_MAP_XY,  
      I      1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1, 1, 1, 1,  
      I      1, sNx, 1, sNy, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1 )  
 #endif  
        ENDIF  
   
 #ifdef ALLOW_AUTODIFF_TAMC  
 CADJ STORE vddiff, ghat  = comlev1_kpp, key = ikey  
 #endif /* ALLOW_AUTODIFF_TAMC */  
   
661  c-----------------------------------------------------------------------  c-----------------------------------------------------------------------
662  c     zero out land values,  c     zero out land values and transfer to global variables
 c     make sure coefficients are within reasonable bounds,  
 c     and transfer to global variables  
663  c-----------------------------------------------------------------------  c-----------------------------------------------------------------------
664    
 #ifdef FRUGAL_KPP  
       DO j = 1, sNy  
          DO i = 1, sNx  
 #else  
665        DO j = jmin, jmax        DO j = jmin, jmax
666           DO i = imin, imax         DO i = imin, imax
667  #endif          DO k = 1, Nr
668              DO k = 1, Nr           KPPviscAz(i,j,k,bi,bj) = vddiff(i,j,k-1,1) * pMask(i,j,k,bi,bj)
669  c KPPviscAz           KPPdiffKzS(i,j,k,bi,bj)= vddiff(i,j,k-1,2) * pMask(i,j,k,bi,bj)
670                 tempVar = min( maxKPPviscAz(k), vddiff(i,j,k-1,1) )           KPPdiffKzT(i,j,k,bi,bj)= vddiff(i,j,k-1,3) * pMask(i,j,k,bi,bj)
671                 tempVar = max( minKPPviscAz, tempVar )           KPPghat(i,j,k,bi,bj)   = ghat(i,j,k)       * pMask(i,j,k,bi,bj)
672                 KPPviscAz(i,j,k,bi,bj) = tempVar*pMask(i,j,k,bi,bj)          END DO
673  c KPPdiffKzS          KPPhbl(i,j,bi,bj) = hbl(i,j) * pMask(i,j,1,bi,bj)
674                 tempVar = min( maxKPPdiffKzS, vddiff(i,j,k-1,2) )         END DO
                tempVar = max( minKPPdiffKzS, tempVar )  
                KPPdiffKzS(i,j,k,bi,bj) = tempVar*pMask(i,j,k,bi,bj)  
 c KPPdiffKzT  
                tempVar = min( maxKPPdiffKzT, vddiff(i,j,k-1,3) )  
                tempVar = max( minKPPdiffKzT, tempVar )  
                KPPdiffKzT(i,j,k,bi,bj) = tempVar*pMask(i,j,k,bi,bj)  
 c KPPghat  
                tempVar = min( maxKPPghat, ghat(i,j,k) )  
                tempVar = max( minKPPghat, tempVar )  
                KPPghat(i,j,k,bi,bj) = tempVar*pMask(i,j,k,bi,bj)  
             END DO  
 c KPPhbl: set to -zgrid(1) over land  
             KPPhbl(i,j,bi,bj) = (hbl(i,j) + zgrid(1))  
      &           * pMask(i,j,1,bi,bj) -  
      &           zgrid(1)  
          END DO  
675        END DO        END DO
676  #ifdef FRUGAL_KPP  #ifdef FRUGAL_KPP
677        _EXCH_XYZ_R8(KPPviscAz  , myThid )        _EXCH_XYZ_R8(KPPviscAz  , myThid )
# Line 829  c KPPhbl: set to -zgrid(1) over land Line 683  c KPPhbl: set to -zgrid(1) over land
683    
684  #ifdef KPP_SMOOTH_VISC  #ifdef KPP_SMOOTH_VISC
685  c     horizontal smoothing of vertical viscosity  c     horizontal smoothing of vertical viscosity
 c     as coded requires FRUGAL_KPP and OLx=4, OLy=4  
 c     alternatively could recode with OLx=5, OLy=5  
   
686        DO k = 1, Nr        DO k = 1, Nr
687           CALL SMOOTH_HORIZ_RL (           CALL SMOOTH_HORIZ (
688       I        k, bi, bj,       I        k, bi, bj,
689       I        KPPviscAz(1-OLx,1-OLy,k,bi,bj),       U        KPPviscAz(1-OLx,1-OLy,k,bi,bj) )
      O        KPPviscAz(1-OLx,1-OLy,k,bi,bj) )  
690        END DO        END DO
691          _EXCH_XYZ_R8(KPPviscAz  , myThid )
692  #endif /* KPP_SMOOTH_VISC */  #endif /* KPP_SMOOTH_VISC */
693    
694  #ifdef KPP_SMOOTH_DIFF  #ifdef KPP_SMOOTH_DIFF
695  c     horizontal smoothing of vertical diffusivity  c     horizontal smoothing of vertical diffusivity
 c     as coded requires FRUGAL_KPP and OLx=4, OLy=4  
 c     alternatively could recode with OLx=5, OLy=5  
   
696        DO k = 1, Nr        DO k = 1, Nr
697           CALL SMOOTH_HORIZ_RL (           CALL SMOOTH_HORIZ (
698       I        k, bi, bj,       I        k, bi, bj,
699       I        KPPdiffKzS(1-OLx,1-OLy,k,bi,bj),       U        KPPdiffKzS(1-OLx,1-OLy,k,bi,bj) )
700       O        KPPdiffKzS(1-OLx,1-OLy,k,bi,bj) )           CALL SMOOTH_HORIZ (
          CALL SMOOTH_HORIZ_RL (  
701       I        k, bi, bj,       I        k, bi, bj,
702       I        KPPdiffKzT(1-OLx,1-OLy,k,bi,bj),       U        KPPdiffKzT(1-OLx,1-OLy,k,bi,bj) )
      O        KPPdiffKzT(1-OLx,1-OLy,k,bi,bj) )  
703        END DO        END DO
704          _EXCH_XYZ_R8(KPPdiffKzS , myThid )
705          _EXCH_XYZ_R8(KPPdiffKzT , myThid )
706  #endif /* KPP_SMOOTH_DIFF */  #endif /* KPP_SMOOTH_DIFF */
707    
708    cph(
709    cph  crucial: this avoids full recomp./call of kppmix
710    CADJ store KPPhbl = comlev1_kpp, key = ikppkey
711    cph)
712    
713  C     Compute fraction of solar short-wave flux penetrating to  C     Compute fraction of solar short-wave flux penetrating to
714  C     the bottom of the mixing layer.  C     the bottom of the mixing layer.
# Line 866  C     the bottom of the mixing layer. Line 718  C     the bottom of the mixing layer.
718           ENDDO           ENDDO
719        ENDDO        ENDDO
720        CALL SWFRAC(        CALL SWFRAC(
721       I     (sNx+2*OLx)*(sNy+2*OLy), m1, worka,       I     (sNx+2*OLx)*(sNy+2*OLy), minusone,
722       O     workb )       I     mytime, mythid,
723         U     worka )
724        DO j=1-OLy,sNy+OLy        DO j=1-OLy,sNy+OLy
725           DO i=1-OLx,sNx+OLx           DO i=1-OLx,sNx+OLx
726              KPPfrac(i,j,bi,bj) = workb(i,j)              KPPfrac(i,j,bi,bj) = worka(i,j)
727           ENDDO           ENDDO
728        ENDDO        ENDDO
729    
730        ENDIF        ENDIF
731    
732  #endif ALLOW_KPP  #endif /* ALLOW_KPP */
733    
734          RETURN
735          END
736    
737          subroutine KPP_CALC_DUMMY(
738         I     bi, bj, myTime, myThid )
739    C     /==========================================================\
740    C     | SUBROUTINE KPP_CALC_DUMMY                                |
741    C     | o Compute all KPP fields defined in KPP.h                |
742    C     | o Dummy routine for TAMC
743    C     |==========================================================|
744    C     | This subroutine serves as an interface between MITGCMUV  |
745    C     | code and NCOM 1-D routines in kpp_routines.F             |
746    C     \==========================================================/
747          IMPLICIT NONE
748    
749    #include "SIZE.h"
750    #include "EEPARAMS.h"
751    #include "PARAMS.h"
752    #include "KPP.h"
753    #include "KPP_PARAMS.h"
754    #include "GRID.h"
755    
756    c Routine arguments
757    c     bi, bj - array indices on which to apply calculations
758    c     myTime - Current time in simulation
759    
760          INTEGER bi, bj
761          INTEGER myThid
762          _RL     myTime
763    
764    #ifdef ALLOW_KPP
765    
766    c Local constants
767          integer i, j, k
768    
769          DO j=1-OLy,sNy+OLy
770             DO i=1-OLx,sNx+OLx
771                KPPhbl (i,j,bi,bj) = 1.0
772                KPPfrac(i,j,bi,bj) = 0.0
773                DO k = 1,Nr
774                   KPPghat   (i,j,k,bi,bj) = 0.0
775                   KPPviscAz (i,j,k,bi,bj) = viscAr
776                   KPPdiffKzT(i,j,k,bi,bj) = diffKrT
777                   KPPdiffKzS(i,j,k,bi,bj) = diffKrS
778                ENDDO
779             ENDDO
780          ENDDO
781          
782    #endif
783        RETURN        RETURN
784        END        END

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.27

  ViewVC Help
Powered by ViewVC 1.1.22