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_ts.F90 in trunk/NEMO/OPA_SRC/DYN – NEMO

source: trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90 @ 1502

Last change on this file since 1502 was 1502, checked in by rblod, 15 years ago

Update dynnxt and dynspg_ts for variable volume, see ticket #474

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 30.3 KB
Line 
1MODULE dynspg_ts
2   !!======================================================================
3   !! History :   1.0  ! 2004-12  (L. Bessieres, G. Madec)  Original code
4   !!              -   ! 2005-11  (V. Garnier, G. Madec)  optimization
5   !!              -   ! 2006-08  (S. Masson)  distributed restart using iom
6   !!             2.0  ! 2007-07  (D. Storkey) calls to BDY routines
7   !!              -   ! 2008-01  (R. Benshila)  change averaging method
8   !!             3.2  ! 2009-07  (R. Benshila, G. Madec) Complete revisit associated to vvl reactivation
9  !!---------------------------------------------------------------------
10#if defined key_dynspg_ts   ||   defined key_esopa
11   !!----------------------------------------------------------------------
12   !!   'key_dynspg_ts'         free surface cst volume with time splitting
13   !!----------------------------------------------------------------------
14   !!   dyn_spg_ts  : compute surface pressure gradient trend using a time-
15   !!                 splitting scheme and add to the general trend
16   !!   ts_rst      : read/write the time-splitting restart fields in the ocean restart file
17   !!----------------------------------------------------------------------
18   USE oce             ! ocean dynamics and tracers
19   USE dom_oce         ! ocean space and time domain
20   USE sbc_oce         ! surface boundary condition: ocean
21   USE dynspg_oce      ! surface pressure gradient variables
22   USE phycst          ! physical constants
23   USE domvvl          ! variable volume
24   USE obcdta          ! open boundary condition data     
25   USE obcfla          ! Flather open boundary condition 
26   USE dynvor          ! vorticity term
27   USE obc_oce         ! Lateral open boundary condition
28   USE obc_par         ! open boundary condition parameters
29   USE bdy_oce         ! unstructured open boundaries
30   USE bdy_par         ! unstructured open boundaries
31   USE bdydta          ! unstructured open boundaries
32   USE bdydyn          ! unstructured open boundaries
33   USE bdytides        ! tidal forcing at unstructured open boundaries.
34   USE lib_mpp         ! distributed memory computing library
35   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
36   USE prtctl          ! Print control
37   USE in_out_manager  ! I/O manager
38   USE iom
39   USE restart         ! only for lrst_oce
40
41   IMPLICIT NONE
42   PRIVATE
43
44   PUBLIC dyn_spg_ts  ! routine called by step.F90
45   PUBLIC ts_rst      ! routine called by istate.F90
46
47
48   REAL(wp), DIMENSION(jpi,jpj) ::  ftnw, ftne   ! triad of coriolis parameter
49   REAL(wp), DIMENSION(jpi,jpj) ::  ftsw, ftse   ! (only used with een vorticity scheme)
50
51   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   un_b, vn_b   ! averaged velocity
52
53   !! * Substitutions
54#  include "domzgr_substitute.h90"
55#  include "vectopt_loop_substitute.h90"
56   !!-------------------------------------------------------------------------
57   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)
58   !! $Id$
59   !! Software is governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
60   !!-------------------------------------------------------------------------
61
62CONTAINS
63
64   SUBROUTINE dyn_spg_ts( kt )
65      !!----------------------------------------------------------------------
66      !!                  ***  routine dyn_spg_ts  ***
67      !!
68      !! ** Purpose :   Compute the now trend due to the surface pressure
69      !!      gradient in case of free surface formulation with time-splitting.
70      !!      Add it to the general trend of momentum equation.
71      !!
72      !! ** Method  :   Free surface formulation with time-splitting
73      !!      -1- Save the vertically integrated trend. This general trend is
74      !!          held constant over the barotropic integration.
75      !!          The Coriolis force is removed from the general trend as the
76      !!          surface gradient and the Coriolis force are updated within
77      !!          the barotropic integration.
78      !!      -2- Barotropic loop : updates of sea surface height (ssha_e) and
79      !!          barotropic velocity (ua_e and va_e) through barotropic
80      !!          momentum and continuity integration. Barotropic former
81      !!          variables are time averaging over the full barotropic cycle
82      !!          (= 2 * baroclinic time step) and saved in zuX_b
83      !!          and zvX_b (X specifying after, now or before).
84      !!      -3- The new general trend becomes :
85      !!          ua = ua - sum_k(ua)/H + ( ua_e - sum_k(ub) )
86      !!
87      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend
88      !!
89      !! References : Griffies et al., (2003): A technical guide to MOM4. NOAA/GFDL
90      !!---------------------------------------------------------------------
91      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index
92      !!
93      INTEGER  ::   ji, jj, jk, jn             ! dummy loop indices
94      INTEGER  ::   icycle                      ! temporary scalar
95      REAL(wp) ::   zraur, zcoef, z2dt_e, z2dt_b,   &  ! temporary scalars
96         z1_8, zspgu, zcubt, zx1, zy1,    &  !     "        "
97         z1_4, zspgv, zcvbt, zx2, zy2        !     "        "
98      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv, zsshb_e
99      !!
100      REAL(wp), DIMENSION(jpi,jpj) ::   zsshun_e, zsshvn_e   ! 2D workspace
101      !!
102      REAL(wp), DIMENSION(jpi,jpj) ::   zcu, zwx, zua, zun, zub   ! 2D workspace
103      REAL(wp), DIMENSION(jpi,jpj) ::   zcv, zwy, zva, zvn, zvb   !  -      -
104      REAL(wp), DIMENSION(jpi,jpj) ::   zun_e, zub_e, zu_sum      ! 2D workspace
105      REAL(wp), DIMENSION(jpi,jpj) ::   zvn_e, zvb_e, zv_sum      !  -      -
106      REAL(wp), DIMENSION(jpi,jpj) ::   zssh_sum                  !  -      -
107      !!----------------------------------------------------------------------
108
109      IF( kt == nit000 ) THEN             !* initialisation
110         !
111         IF(lwp) WRITE(numout,*)
112         IF(lwp) WRITE(numout,*) 'dyn_spg_ts : surface pressure gradient trend'
113         IF(lwp) WRITE(numout,*) '~~~~~~~~~~   free surface with time splitting'
114         IF(lwp) WRITE(numout,*) ' Number of sub cycle in 1 time-step (2 rdt) : icycle = ',  2*nn_baro
115         !
116         CALL ts_rst( nit000, 'READ' )   ! read or initialize the following fields:
117         !                               ! un_b, vn_b 
118         !
119         ua_e  (:,:) = un_b (:,:)
120         va_e  (:,:) = vn_b (:,:)
121         hu_e  (:,:) = hu   (:,:)
122         hv_e  (:,:) = hv   (:,:)
123         hur_e (:,:) = hur  (:,:)
124         hvr_e (:,:) = hvr  (:,:)
125         IF( ln_dynvor_een ) THEN
126            ftne(1,:) = 0.e0   ;   ftnw(1,:) = 0.e0   ;   ftse(1,:) = 0.e0   ;   ftsw(1,:) = 0.e0
127            DO jj = 2, jpj
128               DO ji = fs_2, jpi   ! vector opt.
129                  ftne(ji,jj) = ( ff(ji-1,jj  ) + ff(ji  ,jj  ) + ff(ji  ,jj-1) ) / 3.
130                  ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj  ) + ff(ji  ,jj  ) ) / 3.
131                  ftse(ji,jj) = ( ff(ji  ,jj  ) + ff(ji  ,jj-1) + ff(ji-1,jj-1) ) / 3.
132                  ftsw(ji,jj) = ( ff(ji  ,jj-1) + ff(ji-1,jj-1) + ff(ji-1,jj  ) ) / 3.
133               END DO
134            END DO
135         ENDIF
136         !
137      ENDIF
138
139      !                                   !* Local constant initialization
140      z2dt_b = 2.0 * rdt                                    ! baroclinic time step
141      z1_8 = 0.5 * 0.25                                     ! coefficient for vorticity estimates
142      z1_4 = 0.5 * 0.5
143      zraur  = 1. / rauw                                    ! 1 / volumic mass of pure water
144      !
145      zhdiv(:,:) = 0.e0                                     ! barotropic divergence
146
147      ! -----------------------------------------------------------------------------
148      !  Phase 1 : Coupling between general trend and barotropic estimates (1st step)
149      ! -----------------------------------------------------------------------------
150      !     
151      !                                   !* e3*d/dt(Ua), e3*Ub, e3*Vn (Vertically integrated)
152      !                                   ! --------------------------
153      zua(:,:) = 0.e0   ;   zun(:,:) = 0.e0   ;   zub(:,:) = 0.e0
154      zva(:,:) = 0.e0   ;   zvn(:,:) = 0.e0   ;   zvb(:,:) = 0.e0
155      !
156      DO jk = 1, jpkm1
157#if defined key_vectopt_loop
158         DO jj = 1, 1         !Vector opt. => forced unrolling
159            DO ji = 1, jpij
160#else
161         DO jj = 1, jpj
162            DO ji = 1, jpi
163#endif
164               !                                                                              ! now trend
165               zua(ji,jj) = zua(ji,jj) + fse3u  (ji,jj,jk) * ua(ji,jj,jk) * umask(ji,jj,jk)
166               zva(ji,jj) = zva(ji,jj) + fse3v  (ji,jj,jk) * va(ji,jj,jk) * vmask(ji,jj,jk)
167               !                                                                              ! now velocity
168               zun(ji,jj) = zun(ji,jj) + fse3u  (ji,jj,jk) * un(ji,jj,jk)
169               zvn(ji,jj) = zvn(ji,jj) + fse3v  (ji,jj,jk) * vn(ji,jj,jk)               
170               !                                                                              ! before velocity
171               zub(ji,jj) = zub(ji,jj) + fse3u_b(ji,jj,jk) * ub(ji,jj,jk) 
172               zvb(ji,jj) = zvb(ji,jj) + fse3v_b(ji,jj,jk) * vb(ji,jj,jk)
173            END DO
174         END DO
175      END DO
176
177      !                                   !* baroclinic momentum trend (remove the vertical mean trend)
178      DO jk = 1, jpkm1                    ! --------------------------
179         DO jj = 2, jpjm1
180            DO ji = fs_2, fs_jpim1   ! vector opt.
181               ua(ji,jj,jk) = ua(ji,jj,jk) - zua(ji,jj) * hur(ji,jj)
182               va(ji,jj,jk) = va(ji,jj,jk) - zva(ji,jj) * hvr(ji,jj)
183            END DO
184         END DO
185      END DO
186
187      !                                   !* barotropic Coriolis trends * H (vorticity scheme dependent)
188      !                                   ! ---------------------------====
189      zwx(:,:) = zun(:,:) * e2u(:,:)                   ! now transport
190      zwy(:,:) = zvn(:,:) * e1v(:,:)
191      !
192      IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      ! energy conserving or mixed scheme
193         DO jj = 2, jpjm1
194            DO ji = fs_2, fs_jpim1   ! vector opt.
195               zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)
196               zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
197               zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj)
198               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
199               ! energy conserving formulation for planetary vorticity term
200               zcu(ji,jj) = z1_4 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 )
201               zcv(ji,jj) =-z1_4 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 )
202            END DO
203         END DO
204         !
205      ELSEIF ( ln_dynvor_ens ) THEN                    ! enstrophy conserving scheme
206         DO jj = 2, jpjm1
207            DO ji = fs_2, fs_jpim1   ! vector opt.
208               zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) + zwy(ji,jj) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
209               zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) + zwx(ji,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
210               zcu(ji,jj)  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) )
211               zcv(ji,jj)  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) )
212            END DO
213         END DO
214         !
215      ELSEIF ( ln_dynvor_een ) THEN                    ! enstrophy and energy conserving scheme
216         DO jj = 2, jpjm1
217            DO ji = fs_2, fs_jpim1   ! vector opt.
218               zcu(ji,jj) = + z1_4 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   &
219                  &                                + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) )
220               zcv(ji,jj) = - z1_4 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) + ftse(ji,jj+1) * zwx(ji  ,jj+1)   &
221                  &                                + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) )
222            END DO
223         END DO
224         !
225      ENDIF
226
227      !                                   !* Right-Hand-Side of the barotropic momentum equation
228      !                                   ! ----------------------------------------------------
229      IF( lk_vvl ) THEN                         ! Variable volume : remove both Coriolis and Surface pressure gradient
230         DO jj = 2, jpjm1 
231            DO ji = fs_2, fs_jpim1   ! vector opt.
232               zcu(ji,jj) = zcu(ji,jj) - grav * (  ( rhd(ji+1,jj  ,1) + 1 ) * sshn(ji+1,jj  )    &
233                  &                              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  )  ) * hu(ji,jj) / e1u(ji,jj)
234               zcv(ji,jj) = zcv(ji,jj) - grav * (  ( rhd(ji  ,jj+1,1) + 1 ) * sshn(ji  ,jj+1)    &
235                  &                              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  )  ) * hv(ji,jj) / e2v(ji,jj)
236            END DO
237         END DO
238      ENDIF
239
240      DO jj = 2, jpjm1                             ! Remove coriolis term (and possibly spg) from barotropic trend
241         DO ji = fs_2, fs_jpim1
242            zua(ji,jj) = zua(ji,jj) - zcu(ji,jj)
243            zva(ji,jj) = zva(ji,jj) - zcv(ji,jj)
244         END DO
245      END DO
246
247      !                                   !* d/dt(Ua), Ub, Vn (Vertical mean velocity)
248      !                                   ! --------------------------
249      zua(:,:) = zua(:,:) * hur(:,:)
250      zva(:,:) = zva(:,:) * hvr(:,:)
251      !
252      IF( lk_vvl ) THEN
253         zub(:,:) = zub(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1.e0 - umask(:,:,1) )
254         zvb(:,:) = zvb(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1.e0 - vmask(:,:,1) )
255      ELSE
256         zub(:,:) = zub(:,:) * hur(:,:)
257         zvb(:,:) = zvb(:,:) * hvr(:,:)
258      ENDIF
259
260      ! -----------------------------------------------------------------------
261      !  Phase 2 : Integration of the barotropic equations with time splitting
262      ! -----------------------------------------------------------------------
263      !
264      !                                             ! ==================== !
265      !                                             !    Initialisations   !
266      !                                             ! ==================== !
267      icycle = 2  * nn_baro            ! Number of barotropic sub time-step
268     
269      !                                ! Start from NOW field
270      hu_e   (:,:) = hu   (:,:)            ! ocean depth at u- and v-points
271      hv_e   (:,:) = hv   (:,:) 
272      hur_e  (:,:) = hur  (:,:)            ! ocean depth inverted at u- and v-points
273      hvr_e  (:,:) = hvr  (:,:)
274      zsshb_e(:,:) = sshn (:,:)            ! sea surface height (before and now)
275      sshn_e (:,:) = sshn (:,:)
276     
277      zun_e  (:,:) = un_b (:,:)            ! barotropic velocity (external)
278      zvn_e  (:,:) = vn_b (:,:)
279      zub_e  (:,:) = un_b (:,:)
280      zvb_e  (:,:) = vn_b (:,:)
281
282      zu_sum  (:,:) = un_b (:,:)           ! summation
283      zv_sum  (:,:) = vn_b (:,:)
284      zssh_sum(:,:) = sshn (:,:)
285
286#if defined key_obc
287      ! set ssh corrections to 0
288      ! ssh corrections are applied to normal velocities (Flather's algorithm) and averaged over the barotropic loop
289      IF( lp_obc_east  )   sshfoe_b(:,:) = 0.e0
290      IF( lp_obc_west  )   sshfow_b(:,:) = 0.e0
291      IF( lp_obc_south )   sshfos_b(:,:) = 0.e0
292      IF( lp_obc_north )   sshfon_b(:,:) = 0.e0
293#endif
294
295      !                                             ! ==================== !
296      DO jn = 1, icycle                             !  sub-time-step loop  ! (from NOW to AFTER+1)
297         !                                          ! ==================== !
298         z2dt_e = 2. * ( rdt / nn_baro )
299         IF( jn == 1 )   z2dt_e = rdt / nn_baro
300
301         !                                                !* Update the forcing (OBC, BDY and tides)
302         !                                                !  ------------------
303         IF( lk_obc                     )   CALL obc_dta_bt( kt, jn   )
304         IF( lk_bdy  .OR.  ln_bdy_tides )   CALL bdy_dta_bt( kt, jn+1 )
305
306         !                                                !* after ssh_e
307         !                                                !  -----------
308         DO jj = 2, jpjm1                                      ! Horizontal divergence of barotropic transports
309            DO ji = fs_2, fs_jpim1   ! vector opt.
310               zhdiv(ji,jj) = (   e2u(ji  ,jj) * zun_e(ji  ,jj) * hu_e(ji  ,jj)     &
311                  &             - e2u(ji-1,jj) * zun_e(ji-1,jj) * hu_e(ji-1,jj)     &
312                  &             + e1v(ji,jj  ) * zvn_e(ji,jj  ) * hv_e(ji,jj  )     &
313                  &             - e1v(ji,jj-1) * zvn_e(ji,jj-1) * hv_e(ji,jj-1)   ) / ( e1t(ji,jj) * e2t(ji,jj) )
314            END DO
315         END DO
316         !
317#if defined key_obc
318         !                                                     ! OBC : zhdiv must be zero behind the open boundary
319!!  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column
320         IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1  ) = 0.e0      ! east
321         IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1  ) = 0.e0      ! west
322         IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0      ! north
323         IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1  ) = 0.e0      ! south
324#endif
325#if defined key_bdy
326         zhdiv(:,:) = zhdiv(:,:) * bdytmask(:,:)               ! BDY mask
327#endif
328         !
329         DO jj = 2, jpjm1                                      ! leap-frog on ssh_e
330            DO ji = fs_2, fs_jpim1   ! vector opt.
331               ssha_e(ji,jj) = ( zsshb_e(ji,jj) - z2dt_e * ( zraur * emp(ji,jj) + zhdiv(ji,jj) ) ) * tmask(ji,jj,1)
332            END DO
333         END DO
334
335         !                                                !* after barotropic velocities (vorticity scheme dependent)
336         !                                                !  --------------------------- 
337         zwx(:,:) = e2u(:,:) * zun_e(:,:) * hu_e(:,:)           ! now_e transport
338         zwy(:,:) = e1v(:,:) * zvn_e(:,:) * hv_e(:,:)
339         !
340         IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      !==  energy conserving or mixed scheme  ==!
341            DO jj = 2, jpjm1
342               DO ji = fs_2, fs_jpim1   ! vector opt.
343                  ! surface pressure gradient
344                  IF( lk_vvl) THEN
345                     zspgu = -grav * (  ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  )    &
346                        &             - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj)
347                     zspgv = -grav * (  ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    &
348                        &             - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj)
349                  ELSE
350                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj)
351                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj)
352                  ENDIF
353                  ! energy conserving formulation for planetary vorticity term
354                  zy1 = ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)
355                  zy2 = ( zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
356                  zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) / e2v(ji,jj)
357                  zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
358                  zcubt = z1_4 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 ) * hur_e(ji,jj)
359                  zcvbt =-z1_4 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) * hvr_e(ji,jj)
360                  ! after barotropic velocity
361                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1)
362                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1)
363               END DO
364            END DO
365            !
366         ELSEIF ( ln_dynvor_ens ) THEN                    !==  enstrophy conserving scheme  ==!
367            DO jj = 2, jpjm1
368               DO ji = fs_2, fs_jpim1   ! vector opt.
369                   ! surface pressure gradient
370                  IF( lk_vvl) THEN
371                     zspgu = -grav * (  ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  )    &
372                        &             - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj)
373                     zspgv = -grav * (  ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    &
374                        &             - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj)
375                  ELSE
376                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj)
377                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj)
378                  ENDIF
379                  ! enstrophy conserving formulation for planetary vorticity term
380                  zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) + zwy(ji,jj) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
381                  zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) + zwx(ji,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
382                  zcubt  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) ) * hur_e(ji,jj)
383                  zcvbt  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) * hvr_e(ji,jj)
384                  ! after barotropic velocity
385                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1)
386                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1)
387               END DO
388            END DO
389            !
390         ELSEIF ( ln_dynvor_een ) THEN                    !==  energy and enstrophy conserving scheme  ==!
391            DO jj = 2, jpjm1
392               DO ji = fs_2, fs_jpim1   ! vector opt.
393                  ! surface pressure gradient
394                  IF( lk_vvl) THEN
395                     zspgu = -grav * (  ( rhd(ji+1,jj  ,1) + 1 ) * sshn_e(ji+1,jj  )    &
396                        &             - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj)
397                     zspgv = -grav * (  ( rhd(ji  ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    &
398                        &             - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj)
399                  ELSE
400                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj)
401                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj)
402                  ENDIF
403                  ! energy/enstrophy conserving formulation for planetary vorticity term
404                  zcubt = + z1_4 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   &
405                     &                           + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) * hur_e(ji,jj)
406                  zcvbt = - z1_4 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) + ftse(ji,jj+1) * zwx(ji  ,jj+1)   &
407                     &                           + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) * hvr_e(ji,jj)
408                  ! after barotropic velocity
409                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1)
410                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1)
411               END DO
412            END DO
413            !
414         ENDIF
415         !                                                !* domain lateral boundary
416         !                                                !  -----------------------
417         !                                                      ! Flather's boundary condition for the barotropic loop :
418         !                                                      !         - Update sea surface height on each open boundary
419         !                                                      !         - Correct the velocity
420
421         IF( lk_obc                   )   CALL obc_fla_ts
422         IF( lk_bdy .OR. ln_bdy_tides )   CALL bdy_dyn_fla( sshn_e ) 
423         !
424         CALL lbc_lnk( ua_e  , 'U', -1. )                      ! local domain boundaries
425         CALL lbc_lnk( va_e  , 'V', -1. )
426         CALL lbc_lnk( ssha_e, 'T',  1. )
427
428         zu_sum  (:,:) = zu_sum  (:,:) + ua_e  (:,:)           ! Sum over sub-time-steps
429         zv_sum  (:,:) = zv_sum  (:,:) + va_e  (:,:) 
430         zssh_sum(:,:) = zssh_sum(:,:) + ssha_e(:,:) 
431
432         !                                                !* Time filter and swap
433         !                                                !  --------------------
434         IF( jn == 1 ) THEN                                     ! Swap only (1st Euler time step)
435            zsshb_e(:,:) = sshn_e(:,:)
436            zub_e  (:,:) = zun_e (:,:)
437            zvb_e  (:,:) = zvn_e (:,:)
438            sshn_e (:,:) = ssha_e(:,:)
439            zun_e  (:,:) = ua_e  (:,:)
440            zvn_e  (:,:) = va_e  (:,:)
441         ELSE                                                   ! Swap + Filter
442            zsshb_e(:,:) = atfp * ( zsshb_e(:,:) + ssha_e(:,:) ) + atfp1 * sshn_e(:,:)
443            zub_e  (:,:) = atfp * ( zub_e  (:,:) + ua_e  (:,:) ) + atfp1 * zun_e (:,:)
444            zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + va_e  (:,:) ) + atfp1 * zvn_e (:,:)
445            sshn_e (:,:) = ssha_e(:,:)
446            zun_e  (:,:) = ua_e  (:,:)
447            zvn_e  (:,:) = va_e  (:,:)
448         ENDIF
449
450         IF( lk_vvl ) THEN                                !* Update ocean depth (variable volume case only)
451            !                                             !  ------------------
452            DO jj = 1, jpjm1                                    ! Sea Surface Height at u- & v-points
453               DO ji = 1, fs_jpim1   ! Vector opt.
454                  zsshun_e(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )       &
455                     &                  * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn_e(ji  ,jj)    &
456                     &                    + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) )
457                  zsshvn_e(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )       &
458                     &                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn_e(ji,jj  )    &
459                     &                    + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) )
460               END DO
461            END DO
462            CALL lbc_lnk( zsshun_e, 'U', 1. )                   ! lateral boundaries conditions
463            CALL lbc_lnk( zsshvn_e, 'V', 1. ) 
464            !
465            hu_e (:,:) = hu_0(:,:) + zsshun_e(:,:)              ! Ocean depth at U- and V-points
466            hv_e (:,:) = hv_0(:,:) + zsshvn_e(:,:)
467            hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1.e0 - umask(:,:,1) )
468            hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1.e0 - vmask(:,:,1) )
469            !
470         ENDIF
471         !                                                 ! ==================== !
472      END DO                                               !        end loop      !
473      !                                                    ! ==================== !
474
475#if defined key_obc
476      IF( lp_obc_east  )   sshfoe_b(:,:) = zcoef * sshfoe_b(:,:)     !!gm totally useless ?????
477      IF( lp_obc_west  )   sshfow_b(:,:) = zcoef * sshfow_b(:,:)
478      IF( lp_obc_north )   sshfon_b(:,:) = zcoef * sshfon_b(:,:)
479      IF( lp_obc_south )   sshfos_b(:,:) = zcoef * sshfos_b(:,:)
480#endif
481
482      ! -----------------------------------------------------------------------------
483      ! Phase 3. update the general trend with the barotropic trend
484      ! -----------------------------------------------------------------------------
485      !
486      !                                   !* Time average ==> after barotropic u, v, ssh
487      zcoef =  1.e0 / ( 2 * nn_baro  + 1 ) 
488      un_b  (:,:) = zcoef * zu_sum  (:,:) 
489      vn_b  (:,:) = zcoef * zv_sum  (:,:) 
490      sshn_b(:,:) = zcoef * zssh_sum(:,:) 
491      !
492      !                                   !* update the general momentum trend
493      DO jk=1,jpkm1
494         ua(:,:,jk) = ua(:,:,jk) + ( un_b(:,:) - zub(:,:) ) / z2dt_b
495         va(:,:,jk) = va(:,:,jk) + ( vn_b(:,:) - zvb(:,:) ) / z2dt_b
496      END DO
497      !
498      !                                   !* write time-spliting arrays in the restart
499      IF( lrst_oce )   CALL ts_rst( kt, 'WRITE' )
500      !
501   END SUBROUTINE dyn_spg_ts
502
503
504   SUBROUTINE ts_rst( kt, cdrw )
505      !!---------------------------------------------------------------------
506      !!                   ***  ROUTINE ts_rst  ***
507      !!
508      !! ** Purpose : Read or write time-splitting arrays in restart file
509      !!----------------------------------------------------------------------
510      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
511      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
512      !
513      INTEGER ::  ji, jk        ! dummy loop indices
514      !!----------------------------------------------------------------------
515      !
516      IF( TRIM(cdrw) == 'READ' ) THEN
517         IF( iom_varid( numror, 'un_b', ldstop = .FALSE. ) > 0 ) THEN
518            CALL iom_get( numror, jpdom_autoglo, 'un_b'  , un_b  (:,:) )   ! external velocity issued
519            CALL iom_get( numror, jpdom_autoglo, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop
520         ELSE
521            un_b (:,:) = 0.e0
522            vn_b (:,:) = 0.e0
523            ! vertical sum
524            IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll
525               DO jk = 1, jpkm1
526                  DO ji = 1, jpij
527                     un_b(ji,1) = un_b(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk)
528                     vn_b(ji,1) = vn_b(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk)
529                  END DO
530               END DO
531            ELSE                             ! No  vector opt.
532               DO jk = 1, jpkm1
533                  un_b(:,:) = un_b(:,:) + fse3u(:,:,jk) * un(:,:,jk)
534                  vn_b(:,:) = vn_b(:,:) + fse3v(:,:,jk) * vn(:,:,jk)
535               END DO
536            ENDIF
537            un_b (:,:) = un_b(:,:) * hur(:,:)
538            vn_b (:,:) = vn_b(:,:) * hvr(:,:)
539         ENDIF
540      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
541         CALL iom_rstput( kt, nitrst, numrow, 'un_b'  , un_b  (:,:) )   ! external velocity issued
542         CALL iom_rstput( kt, nitrst, numrow, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop
543      ENDIF
544      !
545   END SUBROUTINE ts_rst
546
547#else
548   !!----------------------------------------------------------------------
549   !!   Default case :   Empty module   No standart free surface cst volume
550   !!----------------------------------------------------------------------
551CONTAINS
552   SUBROUTINE dyn_spg_ts( kt )       ! Empty routine
553      WRITE(*,*) 'dyn_spg_ts: You should not have seen this print! error?', kt
554   END SUBROUTINE dyn_spg_ts
555   SUBROUTINE ts_rst( kt, cdrw )     ! Empty routine
556      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
557      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
558      WRITE(*,*) 'ts_rst    : You should not have seen this print! error?', kt, cdrw
559   END SUBROUTINE ts_rst   
560#endif
561   
562   !!======================================================================
563END MODULE dynspg_ts
Note: See TracBrowser for help on using the repository browser.