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

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

merge solsor and solsor_e, see ticket #45

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