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 @ 1200

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

Adapt Agrif to the new SBC and correct several bugs for agrif (restart writing and reading), see ticket #133
Note : this fix does not work yet on NEC computerq (sxf90/360)

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 23.6 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         ! when using agrif, sshn, gcx have to be read in istate
144         IF (.NOT. lk_agrif) CALL flt_rst( nit000, 'READ' )       ! read or initialize the following fields:
145         !                                                        ! gcx, gcxb, sshb, sshn
146      ENDIF
147
148      ! Local constant initialization
149      z2dt = 2. * rdt                                       ! time step: leap-frog
150      IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt       ! time step: Euler if restart from rest
151      IF( neuler == 0 .AND. kt == nit000+1 ) CALL sol_mat(kt)
152      z2dtg  = grav * z2dt
153      zraur  = 1. / rauw
154      znugdt =  rnu * grav * z2dt
155      znurau =  znugdt * zraur
156
157      !! Explicit physics with thickness weighted updates
158      IF( lk_vvl ) THEN          ! variable volume
159
160         DO jj = 1, jpjm1
161            DO ji = 1,jpim1
162
163               ! Sea Surface Height at u-point before
164               zsshub(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  & 
165                  &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshb(ji  ,jj)       &
166                  &            + e1t(ji+1,jj) * e2t(ji+1,jj) * sshb(ji+1,jj) )
167
168               ! Sea Surface Height at v-point before
169               zsshvb(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  &
170                  &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshb(ji,jj  )       &
171                  &            + e1t(ji,jj+1) * e2t(ji,jj+1) * sshb(ji,jj+1) )
172
173               ! Sea Surface Height at u-point after
174               zsshua(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )  &
175                  &          * ( e1t(ji  ,jj) * e2t(ji  ,jj) * ssha(ji  ,jj)       &
176                  &            + e1t(ji+1,jj) * e2t(ji+1,jj) * ssha(ji+1,jj) )
177
178               ! Sea Surface Height at v-point after
179               zsshva(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )  &
180                  &          * ( e1t(ji,jj  ) * e2t(ji,jj  ) * ssha(ji,jj  )       &
181                  &            + e1t(ji,jj+1) * e2t(ji,jj+1) * ssha(ji,jj+1) )
182
183            END DO
184         END DO
185
186         ! Boundaries conditions
187         CALL lbc_lnk( zsshub, 'U', 1. )    ;    CALL lbc_lnk( zsshvb, 'V', 1. )
188         CALL lbc_lnk( zsshua, 'U', 1. )    ;    CALL lbc_lnk( zsshva, 'V', 1. )
189
190         ! Scale factors at before and after time step
191         ! -------------------------------------------
192         CALL dom_vvl_sf( zsshub, 'U', zfse3ub ) ;    CALL dom_vvl_sf( zsshua, 'U', zfse3ua )
193         CALL dom_vvl_sf( zsshvb, 'V', zfse3vb ) ;    CALL dom_vvl_sf( zsshva, 'V', zfse3va )
194
195
196         ! Thickness weighting
197         ! -------------------
198         DO jk = 1, jpkm1
199            DO jj = 1, jpj
200               DO ji = 1, jpi
201                  ua(ji,jj,jk) = ua(ji,jj,jk) * fse3u(ji,jj,jk)
202                  va(ji,jj,jk) = va(ji,jj,jk) * fse3v(ji,jj,jk)
203
204                  zub(ji,jj,jk) = ub(ji,jj,jk) * zfse3ub(ji,jj,jk)
205                  zvb(ji,jj,jk) = vb(ji,jj,jk) * zfse3vb(ji,jj,jk)
206               END DO
207            END DO
208         END DO
209
210         ! Evaluate the masked next velocity (effect of the additional force not included)
211         DO jk = 1, jpkm1
212            DO jj = 2, jpjm1
213               DO ji = fs_2, fs_jpim1   ! vector opt.
214                  ua(ji,jj,jk) = ( zub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) /zfse3ua(ji,jj,jk) * umask(ji,jj,jk)
215                  va(ji,jj,jk) = ( zvb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) /zfse3va(ji,jj,jk) * vmask(ji,jj,jk)
216               END DO
217            END DO
218         END DO
219
220      ELSE                       ! fixed volume
221
222         ! Surface pressure gradient (now)
223         DO jj = 2, jpjm1
224            DO ji = fs_2, fs_jpim1   ! vector opt.
225               spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) / e1u(ji,jj)
226               spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) / e2v(ji,jj)
227            END DO
228         END DO 
229
230         ! Add the surface pressure trend to the general trend
231         DO jk = 1, jpkm1
232            DO jj = 2, jpjm1
233               DO ji = fs_2, fs_jpim1   ! vector opt.
234                  ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj)
235                  va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj)
236               END DO
237            END DO
238         END DO
239
240         ! Evaluate the masked next velocity (effect of the additional force not included)
241         DO jk = 1, jpkm1
242            DO jj = 2, jpjm1
243               DO ji = fs_2, fs_jpim1   ! vector opt.
244                  ua(ji,jj,jk) = ( ub(ji,jj,jk) + z2dt * ua(ji,jj,jk) ) * umask(ji,jj,jk)
245                  va(ji,jj,jk) = ( vb(ji,jj,jk) + z2dt * va(ji,jj,jk) ) * vmask(ji,jj,jk)
246               END DO
247            END DO
248         END DO
249
250      ENDIF
251
252#if defined key_obc
253      CALL obc_dyn( kt )      ! Update velocities on each open boundary with the radiation algorithm
254      CALL obc_vol( kt )      ! Correction of the barotropic componant velocity to control the volume of the system
255#endif
256#if defined key_bdy
257      ! Update velocities on unstructured boundary using the Flow Relaxation Scheme
258      CALL bdy_dyn_frs( kt )
259
260      IF (ln_bdy_vol) THEN
261      ! Correction of the barotropic component velocity to control the volume of the system
262        CALL bdy_vol( kt )
263      ENDIF
264#endif
265#if defined key_agrif
266      CALL Agrif_dyn( kt )    ! Update velocities on each coarse/fine interfaces
267#endif
268#if defined key_orca_r2
269      IF( n_cla == 1 )   CALL dyn_spg_cla( kt )      ! Cross Land Advection (update (ua,va))
270#endif
271
272      ! compute the next vertically averaged velocity (effect of the additional force not included)
273      ! ---------------------------------------------
274      DO jj = 2, jpjm1
275         DO ji = fs_2, fs_jpim1   ! vector opt.
276            spgu(ji,jj) = 0.e0
277            spgv(ji,jj) = 0.e0
278         END DO
279      END DO
280
281      ! vertical sum
282!CDIR NOLOOPCHG
283      IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll
284         DO jk = 1, jpkm1
285            DO ji = 1, jpij
286               spgu(ji,1) = spgu(ji,1) + fse3u(ji,1,jk) * ua(ji,1,jk)
287               spgv(ji,1) = spgv(ji,1) + fse3v(ji,1,jk) * va(ji,1,jk)
288            END DO
289         END DO
290      ELSE                        ! No  vector opt.
291         DO jk = 1, jpkm1
292            DO jj = 2, jpjm1
293               DO ji = 2, jpim1
294                  spgu(ji,jj) = spgu(ji,jj) + fse3u(ji,jj,jk) * ua(ji,jj,jk)
295                  spgv(ji,jj) = spgv(ji,jj) + fse3v(ji,jj,jk) * va(ji,jj,jk)
296               END DO
297            END DO
298         END DO
299      ENDIF
300
301      ! transport: multiplied by the horizontal scale factor
302      DO jj = 2, jpjm1
303         DO ji = fs_2, fs_jpim1   ! vector opt.
304            spgu(ji,jj) = spgu(ji,jj) * e2u(ji,jj)
305            spgv(ji,jj) = spgv(ji,jj) * e1v(ji,jj)
306         END DO
307      END DO
308
309      ! Boundary conditions on (spgu,spgv)
310      CALL lbc_lnk( spgu, 'U', -1. )
311      CALL lbc_lnk( spgv, 'V', -1. )
312
313      IF( lk_vvl ) CALL sol_mat( kt )
314
315      ! Right hand side of the elliptic equation and first guess
316      ! -----------------------------------------------------------
317      DO jj = 2, jpjm1
318         DO ji = fs_2, fs_jpim1   ! vector opt.
319            ! Divergence of the after vertically averaged velocity
320            zgcb =  spgu(ji,jj) - spgu(ji-1,jj)   &
321                  + spgv(ji,jj) - spgv(ji,jj-1)
322            gcb(ji,jj) = gcdprc(ji,jj) * zgcb
323            ! First guess of the after barotropic transport divergence
324            zbtd = gcx(ji,jj)
325            gcx (ji,jj) = 2. * zbtd   - gcxb(ji,jj)
326            gcxb(ji,jj) =      zbtd
327         END DO
328      END DO
329      ! applied the lateral boundary conditions
330      IF( nsolv == 2 .AND. MAX( jpr2di, jpr2dj ) > 0 ) CALL lbc_lnk_e( gcb, c_solver_pt, 1. )   
331
332#if defined key_agrif
333      IF( .NOT. AGRIF_ROOT() ) THEN
334         ! add contribution of gradient of after barotropic transport divergence
335         IF( nbondi == -1 .OR. nbondi == 2 )   gcb(3     ,:) =   &
336            &    gcb(3     ,:) - znugdt * z2dt * laplacu(2     ,:) * gcdprc(3     ,:) * hu(2     ,:) * e2u(2     ,:)
337         IF( nbondi ==  1 .OR. nbondi == 2 )   gcb(nlci-2,:) =   &
338            &    gcb(nlci-2,:) + znugdt * z2dt * laplacu(nlci-2,:) * gcdprc(nlci-2,:) * hu(nlci-2,:) * e2u(nlci-2,:)
339         IF( nbondj == -1 .OR. nbondj == 2 )   gcb(:     ,3) =   &
340            &    gcb(:,3     ) - znugdt * z2dt * laplacv(:,2     ) * gcdprc(:,3     ) * hv(:,2     ) * e1v(:,2     )
341         IF( nbondj ==  1 .OR. nbondj == 2 )   gcb(:,nlcj-2) =   &
342            &    gcb(:,nlcj-2) + znugdt * z2dt * laplacv(:,nlcj-2) * gcdprc(:,nlcj-2) * hv(:,nlcj-2) * e1v(:,nlcj-2)
343      ENDIF
344#endif
345
346
347      ! Relative precision (computation on one processor)
348      ! ------------------
349      rnorme =0.
350      rnorme = SUM( gcb(1:jpi,1:jpj) * gcdmat(1:jpi,1:jpj) * gcb(1:jpi,1:jpj) * bmask(:,:) )
351      IF( lk_mpp )   CALL mpp_sum( rnorme )   ! sum over the global domain
352
353      epsr = eps * eps * rnorme
354      ncut = 0
355      ! if rnorme is 0, the solution is 0, the solver is not called
356      IF( rnorme == 0.e0 ) THEN
357         gcx(:,:) = 0.e0
358         res   = 0.e0
359         niter = 0
360         ncut  = 999
361      ENDIF
362
363      ! Evaluate the next transport divergence
364      ! --------------------------------------
365      !    Iterarive solver for the elliptic equation (except IF sol.=0)
366      !    (output in gcx with boundary conditions applied)
367      kindic = 0
368      IF( ncut == 0 ) THEN
369         IF( nsolv == 1 ) THEN         ! diagonal preconditioned conjuguate gradient
370            CALL sol_pcg( kindic )
371         ELSEIF( nsolv == 2 ) THEN     ! successive-over-relaxation
372            CALL sol_sor( kindic )
373         ELSEIF( nsolv == 3 ) THEN     ! FETI solver
374            CALL sol_fet( kindic )
375         ELSE                          ! e r r o r in nsolv namelist parameter
376            WRITE(ctmp1,*) ' ~~~~~~~~~~~                not = ', nsolv
377            CALL ctl_stop( ' dyn_spg_flt : e r r o r, nsolv = 1, 2 or 3', ctmp1 )
378         ENDIF
379      ENDIF
380
381      ! Transport divergence gradient multiplied by z2dt
382      ! --------------------------------------------====
383      DO jj = 2, jpjm1
384         DO ji = fs_2, fs_jpim1   ! vector opt.
385            ! trend of Transport divergence gradient
386            ztdgu = znugdt * (gcx(ji+1,jj  ) - gcx(ji,jj) ) / e1u(ji,jj)
387            ztdgv = znugdt * (gcx(ji  ,jj+1) - gcx(ji,jj) ) / e2v(ji,jj)
388            ! multiplied by z2dt
389#if defined key_obc
390            ! caution : grad D = 0 along open boundaries
391            spgu(ji,jj) = z2dt * ztdgu * obcumask(ji,jj)
392            spgv(ji,jj) = z2dt * ztdgv * obcvmask(ji,jj)
393#elif defined key_bdy
394            ! caution : grad D = 0 along open boundaries
395            ! Remark: The filtering force could be reduced here in the FRS zone
396            !         by multiplying spgu/spgv by (1-alpha) ?? 
397            spgu(ji,jj) = z2dt * ztdgu * bdyumask(ji,jj)
398            spgv(ji,jj) = z2dt * ztdgv * bdyvmask(ji,jj)           
399#else
400            spgu(ji,jj) = z2dt * ztdgu
401            spgv(ji,jj) = z2dt * ztdgv
402#endif
403         END DO
404      END DO
405
406#if defined key_agrif     
407      IF( .NOT. Agrif_Root() ) THEN
408         ! caution : grad D (fine) = grad D (coarse) at coarse/fine interface
409         IF( nbondi == -1 .OR. nbondi == 2 ) spgu(2     ,:) = znugdt * z2dt * laplacu(2     ,:) * umask(2     ,:,1)
410         IF( nbondi ==  1 .OR. nbondi == 2 ) spgu(nlci-2,:) = znugdt * z2dt * laplacu(nlci-2,:) * umask(nlci-2,:,1)
411         IF( nbondj == -1 .OR. nbondj == 2 ) spgv(:,2     ) = znugdt * z2dt * laplacv(:,2     ) * vmask(:     ,2,1)
412         IF( nbondj ==  1 .OR. nbondj == 2 ) spgv(:,nlcj-2) = znugdt * z2dt * laplacv(:,nlcj-2) * vmask(:,nlcj-2,1)
413      ENDIF
414#endif     
415      ! 7.  Add the trends multiplied by z2dt to the after velocity
416      ! -----------------------------------------------------------
417      !     ( c a u t i o n : (ua,va) here are the after velocity not the
418      !                       trend, the leap-frog time stepping will not
419      !                       be done in dynnxt.F90 routine)
420      DO jk = 1, jpkm1
421         DO jj = 2, jpjm1
422            DO ji = fs_2, fs_jpim1   ! vector opt.
423               ua(ji,jj,jk) = (ua(ji,jj,jk) + spgu(ji,jj)) * umask(ji,jj,jk)
424               va(ji,jj,jk) = (va(ji,jj,jk) + spgv(ji,jj)) * vmask(ji,jj,jk)
425            END DO
426         END DO
427      END DO
428
429      ! Sea surface elevation time stepping
430      ! -----------------------------------
431      IF( lk_vvl ) THEN   ! after free surface elevation
432         zssha(:,:) = ssha(:,:)
433      ELSE
434         zssha(:,:) = sshb(:,:) + z2dt * ( wn(:,:,1) - emp(:,:) * zraur ) * tmask(:,:,1)
435      ENDIF
436#if defined key_obc
437# if defined key_agrif
438      IF ( Agrif_Root() ) THEN
439# endif
440         zssha(:,:)=zssha(:,:)*obctmsk(:,:)
441         CALL lbc_lnk(zssha,'T',1.)  ! absolutly compulsory !! (jmm)
442# if defined key_agrif
443      ENDIF
444# endif
445#endif
446
447      IF( neuler == 0 .AND. kt == nit000 ) THEN      ! Euler (forward) time stepping, no time filter
448         ! swap of arrays
449         sshb(:,:) = sshn (:,:)
450         sshn(:,:) = zssha(:,:)
451      ELSE                                           ! Leap-frog time stepping and time filter
452         ! time filter and array swap
453         sshb(:,:) = atfp * ( sshb(:,:) + zssha(:,:) ) + atfp1 * sshn(:,:)
454         sshn(:,:) = zssha(:,:)
455      ENDIF
456
457      ! write filtered free surface arrays in restart file
458      ! --------------------------------------------------
459      IF( lrst_oce ) CALL flt_rst( kt, 'WRITE' )
460
461      ! print sum trends (used for debugging)
462      IF(ln_ctl)     CALL prt_ctl( tab2d_1=sshn, clinfo1=' spg  - ssh: ', mask1=tmask )
463      !
464   END SUBROUTINE dyn_spg_flt
465
466
467   SUBROUTINE flt_rst( kt, cdrw )
468     !!---------------------------------------------------------------------
469     !!                   ***  ROUTINE ts_rst  ***
470     !!
471     !! ** Purpose : Read or write filtered free surface arrays in restart file
472     !!----------------------------------------------------------------------
473     INTEGER         , INTENT(in) ::   kt         ! ocean time-step
474     CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
475     !!----------------------------------------------------------------------
476
477     IF( TRIM(cdrw) == 'READ' ) THEN
478        IF( iom_varid( numror, 'gcx', ldstop = .FALSE. ) > 0 ) THEN
479! Caution : extra-hallow
480! gcx and gcxb are defined as: DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)
481           CALL iom_get( numror, jpdom_autoglo, 'gcx' , gcx (1:jpi,1:jpj) )
482           CALL iom_get( numror, jpdom_autoglo, 'gcxb', gcxb(1:jpi,1:jpj) )
483           CALL iom_get( numror, jpdom_autoglo, 'sshb', sshb(:,:)         )
484           CALL iom_get( numror, jpdom_autoglo, 'sshn', sshn(:,:)         )
485           IF( neuler == 0 ) THEN
486              sshb(:,:) = sshn(:,:)
487              gcxb(:,:) = gcx (:,:)
488           ENDIF
489        ELSE
490           gcx (:,:) = 0.e0
491           gcxb(:,:) = 0.e0
492           IF( nn_rstssh == 1 ) THEN 
493              sshb(:,:) = 0.e0
494              sshn(:,:) = 0.e0
495           ENDIF
496        ENDIF
497     ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
498! Caution : extra-hallow
499! gcx and gcxb are defined as: DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)
500        CALL iom_rstput( kt, nitrst, numrow, 'gcx' , gcx( 1:jpi,1:jpj) )
501        CALL iom_rstput( kt, nitrst, numrow, 'gcxb', gcxb(1:jpi,1:jpj) )
502        CALL iom_rstput( kt, nitrst, numrow, 'sshb', sshb(:,:)         )
503        CALL iom_rstput( kt, nitrst, numrow, 'sshn', sshn(:,:)         )
504     ENDIF
505     !
506   END SUBROUTINE flt_rst
507
508#else
509   !!----------------------------------------------------------------------
510   !!   Default case :   Empty module   No standart free surface cst volume
511   !!----------------------------------------------------------------------
512CONTAINS
513   SUBROUTINE dyn_spg_flt( kt, kindic )       ! Empty routine
514      WRITE(*,*) 'dyn_spg_flt: You should not have seen this print! error?', kt, kindic
515   END SUBROUTINE dyn_spg_flt
516   SUBROUTINE flt_rst    ( kt, cdrw )         ! Empty routine
517      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
518      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
519      WRITE(*,*) 'flt_rst: You should not have seen this print! error?', kt, cdrw
520   END SUBROUTINE flt_rst
521#endif
522   
523   !!======================================================================
524END MODULE dynspg_flt
Note: See TracBrowser for help on using the repository browser.