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 branches/2011/dev_r2787_MERCATOR3_tidalpot/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/2011/dev_r2787_MERCATOR3_tidalpot/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90 @ 2967

Last change on this file since 2967 was 2967, checked in by cbricaud, 13 years ago

Use only ln_tide_pot to activate tidal potential forcing

  • Property svn:keywords set to Id
File size: 37.7 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   !!             3.3  ! 2010-09  (D. Storkey, E. O'Dea) update for BDY for Shelf configurations
10   !!             3.3  ! 2011-03  (R. Benshila, R. Hordoir, P. Oddo) update calculation of ub_b
11   !!---------------------------------------------------------------------
12#if defined key_dynspg_ts   ||   defined key_esopa
13   !!----------------------------------------------------------------------
14   !!   'key_dynspg_ts'         free surface cst volume with time splitting
15   !!----------------------------------------------------------------------
16   !!   dyn_spg_ts  : compute surface pressure gradient trend using a time-
17   !!                 splitting scheme and add to the general trend
18   !!   ts_rst      : read/write the time-splitting restart fields in the ocean restart file
19   !!----------------------------------------------------------------------
20   USE oce             ! ocean dynamics and tracers
21   USE dom_oce         ! ocean space and time domain
22   USE sbc_oce         ! surface boundary condition: ocean
23   USE dynspg_oce      ! surface pressure gradient variables
24   USE phycst          ! physical constants
25   USE domvvl          ! variable volume
26   USE zdfbfr          ! bottom friction
27   USE obcdta          ! open boundary condition data     
28   USE obcfla          ! Flather open boundary condition 
29   USE dynvor          ! vorticity term
30   USE obc_oce         ! Lateral open boundary condition
31   USE obc_par         ! open boundary condition parameters
32   USE bdy_oce         ! unstructured open boundaries
33   USE bdy_par         ! unstructured open boundaries
34   USE bdydta          ! unstructured open boundaries
35   USE bdydyn          ! unstructured open boundaries
36   USE bdytides        ! tidal forcing at unstructured open boundaries.
37   USE sbctide
38   USE updtide
39   USE lib_mpp         ! distributed memory computing library
40   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
41   USE prtctl          ! Print control
42   USE in_out_manager  ! I/O manager
43   USE iom             ! IOM library
44   USE restart         ! only for lrst_oce
45   USE zdf_oce
46
47   IMPLICIT NONE
48   PRIVATE
49
50   PUBLIC dyn_spg_ts        ! routine called by step.F90
51   PUBLIC ts_rst            ! routine called by istate.F90
52   PUBLIC dyn_spg_ts_alloc  ! routine called by dynspg.F90
53
54
55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftnw, ftne   ! triad of coriolis parameter
56   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse   ! (only used with een vorticity scheme)
57
58   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_b, vn_b   ! now    averaged velocity
59   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ub_b, vb_b   ! before averaged velocity
60
61   !! * Substitutions
62#  include "domzgr_substitute.h90"
63#  include "vectopt_loop_substitute.h90"
64   !!----------------------------------------------------------------------
65   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
66   !! $Id$
67   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
68   !!----------------------------------------------------------------------
69CONTAINS
70
71   INTEGER FUNCTION dyn_spg_ts_alloc()
72      !!----------------------------------------------------------------------
73      !!                  ***  routine dyn_spg_ts_alloc  ***
74      !!----------------------------------------------------------------------
75      ALLOCATE( ftnw  (jpi,jpj) , ftne(jpi,jpj) , un_b(jpi,jpj) , vn_b(jpi,jpj) ,     &
76         &      ftsw  (jpi,jpj) , ftse(jpi,jpj) , ub_b(jpi,jpj) , vb_b(jpi,jpj) , STAT= dyn_spg_ts_alloc )
77         !
78      IF( lk_mpp                )   CALL mpp_sum( dyn_spg_ts_alloc )
79      IF( dyn_spg_ts_alloc /= 0 )   CALL ctl_warn('dynspg_oce_alloc: failed to allocate arrays')
80      !
81   END FUNCTION dyn_spg_ts_alloc
82
83
84   SUBROUTINE dyn_spg_ts( kt )
85      !!----------------------------------------------------------------------
86      !!                  ***  routine dyn_spg_ts  ***
87      !!
88      !! ** Purpose :   Compute the now trend due to the surface pressure
89      !!      gradient in case of free surface formulation with time-splitting.
90      !!      Add it to the general trend of momentum equation.
91      !!
92      !! ** Method  :   Free surface formulation with time-splitting
93      !!      -1- Save the vertically integrated trend. This general trend is
94      !!          held constant over the barotropic integration.
95      !!          The Coriolis force is removed from the general trend as the
96      !!          surface gradient and the Coriolis force are updated within
97      !!          the barotropic integration.
98      !!      -2- Barotropic loop : updates of sea surface height (ssha_e) and
99      !!          barotropic velocity (ua_e and va_e) through barotropic
100      !!          momentum and continuity integration. Barotropic former
101      !!          variables are time averaging over the full barotropic cycle
102      !!          (= 2 * baroclinic time step) and saved in uX_b
103      !!          and vX_b (X specifying after, now or before).
104      !!      -3- The new general trend becomes :
105      !!          ua = ua - sum_k(ua)/H + ( un_b - ub_b )
106      !!
107      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend
108      !!
109      !! References : Griffies et al., (2003): A technical guide to MOM4. NOAA/GFDL
110      !!---------------------------------------------------------------------
111      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
112      USE wrk_nemo, ONLY:   zsshun_e => wrk_2d_1 , zsshb_e  => wrk_2d_2  , zhdiv => wrk_2d_3
113      USE wrk_nemo, ONLY:   zsshvn_e => wrk_2d_4 , zssh_sum => wrk_2d_5
114      USE wrk_nemo, ONLY:   zcu => wrk_2d_6  , zwx   => wrk_2d_7  , zua   => wrk_2d_8  , zbfru  => wrk_2d_9
115      USE wrk_nemo, ONLY:   zcv => wrk_2d_10 , zwy   => wrk_2d_11 , zva   => wrk_2d_12 , zbfrv  => wrk_2d_13
116      USE wrk_nemo, ONLY:   zun => wrk_2d_14 , zun_e => wrk_2d_15 , zub_e => wrk_2d_16 , zu_sum => wrk_2d_17
117      USE wrk_nemo, ONLY:   zvn => wrk_2d_18 , zvn_e => wrk_2d_19 , zvb_e => wrk_2d_20 , zv_sum => wrk_2d_21
118      !
119      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index
120      !
121      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
122      INTEGER  ::   icycle           ! local scalar
123      REAL(wp) ::   zraur, zcoef, z2dt_e, z2dt_b     ! local scalars
124      REAL(wp) ::   z1_8, zx1, zy1                   !   -      -
125      REAL(wp) ::   z1_4, zx2, zy2                   !   -      -
126      REAL(wp) ::   zu_spg, zu_cor, zu_sld, zu_asp   !   -      -
127      REAL(wp) ::   zv_spg, zv_cor, zv_sld, zv_asp   !   -      -
128      !!----------------------------------------------------------------------
129
130      IF( wrk_in_use(2,  1, 2, 3, 4, 5, 6, 7, 8, 9,10,     &
131         &              11,12,13,14,15,16,17,18,19,20,21 ) ) THEN
132         CALL ctl_stop( 'dyn_spg_ts: requested workspace arrays unavailable' )   ;   RETURN
133      ENDIF
134
135      IF( kt == nit000 ) THEN             !* initialisation
136         !
137         IF(lwp) WRITE(numout,*)
138         IF(lwp) WRITE(numout,*) 'dyn_spg_ts : surface pressure gradient trend'
139         IF(lwp) WRITE(numout,*) '~~~~~~~~~~   free surface with time splitting'
140         IF(lwp) WRITE(numout,*) ' Number of sub cycle in 1 time-step (2 rdt) : icycle = ',  2*nn_baro
141         !
142         CALL ts_rst( nit000, 'READ' )   ! read or initialize the following fields: un_b, vn_b 
143         !
144         ua_e  (:,:) = un_b (:,:)
145         va_e  (:,:) = vn_b (:,:)
146         hu_e  (:,:) = hu   (:,:)
147         hv_e  (:,:) = hv   (:,:)
148         hur_e (:,:) = hur  (:,:)
149         hvr_e (:,:) = hvr  (:,:)
150         IF( ln_dynvor_een ) THEN
151            ftne(1,:) = 0.e0   ;   ftnw(1,:) = 0.e0   ;   ftse(1,:) = 0.e0   ;   ftsw(1,:) = 0.e0
152            DO jj = 2, jpj
153               DO ji = fs_2, jpi   ! vector opt.
154                  ftne(ji,jj) = ( ff(ji-1,jj  ) + ff(ji  ,jj  ) + ff(ji  ,jj-1) ) / 3.
155                  ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj  ) + ff(ji  ,jj  ) ) / 3.
156                  ftse(ji,jj) = ( ff(ji  ,jj  ) + ff(ji  ,jj-1) + ff(ji-1,jj-1) ) / 3.
157                  ftsw(ji,jj) = ( ff(ji  ,jj-1) + ff(ji-1,jj-1) + ff(ji-1,jj  ) ) / 3.
158               END DO
159            END DO
160         ENDIF
161         !
162      ENDIF
163
164      !                                   !* Local constant initialization
165      z2dt_b = 2.0 * rdt                                    ! baroclinic time step
166      z1_8 = 0.5 * 0.25                                     ! coefficient for vorticity estimates
167      z1_4 = 0.5 * 0.5
168      zraur  = 1. / rau0                                    ! 1 / volumic mass
169      !
170      zhdiv(:,:) = 0.e0                                     ! barotropic divergence
171      zu_sld = 0.e0   ;   zu_asp = 0.e0                     ! tides trends (lk_tide=F)
172      zv_sld = 0.e0   ;   zv_asp = 0.e0
173
174      ! -----------------------------------------------------------------------------
175      !  Phase 1 : Coupling between general trend and barotropic estimates (1st step)
176      ! -----------------------------------------------------------------------------
177      !     
178      !                                   !* e3*d/dt(Ua), e3*Ub, e3*Vn (Vertically integrated)
179      !                                   ! --------------------------
180      zua(:,:) = 0.e0   ;   zun(:,:) = 0.e0   ;   ub_b(:,:) = 0.e0
181      zva(:,:) = 0.e0   ;   zvn(:,:) = 0.e0   ;   vb_b(:,:) = 0.e0
182      !
183      DO jk = 1, jpkm1
184#if defined key_vectopt_loop
185         DO jj = 1, 1         !Vector opt. => forced unrolling
186            DO ji = 1, jpij
187#else
188         DO jj = 1, jpj
189            DO ji = 1, jpi
190#endif
191               !                                                                              ! now trend
192               zua(ji,jj) = zua(ji,jj) + fse3u  (ji,jj,jk) * ua(ji,jj,jk) * umask(ji,jj,jk)
193               zva(ji,jj) = zva(ji,jj) + fse3v  (ji,jj,jk) * va(ji,jj,jk) * vmask(ji,jj,jk)
194               !                                                                              ! now velocity
195               zun(ji,jj) = zun(ji,jj) + fse3u  (ji,jj,jk) * un(ji,jj,jk)
196               zvn(ji,jj) = zvn(ji,jj) + fse3v  (ji,jj,jk) * vn(ji,jj,jk)               
197               !
198#if defined key_vvl
199               ub_b(ji,jj) = ub_b(ji,jj) + (fse3u_0(ji,jj,jk)*(1.+sshu_b(ji,jj)*muu(ji,jj,jk)))* ub(ji,jj,jk) 
200               vb_b(ji,jj) = vb_b(ji,jj) + (fse3v_0(ji,jj,jk)*(1.+sshv_b(ji,jj)*muv(ji,jj,jk)))* vb(ji,jj,jk)   
201#else
202               ub_b(ji,jj) = ub_b(ji,jj) + fse3u_0(ji,jj,jk) * ub(ji,jj,jk)  * umask(ji,jj,jk)
203               vb_b(ji,jj) = vb_b(ji,jj) + fse3v_0(ji,jj,jk) * vb(ji,jj,jk)  * vmask(ji,jj,jk)
204#endif
205            END DO
206         END DO
207      END DO
208
209      !                                   !* baroclinic momentum trend (remove the vertical mean trend)
210      DO jk = 1, jpkm1                    ! --------------------------
211         DO jj = 2, jpjm1
212            DO ji = fs_2, fs_jpim1   ! vector opt.
213               ua(ji,jj,jk) = ua(ji,jj,jk) - zua(ji,jj) * hur(ji,jj)
214               va(ji,jj,jk) = va(ji,jj,jk) - zva(ji,jj) * hvr(ji,jj)
215            END DO
216         END DO
217      END DO
218
219      !                                   !* barotropic Coriolis trends * H (vorticity scheme dependent)
220      !                                   ! ---------------------------====
221      zwx(:,:) = zun(:,:) * e2u(:,:)                   ! now transport
222      zwy(:,:) = zvn(:,:) * e1v(:,:)
223      !
224      IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      ! energy conserving or mixed scheme
225         DO jj = 2, jpjm1
226            DO ji = fs_2, fs_jpim1   ! vector opt.
227               zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)
228               zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
229               zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj)
230               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
231               ! energy conserving formulation for planetary vorticity term
232               zcu(ji,jj) = z1_4 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 )
233               zcv(ji,jj) =-z1_4 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 )
234            END DO
235         END DO
236         !
237      ELSEIF ( ln_dynvor_ens ) THEN                    ! enstrophy conserving scheme
238         DO jj = 2, jpjm1
239            DO ji = fs_2, fs_jpim1   ! vector opt.
240               zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) + zwy(ji,jj) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
241               zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) + zwx(ji,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
242               zcu(ji,jj)  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) )
243               zcv(ji,jj)  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) )
244            END DO
245         END DO
246         !
247      ELSEIF ( ln_dynvor_een ) THEN                    ! enstrophy and energy conserving scheme
248         DO jj = 2, jpjm1
249            DO ji = fs_2, fs_jpim1   ! vector opt.
250               zcu(ji,jj) = + z1_4 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   &
251                  &                                + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) )
252               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)   &
253                  &                                + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) )
254            END DO
255         END DO
256         !
257      ENDIF
258
259      !                                   !* Right-Hand-Side of the barotropic momentum equation
260      !                                   ! ----------------------------------------------------
261      IF( lk_vvl ) THEN                         ! Variable volume : remove both Coriolis and Surface pressure gradient
262         DO jj = 2, jpjm1 
263            DO ji = fs_2, fs_jpim1   ! vector opt.
264               zcu(ji,jj) = zcu(ji,jj) - grav * (  ( rhd(ji+1,jj  ,1) + 1 ) * sshn(ji+1,jj  )    &
265                  &                              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  )  ) * hu(ji,jj) / e1u(ji,jj)
266               zcv(ji,jj) = zcv(ji,jj) - grav * (  ( rhd(ji  ,jj+1,1) + 1 ) * sshn(ji  ,jj+1)    &
267                  &                              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  )  ) * hv(ji,jj) / e2v(ji,jj)
268            END DO
269         END DO
270      ENDIF
271
272      DO jj = 2, jpjm1                             ! Remove coriolis term (and possibly spg) from barotropic trend
273         DO ji = fs_2, fs_jpim1
274            zua(ji,jj) = zua(ji,jj) - zcu(ji,jj)
275            zva(ji,jj) = zva(ji,jj) - zcv(ji,jj)
276         END DO
277      END DO
278
279                   
280      !                                             ! Remove barotropic contribution of bottom friction
281      !                                             ! from the barotropic transport trend
282      zcoef = -1. / z2dt_b
283# if defined key_vectopt_loop
284      DO jj = 1, 1
285         DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling)
286# else
287      DO jj = 2, jpjm1
288         DO ji = 2, jpim1
289# endif
290            ! Apply stability criteria for bottom friction
291            !RBbug for vvl and external mode we may need to use varying fse3
292            !!gm  Rq: the bottom e3 present the smallest variation, the use of e3u_0 is not a big approx.
293            zbfru(ji,jj) = MAX(  bfrua(ji,jj) , fse3u(ji,jj,mbku(ji,jj)) * zcoef  )
294            zbfrv(ji,jj) = MAX(  bfrva(ji,jj) , fse3v(ji,jj,mbkv(ji,jj)) * zcoef  )
295         END DO
296      END DO
297
298      IF( lk_vvl ) THEN
299         DO jj = 2, jpjm1
300            DO ji = fs_2, fs_jpim1   ! vector opt.
301               zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj)   &
302                  &       / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1.e0 - umask(ji,jj,1) )
303               zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj)   &
304                  &       / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1.e0 - vmask(ji,jj,1) )
305            END DO
306         END DO
307      ELSE
308         DO jj = 2, jpjm1
309            DO ji = fs_2, fs_jpim1   ! vector opt.
310               zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj) * hur(ji,jj)
311               zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj) * hvr(ji,jj)
312            END DO
313         END DO
314      ENDIF
315
316      !                                   !* d/dt(Ua), Ub, Vn (Vertical mean velocity)
317      !                                   ! --------------------------
318      zua(:,:) = zua(:,:) * hur(:,:)
319      zva(:,:) = zva(:,:) * hvr(:,:)
320      !
321      IF( lk_vvl ) THEN
322         ub_b(:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1.e0 - umask(:,:,1) )
323         vb_b(:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1.e0 - vmask(:,:,1) )
324      ELSE
325         ub_b(:,:) = ub_b(:,:) * hur(:,:)
326         vb_b(:,:) = vb_b(:,:) * hvr(:,:)
327      ENDIF
328
329      ! -----------------------------------------------------------------------
330      !  Phase 2 : Integration of the barotropic equations with time splitting
331      ! -----------------------------------------------------------------------
332      !
333      !                                             ! ==================== !
334      !                                             !    Initialisations   !
335      !                                             ! ==================== !
336      icycle = 2  * nn_baro            ! Number of barotropic sub time-step
337     
338      !                                ! Start from NOW field
339      hu_e   (:,:) = hu   (:,:)            ! ocean depth at u- and v-points
340      hv_e   (:,:) = hv   (:,:) 
341      hur_e  (:,:) = hur  (:,:)            ! ocean depth inverted at u- and v-points
342      hvr_e  (:,:) = hvr  (:,:)
343!RBbug     zsshb_e(:,:) = sshn (:,:) 
344      zsshb_e(:,:) = sshn_b(:,:)           ! sea surface height (before and now)
345      sshn_e (:,:) = sshn (:,:)
346     
347      zun_e  (:,:) = un_b (:,:)            ! barotropic velocity (external)
348      zvn_e  (:,:) = vn_b (:,:)
349      zub_e  (:,:) = un_b (:,:)
350      zvb_e  (:,:) = vn_b (:,:)
351
352      zu_sum  (:,:) = un_b (:,:)           ! summation
353      zv_sum  (:,:) = vn_b (:,:)
354      zssh_sum(:,:) = sshn (:,:)
355
356#if defined key_obc
357      ! set ssh corrections to 0
358      ! ssh corrections are applied to normal velocities (Flather's algorithm) and averaged over the barotropic loop
359      IF( lp_obc_east  )   sshfoe_b(:,:) = 0.e0
360      IF( lp_obc_west  )   sshfow_b(:,:) = 0.e0
361      IF( lp_obc_south )   sshfos_b(:,:) = 0.e0
362      IF( lp_obc_north )   sshfon_b(:,:) = 0.e0
363#endif
364
365      !                                             ! ==================== !
366      DO jn = 1, icycle                             !  sub-time-step loop  ! (from NOW to AFTER+1)
367         !                                          ! ==================== !
368         z2dt_e = 2. * ( rdt / nn_baro )
369         IF( jn == 1 )   z2dt_e = rdt / nn_baro
370
371         !                                                !* Update the forcing (OBC, BDY and tides)
372         !                                                !  ------------------
373         IF( lk_obc )   CALL obc_dta_bt ( kt, jn   )
374         IF( lk_bdy )   CALL bdy_dta_fla( kt, jn+1, icycle )
375         IF ( ln_tide_pot ) CALL upd_tide( kt, jn )
376
377         !                                                !* after ssh_e
378         !                                                !  -----------
379         DO jj = 2, jpjm1                                      ! Horizontal divergence of barotropic transports
380            DO ji = fs_2, fs_jpim1   ! vector opt.
381               zhdiv(ji,jj) = (   e2u(ji  ,jj) * zun_e(ji  ,jj) * hu_e(ji  ,jj)     &
382                  &             - e2u(ji-1,jj) * zun_e(ji-1,jj) * hu_e(ji-1,jj)     &
383                  &             + e1v(ji,jj  ) * zvn_e(ji,jj  ) * hv_e(ji,jj  )     &
384                  &             - e1v(ji,jj-1) * zvn_e(ji,jj-1) * hv_e(ji,jj-1)   ) / ( e1t(ji,jj) * e2t(ji,jj) )
385            END DO
386         END DO
387         !
388#if defined key_obc
389         !                                                     ! OBC : zhdiv must be zero behind the open boundary
390!!  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column
391         IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1  ) = 0.e0      ! east
392         IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1  ) = 0.e0      ! west
393         IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0      ! north
394         IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1  ) = 0.e0      ! south
395#endif
396#if defined key_bdy
397         zhdiv(:,:) = zhdiv(:,:) * bdytmask(:,:)               ! BDY mask
398#endif
399         !
400         DO jj = 2, jpjm1                                      ! leap-frog on ssh_e
401            DO ji = fs_2, fs_jpim1   ! vector opt.
402               ssha_e(ji,jj) = ( zsshb_e(ji,jj) - z2dt_e * ( zraur * ( emp(ji,jj)-rnf(ji,jj) ) + zhdiv(ji,jj) ) ) * tmask(ji,jj,1) 
403            END DO
404         END DO
405
406         !                                                !* after barotropic velocities (vorticity scheme dependent)
407         !                                                !  --------------------------- 
408         zwx(:,:) = e2u(:,:) * zun_e(:,:) * hu_e(:,:)           ! now_e transport
409         zwy(:,:) = e1v(:,:) * zvn_e(:,:) * hv_e(:,:)
410         !
411         IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      !==  energy conserving or mixed scheme  ==!
412            DO jj = 2, jpjm1
413               DO ji = fs_2, fs_jpim1   ! vector opt.
414                  ! surface pressure gradient
415                  IF( lk_vvl) THEN
416                     zu_spg = -grav * (  ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  )    &
417                        &              - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj)
418                     zv_spg = -grav * (  ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    &
419                        &              - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj)
420                  ELSE
421                     zu_spg = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj)
422                     zv_spg = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj)
423                  ENDIF
424                  ! add tidal astronomical forcing
425                  IF ( ln_tide_pot ) THEN
426                  zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj)
427                  zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj)
428                  ENDIF
429                  ! energy conserving formulation for planetary vorticity term
430                  zy1 = ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)
431                  zy2 = ( zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
432                  zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) / e2v(ji,jj)
433                  zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
434                  zu_cor = z1_4 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 ) * hur_e(ji,jj)
435                  zv_cor =-z1_4 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) * hvr_e(ji,jj)
436                  ! after velocities with implicit bottom friction
437                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   &
438                     &         / ( 1.e0         - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) )
439                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   &
440                     &         / ( 1.e0         - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) )
441               END DO
442            END DO
443            !
444         ELSEIF ( ln_dynvor_ens ) THEN                    !==  enstrophy conserving scheme  ==!
445            DO jj = 2, jpjm1
446               DO ji = fs_2, fs_jpim1   ! vector opt.
447                   ! surface pressure gradient
448                  IF( lk_vvl) THEN
449                     zu_spg = -grav * (  ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  )    &
450                        &              - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj)
451                     zv_spg = -grav * (  ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    &
452                        &              - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj)
453                  ELSE
454                     zu_spg = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj)
455                     zv_spg = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj)
456                  ENDIF
457                  ! add tidal astronomical forcing
458                  IF ( ln_tide_pot ) THEN
459                  zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj)
460                  zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj)
461                  ENDIF
462                  ! enstrophy conserving formulation for planetary vorticity term
463                  zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) + zwy(ji,jj) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
464                  zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) + zwx(ji,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
465                  zu_cor  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) ) * hur_e(ji,jj)
466                  zv_cor  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) * hvr_e(ji,jj)
467                  ! after velocities with implicit bottom friction
468                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   &
469                     &         / ( 1.e0         - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) )
470                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   &
471                     &         / ( 1.e0         - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) )
472               END DO
473            END DO
474            !
475         ELSEIF ( ln_dynvor_een ) THEN                    !==  energy and enstrophy conserving scheme  ==!
476            DO jj = 2, jpjm1
477               DO ji = fs_2, fs_jpim1   ! vector opt.
478                  ! surface pressure gradient
479                  IF( lk_vvl) THEN
480                     zu_spg = -grav * (  ( rhd(ji+1,jj  ,1) + 1 ) * sshn_e(ji+1,jj  )    &
481                        &              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj)
482                     zv_spg = -grav * (  ( rhd(ji  ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    &
483                        &              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj)
484                  ELSE
485                     zu_spg = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj)
486                     zv_spg = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj)
487                  ENDIF
488                  ! add tidal astronomical forcing
489                  IF ( ln_tide_pot ) THEN
490                  zu_spg = zu_spg + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj)
491                  zv_spg = zv_spg + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj)
492                  ENDIF
493                  ! energy/enstrophy conserving formulation for planetary vorticity term
494                  zu_cor = + z1_4 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   &
495                     &                           + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) * hur_e(ji,jj)
496                  zv_cor = - z1_4 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) + ftse(ji,jj+1) * zwx(ji  ,jj+1)   &
497                     &                           + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) * hvr_e(ji,jj)
498                  ! after velocities with implicit bottom friction
499                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   &
500                     &         / ( 1.e0         - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) )
501                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   &
502                     &         / ( 1.e0         - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) )
503               END DO
504            END DO
505            !
506         ENDIF
507         !                                                !* domain lateral boundary
508         !                                                !  -----------------------
509         !                                                      ! Flather's boundary condition for the barotropic loop :
510         !                                                      !         - Update sea surface height on each open boundary
511         !                                                      !         - Correct the velocity
512
513         IF( lk_obc               )   CALL obc_fla_ts ( ua_e, va_e, sshn_e, ssha_e )
514         IF( lk_bdy .OR. ln_tides )   CALL bdy_dyn_fla( sshn_e ) 
515         !
516         CALL lbc_lnk( ua_e  , 'U', -1. )                      ! local domain boundaries
517         CALL lbc_lnk( va_e  , 'V', -1. )
518         CALL lbc_lnk( ssha_e, 'T',  1. )
519
520         zu_sum  (:,:) = zu_sum  (:,:) + ua_e  (:,:)           ! Sum over sub-time-steps
521         zv_sum  (:,:) = zv_sum  (:,:) + va_e  (:,:) 
522         zssh_sum(:,:) = zssh_sum(:,:) + ssha_e(:,:) 
523
524         !                                                !* Time filter and swap
525         !                                                !  --------------------
526         IF( jn == 1 ) THEN                                     ! Swap only (1st Euler time step)
527            zsshb_e(:,:) = sshn_e(:,:)
528            zub_e  (:,:) = zun_e (:,:)
529            zvb_e  (:,:) = zvn_e (:,:)
530            sshn_e (:,:) = ssha_e(:,:)
531            zun_e  (:,:) = ua_e  (:,:)
532            zvn_e  (:,:) = va_e  (:,:)
533         ELSE                                                   ! Swap + Filter
534            zsshb_e(:,:) = atfp * ( zsshb_e(:,:) + ssha_e(:,:) ) + atfp1 * sshn_e(:,:)
535            zub_e  (:,:) = atfp * ( zub_e  (:,:) + ua_e  (:,:) ) + atfp1 * zun_e (:,:)
536            zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + va_e  (:,:) ) + atfp1 * zvn_e (:,:)
537            sshn_e (:,:) = ssha_e(:,:)
538            zun_e  (:,:) = ua_e  (:,:)
539            zvn_e  (:,:) = va_e  (:,:)
540         ENDIF
541
542         IF( lk_vvl ) THEN                                !* Update ocean depth (variable volume case only)
543            !                                             !  ------------------
544            DO jj = 1, jpjm1                                    ! Sea Surface Height at u- & v-points
545               DO ji = 1, fs_jpim1   ! Vector opt.
546                  zsshun_e(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )       &
547                     &                  * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn_e(ji  ,jj)    &
548                     &                    + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) )
549                  zsshvn_e(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )       &
550                     &                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn_e(ji,jj  )    &
551                     &                    + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) )
552               END DO
553            END DO
554            CALL lbc_lnk( zsshun_e, 'U', 1. )                   ! lateral boundaries conditions
555            CALL lbc_lnk( zsshvn_e, 'V', 1. ) 
556            !
557            hu_e (:,:) = hu_0(:,:) + zsshun_e(:,:)              ! Ocean depth at U- and V-points
558            hv_e (:,:) = hv_0(:,:) + zsshvn_e(:,:)
559            hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1.e0 - umask(:,:,1) )
560            hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1.e0 - vmask(:,:,1) )
561            !
562         ENDIF
563         !                                                 ! ==================== !
564      END DO                                               !        end loop      !
565      !                                                    ! ==================== !
566
567#if defined key_obc
568      IF( lp_obc_east  )   sshfoe_b(:,:) = zcoef * sshfoe_b(:,:)     !!gm totally useless ?????
569      IF( lp_obc_west  )   sshfow_b(:,:) = zcoef * sshfow_b(:,:)
570      IF( lp_obc_north )   sshfon_b(:,:) = zcoef * sshfon_b(:,:)
571      IF( lp_obc_south )   sshfos_b(:,:) = zcoef * sshfos_b(:,:)
572#endif
573
574      ! -----------------------------------------------------------------------------
575      ! Phase 3. update the general trend with the barotropic trend
576      ! -----------------------------------------------------------------------------
577      !
578      !                                   !* Time average ==> after barotropic u, v, ssh
579      zcoef =  1.e0 / ( 2 * nn_baro  + 1 ) 
580      zu_sum(:,:) = zcoef * zu_sum  (:,:) 
581      zv_sum(:,:) = zcoef * zv_sum  (:,:) 
582      !
583      !                                   !* update the general momentum trend
584      DO jk=1,jpkm1
585         ua(:,:,jk) = ua(:,:,jk) + ( zu_sum(:,:) - ub_b(:,:) ) / z2dt_b
586         va(:,:,jk) = va(:,:,jk) + ( zv_sum(:,:) - vb_b(:,:) ) / z2dt_b
587      END DO
588      un_b  (:,:) =  zu_sum(:,:) 
589      vn_b  (:,:) =  zv_sum(:,:) 
590      sshn_b(:,:) = zcoef * zssh_sum(:,:) 
591      !
592      !                                   !* write time-spliting arrays in the restart
593      IF( lrst_oce )   CALL ts_rst( kt, 'WRITE' )
594      !
595      !
596      IF( wrk_not_released(2,  1, 2, 3, 4, 5, 6, 7, 8, 9,10,         &
597         &                    11,12,13,14,15,16,17,18,19,20,21) )    &
598         CALL ctl_stop('dyn_spg_ts: failed to release workspace arrays')
599      !
600   END SUBROUTINE dyn_spg_ts
601
602
603   SUBROUTINE ts_rst( kt, cdrw )
604      !!---------------------------------------------------------------------
605      !!                   ***  ROUTINE ts_rst  ***
606      !!
607      !! ** Purpose : Read or write time-splitting arrays in restart file
608      !!----------------------------------------------------------------------
609      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
610      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
611      !
612      INTEGER ::  ji, jk        ! dummy loop indices
613      !!----------------------------------------------------------------------
614      !
615      IF( TRIM(cdrw) == 'READ' ) THEN
616         IF( iom_varid( numror, 'un_b', ldstop = .FALSE. ) > 0 ) THEN
617            CALL iom_get( numror, jpdom_autoglo, 'un_b'  , un_b  (:,:) )   ! external velocity issued
618            CALL iom_get( numror, jpdom_autoglo, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop
619         ELSE
620            un_b (:,:) = 0.e0
621            vn_b (:,:) = 0.e0
622            ! vertical sum
623            IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll
624               DO jk = 1, jpkm1
625                  DO ji = 1, jpij
626                     un_b(ji,1) = un_b(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk)
627                     vn_b(ji,1) = vn_b(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk)
628                  END DO
629               END DO
630            ELSE                             ! No  vector opt.
631               DO jk = 1, jpkm1
632                  un_b(:,:) = un_b(:,:) + fse3u(:,:,jk) * un(:,:,jk)
633                  vn_b(:,:) = vn_b(:,:) + fse3v(:,:,jk) * vn(:,:,jk)
634               END DO
635            ENDIF
636            un_b (:,:) = un_b(:,:) * hur(:,:)
637            vn_b (:,:) = vn_b(:,:) * hvr(:,:)
638         ENDIF
639
640         ! Vertically integrated velocity (before)
641         IF (neuler/=0) THEN
642            ub_b (:,:) = 0.e0
643            vb_b (:,:) = 0.e0
644
645            ! vertical sum
646            IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll
647               DO jk = 1, jpkm1
648                  DO ji = 1, jpij
649                     ub_b(ji,1) = ub_b(ji,1) + fse3u_b(ji,1,jk) * ub(ji,1,jk)
650                     vb_b(ji,1) = vb_b(ji,1) + fse3v_b(ji,1,jk) * vb(ji,1,jk)
651                  END DO
652               END DO
653            ELSE                             ! No  vector opt.
654               DO jk = 1, jpkm1
655                  ub_b(:,:) = ub_b(:,:) + fse3u_b(:,:,jk) * ub(:,:,jk)
656                  vb_b(:,:) = vb_b(:,:) + fse3v_b(:,:,jk) * vb(:,:,jk)
657               END DO
658            ENDIF
659
660            IF( lk_vvl ) THEN
661               ub_b (:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1.e0 - umask(:,:,1) )
662               vb_b (:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1.e0 - vmask(:,:,1) )
663            ELSE
664               ub_b(:,:) = ub_b(:,:) * hur(:,:)
665               vb_b(:,:) = vb_b(:,:) * hvr(:,:)
666            ENDIF
667         ELSE                                 ! neuler==0
668            ub_b (:,:) = un_b (:,:)
669            vb_b (:,:) = vn_b (:,:)
670         ENDIF
671
672         IF( iom_varid( numror, 'sshn_b', ldstop = .FALSE. ) > 0 ) THEN
673            CALL iom_get( numror, jpdom_autoglo, 'sshn_b' , sshn_b (:,:) )   ! filtered ssh
674         ELSE
675            sshn_b(:,:) = sshb(:,:)   ! if not in restart set previous time mean to current baroclinic before value   
676         ENDIF
677      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN
678         CALL iom_rstput( kt, nitrst, numrow, 'un_b'   , un_b  (:,:) )   ! external velocity and ssh
679         CALL iom_rstput( kt, nitrst, numrow, 'vn_b'   , vn_b  (:,:) )   ! issued from barotropic loop
680         CALL iom_rstput( kt, nitrst, numrow, 'sshn_b' , sshn_b(:,:) )   !
681      ENDIF
682      !
683   END SUBROUTINE ts_rst
684
685#else
686   !!----------------------------------------------------------------------
687   !!   Default case :   Empty module   No standart free surface cst volume
688   !!----------------------------------------------------------------------
689CONTAINS
690   INTEGER FUNCTION dyn_spg_ts_alloc()    ! Dummy function
691      dyn_spg_ts_alloc = 0
692   END FUNCTION dyn_spg_ts_alloc
693   SUBROUTINE dyn_spg_ts( kt )            ! Empty routine
694      INTEGER, INTENT(in) :: kt
695      WRITE(*,*) 'dyn_spg_ts: You should not have seen this print! error?', kt
696   END SUBROUTINE dyn_spg_ts
697   SUBROUTINE ts_rst( kt, cdrw )          ! Empty routine
698      INTEGER         , INTENT(in) ::   kt         ! ocean time-step
699      CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
700      WRITE(*,*) 'ts_rst    : You should not have seen this print! error?', kt, cdrw
701   END SUBROUTINE ts_rst   
702#endif
703   
704   !!======================================================================
705END MODULE dynspg_ts
Note: See TracBrowser for help on using the repository browser.