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 trunk/NEMO/OPA_SRC/DYN – NEMO

source: trunk/NEMO/OPA_SRC/DYN/dynspg_flt.F90 @ 1158

Last change on this file since 1158 was 1158, checked in by rblod, 16 years ago

OBC corrections, see ticket #224

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 23.5 KB
Line 
1MODULE dynspg_flt
2   !!======================================================================
3   !!                   ***  MODULE  dynspg_flt  ***
4   !! Ocean dynamics:  surface pressure gradient trend
5   !!======================================================================
6   !! History    8.0  !  98-05  (G. Roullet)  free surface
7   !!                 !  98-10  (G. Madec, M. Imbard)  release 8.2
8   !!            8.5  !  02-08  (G. Madec)  F90: Free form and module
9   !!            " "  !  02-11  (C. Talandier, A-M Treguier) Open boundaries
10   !!            9.0  !  04-08  (C. Talandier) New trends organization
11   !!            " "  !  05-11  (V. Garnier) Surface pressure gradient organization
12   !!            " "  !  06-07  (S. Masson)  distributed restart using iom
13   !!            " "  !  05-01  (J.Chanut, A.Sellar) Calls to BDY routines.
14   !!----------------------------------------------------------------------
15#if defined key_dynspg_flt   ||   defined key_esopa 
16   !!----------------------------------------------------------------------
17   !!   'key_dynspg_flt'                              filtered free surface
18   !!----------------------------------------------------------------------
19   !!----------------------------------------------------------------------
20   !!   dyn_spg_flt  : update the momentum trend with the surface pressure
21   !!                  gradient in the filtered free surface case with
22   !!                  vector optimization
23   !!   flt_rst      : read/write the time-splitting restart fields in the ocean restart file
24   !!----------------------------------------------------------------------
25   USE oce             ! ocean dynamics and tracers
26   USE dom_oce         ! ocean space and time domain
27   USE zdf_oce         ! ocean vertical physics
28   USE sbc_oce         ! surface boundary condition: ocean
29   USE obc_oce         ! Lateral open boundary condition
30   USE sol_oce         ! ocean elliptic solver
31   USE phycst          ! physical constants
32   USE domvvl          ! variable volume
33   USE solver          ! solver initialization
34   USE solpcg          ! preconditionned conjugate gradient solver
35   USE solsor          ! Successive Over-relaxation solver
36   USE solfet          ! FETI solver
37   USE obcdyn          ! ocean open boundary condition (obc_dyn routines)
38   USE obcvol          ! ocean open boundary condition (obc_vol routines)
39   USE bdy_oce         ! Unstructured open boundaries condition
40   USE bdydyn          ! Unstructured open boundaries condition (bdy_dyn routine)
41   USE bdyvol          ! Unstructured open boundaries condition (bdy_vol routine)
42   USE cla_dynspg      ! cross land advection
43   USE in_out_manager  ! I/O manager
44   USE lib_mpp         ! distributed memory computing library
45   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
46   USE prtctl          ! Print control
47   USE solmat          ! matrix construction for elliptic solvers
48   USE agrif_opa_interp
49   USE iom
50   USE restart         ! only for lrst_oce
51
52   IMPLICIT NONE
53   PRIVATE
54
55   PUBLIC dyn_spg_flt  ! routine called by step.F90
56   PUBLIC flt_rst      ! routine called by istate.F90
57
58   !! * Substitutions
59#  include "domzgr_substitute.h90"
60#  include "vectopt_loop_substitute.h90"
61   !!----------------------------------------------------------------------
62   !!   OPA 9.0 , LOCEAN-IPSL (2005)
63   !! $Id$
64   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
65   !!----------------------------------------------------------------------
66
67CONTAINS
68
69   SUBROUTINE dyn_spg_flt( kt, kindic )
70      !!----------------------------------------------------------------------
71      !!                  ***  routine dyn_spg_flt  ***
72      !!
73      !! ** Purpose :   Compute the now trend due to the surface pressure
74      !!      gradient in case of filtered free surface formulation  and add
75      !!      it to the general trend of momentum equation.
76      !!
77      !! ** Method  :   Filtered free surface formulation. The surface
78      !!      pressure gradient is given by:
79      !!         spgu = 1/rau0 d/dx(ps) =  1/e1u di( sshn + rnu btda )
80      !!         spgv = 1/rau0 d/dy(ps) =  1/e2v dj( sshn + rnu btda )
81      !!      where sshn is the free surface elevation and btda is the after
82      !!      of the free surface elevation
83      !!       -1- compute the after sea surface elevation from the kinematic
84      !!      surface boundary condition:
85      !!              zssha = sshb + 2 rdt ( wn - emp )
86      !!           Time filter applied on now sea surface elevation to avoid
87      !!      the divergence of two consecutive time-steps and swap of free
88      !!      surface arrays to start the next time step:
89      !!              sshb = sshn + atfp * [ sshb + zssha - 2 sshn ]
90      !!              sshn = zssha
91      !!       -2- evaluate the surface presure trend (including the addi-
92      !!      tional force) in three steps:
93      !!        a- compute the right hand side of the elliptic equation:
94      !!            gcb = 1/(e1t e2t) [ di(e2u spgu) + dj(e1v spgv) ]
95      !!         where (spgu,spgv) are given by:
96      !!            spgu = vertical sum[ e3u (ub+ 2 rdt ua ) ]
97      !!                 - grav 2 rdt hu /e1u di[sshn + emp]
98      !!            spgv = vertical sum[ e3v (vb+ 2 rdt va) ]
99      !!                 - grav 2 rdt hv /e2v dj[sshn + emp]
100      !!         and define the first guess from previous computation :
101      !!            zbtd = btda
102      !!            btda = 2 zbtd - btdb
103      !!            btdb = zbtd
104      !!        b- compute the relative accuracy to be reached by the
105      !!         iterative solver
106      !!        c- apply the solver by a call to sol... routine
107      !!       -3- compute and add the free surface pressure gradient inclu-
108      !!      ding the additional force used to stabilize the equation.
109      !!
110      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend
111      !!
112      !! References : Roullet and Madec 1999, JGR.
113      !!---------------------------------------------------------------------
114      !! * Modules used
115      USE oce    , ONLY :   zub   => ta,             &  ! ta used as workspace
116                            zvb   => sa                 ! sa   "          "
117
118      INTEGER, INTENT( in )  ::   kt         ! ocean time-step index
119      INTEGER, INTENT( out ) ::   kindic     ! solver convergence flag (<0 if not converge)
120      !!                                   
121      INTEGER  ::   ji, jj, jk                          ! dummy loop indices
122      REAL(wp) ::   z2dt, z2dtg, zraur, znugdt,      &  ! temporary scalars
123         &          znurau, zgcb, zbtd,              &  !   "          "
124         &          ztdgu, ztdgv                        !   "          "
125      !! Variable volume
126      REAL(wp), DIMENSION(jpi,jpj)     ::  &
127         zsshub, zsshua, zsshvb, zsshva, zssha          ! 2D workspace
128      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  &            ! 3D workspace
129         zfse3ub, zfse3ua, zfse3vb, zfse3va             ! 3D workspace
130      !!----------------------------------------------------------------------
131      !
132      IF( kt == nit000 ) THEN
133         IF(lwp) WRITE(numout,*)
134         IF(lwp) WRITE(numout,*) 'dyn_spg_flt : surface pressure gradient trend'
135         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   (free surface constant volume case)'
136       
137         ! set to zero free surface specific arrays
138         spgu(:,:) = 0.e0                     ! surface pressure gradient (i-direction)
139         spgv(:,:) = 0.e0                     ! surface pressure gradient (j-direction)
140         CALL solver_init( nit000 )           ! Elliptic solver initialisation
141
142         ! read filtered free surface arrays in restart file
143         CALL flt_rst( nit000, 'READ' )       ! read or initialize the following fields:
144         !                                    ! gcx, gcxb, sshb, sshn
145      ENDIF
146
147      ! Local constant initialization
148      z2dt = 2. * rdt                                       ! time step: leap-frog
149      IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt       ! time step: Euler if restart from rest
150      IF( neuler == 0 .AND. kt == nit000+1 ) CALL sol_mat(kt)
151      z2dtg  = grav * z2dt
152      zraur  = 1. / rauw
153      znugdt =  rnu * grav * z2dt
154      znurau =  znugdt * zraur
155
156      !! Explicit physics with thickness weighted updates
157      IF( lk_vvl ) THEN          ! variable volume
158
159         DO jj = 1, jpjm1
160            DO ji = 1,jpim1
161
162               ! Sea Surface Height at u-point before
163               zsshub(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  & 
164                  &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)       &
165                  &            + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) )
166
167               ! Sea Surface Height at v-point before
168               zsshvb(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  &
169                  &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )       &
170                  &            + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) )
171
172               ! Sea Surface Height at u-point after
173               zsshua(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  &
174                  &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * ssha(ji  ,jj)       &
175                  &            + e1t(ji+1,jj) * e2t(ji+1,jj) * ssha(ji+1,jj) )
176
177               ! Sea Surface Height at v-point after
178               zsshva(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  &
179                  &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * ssha(ji,jj  )       &
180                  &            + e1t(ji,jj+1) * e2t(ji,jj+1) * ssha(ji,jj+1) )
181
182            END DO
183         END DO
184
185         ! Boundaries conditions
186         CALL lbc_lnk( zsshub, 'U', 1. )    ;    CALL lbc_lnk( zsshvb, 'V', 1. )
187         CALL lbc_lnk( zsshua, 'U', 1. )    ;    CALL lbc_lnk( zsshva, 'V', 1. )
188
189         ! Scale factors at before and after time step
190         ! -------------------------------------------
191         CALL dom_vvl_sf( zsshub, 'U', zfse3ub ) ;    CALL dom_vvl_sf( zsshua, 'U', zfse3ua )
192         CALL dom_vvl_sf( zsshvb, 'V', zfse3vb ) ;    CALL dom_vvl_sf( zsshva, 'V', zfse3va )
193
194
195         ! Thickness weighting
196         ! -------------------
197         DO jk = 1, jpkm1
198            DO jj = 1, jpj
199               DO ji = 1, jpi
200                  ua(ji,jj,jk) = ua(ji,jj,jk) * fse3u(ji,jj,jk)
201                  va(ji,jj,jk) = va(ji,jj,jk) * fse3v(ji,jj,jk)
202
203                  zub(ji,jj,jk) = ub(ji,jj,jk) * zfse3ub(ji,jj,jk)
204                  zvb(ji,jj,jk) = vb(ji,jj,jk) * zfse3vb(ji,jj,jk)
205               END DO
206            END DO
207         END DO
208
209         ! Evaluate the masked next velocity (effect of the additional force not included)
210         DO jk = 1, jpkm1
211            DO jj = 2, jpjm1
212               DO ji = fs_2, fs_jpim1   ! vector opt.
213                  ua(ji,jj,jk) = ( zub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) /zfse3ua(ji,jj,jk) * umask(ji,jj,jk)
214                  va(ji,jj,jk) = ( zvb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) /zfse3va(ji,jj,jk) * vmask(ji,jj,jk)
215               END DO
216            END DO
217         END DO
218
219      ELSE                       ! fixed volume
220
221         ! Surface pressure gradient (now)
222         DO jj = 2, jpjm1
223            DO ji = fs_2, fs_jpim1   ! vector opt.
224               spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj)
225               spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj)
226            END DO
227         END DO 
228
229         ! Add the surface pressure trend to the general trend
230         DO jk = 1, jpkm1
231            DO jj = 2, jpjm1
232               DO ji = fs_2, fs_jpim1   ! vector opt.
233                  ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj)
234                  va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj)
235               END DO
236            END DO
237         END DO
238
239         ! Evaluate the masked next velocity (effect of the additional force not included)
240         DO jk = 1, jpkm1
241            DO jj = 2, jpjm1
242               DO ji = fs_2, fs_jpim1   ! vector opt.
243                  ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk)
244                  va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk)
245               END DO
246            END DO
247         END DO
248
249      ENDIF
250
251#if defined key_obc
252      CALL obc_dyn( kt )      ! Update velocities on each open boundary with the radiation algorithm
253      CALL obc_vol( kt )      ! Correction of the barotropic componant velocity to control the volume of the system
254#endif
255#if defined key_bdy
256      ! Update velocities on unstructured boundary using the Flow Relaxation Scheme
257      CALL bdy_dyn_frs( kt )
258
259      IF (ln_bdy_vol) THEN
260      ! Correction of the barotropic component velocity to control the volume of the system
261        CALL bdy_vol( kt )
262      ENDIF
263#endif
264#if defined key_agrif
265      CALL Agrif_dyn( kt )    ! Update velocities on each coarse/fine interfaces
266#endif
267#if defined key_orca_r2
268      IF( n_cla == 1 )   CALL dyn_spg_cla( kt )      ! Cross Land Advection (update (ua,va))
269#endif
270
271      ! compute the next vertically averaged velocity (effect of the additional force not included)
272      ! ---------------------------------------------
273      DO jj = 2, jpjm1
274         DO ji = fs_2, fs_jpim1   ! vector opt.
275            spgu(ji,jj) = 0.e0
276            spgv(ji,jj) = 0.e0
277         END DO
278      END DO
279
280      ! vertical sum
281!CDIR NOLOOPCHG
282      IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll
283         DO jk = 1, jpkm1
284            DO ji = 1, jpij
285               spgu(ji,1) = spgu(ji,1) + fse3u(ji,1,jk) * ua(ji,1,jk)
286               spgv(ji,1) = spgv(ji,1) + fse3v(ji,1,jk) * va(ji,1,jk)
287            END DO
288         END DO
289      ELSE                        ! No  vector opt.
290         DO jk = 1, jpkm1
291            DO jj = 2, jpjm1
292               DO ji = 2, jpim1
293                  spgu(ji,jj) = spgu(ji,jj) + fse3u(ji,jj,jk) * ua(ji,jj,jk)
294                  spgv(ji,jj) = spgv(ji,jj) + fse3v(ji,jj,jk) * va(ji,jj,jk)
295               END DO
296            END DO
297         END DO
298      ENDIF
299
300      ! transport: multiplied by the horizontal scale factor
301      DO jj = 2, jpjm1
302         DO ji = fs_2, fs_jpim1   ! vector opt.
303            spgu(ji,jj) = spgu(ji,jj) * e2u(ji,jj)
304            spgv(ji,jj) = spgv(ji,jj) * e1v(ji,jj)
305         END DO
306      END DO
307
308      ! Boundary conditions on (spgu,spgv)
309      CALL lbc_lnk( spgu, 'U', -1. )
310      CALL lbc_lnk( spgv, 'V', -1. )
311
312      IF( lk_vvl ) CALL sol_mat( kt )
313
314      ! Right hand side of the elliptic equation and first guess
315      ! -----------------------------------------------------------
316      DO jj = 2, jpjm1
317         DO ji = fs_2, fs_jpim1   ! vector opt.
318            ! Divergence of the after vertically averaged velocity
319            zgcb =  spgu(ji,jj) - spgu(ji-1,jj)   &
320                  + spgv(ji,jj) - spgv(ji,jj-1)
321            gcb(ji,jj) = gcdprc(ji,jj) * zgcb
322            ! First guess of the after barotropic transport divergence
323            zbtd = gcx(ji,jj)
324            gcx (ji,jj) = 2. * zbtd   - gcxb(ji,jj)
325            gcxb(ji,jj) =      zbtd
326         END DO
327      END DO
328      ! applied the lateral boundary conditions
329      IF( nsolv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 ) CALL lbc_lnk_e( gcb, c_solver_pt, 1. )   
330
331#if defined key_agrif
332      IF( .NOT. AGRIF_ROOT() ) THEN
333         ! add contribution of gradient of after barotropic transport divergence
334         IF( nbondi == -1 .OR. nbondi == 2 )   gcb(3     ,:) =   &
335            &    gcb(3     ,:) - znugdt * z2dt * laplacu(2     ,:) * gcdprc(3     ,:) * hu(2     ,:) * e2u(2     ,:)
336         IF( nbondi ==  1 .OR. nbondi == 2 )   gcb(nlci-2,:) =   &
337            &    gcb(nlci-2,:) + znugdt * z2dt * laplacu(nlci-2,:) * gcdprc(nlci-2,:) * hu(nlci-2,:) * e2u(nlci-2,:)
338         IF( nbondj == -1 .OR. nbondj == 2 )   gcb(:     ,3) =   &
339            &    gcb(:,3     ) - znugdt * z2dt * laplacv(:,2     ) * gcdprc(:,3     ) * hv(:,2     ) * e1v(:,2     )
340         IF( nbondj ==  1 .OR. nbondj == 2 )   gcb(:,nlcj-2) =   &
341            &    gcb(:,nlcj-2) + znugdt * z2dt * laplacv(:,nlcj-2) * gcdprc(:,nlcj-2) * hv(:,nlcj-2) * e1v(:,nlcj-2)
342      ENDIF
343#endif
344
345
346      ! Relative precision (computation on one processor)
347      ! ------------------
348      rnorme =0.
349      rnorme = SUM( gcb(1:jpi,1:jpj) * gcdmat(1:jpi,1:jpj) * gcb(1:jpi,1:jpj) * bmask(:,:) )
350      IF( lk_mpp )   CALL mpp_sum( rnorme )   ! sum over the global domain
351
352      epsr = eps * eps * rnorme
353      ncut = 0
354      ! if rnorme is 0, the solution is 0, the solver is not called
355      IF( rnorme == 0.e0 ) THEN
356         gcx(:,:) = 0.e0
357         res   = 0.e0
358         niter = 0
359         ncut  = 999
360      ENDIF
361
362      ! Evaluate the next transport divergence
363      ! --------------------------------------
364      !    Iterarive solver for the elliptic equation (except IF sol.=0)
365      !    (output in gcx with boundary conditions applied)
366      kindic = 0
367      IF( ncut == 0 ) THEN
368         IF( nsolv == 1 ) THEN         ! diagonal preconditioned conjuguate gradient
369            CALL sol_pcg( kindic )
370         ELSEIF( nsolv == 2 ) THEN     ! successive-over-relaxation
371            CALL sol_sor( kindic )
372         ELSEIF( nsolv == 3 ) THEN     ! FETI solver
373            CALL sol_fet( kindic )
374         ELSE                          ! e r r o r in nsolv namelist parameter
375            WRITE(ctmp1,*) ' ~~~~~~~~~~~                not = ', nsolv
376            CALL ctl_stop( ' dyn_spg_flt : e r r o r, nsolv = 1, 2 or 3', ctmp1 )
377         ENDIF
378      ENDIF
379
380      ! Transport divergence gradient multiplied by z2dt
381      ! --------------------------------------------====
382      DO jj = 2, jpjm1
383         DO ji = fs_2, fs_jpim1   ! vector opt.
384            ! trend of Transport divergence gradient
385            ztdgu = znugdt * (gcx(ji+1,jj  ) - gcx(ji,jj) ) / e1u(ji,jj)
386            ztdgv = znugdt * (gcx(ji  ,jj+1) - gcx(ji,jj) ) / e2v(ji,jj)
387            ! multiplied by z2dt
388#if defined key_obc
389            ! caution : grad D = 0 along open boundaries
390            spgu(ji,jj) = z2dt * ztdgu * obcumask(ji,jj)
391            spgv(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj)
392#elif defined key_bdy
393            ! caution : grad D = 0 along open boundaries
394            ! Remark: The filtering force could be reduced here in the FRS zone
395            !         by multiplying spgu/spgv by (1-alpha) ?? 
396            spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj)
397            spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj)           
398#else
399            spgu(ji,jj) = z2dt * ztdgu
400            spgv(ji,jj) = z2dt * ztdgv
401#endif
402         END DO
403      END DO
404
405#if defined key_agrif     
406      IF( .NOT. Agrif_Root() ) THEN
407         ! caution : grad D (fine) = grad D (coarse) at coarse/fine interface
408         IF( nbondi == -1 .OR. nbondi == 2 ) spgu(2     ,:) = znugdt * z2dt * laplacu(2     ,:) * umask(2     ,:,1)
409         IF( nbondi ==  1 .OR. nbondi == 2 ) spgu(nlci-2,:) = znugdt * z2dt * laplacu(nlci-2,:) * umask(nlci-2,:,1)
410         IF( nbondj == -1 .OR. nbondj == 2 ) spgv(:,2     ) = znugdt * z2dt * laplacv(:,2     ) * vmask(:     ,2,1)
411         IF( nbondj ==  1 .OR. nbondj == 2 ) spgv(:,nlcj-2) = znugdt * z2dt * laplacv(:,nlcj-2) * vmask(:,nlcj-2,1)
412      ENDIF
413#endif     
414      ! 7.  Add the trends multiplied by z2dt to the after velocity
415      ! -----------------------------------------------------------
416      !     ( c a u t i o n : (ua,va) here are the after velocity not the
417      !                       trend, the leap-frog time stepping will not
418      !                       be done in dynnxt.F90 routine)
419      DO jk = 1, jpkm1
420         DO jj = 2, jpjm1
421            DO ji = fs_2, fs_jpim1   ! vector opt.
422               ua(ji,jj,jk) = (ua(ji,jj,jk) + spgu(ji,jj)) * umask(ji,jj,jk)
423               va(ji,jj,jk) = (va(ji,jj,jk) + spgv(ji,jj)) * vmask(ji,jj,jk)
424            END DO
425         END DO
426      END DO
427
428      ! Sea surface elevation time stepping
429      ! -----------------------------------
430      IF( lk_vvl ) THEN   ! after free surface elevation
431         zssha(:,:) = ssha(:,:)
432      ELSE
433         zssha(:,:) = sshb(:,:) + z2dt * ( wn(:,:,1) - emp(:,:) * zraur ) * tmask(:,:,1)
434      ENDIF
435#if defined key_obc
436# if defined key_agrif
437      IF ( Agrif_Root() ) THEN
438# endif
439         zssha(:,:)=zssha(:,:)*obctmsk(:,:)
440         CALL lbc_lnk(zssha,'T',1.)  ! absolutly compulsory !! (jmm)
441# if defined key_agrif
442      ENDIF
443# endif
444#endif
445
446      IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler (forward) time stepping, no time filter
447         ! swap of arrays
448         sshb(:,:) = sshn (:,:)
449         sshn(:,:) = zssha(:,:)
450      ELSE                                           ! Leap-frog time stepping and time filter
451         ! time filter and array swap
452         sshb(:,:) = atfp * ( sshb(:,:) + zssha(:,:) ) + atfp1 * sshn(:,:)
453         sshn(:,:) = zssha(:,:)
454      ENDIF
455
456      ! write filtered free surface arrays in restart file
457      ! --------------------------------------------------
458      IF( lrst_oce ) CALL flt_rst( kt, 'WRITE' )
459
460      ! print sum trends (used for debugging)
461      IF(ln_ctl)     CALL prt_ctl( tab2d_1=sshn, clinfo1=' spg  - ssh: ', mask1=tmask )
462      !
463   END SUBROUTINE dyn_spg_flt
464
465
466   SUBROUTINE flt_rst( kt, cdrw )
467     !!---------------------------------------------------------------------
468     !!                   ***  ROUTINE ts_rst  ***
469     !!
470     !! ** Purpose : Read or write filtered free surface arrays in restart file
471     !!----------------------------------------------------------------------
472     INTEGER         , INTENT(in) ::   kt         ! ocean time-step
473     CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
474     !!----------------------------------------------------------------------
475
476     IF( TRIM(cdrw) == 'READ' ) THEN
477        IF( iom_varid( numror, 'gcx', ldstop = .FALSE. ) > 0 ) THEN
478! Caution : extra-hallow
479! gcx and gcxb are defined as: DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)
480           CALL iom_get( numror, jpdom_autoglo, 'gcx' , gcx (1:jpi,1:jpj) )
481           CALL iom_get( numror, jpdom_autoglo, 'gcxb', gcxb(1:jpi,1:jpj) )
482           CALL iom_get( numror, jpdom_autoglo, 'sshb', sshb(:,:)         )
483           CALL iom_get( numror, jpdom_autoglo, 'sshn', sshn(:,:)         )
484           IF( neuler == 0 ) THEN
485              sshb(:,:) = sshn(:,:)
486              gcxb(:,:) = gcx (:,:)
487           ENDIF
488        ELSE
489           gcx (:,:) = 0.e0
490           gcxb(:,:) = 0.e0
491           IF( nn_rstssh == 1 ) THEN 
492              sshb(:,:) = 0.e0
493              sshn(:,:) = 0.e0
494           ENDIF
495        ENDIF
496     ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
497! Caution : extra-hallow
498! gcx and gcxb are defined as: DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)
499        CALL iom_rstput( kt, nitrst, numrow, 'gcx' , gcx( 1:jpi,1:jpj) )
500        CALL iom_rstput( kt, nitrst, numrow, 'gcxb', gcxb(1:jpi,1:jpj) )
501        CALL iom_rstput( kt, nitrst, numrow, 'sshb', sshb(:,:)         )
502        CALL iom_rstput( kt, nitrst, numrow, 'sshn', sshn(:,:)         )
503     ENDIF
504     !
505   END SUBROUTINE flt_rst
506
507#else
508   !!----------------------------------------------------------------------
509   !!   Default case :   Empty module   No standart free surface cst volume
510   !!----------------------------------------------------------------------
511CONTAINS
512   SUBROUTINE dyn_spg_flt( kt, kindic )       ! Empty routine
513      WRITE(*,*) 'dyn_spg_flt: You should not have seen this print! error?', kt, kindic
514   END SUBROUTINE dyn_spg_flt
515   SUBROUTINE flt_rst    ( kt, cdrw )         ! Empty routine
516      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
517      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
518      WRITE(*,*) 'flt_rst: You should not have seen this print! error?', kt, cdrw
519   END SUBROUTINE flt_rst
520#endif
521   
522   !!======================================================================
523END MODULE dynspg_flt
Note: See TracBrowser for help on using the repository browser.