New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
dynspg_flt.F90 in branches/2015/dev_r5803_UKMO_AGRIF_Vert_interp/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/2015/dev_r5803_UKMO_AGRIF_Vert_interp/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_flt.F90 @ 6258

Last change on this file since 6258 was 6258, checked in by timgraham, 8 years ago

First inclusion of Laurent Debreu's modified code for vertical refinement.
Still a lot of outstanding issues:
1) conv preprocessor fails for limrhg.F90 at the moment (for now I've run without ice model)
2) conv preprocessor fails for STO code - removed this code from testing for now
3) conv preprocessor fails for cpl_oasis.F90 - can work round this by modifying code but the preprocessor should be fixed to deal with this.

After that code compiles and can be run for horizontal grid refinement. Not yet working for vertical refinement.

File size: 20.1 KB
Line 
1MODULE dynspg_flt
2   !!======================================================================
3   !!                   ***  MODULE  dynspg_flt  ***
4   !! Ocean dynamics:  surface pressure gradient trend
5   !!======================================================================
6   !! History    OPA  !  1998-05  (G. Roullet)  free surface
7   !!                 !  1998-10  (G. Madec, M. Imbard)  release 8.2
8   !!   NEMO     O.1  !  2002-08  (G. Madec)  F90: Free form and module
9   !!             -   !  2002-11  (C. Talandier, A-M Treguier) Open boundaries
10   !!            1.0  !  2004-08  (C. Talandier) New trends organization
11   !!             -   !  2005-11  (V. Garnier) Surface pressure gradient organization
12   !!            2.0  !  2006-07  (S. Masson)  distributed restart using iom
13   !!             -   !  2006-08  (J.Chanut, A.Sellar) Calls to BDY routines.
14   !!            3.2  !  2009-03  (G. Madec, M. Leclair, R. Benshila) introduce sshwzv module
15   !!            3.7  !  2014-04  (F. Roquet, G. Madec)  add some trends diag
16   !!----------------------------------------------------------------------
17#if defined key_dynspg_flt   ||   defined key_esopa 
18   !!----------------------------------------------------------------------
19   !!   'key_dynspg_flt'                              filtered free surface
20   !!----------------------------------------------------------------------
21   !!   dyn_spg_flt  : update the momentum trend with the surface pressure gradient in the filtered free surface case
22   !!   flt_rst      : read/write the time-splitting restart fields in the ocean restart file
23   !!----------------------------------------------------------------------
24   USE oce             ! ocean dynamics and tracers
25   USE dom_oce         ! ocean space and time domain
26   USE zdf_oce         ! ocean vertical physics
27   USE sbc_oce         ! surface boundary condition: ocean
28   USE bdy_oce         ! Lateral open boundary condition
29   USE sol_oce         ! ocean elliptic solver
30   USE phycst          ! physical constants
31   USE domvvl          ! variable volume
32   USE dynadv          ! advection
33   USE solmat          ! matrix construction for elliptic solvers
34   USE solpcg          ! preconditionned conjugate gradient solver
35   USE solsor          ! Successive Over-relaxation solver
36   USE bdydyn          ! ocean open boundary condition on dynamics
37   USE bdyvol          ! ocean open boundary condition (bdy_vol routine)
38   USE cla             ! cross land advection
39   USE trd_oce         ! trends: ocean variables
40   USE trddyn          ! trend manager: dynamics
41   !
42   USE in_out_manager  ! I/O manager
43   USE lib_mpp         ! distributed memory computing library
44   USE wrk_nemo        ! Memory Allocation
45   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
46   USE prtctl          ! Print control
47   USE iom
48   USE lib_fortran
49   USE timing          ! Timing
50#if defined key_agrif
51   USE agrif_opa_interp
52#endif
53
54   IMPLICIT NONE
55   PRIVATE
56
57   PUBLIC   dyn_spg_flt  ! routine called by step.F90
58   PUBLIC   flt_rst      ! routine called by istate.F90
59
60   !! * Substitutions
61#  include "domzgr_substitute.h90"
62#  include "vectopt_loop_substitute.h90"
63   !!----------------------------------------------------------------------
64   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
65   !! $Id$
66   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
67   !!----------------------------------------------------------------------
68CONTAINS
69
70   SUBROUTINE dyn_spg_flt( kt, kindic )
71      !!----------------------------------------------------------------------
72      !!                  ***  routine dyn_spg_flt  ***
73      !!
74      !! ** Purpose :   Compute the now trend due to the surface pressure
75      !!      gradient in case of filtered free surface formulation  and add
76      !!      it to the general trend of momentum equation.
77      !!
78      !! ** Method  :   Filtered free surface formulation. The surface
79      !!      pressure gradient is given by:
80      !!         spgu = 1/rau0 d/dx(ps) =  1/e1u di( sshn + btda )
81      !!         spgv = 1/rau0 d/dy(ps) =  1/e2v dj( sshn + btda )
82      !!      where sshn is the free surface elevation and btda is the after
83      !!      time derivative of the free surface elevation
84      !!       -1- evaluate the surface presure trend (including the addi-
85      !!      tional force) in three steps:
86      !!        a- compute the right hand side of the elliptic equation:
87      !!            gcb = 1/(e1t e2t) [ di(e2u spgu) + dj(e1v spgv) ]
88      !!         where (spgu,spgv) are given by:
89      !!            spgu = vertical sum[ e3u (ub+ 2 rdt ua ) ]
90      !!                 - grav 2 rdt hu /e1u di[sshn + (emp-rnf)]
91      !!            spgv = vertical sum[ e3v (vb+ 2 rdt va) ]
92      !!                 - grav 2 rdt hv /e2v dj[sshn + (emp-rnf)]
93      !!         and define the first guess from previous computation :
94      !!            zbtd = btda
95      !!            btda = 2 zbtd - btdb
96      !!            btdb = zbtd
97      !!        b- compute the relative accuracy to be reached by the
98      !!         iterative solver
99      !!        c- apply the solver by a call to sol... routine
100      !!       -2- compute and add the free surface pressure gradient inclu-
101      !!      ding the additional force used to stabilize the equation.
102      !!
103      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend
104      !!
105      !! References : Roullet and Madec, JGR, 2000.
106      !!---------------------------------------------------------------------
107      INTEGER, INTENT(in   ) ::   kt       ! ocean time-step index
108      INTEGER, INTENT(  out) ::   kindic   ! solver convergence flag (<0 if not converge)
109      !
110      INTEGER  ::   ji, jj, jk   ! dummy loop indices
111      REAL(wp) ::   z2dt, z2dtg, zgcb, zbtd, ztdgu, ztdgv   ! local scalars
112      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv
113      REAL(wp), POINTER, DIMENSION(:,:)   ::  zpw
114      !!----------------------------------------------------------------------
115      !
116      IF( nn_timing == 1 )  CALL timing_start('dyn_spg_flt')
117      !
118      IF( kt == nit000 ) THEN
119         IF(lwp) WRITE(numout,*)
120         IF(lwp) WRITE(numout,*) 'dyn_spg_flt : surface pressure gradient trend'
121         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   (free surface constant volume case)'
122       
123         ! set to zero free surface specific arrays
124         spgu(:,:) = 0._wp                     ! surface pressure gradient (i-direction)
125         spgv(:,:) = 0._wp                     ! surface pressure gradient (j-direction)
126
127         ! read filtered free surface arrays in restart file
128         ! when using agrif, sshn, gcx have to be read in istate
129         IF(.NOT. lk_agrif) THEN
130            CALL flt_rst( nit000, 'READ' )      ! read or initialize the following fields:
131         !                                                        ! gcx, gcxb
132         ELSE
133            gcx (:,:) = 0.e0
134            gcxb(:,:) = 0.e0
135         ENDIF
136      ENDIF
137
138      ! Local constant initialization
139      z2dt = 2. * rdt                                             ! time step: leap-frog
140      IF( neuler == 0 .AND. kt == nit000   )   z2dt = rdt         ! time step: Euler if restart from rest
141      IF( neuler == 0 .AND. kt == nit000+1 )   CALL sol_mat( kt )
142      z2dtg  = grav * z2dt
143
144      ! Evaluate the masked next velocity (effect of the additional force not included)
145      ! --------------------------------- 
146      IF( lk_vvl ) THEN          ! variable volume  (surface pressure gradient already included in dyn_hpg)
147         !
148         IF( ln_dynadv_vec ) THEN      ! vector form : applied on velocity
149            DO jk = 1, jpkm1
150               DO jj = 2, jpjm1
151                  DO ji = fs_2, fs_jpim1   ! vector opt.
152                     ua(ji,jj,jk) = (  ub(ji,jj,jk) + z2dt * ua(ji,jj,jk)  ) * umask(ji,jj,jk)
153                     va(ji,jj,jk) = (  vb(ji,jj,jk) + z2dt * va(ji,jj,jk)  ) * vmask(ji,jj,jk)
154                  END DO
155               END DO
156            END DO
157            !
158         ELSE                          ! flux form : applied on thickness weighted velocity
159            DO jk = 1, jpkm1
160               DO jj = 2, jpjm1
161                  DO ji = fs_2, fs_jpim1   ! vector opt.
162                     ua(ji,jj,jk) = (        ub(ji,jj,jk) * fse3u_b(ji,jj,jk)      &
163                        &           + z2dt * ua(ji,jj,jk) * fse3u_n(ji,jj,jk)  )   &
164                        &         / fse3u_a(ji,jj,jk) * umask(ji,jj,jk)
165                     va(ji,jj,jk) = (        vb(ji,jj,jk) * fse3v_b(ji,jj,jk)      &
166                        &           + z2dt * va(ji,jj,jk) * fse3v_n(ji,jj,jk)  )   &
167                        &         / fse3v_a(ji,jj,jk) * vmask(ji,jj,jk)
168                 END DO
169               END DO
170            END DO
171            !
172         ENDIF
173         !
174      ELSE                       ! fixed volume  (add the surface pressure gradient + unweighted time stepping)
175         !
176         DO jj = 2, jpjm1              ! Surface pressure gradient (now)
177            DO ji = fs_2, fs_jpim1   ! vector opt.
178               spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj)
179               spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj)
180            END DO
181         END DO
182         DO jk = 1, jpkm1              ! unweighted time stepping
183            DO jj = 2, jpjm1
184               DO ji = fs_2, fs_jpim1   ! vector opt.
185                  ua(ji,jj,jk) = (  ub(ji,jj,jk) + z2dt * ( ua(ji,jj,jk) + spgu(ji,jj) )  ) * umask(ji,jj,jk)
186                  va(ji,jj,jk) = (  vb(ji,jj,jk) + z2dt * ( va(ji,jj,jk) + spgv(ji,jj) )  ) * vmask(ji,jj,jk)
187               END DO
188            END DO
189         END DO
190         !
191         IF( l_trddyn )   THEN                      ! temporary save of spg trends
192            CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv )
193            DO jk = 1, jpkm1              ! unweighted time stepping
194               DO jj = 2, jpjm1
195                  DO ji = fs_2, fs_jpim1   ! vector opt.
196                     ztrdu(ji,jj,jk) = spgu(ji,jj) * umask(ji,jj,jk)
197                     ztrdv(ji,jj,jk) = spgv(ji,jj) * vmask(ji,jj,jk)
198                  END DO
199               END DO
200            END DO
201            CALL trd_dyn( ztrdu, ztrdv, jpdyn_spgexp, kt )
202         ENDIF
203         !
204      ENDIF
205
206#if defined key_bdy
207      IF( lk_bdy ) CALL bdy_dyn( kt )   ! Update velocities on each open boundary
208      IF( lk_bdy ) CALL bdy_vol( kt )   ! Correction of the barotropic component velocity to control the volume of the system
209#endif
210#if defined key_agrif
211      CALL Agrif_dyn( kt )    ! Update velocities on each coarse/fine interfaces
212#endif
213      IF( nn_cla == 1 .AND. cp_cfg == 'orca' .AND. jp_cfg == 2 )   CALL cla_dynspg( kt )      ! Cross Land Advection (update (ua,va))
214
215      ! compute the next vertically averaged velocity (effect of the additional force not included)
216      ! ---------------------------------------------
217      DO jj = 2, jpjm1
218         DO ji = fs_2, fs_jpim1   ! vector opt.
219            spgu(ji,jj) = fse3u_a(ji,jj,1) * ua(ji,jj,1)
220            spgv(ji,jj) = fse3v_a(ji,jj,1) * va(ji,jj,1)
221         END DO
222      END DO
223      DO jk = 2, jpkm1                     ! vertical sum
224         DO jj = 2, jpjm1
225            DO ji = fs_2, fs_jpim1   ! vector opt.
226               spgu(ji,jj) = spgu(ji,jj) + fse3u_a(ji,jj,jk) * ua(ji,jj,jk)
227               spgv(ji,jj) = spgv(ji,jj) + fse3v_a(ji,jj,jk) * va(ji,jj,jk)
228            END DO
229         END DO
230      END DO
231
232      DO jj = 2, jpjm1                     ! transport: multiplied by the horizontal scale factor
233         DO ji = fs_2, fs_jpim1   ! vector opt.
234            spgu(ji,jj) = spgu(ji,jj) * e2u(ji,jj)
235            spgv(ji,jj) = spgv(ji,jj) * e1v(ji,jj)
236         END DO
237      END DO
238      CALL lbc_lnk( spgu, 'U', -1. )       ! lateral boundary conditions
239      CALL lbc_lnk( spgv, 'V', -1. )
240
241      IF( lk_vvl ) CALL sol_mat( kt )      ! build the matrix at kt (vvl case only)
242
243      ! Right hand side of the elliptic equation and first guess
244      ! --------------------------------------------------------
245      DO jj = 2, jpjm1
246         DO ji = fs_2, fs_jpim1   ! vector opt.
247            ! Divergence of the after vertically averaged velocity
248            zgcb =  spgu(ji,jj) - spgu(ji-1,jj)   &
249                  + spgv(ji,jj) - spgv(ji,jj-1)
250            gcb(ji,jj) = gcdprc(ji,jj) * zgcb
251            ! First guess of the after barotropic transport divergence
252            zbtd = gcx(ji,jj)
253            gcx (ji,jj) = 2. * zbtd   - gcxb(ji,jj)
254            gcxb(ji,jj) =      zbtd
255         END DO
256      END DO
257      ! applied the lateral boundary conditions
258      IF( nn_solv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 )   CALL lbc_lnk_e( gcb, c_solver_pt, 1., jpr2di, jpr2dj )   
259
260#if defined key_agrif
261      IF( .NOT. AGRIF_ROOT() ) THEN
262         ! add contribution of gradient of after barotropic transport divergence
263         IF( nbondi == -1 .OR. nbondi == 2 )   gcb(3     ,:) =   &
264            &    gcb(3     ,:) - z2dtg * z2dt * laplacu(2     ,:) * gcdprc(3     ,:) * hu(2     ,:) * e2u(2     ,:)
265         IF( nbondi ==  1 .OR. nbondi == 2 )   gcb(nlci-2,:) =   &
266            &    gcb(nlci-2,:) + z2dtg * z2dt * laplacu(nlci-2,:) * gcdprc(nlci-2,:) * hu(nlci-2,:) * e2u(nlci-2,:)
267         IF( nbondj == -1 .OR. nbondj == 2 )   gcb(:     ,3) =   &
268            &    gcb(:,3     ) - z2dtg * z2dt * laplacv(:,2     ) * gcdprc(:,3     ) * hv(:,2     ) * e1v(:,2     )
269         IF( nbondj ==  1 .OR. nbondj == 2 )   gcb(:,nlcj-2) =   &
270            &    gcb(:,nlcj-2) + z2dtg * z2dt * laplacv(:,nlcj-2) * gcdprc(:,nlcj-2) * hv(:,nlcj-2) * e1v(:,nlcj-2)
271      ENDIF
272#endif
273
274
275      ! Relative precision (computation on one processor)
276      ! ------------------
277      rnorme =0.e0
278      rnorme = GLOB_SUM( gcb(1:jpi,1:jpj) * gcdmat(1:jpi,1:jpj) * gcb(1:jpi,1:jpj) * bmask(:,:) )
279
280      epsr = eps * eps * rnorme
281      ncut = 0
282      ! if rnorme is 0, the solution is 0, the solver is not called
283      IF( rnorme == 0._wp ) THEN
284         gcx(:,:) = 0._wp
285         res   = 0._wp
286         niter = 0
287         ncut  = 999
288      ENDIF
289
290      ! Evaluate the next transport divergence
291      ! --------------------------------------
292      !    Iterarive solver for the elliptic equation (except IF sol.=0)
293      !    (output in gcx with boundary conditions applied)
294      kindic = 0
295      IF( ncut == 0 ) THEN
296         IF    ( nn_solv == 1 ) THEN   ;   CALL sol_pcg( kindic )      ! diagonal preconditioned conjuguate gradient
297         ELSEIF( nn_solv == 2 ) THEN   ;   CALL sol_sor( kindic )      ! successive-over-relaxation
298         ENDIF
299      ENDIF
300
301      ! Transport divergence gradient multiplied by z2dt
302      ! --------------------------------------------====
303      DO jj = 2, jpjm1
304         DO ji = fs_2, fs_jpim1   ! vector opt.
305            ! trend of Transport divergence gradient
306            ztdgu = z2dtg * (gcx(ji+1,jj  ) - gcx(ji,jj) ) / e1u(ji,jj)
307            ztdgv = z2dtg * (gcx(ji  ,jj+1) - gcx(ji,jj) ) / e2v(ji,jj)
308            ! multiplied by z2dt
309#if defined key_bdy
310            IF(lk_bdy) THEN
311            ! caution : grad D = 0 along open boundaries
312               spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj)
313               spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj)
314            ELSE
315               spgu(ji,jj) = z2dt * ztdgu
316               spgv(ji,jj) = z2dt * ztdgv
317            ENDIF
318#else
319            spgu(ji,jj) = z2dt * ztdgu
320            spgv(ji,jj) = z2dt * ztdgv
321#endif
322         END DO
323      END DO
324
325#if defined key_agrif     
326      IF( .NOT. Agrif_Root() ) THEN
327         ! caution : grad D (fine) = grad D (coarse) at coarse/fine interface
328         IF( nbondi == -1 .OR. nbondi == 2 ) spgu(2     ,:) = z2dtg * z2dt * laplacu(2     ,:) * umask(2     ,:,1)
329         IF( nbondi ==  1 .OR. nbondi == 2 ) spgu(nlci-2,:) = z2dtg * z2dt * laplacu(nlci-2,:) * umask(nlci-2,:,1)
330         IF( nbondj == -1 .OR. nbondj == 2 ) spgv(:,2     ) = z2dtg * z2dt * laplacv(:,2     ) * vmask(:     ,2,1)
331         IF( nbondj ==  1 .OR. nbondj == 2 ) spgv(:,nlcj-2) = z2dtg * z2dt * laplacv(:,nlcj-2) * vmask(:,nlcj-2,1)
332      ENDIF
333#endif     
334
335      IF( l_trddyn )   THEN                     
336         ztrdu(:,:,:) = ua(:,:,:)                 ! save the after velocity before the filtered SPG
337         ztrdv(:,:,:) = va(:,:,:)
338         !
339         CALL wrk_alloc( jpi, jpj, zpw )
340         !
341         zpw(:,:) = - z2dt * gcx(:,:)
342         CALL iom_put( "ssh_flt" , zpw )          ! output equivalent ssh modification due to implicit filter
343         !
344         !                                        ! save surface pressure flux: -pw at z=0
345         zpw(:,:) = - rau0 * grav * sshn(:,:) * wn(:,:,1) * tmask(:,:,1)
346         CALL iom_put( "pw0_exp" , zpw )
347         zpw(:,:) = wn(:,:,1)
348         CALL iom_put( "w0" , zpw )
349         zpw(:,:) =  rau0 * z2dtg * gcx(:,:) * wn(:,:,1) * tmask(:,:,1)
350         CALL iom_put( "pw0_flt" , zpw )
351         !
352         CALL wrk_dealloc( jpi, jpj, zpw ) 
353         !                                   
354      ENDIF
355     
356      ! Add the trends multiplied by z2dt to the after velocity
357      ! -------------------------------------------------------
358      !     ( c a u t i o n : (ua,va) here are the after velocity not the
359      !                       trend, the leap-frog time stepping will not
360      !                       be done in dynnxt.F90 routine)
361      DO jk = 1, jpkm1
362         DO jj = 2, jpjm1
363            DO ji = fs_2, fs_jpim1   ! vector opt.
364               ua(ji,jj,jk) = ( ua(ji,jj,jk) + spgu(ji,jj) ) * umask(ji,jj,jk)
365               va(ji,jj,jk) = ( va(ji,jj,jk) + spgv(ji,jj) ) * vmask(ji,jj,jk)
366            END DO
367         END DO
368      END DO
369
370      IF( l_trddyn )   THEN                      ! save the explicit SPG trends for further diagnostics
371         ztrdu(:,:,:) = ( ua(:,:,:) - ztrdu(:,:,:) ) / z2dt
372         ztrdv(:,:,:) = ( va(:,:,:) - ztrdv(:,:,:) ) / z2dt
373         CALL trd_dyn( ztrdu, ztrdv, jpdyn_spgflt, kt )
374         !
375         CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 
376      ENDIF
377
378      IF( lrst_oce )   CALL flt_rst( kt, 'WRITE' )      ! write filtered free surface arrays in restart file
379      !
380      IF( nn_timing == 1 )   CALL timing_stop('dyn_spg_flt')
381      !
382   END SUBROUTINE dyn_spg_flt
383
384
385   SUBROUTINE flt_rst( kt, cdrw )
386      !!---------------------------------------------------------------------
387      !!                   ***  ROUTINE ts_rst  ***
388      !!
389      !! ** Purpose : Read or write filtered free surface arrays in restart file
390      !!----------------------------------------------------------------------
391      INTEGER         , INTENT(in) ::   kt     ! ocean time-step
392      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
393      !!----------------------------------------------------------------------
394      !
395      IF( TRIM(cdrw) == 'READ' ) THEN
396         IF( iom_varid( numror, 'gcx', ldstop = .FALSE. ) > 0 ) THEN
397! Caution : extra-hallow
398! gcx and gcxb are defined as: DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)
399            CALL iom_get( numror, jpdom_autoglo, 'gcx' , gcx (1:jpi,1:jpj) )
400            CALL iom_get( numror, jpdom_autoglo, 'gcxb', gcxb(1:jpi,1:jpj) )
401            IF( neuler == 0 )   gcxb(:,:) = gcx (:,:)
402         ELSE
403            gcx (:,:) = 0.e0
404            gcxb(:,:) = 0.e0
405         ENDIF
406      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
407! Caution : extra-hallow
408! gcx and gcxb are defined as: DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)
409         CALL iom_rstput( kt, nitrst, numrow, 'gcx' , gcx (1:jpi,1:jpj) )
410         CALL iom_rstput( kt, nitrst, numrow, 'gcxb', gcxb(1:jpi,1:jpj) )
411      ENDIF
412      !
413   END SUBROUTINE flt_rst
414
415#else
416   !!----------------------------------------------------------------------
417   !!   Default case :   Empty module   No standart free surface cst volume
418   !!----------------------------------------------------------------------
419CONTAINS
420   SUBROUTINE dyn_spg_flt( kt, kindic )       ! Empty routine
421      WRITE(*,*) 'dyn_spg_flt: You should not have seen this print! error?', kt, kindic
422   END SUBROUTINE dyn_spg_flt
423   SUBROUTINE flt_rst    ( kt, cdrw )         ! Empty routine
424      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
425      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
426      WRITE(*,*) 'flt_rst: You should not have seen this print! error?', kt, cdrw
427   END SUBROUTINE flt_rst
428#endif
429   
430   !!======================================================================
431END MODULE dynspg_flt
Note: See TracBrowser for help on using the repository browser.