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 NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DYN – NEMO

source: NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DYN/dynspg_ts.F90 @ 14618

Last change on this file since 14618 was 14604, checked in by techene, 3 years ago

#2605 : allow time filtering of barotropic variables

  • Property svn:keywords set to Id
File size: 82.2 KB
Line 
1MODULE dynspg_ts
2
3   !! Includes ROMS wd scheme with diagnostic outputs ; puu(:,:,:,Kmm) and puu(:,:,:,Krhs) updates are commented out !
4
5   !!======================================================================
6   !!                   ***  MODULE  dynspg_ts  ***
7   !! Ocean dynamics:  surface pressure gradient trend, split-explicit scheme
8   !!======================================================================
9   !! History :   1.0  ! 2004-12  (L. Bessieres, G. Madec)  Original code
10   !!              -   ! 2005-11  (V. Garnier, G. Madec)  optimization
11   !!              -   ! 2006-08  (S. Masson)  distributed restart using iom
12   !!             2.0  ! 2007-07  (D. Storkey) calls to BDY routines
13   !!              -   ! 2008-01  (R. Benshila)  change averaging method
14   !!             3.2  ! 2009-07  (R. Benshila, G. Madec) Complete revisit associated to vvl reactivation
15   !!             3.3  ! 2010-09  (D. Storkey, E. O'Dea) update for BDY for Shelf configurations
16   !!             3.3  ! 2011-03  (R. Benshila, R. Hordoir, P. Oddo) update calculation of ub_b
17   !!             3.5  ! 2013-07  (J. Chanut) Switch to Forward-backward time stepping
18   !!             3.6  ! 2013-11  (A. Coward) Update for z-tilde compatibility
19   !!             3.7  ! 2015-11  (J. Chanut) free surface simplification
20   !!              -   ! 2016-12  (G. Madec, E. Clementi) update for Stoke-Drift divergence
21   !!             4.0  ! 2017-05  (G. Madec)  drag coef. defined at t-point (zdfdrg.F90)
22   !!---------------------------------------------------------------------
23
24   !!----------------------------------------------------------------------
25   !!   dyn_spg_ts     : compute surface pressure gradient trend using a time-splitting scheme
26   !!   dyn_spg_ts_init: initialisation of the time-splitting scheme
27   !!   ts_wgt         : set time-splitting weights for temporal averaging (or not)
28   !!   ts_rst         : read/write time-splitting fields in restart file
29   !!----------------------------------------------------------------------
30   USE oce             ! ocean dynamics and tracers
31   USE dom_oce         ! ocean space and time domain
32   USE sbc_oce         ! surface boundary condition: ocean
33   USE isf_oce         ! ice shelf variable (fwfisf)
34   USE zdf_oce         ! vertical physics: variables
35   USE zdfdrg          ! vertical physics: top/bottom drag coef.
36   USE sbcapr          ! surface boundary condition: atmospheric pressure
37   USE dynadv    , ONLY: ln_dynadv_vec
38   USE dynvor          ! vortivity scheme indicators
39   USE phycst          ! physical constants
40   USE dynvor          ! vorticity term
41   USE wet_dry         ! wetting/drying flux limter
42   USE bdy_oce         ! open boundary
43   USE bdyvol          ! open boundary volume conservation
44   USE bdytides        ! open boundary condition data
45   USE bdydyn2d        ! open boundary conditions on barotropic variables
46   USE tide_mod        !
47   USE sbcwave         ! surface wave
48#if defined key_agrif
49   USE agrif_oce_interp ! agrif
50   USE agrif_oce
51#endif
52#if defined key_asminc   
53   USE asminc          ! Assimilation increment
54#endif
55   !
56   USE in_out_manager  ! I/O manager
57   USE lib_mpp         ! distributed memory computing library
58   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
59   USE prtctl          ! Print control
60   USE iom             ! IOM library
61   USE restart         ! only for lrst_oce
62
63   USE iom   ! to remove
64
65   IMPLICIT NONE
66   PRIVATE
67
68   PUBLIC dyn_spg_ts        ! called by dyn_spg
69   PUBLIC dyn_spg_ts_init   !    -    - dyn_spg_init
70   PUBLIC dyn_drg_init      ! called by rk3ssh
71
72   !! Time filtered arrays at baroclinic time step:
73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv   !: Advection vel. at "now" barocl. step
74   !
75   INTEGER, SAVE :: icycle      ! Number of barotropic sub-steps for each internal step nn_e <= 2.5 nn_e
76   REAL(wp),SAVE :: rDt_e       ! Barotropic time step
77   !
78   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)   ::   wgtbtp1, wgtbtp2   ! 1st & 2nd weights used in time filtering of barotropic fields
79   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zwz                ! ff_f/h at F points
80   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ftnw, ftne         ! triad of coriolis parameter
81   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ftsw, ftse         ! (only used with een vorticity scheme)
82
83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sshe_rhs           ! RHS of ssh Eq.
84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Ue_rhs, Ve_rhs    ! RHS of barotropic velocity Eq.
85   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   CdU_u, CdU_v       ! top/bottom stress at u- & v-points
86
87   REAL(wp) ::   r1_12 = 1._wp / 12._wp   ! local ratios
88   REAL(wp) ::   r1_8  = 0.125_wp         !
89   REAL(wp) ::   r1_4  = 0.25_wp          !
90   REAL(wp) ::   r1_2  = 0.5_wp           !
91
92   !! * Substitutions
93#  include "do_loop_substitute.h90"
94#  include "domzgr_substitute.h90"
95   !!----------------------------------------------------------------------
96   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
97   !! $Id$
98   !! Software governed by the CeCILL license (see ./LICENSE)
99   !!----------------------------------------------------------------------
100CONTAINS
101
102   INTEGER FUNCTION dyn_spg_ts_alloc()
103      !!----------------------------------------------------------------------
104      !!                  ***  routine dyn_spg_ts_alloc  ***
105      !!----------------------------------------------------------------------
106      INTEGER :: ierr(3)
107      !!----------------------------------------------------------------------
108      ierr(:) = 0
109      !
110      ALLOCATE( wgtbtp1(3*nn_e), wgtbtp2(3*nn_e), zwz(jpi,jpj), STAT=ierr(1) )
111      IF( ln_dynvor_een .OR. ln_dynvor_eeT )   &
112         &     ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , ftsw(jpi,jpj) , ftse(jpi,jpj), STAT=ierr(2)   )
113         !
114      ALLOCATE( un_adv(jpi,jpj), vn_adv(jpi,jpj)                    , STAT=ierr(3) )
115      !
116      dyn_spg_ts_alloc = MAXVAL( ierr(:) )
117      !
118      CALL mpp_sum( 'dynspg_ts', dyn_spg_ts_alloc )
119      IF( dyn_spg_ts_alloc /= 0 )   CALL ctl_stop( 'STOP', 'dyn_spg_ts_alloc: failed to allocate arrays' )
120      !
121   END FUNCTION dyn_spg_ts_alloc
122
123
124   SUBROUTINE dyn_spg_ts( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa )
125      !!----------------------------------------------------------------------
126      !!
127      !! ** Purpose : - Compute the now trend due to the explicit time stepping
128      !!              of the quasi-linear barotropic system, and add it to the
129      !!              general momentum trend.
130      !!
131      !! ** Method  : - split-explicit schem (time splitting) :
132      !!      Barotropic variables are advanced from internal time steps
133      !!      "n"   to "n+1" if ln_bt_fw=T
134      !!      or from
135      !!      "n-1" to "n+1" if ln_bt_fw=F
136      !!      thanks to a generalized forward-backward time stepping (see ref. below).
137      !!
138      !! ** Action :
139      !!      -Update the filtered free surface at step "n+1"      : pssh(:,:,Kaa)
140      !!      -Update filtered barotropic velocities at step "n+1" : puu_b(:,:,:,Kaa), vv_b(:,:,:,Kaa)
141      !!      -Compute barotropic advective fluxes at step "n"     : un_adv, vn_adv
142      !!      These are used to advect tracers and are compliant with discrete
143      !!      continuity equation taken at the baroclinic time steps. This
144      !!      ensures tracers conservation.
145      !!      - (puu(:,:,:,Krhs), pvv(:,:,:,Krhs)) momentum trend updated with barotropic component.
146      !!
147      !! References : Shchepetkin and McWilliams, Ocean Modelling, 2005.
148      !!---------------------------------------------------------------------
149      INTEGER                             , INTENT( in )  ::  kt                  ! ocean time-step index
150      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs, Kaa ! ocean time level indices
151      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation
152      REAL(wp), DIMENSION(jpi,jpj    ,jpt), INTENT(inout) ::  pssh, puu_b, pvv_b  ! SSH and barotropic velocities at main time levels
153      !
154      INTEGER  ::   ji, jj, jk, jn        ! dummy loop indices
155      LOGICAL  ::   ll_fw_start           ! =T : forward integration
156      LOGICAL  ::   ll_init               ! =T : special startup of 2d equations
157      INTEGER  ::   noffset               ! local integers  : time offset for bdy update
158      REAL(wp) ::   z1_hu , z1_hv             ! local scalars
159      REAL(wp) ::   zzsshu, zzsshv            !   -      -
160      REAL(wp) ::   za0, za1, za2, za3        !   -      -
161      REAL(wp) ::   zztmp, zldg               !   -      -
162      REAL(wp) ::   zhu_bck, zhv_bck, zhdiv   !   -      -
163      REAL(wp) ::   zun_save, zvn_save        !   -      -
164      REAL(wp), DIMENSION(jpi,jpj) :: zu_trd, zu_frc, zu_spg, zssh_frc
165      REAL(wp), DIMENSION(jpi,jpj) :: zv_trd, zv_frc, zv_spg
166      REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhtp2_e
167      REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zsshp2_e
168      REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v   ! top/bottom stress at u- & v-points
169      REAL(wp), DIMENSION(jpi,jpj) :: zhU, zhV         ! fluxes
170      !
171      REAL(wp) ::   zwdramp                     ! local scalar - only used if ln_wd_dl = .True.
172
173      INTEGER  :: iwdg, jwdg, kwdg   ! short-hand values for the indices of the output point
174
175      REAL(wp) ::   zepsilon, zgamma            !   -      -
176      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zcpx, zcpy   ! Wetting/Dying gravity filter coef.
177      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ztwdmask, zuwdmask, zvwdmask ! ROMS wetting and drying masks at t,u,v points
178      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zuwdav2, zvwdav2    ! averages over the sub-steps of zuwdmask and zvwdmask
179      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: z2d          ! 2D workspace
180      REAL(wp) ::   zt0substep !   Time of day at the beginning of the time substep
181      !!----------------------------------------------------------------------
182      !
183      IF( ln_wd_il ) ALLOCATE( zcpx(jpi,jpj), zcpy(jpi,jpj) )
184      !                                         !* Allocate temporary arrays
185      IF( ln_wd_dl ) ALLOCATE( ztwdmask(jpi,jpj), zuwdmask(jpi,jpj), zvwdmask(jpi,jpj), zuwdav2(jpi,jpj), zvwdav2(jpi,jpj))
186      !
187      zwdramp = r_rn_wdmin1               ! simplest ramp
188!     zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp
189      !                                         ! inverse of baroclinic time step
190      !
191      ll_init     = ln_bt_av                    ! if no time averaging, then no specific restart
192      ll_fw_start = .FALSE.
193      !                                         ! time offset in steps for bdy data update
194      IF( .NOT.ln_bt_fw ) THEN   ;   noffset = - nn_e
195      ELSE                       ;   noffset =   0 
196      ENDIF
197      !
198      IF( kt == nit000 ) THEN                   !* initialisation
199         !
200         IF(lwp) WRITE(numout,*)
201         IF(lwp) WRITE(numout,*) 'dyn_spg_ts : surface pressure gradient trend'
202         IF(lwp) WRITE(numout,*) '~~~~~~~~~~   free surface with time splitting'
203         IF(lwp) WRITE(numout,*)
204         !
205         IF( l_1st_euler )   ll_init=.TRUE.
206         !
207         IF( ln_bt_fw .OR. l_1st_euler ) THEN
208            ll_fw_start =.TRUE.
209            noffset     = 0
210         ELSE
211            ll_fw_start =.FALSE.
212         ENDIF
213         !                    ! Set averaging weights and cycle length:
214         CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 )
215         !
216      ELSEIF( kt == nit000 + 1 ) THEN           !* initialisation 2nd time-step
217         !
218         IF( .NOT.ln_bt_fw ) THEN
219            ! If we did an Euler timestep on the first timestep we need to reset ll_fw_start
220            ! and the averaging weights. We don't have an easy way of telling whether we did
221            ! an Euler timestep on the first timestep (because l_1st_euler is reset to .false.
222            ! at the end of the first timestep) so just do this in all cases.
223            ll_fw_start = .FALSE.
224            CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 )
225         ENDIF
226         !
227      ENDIF
228      !
229      ! -----------------------------------------------------------------------------
230      !  Phase 1 : Coupling between general trend and barotropic estimates (1st step)
231      ! -----------------------------------------------------------------------------
232#if defined key_RK3
233      !                    !========================================!
234      !                    !==  Phase 1 for RK3 time integration  ==!
235      !                    !========================================!
236      !
237      !                          ! Currently, RK3 requires the forward mode
238      IF( kt == nit000 ) THEN
239         IF( .NOT.ln_bt_fw  )   CALL ctl_stop( 'dyn_spg_ts: RK3 requires forward mode (ln_bt_fw=T)' )
240      ENDIF
241      !
242      !                          ! set values computed in RK3_ssh
243      zssh_frc(:,:) = sshe_rhs(:,:)
244        zu_frc(:,:) =   Ue_rhs(:,:)
245        zv_frc(:,:) =   Ve_rhs(:,:)
246      zCdU_u  (:,:) = CdU_u   (:,:)
247      zCdU_v  (:,:) = CdU_v   (:,:)
248
249!!gm ==>>> !!ts    ISSUe her on en discute    changer les cas ENS ENE  et triad ?
250      IF( kt == nit000 .OR. .NOT. ln_linssh )   CALL dyn_cor_2D_init( Kmm )   ! Set zwz, the barotropic Coriolis force coefficient
251      !                      ! recompute zwz = f/depth  at every time step for (.NOT.ln_linssh) as the water colomn height changes
252      !
253     
254#else
255      !                    !========================================!
256      !                    !==  Phase 1 for MLF time integration  ==!
257      !                    !========================================!
258      !
259      !     
260      !
261      !                                   !=  zu_frc =  1/H e3*d/dt(Ua)  =!  (Vertical mean of Ua, the 3D trends)
262      !                                   !  ---------------------------  !
263# if defined key_qco 
264      zu_frc(:,:) = SUM( e3u_0(:,:,:  ) * puu(:,:,:,Krhs) * umask(:,:,:), DIM=3 ) * r1_hu_0(:,:)
265      zv_frc(:,:) = SUM( e3v_0(:,:,:  ) * pvv(:,:,:,Krhs) * vmask(:,:,:), DIM=3 ) * r1_hv_0(:,:)
266# else
267      zu_frc(:,:) = SUM( e3u(:,:,:,Kmm) * puu(:,:,:,Krhs) * umask(:,:,:), DIM=3 ) * r1_hu(:,:,Kmm)
268      zv_frc(:,:) = SUM( e3v(:,:,:,Kmm) * pvv(:,:,:,Krhs) * vmask(:,:,:), DIM=3 ) * r1_hv(:,:,Kmm)
269# endif 
270      !
271      !
272      !                                   !=  U(Krhs) => baroclinic trend  =!   (remove its vertical mean)
273      DO jk = 1, jpkm1                    !  -----------------------------  !
274         puu(:,:,jk,Krhs) = ( puu(:,:,jk,Krhs) - zu_frc(:,:) ) * umask(:,:,jk)
275         pvv(:,:,jk,Krhs) = ( pvv(:,:,jk,Krhs) - zv_frc(:,:) ) * vmask(:,:,jk)
276      END DO
277     
278!!gm  Question here when removing the Vertically integrated trends, we remove the vertically integrated NL trends on momentum....
279!!gm  Is it correct to do so ?   I think so...
280     
281      !                                   !=  remove 2D Coriolis trend  =!
282      !                                   !  --------------------------  !
283      !
284      IF( kt == nit000 .OR. .NOT. ln_linssh )   CALL dyn_cor_2D_init( Kmm )   ! Set zwz, the barotropic Coriolis force coefficient
285      !                      ! recompute zwz = f/depth  at every time step for (.NOT.ln_linssh) as the water colomn height changes
286      !
287      zhU(:,:) = puu_b(:,:,Kmm) * hu(:,:,Kmm) * e2u(:,:)        ! now fluxes
288      zhV(:,:) = pvv_b(:,:,Kmm) * hv(:,:,Kmm) * e1v(:,:)        ! NB: FULL domain : put a value in last row and column
289      !
290      CALL dyn_cor_2D( ht(:,:), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in
291         &                                                                          zu_trd, zv_trd   )   ! ==>> out
292      !
293      DO_2D( 0, 0, 0, 0 )                          ! Remove coriolis term (and possibly spg) from barotropic trend
294         zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj)
295         zv_frc(ji,jj) = zv_frc(ji,jj) - zv_trd(ji,jj) * ssvmask(ji,jj)
296      END_2D
297      !
298      !                                   !=  Add bottom stress contribution from baroclinic velocities  =!
299      !                                   !  -----------------------------------------------------------  !
300      CALL dyn_drg_init( Kbb, Kmm, puu   , pvv   , puu_b , pvv_b  ,   &     !  <<= IN
301         &                         zu_frc, zv_frc, zCdU_u, zCdU_v )         !  =>> OUT
302      !
303      !                                   !=  Add atmospheric pressure forcing  =!
304      !                                   !  ----------------------------------  !
305      IF( ln_apr_dyn ) THEN
306         IF( ln_bt_fw ) THEN                          ! FORWARD integration: use kt+1/2 pressure (NOW+1/2)
307            DO_2D( 0, 0, 0, 0 )
308               zu_frc(ji,jj) = zu_frc(ji,jj) + grav * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) ) * r1_e1u(ji,jj)
309               zv_frc(ji,jj) = zv_frc(ji,jj) + grav * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) ) * r1_e2v(ji,jj)
310            END_2D
311         ELSE                                         ! CENTRED integration: use kt-1/2 + kt+1/2 pressure (NOW)
312            zztmp = grav * r1_2
313            DO_2D( 0, 0, 0, 0 )
314               zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)  &
315                    &                                   + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj)
316               zv_frc(ji,jj) = zv_frc(ji,jj) + zztmp * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)  &
317                    &                                   + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj)
318            END_2D
319         ENDIF
320      ENDIF
321      !
322      !                                   !=  Add wind forcing  =!
323      !                                   !  ------------------  !
324      IF( ln_bt_fw ) THEN
325         DO_2D( 0, 0, 0, 0 )
326            zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu(ji,jj,Kmm)
327            zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv(ji,jj,Kmm)
328         END_2D
329      ELSE
330         zztmp = r1_rho0 * r1_2
331         DO_2D( 0, 0, 0, 0 )
332            zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu(ji,jj,Kmm)
333            zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv(ji,jj,Kmm)
334         END_2D
335      ENDIF 
336      !
337      !              !----------------!
338      !              !==  sssh_frc  ==!   Right-Hand-Side of the barotropic ssh equation   (over the FULL domain)
339      !              !----------------!
340      !                                   !=  Net water flux forcing applied to a water column  =!
341      !                                   ! ---------------------------------------------------  !
342      IF (ln_bt_fw) THEN                          ! FORWARD integration: use kt+1/2 fluxes (NOW+1/2)
343         zssh_frc(:,:) = r1_rho0 * ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) )
344      ELSE                                        ! CENTRED integration: use kt-1/2 + kt+1/2 fluxes (NOW)
345         zztmp = r1_rho0 * r1_2
346         zssh_frc(:,:) = zztmp * (   emp(:,:)        + emp_b(:,:)          &
347            &                      - rnf(:,:)        - rnf_b(:,:)          &
348            &                      + fwfisf_cav(:,:) + fwfisf_cav_b(:,:)   &
349            &                      + fwfisf_par(:,:) + fwfisf_par_b(:,:)   )
350      ENDIF
351      !                                   !=  Add Stokes drift divergence  =!   (if exist)
352      IF( ln_sdw ) THEN                   !  -----------------------------  !
353         zssh_frc(:,:) = zssh_frc(:,:) + div_sd(:,:)
354      ENDIF
355      !
356      !                                         ! ice sheet coupling
357      IF ( ln_isf .AND. ln_isfcpl ) THEN
358         !
359         ! ice sheet coupling
360         IF( ln_rstart .AND. kt == nit000 ) THEN
361            zssh_frc(:,:) = zssh_frc(:,:) + risfcpl_ssh(:,:)
362         END IF
363         !
364         ! conservation option
365         IF( ln_isfcpl_cons ) THEN
366            zssh_frc(:,:) = zssh_frc(:,:) + risfcpl_cons_ssh(:,:)
367         END IF
368         !
369      END IF
370      !
371# if defined key_asminc
372      !                                   !=  Add the IAU weighted SSH increment  =!
373      !                                   !  ------------------------------------  !
374      IF( lk_asminc .AND. ln_sshinc .AND. ln_asmiau ) THEN
375         zssh_frc(:,:) = zssh_frc(:,:) - ssh_iau(:,:)
376      ENDIF
377# endif
378
379      !                    !==  END of  Phase 1 for MLF time integration  ==!
380#endif
381
382
383      !                                   != Fill boundary data arrays for AGRIF
384      !                                   ! ------------------------------------
385#if defined key_agrif
386         IF( .NOT.Agrif_Root() ) CALL agrif_dta_ts( kt )
387#endif
388      !
389      ! -----------------------------------------------------------------------
390      !  Phase 2 : Integration of the barotropic equations
391      ! -----------------------------------------------------------------------
392      !
393      !                                             ! ==================== !
394      !                                             !    Initialisations   !
395      !                                             ! ==================== ! 
396      ! Initialize barotropic variables:     
397      IF( ll_init )THEN
398         sshbb_e(:,:) = 0._wp
399         ubb_e  (:,:) = 0._wp
400         vbb_e  (:,:) = 0._wp
401         sshb_e (:,:) = 0._wp
402         ub_e   (:,:) = 0._wp
403         vb_e   (:,:) = 0._wp
404      ENDIF
405      !
406      IF( ln_linssh ) THEN    ! mid-step ocean depth is fixed (hup2_e=hu_n=hu_0)
407         zhup2_e(:,:) = hu_0(:,:)
408         zhvp2_e(:,:) = hv_0(:,:)
409         zhtp2_e(:,:) = ht_0(:,:)
410      ENDIF
411      !
412      IF( ln_bt_fw ) THEN                 ! FORWARD integration: start from NOW fields                   
413         sshn_e(:,:) =    pssh (:,:,Kmm)           
414         un_e  (:,:) =    puu_b(:,:,Kmm)           
415         vn_e  (:,:) =    pvv_b(:,:,Kmm)
416         !
417         hu_e  (:,:) =    hu(:,:,Kmm)       
418         hv_e  (:,:) =    hv(:,:,Kmm) 
419         hur_e (:,:) = r1_hu(:,:,Kmm)   
420         hvr_e (:,:) = r1_hv(:,:,Kmm)
421      ELSE                                ! CENTRED integration: start from BEFORE fields
422         sshn_e(:,:) =    pssh (:,:,Kbb)
423         un_e  (:,:) =    puu_b(:,:,Kbb)         
424         vn_e  (:,:) =    pvv_b(:,:,Kbb)
425         !
426         hu_e  (:,:) =    hu(:,:,Kbb)       
427         hv_e  (:,:) =    hv(:,:,Kbb) 
428         hur_e (:,:) = r1_hu(:,:,Kbb)   
429         hvr_e (:,:) = r1_hv(:,:,Kbb)
430      ENDIF
431      !
432      ! Initialize sums:
433      puu_b (:,:,Kaa) = 0._wp       ! After barotropic velocities (or transport if flux form)         
434      pvv_b (:,:,Kaa) = 0._wp
435      pssh  (:,:,Kaa) = 0._wp       ! Sum for after averaged sea level
436      un_adv(:,:)     = 0._wp       ! Sum for now transport issued from ts loop
437      vn_adv(:,:)     = 0._wp
438      !
439      IF( ln_wd_dl ) THEN
440         zuwdmask(:,:) = 0._wp  ! set to zero for definiteness (not sure this is necessary)
441         zvwdmask(:,:) = 0._wp  !
442         zuwdav2 (:,:) = 0._wp 
443         zvwdav2 (:,:) = 0._wp   
444      END IF 
445
446      !                                             ! ==================== !
447      DO jn = 1, icycle                             !  sub-time-step loop  !
448         !                                          ! ==================== !
449         !
450         l_full_nf_update = jn == icycle   ! false: disable full North fold update (performances) for jn = 1 to icycle-1
451         !
452         !                    !==  Update the forcing ==! (BDY and tides)
453         !
454         IF( ln_bdy      .AND. ln_tide )   CALL bdy_dta_tides( kt, kit=jn, pt_offset= REAL(noffset+1,wp) )
455         ! Update tide potential at the beginning of current time substep
456         IF( ln_tide_pot .AND. ln_tide ) THEN
457            zt0substep = REAL(nsec_day, wp) - 0.5_wp*rn_Dt + (jn + noffset - 1) * rn_Dt / REAL(nn_e, wp)
458            CALL upd_tide(zt0substep, Kmm)
459         END IF
460         !
461         !                    !==  extrapolation at mid-step  ==!   (jn+1/2)
462         !
463         !                       !* Set extrapolation coefficients for predictor step:
464         IF ((jn<3).AND.ll_init) THEN      ! Forward           
465           za1 = 1._wp                                         
466           za2 = 0._wp                       
467           za3 = 0._wp                       
468         ELSE                              ! AB3-AM4 Coefficients: bet=0.281105
469           za1 =  1.781105_wp              ! za1 =   3/2 +   bet
470           za2 = -1.06221_wp               ! za2 = -(1/2 + 2*bet)
471           za3 =  0.281105_wp              ! za3 = bet
472         ENDIF
473         !
474         !                       !* Extrapolate barotropic velocities at mid-step (jn+1/2)
475         !--        m+1/2               m                m-1           m-2       --!
476         !--       u      = (3/2+beta) u   -(1/2+2beta) u      + beta u          --!
477         !-------------------------------------------------------------------------!
478         ua_e(:,:) = za1 * un_e(:,:) + za2 * ub_e(:,:) + za3 * ubb_e(:,:)
479         va_e(:,:) = za1 * vn_e(:,:) + za2 * vb_e(:,:) + za3 * vbb_e(:,:)
480
481         IF( .NOT.ln_linssh ) THEN                        !* Update ocean depth (variable volume case only)
482            !                                             !  ------------------
483            ! Extrapolate Sea Level at step jit+0.5:
484            !--         m+1/2                 m                  m-1             m-2       --!
485            !--      ssh      = (3/2+beta) ssh   -(1/2+2beta) ssh      + beta ssh          --!
486            !--------------------------------------------------------------------------------!
487            zsshp2_e(:,:) = za1 * sshn_e(:,:)  + za2 * sshb_e(:,:) + za3 * sshbb_e(:,:)
488           
489            ! set wetting & drying mask at tracer points for this barotropic mid-step
490            IF( ln_wd_dl )   CALL wad_tmsk( zsshp2_e, ztwdmask )
491            !
492            !                          ! ocean t-depth at mid-step
493            zhtp2_e(:,:) = ht_0(:,:) + zsshp2_e(:,:)
494            !
495            !                          ! ocean u- and v-depth at mid-step   (separate DO-loops remove the need of a lbc_lnk)
496#if defined key_qcoTest_FluxForm
497            !                                ! 'key_qcoTest_FluxForm' : simple ssh average
498            DO_2D( 1, 0, 1, 1 )   ! not jpi-column
499               zhup2_e(ji,jj) = hu_0(ji,jj) + r1_2 * (  zsshp2_e(ji,jj) + zsshp2_e(ji+1,jj  )  ) * ssumask(ji,jj)
500            END_2D
501            DO_2D( 1, 1, 1, 0 )
502               zhvp2_e(ji,jj) = hv_0(ji,jj) + r1_2 * (  zsshp2_e(ji,jj) + zsshp2_e(ji  ,jj+1)  ) * ssvmask(ji,jj)
503            END_2D
504#else
505            !                                ! no 'key_qcoTest_FluxForm' : surface weighted ssh average
506            DO_2D( 1, 0, 1, 1 )   ! not jpi-column
507               zhup2_e(ji,jj) = hu_0(ji,jj) + r1_2 * r1_e1e2u(ji,jj)                        &
508                    &                              * (  e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)  &
509                    &                                 + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj)  ) * ssumask(ji,jj)
510            END_2D
511            DO_2D( 1, 1, 1, 0 )   ! not jpj-row
512               zhvp2_e(ji,jj) = hv_0(ji,jj) + r1_2 * r1_e1e2v(ji,jj)                        &
513                    &                              * (  e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )  &
514                    &                                 + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1)  ) * ssvmask(ji,jj)
515            END_2D
516#endif               
517            !
518         ENDIF
519         !
520         !                    !==  after SSH  ==!   (jn+1)
521         !
522         !                             ! update (ua_e,va_e) to enforce volume conservation at open boundaries
523         !                             ! values of zhup2_e and zhvp2_e on the halo are not needed in bdy_vol2d
524         IF( ln_bdy .AND. ln_vol ) CALL bdy_vol2d( kt, jn, ua_e, va_e, zhup2_e, zhvp2_e )
525         !     
526         !                             ! resulting flux at mid-step (not over the full domain)
527         zhU(1:jpim1,1:jpj  ) = e2u(1:jpim1,1:jpj  ) * ua_e(1:jpim1,1:jpj  ) * zhup2_e(1:jpim1,1:jpj  )   ! not jpi-column
528         zhV(1:jpi  ,1:jpjm1) = e1v(1:jpi  ,1:jpjm1) * va_e(1:jpi  ,1:jpjm1) * zhvp2_e(1:jpi  ,1:jpjm1)   ! not jpj-row
529         !
530#if defined key_agrif
531         ! Set fluxes during predictor step to ensure volume conservation
532         IF( .NOT.Agrif_Root() .AND. ln_bt_fw ) CALL agrif_dyn_ts_flux( jn, zhU, zhV )
533#endif
534         IF( ln_wd_il )   CALL wad_lmt_bt(zhU, zhV, sshn_e, zssh_frc, rDt_e)    !!gm wad_lmt_bt use of lbc_lnk on zhU, zhV
535
536         IF( ln_wd_dl ) THEN           ! un_e and vn_e are set to zero at faces where
537            !                          ! the direction of the flow is from dry cells
538            CALL wad_Umsk( ztwdmask, zhU, zhV, un_e, vn_e, zuwdmask, zvwdmask )   ! not jpi colomn for U, not jpj row for V
539            !
540         ENDIF   
541         !
542         !
543         !     Compute Sea Level at step jit+1
544         !--           m+1        m                               m+1/2          --!
545         !--        ssh    =  ssh   - delta_t' * [ frc + div( flux      ) ]      --!
546         !-------------------------------------------------------------------------!
547         DO_2D( 0, 0, 0, 0 )
548            zhdiv = (   zhU(ji,jj) - zhU(ji-1,jj) + zhV(ji,jj) - zhV(ji,jj-1)   ) * r1_e1e2t(ji,jj)
549            ssha_e(ji,jj) = (  sshn_e(ji,jj) - rDt_e * ( zssh_frc(ji,jj) + zhdiv )  ) * ssmask(ji,jj)
550         END_2D
551         !
552         CALL lbc_lnk_multi( 'dynspg_ts', ssha_e, 'T', 1._wp,  zhU, 'U', -1._wp,  zhV, 'V', -1._wp )
553         !
554         ! Duplicate sea level across open boundaries (this is only cosmetic if linssh=T)
555         IF( ln_bdy )   CALL bdy_ssh( ssha_e )
556#if defined key_agrif
557         IF( .NOT.Agrif_Root() )   CALL agrif_ssh_ts( jn )
558#endif
559         !
560         !                             ! Sum over sub-time-steps to compute advective velocities
561         za2 = wgtbtp2(jn)             ! zhU, zhV hold fluxes extrapolated at jn+0.5
562         un_adv(:,:) = un_adv(:,:) + za2 * zhU(:,:) * r1_e2u(:,:)
563         vn_adv(:,:) = vn_adv(:,:) + za2 * zhV(:,:) * r1_e1v(:,:)
564         ! sum over sub-time-steps to decide which baroclinic velocities to set to zero (zuwdav2 is only used when ln_wd_dl_bc=True)
565         IF ( ln_wd_dl_bc ) THEN
566            zuwdav2(1:jpim1,1:jpj  ) = zuwdav2(1:jpim1,1:jpj  ) + za2 * zuwdmask(1:jpim1,1:jpj  )   ! not jpi-column
567            zvwdav2(1:jpi  ,1:jpjm1) = zvwdav2(1:jpi  ,1:jpjm1) + za2 * zvwdmask(1:jpi  ,1:jpjm1)   ! not jpj-row
568         END IF
569         !
570         
571         ! Sea Surface Height at u-,v-points (vvl case only)
572         IF( .NOT.ln_linssh ) THEN
573#if defined key_qcoTest_FluxForm
574            !                                ! 'key_qcoTest_FluxForm' : simple ssh average
575            DO_2D( 1, 0, 1, 1 )
576               zsshu_a(ji,jj) = r1_2 * (  ssha_e(ji,jj) + ssha_e(ji+1,jj  )  ) * ssumask(ji,jj)
577            END_2D
578            DO_2D( 1, 1, 1, 0 )
579               zsshv_a(ji,jj) = r1_2 * (  ssha_e(ji,jj) + ssha_e(ji  ,jj+1)  ) * ssvmask(ji,jj)
580            END_2D
581#else
582            DO_2D( 0, 0, 0, 0 )
583               zsshu_a(ji,jj) = r1_2 * r1_e1e2u(ji,jj) * ( e1e2t(ji  ,jj  ) * ssha_e(ji  ,jj  )   &
584                  &                                      + e1e2t(ji+1,jj  ) * ssha_e(ji+1,jj  ) ) * ssumask(ji,jj)
585               zsshv_a(ji,jj) = r1_2 * r1_e1e2v(ji,jj) * ( e1e2t(ji  ,jj  ) * ssha_e(ji  ,jj  )   &
586                  &                                      + e1e2t(ji  ,jj+1) * ssha_e(ji  ,jj+1) ) * ssvmask(ji,jj)
587            END_2D
588#endif
589         ENDIF
590         !         
591         ! Half-step back interpolation of SSH for surface pressure computation at step jit+1/2
592         !--            m+1/2           m+1              m               m-1              m-2     --!
593         !--        ssh'    =  za0 * ssh     +  za1 * ssh   +  za2 * ssh      +  za3 * ssh        --!
594         !------------------------------------------------------------------------------------------!
595         CALL ts_bck_interp( jn, ll_init, za0, za1, za2, za3 )   ! coeficients of the interpolation
596         zsshp2_e(:,:) = za0 *  ssha_e(:,:) + za1 *  sshn_e (:,:)   &
597            &          + za2 *  sshb_e(:,:) + za3 *  sshbb_e(:,:)
598         !
599         !                             ! Surface pressure gradient
600         zldg = ( 1._wp - rn_scal_load ) * grav    ! local factor
601         DO_2D( 0, 0, 0, 0 )
602            zu_spg(ji,jj) = - zldg * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj)
603            zv_spg(ji,jj) = - zldg * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj)
604         END_2D
605         IF( ln_wd_il ) THEN        ! W/D : gravity filters applied on pressure gradient
606            CALL wad_spg( zsshp2_e, zcpx, zcpy )   ! Calculating W/D gravity filters
607            zu_spg(2:jpim1,2:jpjm1) = zu_spg(2:jpim1,2:jpjm1) * zcpx(2:jpim1,2:jpjm1)
608            zv_spg(2:jpim1,2:jpjm1) = zv_spg(2:jpim1,2:jpjm1) * zcpy(2:jpim1,2:jpjm1)
609         ENDIF
610         !
611         ! Add Coriolis trend:
612         ! zwz array below or triads normally depend on sea level with ln_linssh=F and should be updated
613         ! at each time step. We however keep them constant here for optimization.
614         ! Recall that zhU and zhV hold fluxes at jn+0.5 (extrapolated not backward interpolated)
615         CALL dyn_cor_2D( zhtp2_e, zhup2_e, zhvp2_e, ua_e, va_e, zhU, zhV,    zu_trd, zv_trd   )
616         !
617         ! Add tidal astronomical forcing if defined
618         IF ( ln_tide .AND. ln_tide_pot ) THEN
619            DO_2D( 0, 0, 0, 0 )
620               zu_trd(ji,jj) = zu_trd(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj)
621               zv_trd(ji,jj) = zv_trd(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj)
622            END_2D
623         ENDIF
624         !
625         ! Add bottom stresses:
626!jth do implicitly instead
627         IF ( .NOT. ll_wd ) THEN ! Revert to explicit for bit comparison tests in non wad runs
628            DO_2D( 0, 0, 0, 0 )
629               zu_trd(ji,jj) = zu_trd(ji,jj) + zCdU_u(ji,jj) * un_e(ji,jj) * hur_e(ji,jj)
630               zv_trd(ji,jj) = zv_trd(ji,jj) + zCdU_v(ji,jj) * vn_e(ji,jj) * hvr_e(ji,jj)
631            END_2D
632         ENDIF
633         !
634         ! Set next velocities:
635         !     Compute barotropic speeds at step jit+1    (h : total height of the water colomn)
636         !--                              VECTOR FORM
637         !--   m+1                 m               /                                                       m+1/2           \    --!
638         !--  u     =             u   + delta_t' * \         (1-r)*g * grad_x( ssh') -         f * k vect u      +     frc /    --!
639         !--                                                                                                                    --!
640         !--                             FLUX FORM                                                                              --!
641         !--  m+1   __1__  /  m    m               /  m+1/2                             m+1/2              m+1/2    n      \ \  --!
642         !-- u    =   m+1 |  h  * u   + delta_t' * \ h     * (1-r)*g * grad_x( ssh') - h     * f * k vect u      + h * frc /  | --!
643         !--         h     \                                                                                                 /  --!
644         !------------------------------------------------------------------------------------------------------------------------!
645         IF( ln_dynadv_vec .OR. ln_linssh ) THEN      !* Vector form
646            DO_2D( 0, 0, 0, 0 )
647               ua_e(ji,jj) = (                                 un_e(ji,jj)   & 
648                         &     + rDt_e * (                   zu_spg(ji,jj)   &
649                         &                                 + zu_trd(ji,jj)   &
650                         &                                 + zu_frc(ji,jj) ) & 
651                         &   ) * ssumask(ji,jj)
652
653               va_e(ji,jj) = (                                 vn_e(ji,jj)   &
654                         &     + rDt_e * (                   zv_spg(ji,jj)   &
655                         &                                 + zv_trd(ji,jj)   &
656                         &                                 + zv_frc(ji,jj) ) &
657                         &   ) * ssvmask(ji,jj)
658            END_2D
659            !
660         ELSE                           !* Flux form
661            DO_2D( 0, 0, 0, 0 )
662               !                    ! hu_e, hv_e hold depth at jn,  zhup2_e, zhvp2_e hold extrapolated depth at jn+1/2
663               !                    ! backward interpolated depth used in spg terms at jn+1/2
664#if defined key_qcoTest_FluxForm
665            !                                ! 'key_qcoTest_FluxForm' : simple ssh average
666               zhu_bck = hu_0(ji,jj) + r1_2 * (  zsshp2_e(ji,jj) + zsshp2_e(ji+1,jj  )  ) * ssumask(ji,jj)
667               zhv_bck = hv_0(ji,jj) + r1_2 * (  zsshp2_e(ji,jj) + zsshp2_e(ji  ,jj+1)  ) * ssvmask(ji,jj)
668#else
669               zhu_bck = hu_0(ji,jj) + r1_2*r1_e1e2u(ji,jj) * (  e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)    &
670                    &                                          + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj)  ) * ssumask(ji,jj)
671               zhv_bck = hv_0(ji,jj) + r1_2*r1_e1e2v(ji,jj) * (  e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )    &
672                    &                                          + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1)  ) * ssvmask(ji,jj)
673#endif
674               !                    ! inverse depth at jn+1
675               z1_hu = ssumask(ji,jj) / ( hu_0(ji,jj) + zsshu_a(ji,jj) + 1._wp - ssumask(ji,jj) )
676               z1_hv = ssvmask(ji,jj) / ( hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - ssvmask(ji,jj) )
677               !
678               ua_e(ji,jj) = (               hu_e  (ji,jj) *   un_e (ji,jj)      & 
679                    &            + rDt_e * (  zhu_bck        * zu_spg (ji,jj)  &   !
680                    &                       + zhup2_e(ji,jj) * zu_trd (ji,jj)  &   !
681                    &                       +  hu(ji,jj,Kmm) * zu_frc (ji,jj)  )   ) * z1_hu
682               !
683               va_e(ji,jj) = (               hv_e  (ji,jj) *   vn_e (ji,jj)      &
684                    &            + rDt_e * (  zhv_bck        * zv_spg (ji,jj)  &   !
685                    &                       + zhvp2_e(ji,jj) * zv_trd (ji,jj)  &   !
686                    &                       +  hv(ji,jj,Kmm) * zv_frc (ji,jj)  )   ) * z1_hv
687            END_2D
688         ENDIF
689!jth implicit bottom friction:
690         IF ( ll_wd ) THEN ! revert to explicit for bit comparison tests in non wad runs
691            DO_2D( 0, 0, 0, 0 )
692               ua_e(ji,jj) =  ua_e(ji,jj) / ( 1._wp - rDt_e * zCdU_u(ji,jj) * hur_e(ji,jj) )
693               va_e(ji,jj) =  va_e(ji,jj) / ( 1._wp - rDt_e * zCdU_v(ji,jj) * hvr_e(ji,jj) )
694            END_2D
695         ENDIF
696       
697         IF( .NOT.ln_linssh ) THEN !* Update ocean depth (variable volume case only)
698            hu_e (2:jpim1,2:jpjm1) =    hu_0(2:jpim1,2:jpjm1) + zsshu_a(2:jpim1,2:jpjm1)
699            hur_e(2:jpim1,2:jpjm1) = ssumask(2:jpim1,2:jpjm1) / (  hu_e(2:jpim1,2:jpjm1) + 1._wp - ssumask(2:jpim1,2:jpjm1)  )
700            hv_e (2:jpim1,2:jpjm1) =    hv_0(2:jpim1,2:jpjm1) + zsshv_a(2:jpim1,2:jpjm1)
701            hvr_e(2:jpim1,2:jpjm1) = ssvmask(2:jpim1,2:jpjm1) / (  hv_e(2:jpim1,2:jpjm1) + 1._wp - ssvmask(2:jpim1,2:jpjm1)  )
702         ENDIF
703         !
704         IF( .NOT.ln_linssh ) THEN   !* Update ocean depth (variable volume case only)
705            CALL lbc_lnk_multi( 'dynspg_ts', ua_e , 'U', -1._wp, va_e , 'V', -1._wp  &
706                 &                         , hu_e , 'U',  1._wp, hv_e , 'V',  1._wp  &
707                 &                         , hur_e, 'U',  1._wp, hvr_e, 'V',  1._wp  )
708         ELSE
709            CALL lbc_lnk_multi( 'dynspg_ts', ua_e , 'U', -1._wp, va_e , 'V', -1._wp  )
710         ENDIF
711         !                                                 ! open boundaries
712         IF( ln_bdy )   CALL bdy_dyn2d( jn, ua_e, va_e, un_e, vn_e, hur_e, hvr_e, ssha_e )
713#if defined key_agrif                                                           
714         IF( .NOT.Agrif_Root() )  CALL agrif_dyn_ts( jn )  ! Agrif
715#endif
716         !                                             !* Swap
717         !                                             !  ----
718         ubb_e  (:,:) = ub_e  (:,:)
719         ub_e   (:,:) = un_e  (:,:)
720         un_e   (:,:) = ua_e  (:,:)
721         !
722         vbb_e  (:,:) = vb_e  (:,:)
723         vb_e   (:,:) = vn_e  (:,:)
724         vn_e   (:,:) = va_e  (:,:)
725         !
726         sshbb_e(:,:) = sshb_e(:,:)
727         sshb_e (:,:) = sshn_e(:,:)
728         sshn_e (:,:) = ssha_e(:,:)
729         !
730         !                                             !* Sum over whole bt loop (except in weight average)
731         !                                             !  ----------------------
732         IF( ln_bt_av ) THEN
733            za1 = wgtbtp1(jn)                                   
734            IF( ln_dynadv_vec .OR. ln_linssh ) THEN    ! Sum velocities
735               puu_b  (:,:,Kaa) = puu_b  (:,:,Kaa) + za1 * ua_e  (:,:) 
736               pvv_b  (:,:,Kaa) = pvv_b  (:,:,Kaa) + za1 * va_e  (:,:) 
737            ELSE                                       ! Sum transports
738               IF ( .NOT.ln_wd_dl ) THEN 
739                  puu_b  (:,:,Kaa) = puu_b  (:,:,Kaa) + za1 * ua_e  (:,:) * hu_e (:,:)
740                  pvv_b  (:,:,Kaa) = pvv_b  (:,:,Kaa) + za1 * va_e  (:,:) * hv_e (:,:)
741               ELSE
742                  puu_b  (:,:,Kaa) = puu_b  (:,:,Kaa) + za1 * ua_e  (:,:) * hu_e (:,:) * zuwdmask(:,:)
743                  pvv_b  (:,:,Kaa) = pvv_b  (:,:,Kaa) + za1 * va_e  (:,:) * hv_e (:,:) * zvwdmask(:,:)
744               ENDIF
745            ENDIF
746            !                                          ! Sum sea level
747            pssh(:,:,Kaa) = pssh(:,:,Kaa) + za1 * ssha_e(:,:)
748         ENDIF
749         !
750         !                                                 ! ==================== !
751      END DO                                               !        end loop      !
752      !                                                    ! ==================== !
753
754     
755      ! -----------------------------------------------------------------------------
756      ! Phase 3. update the general trend with the barotropic trend
757      ! -----------------------------------------------------------------------------
758      !
759      IF(.NOT.ln_bt_av ) THEN                          !* Update Kaa barotropic external mode
760         puu_b(:,:,Kaa) = ua_e  (:,:)
761         pvv_b(:,:,Kaa) = va_e  (:,:)
762         pssh (:,:,Kaa) = ssha_e(:,:)
763      ENDIF
764
765#if defined key_RK3
766      !                                                !*  RK3 case
767      !
768      IF( ln_bt_av ) THEN                  ! at this stage, pssh(:,:,:,Krhs) has been corrected: compute new depths at velocity points
769         !
770# if defined key_qcoTest_FluxForm
771         !                                       ! 'key_qcoTest_FluxForm' : simple ssh average
772         DO_2D( 0, 0, 0, 0 )
773            zzsshu = r1_2 * ( pssh(ji,jj,Kaa) + pssh(ji+1,jj  ,Kaa) ) * ssumask(ji,jj)
774            zzsshv = r1_2 * ( pssh(ji,jj,Kaa) + pssh(ji  ,jj+1,Kaa) ) * ssvmask(ji,jj)
775            !
776            !                              ! Save barotropic velocities (not transport)
777            puu_b(ji,jj,Kaa) = puu_b(ji,jj,Kaa) / ( hu_0(ji,jj) + zzsshu + 1._wp - ssumask(ji,jj) )
778            pvv_b(ji,jj,Kaa) = pvv_b(ji,jj,Kaa) / ( hv_0(ji,jj) + zzsshv + 1._wp - ssvmask(ji,jj) )
779         END_2D
780# else
781         DO_2D( 0, 0, 0, 0 )
782            zzsshu = r1_2 * r1_e1e2u(ji,jj) * ( e1e2t(ji  ,jj) * pssh(ji  ,jj,Kaa)   &
783               &                              + e1e2t(ji+1,jj) * pssh(ji+1,jj,Kaa) ) * ssumask(ji,jj)
784            zzsshv = r1_2 * r1_e1e2v(ji,jj) * ( e1e2t(ji,jj  ) * pssh(ji,jj  ,Kaa)   &
785               &                              + e1e2t(ji,jj+1) * pssh(ji,jj+1,Kaa) ) * ssvmask(ji,jj)
786            !
787            !                             ! Save barotropic velocities (not transport)
788            puu_b(ji,jj,Kaa) = puu_b(ji,jj,Kaa) / ( hu_0(ji,jj) + zzsshu + 1._wp - ssumask(ji,jj) )
789            pvv_b(ji,jj,Kaa) = pvv_b(ji,jj,Kaa) / ( hv_0(ji,jj) + zzsshv + 1._wp - ssvmask(ji,jj) )
790         END_2D
791# endif   
792         !
793         CALL lbc_lnk_multi( 'dynspg_ts', puu_b, 'U', -1._wp, pvv_b, 'V', -1._wp ) ! Boundary conditions
794         !
795      ENDIF
796      !
797      ! advective transport from N to N+1 (i.e. Kbb to Kaa)
798      ub2_b(:,:) = un_adv(:,:)      ! Save integrated transport for next computation (NOT USED)
799      vb2_b(:,:) = vn_adv(:,:)
800      !
801      IF( iom_use("ubar") ) THEN    ! RK3 single first: hu[N+1/2] = 1/2 ( hu[N] + hu[N+1] )
802         ALLOCATE( z2d(jpi,jpj) )
803         z2d(:,:) = 2._wp / ( hu_e(:,:) + hu(:,:,Kbb) + 1._wp - ssumask(:,:) ) 
804         CALL iom_put(  "ubar", un_adv(:,:)*z2d(:,:) )    ! barotropic i-current
805         z2d(:,:) = 2._wp / ( hv_e(:,:) + hv(:,:,Kbb) + 1._wp - ssvmask(:,:) )
806         CALL iom_put(  "vbar", vn_adv(:,:)*z2d(:,:) )    ! barotropic i-current
807         DEALLOCATE( z2d )
808      ENDIF
809      !
810      !                    !==  END Phase 3 for RK3 (forward mode) ==!
811
812#else
813      !                                                !*  MLF case
814      !
815      ! Set advective velocity correction:
816      IF( ln_bt_fw ) THEN
817         IF( .NOT.( kt == nit000 .AND. l_1st_euler ) ) THEN
818            DO_2D( 1, 1, 1, 1 )
819               zun_save = un_adv(ji,jj)
820               zvn_save = vn_adv(ji,jj)
821               !                          ! apply the previously computed correction
822               un_adv(ji,jj) = r1_2 * ( ub2_b(ji,jj) + zun_save - rn_atfp * un_bf(ji,jj) )
823               vn_adv(ji,jj) = r1_2 * ( vb2_b(ji,jj) + zvn_save - rn_atfp * vn_bf(ji,jj) )
824               !                          ! Update corrective fluxes for next time step
825               un_bf(ji,jj)  = rn_atfp * un_bf(ji,jj) + ( zun_save - ub2_b(ji,jj) )
826               vn_bf(ji,jj)  = rn_atfp * vn_bf(ji,jj) + ( zvn_save - vb2_b(ji,jj) )
827               !                          ! Save integrated transport for next computation
828               ub2_b(ji,jj) = zun_save
829               vb2_b(ji,jj) = zvn_save
830            END_2D
831         ELSE
832            un_bf(:,:) = 0._wp            ! corrective fluxes for next time step set to zero
833            vn_bf(:,:) = 0._wp
834            ub2_b(:,:) = un_adv(:,:)      ! Save integrated transport for next computation
835            vb2_b(:,:) = vn_adv(:,:)
836         ENDIF
837      ENDIF
838      !
839      ! Update barotropic trend:
840      IF( ln_dynadv_vec .OR. ln_linssh ) THEN
841         DO jk=1,jpkm1
842            puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) ) * r1_Dt
843            pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) ) * r1_Dt
844         END DO
845      ELSE
846         IF(.NOT.ln_bt_av ) THEN   ! (puu_b,pvv_b)_Kaa is a velocity (hu,hv)_Kaa = (hu_e,hv_e)
847            !
848            DO jk=1,jpkm1
849               puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + r1_hu(:,:,Kmm)   &
850                  &             * ( puu_b(:,:,Kaa)*hu_e(:,:) - puu_b(:,:,Kbb) * hu(:,:,Kbb) ) * r1_Dt
851               pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + r1_hv(:,:,Kmm)   &
852                  &             * ( pvv_b(:,:,Kaa)*hv_e(:,:) - pvv_b(:,:,Kbb) * hv(:,:,Kbb) ) * r1_Dt
853            END DO
854            !
855         ELSE                  ! at this stage, pssh(:,:,:,Krhs) has been corrected: compute new depths at velocity points
856            !
857# if defined key_qcoTest_FluxForm
858            !                                ! 'key_qcoTest_FluxForm' : simple ssh average
859            DO_2D( 1, 0, 1, 0 )
860               zsshu_a(ji,jj) = r1_2 * ( pssh(ji,jj,Kaa) + pssh(ji+1,jj  ,Kaa) ) * ssumask(ji,jj)
861               zsshv_a(ji,jj) = r1_2 * ( pssh(ji,jj,Kaa) + pssh(ji  ,jj+1,Kaa) ) * ssvmask(ji,jj)
862            END_2D
863# else
864            DO_2D( 1, 0, 1, 0 )
865               zsshu_a(ji,jj) = r1_2 * r1_e1e2u(ji,jj) * ( e1e2t(ji  ,jj) * pssh(ji  ,jj,Kaa)   &
866                  &                                      + e1e2t(ji+1,jj) * pssh(ji+1,jj,Kaa) ) * ssumask(ji,jj)
867               zsshv_a(ji,jj) = r1_2 * r1_e1e2v(ji,jj) * ( e1e2t(ji,jj  ) * pssh(ji,jj  ,Kaa)   &
868                  &                                      + e1e2t(ji,jj+1) * pssh(ji,jj+1,Kaa) ) * ssvmask(ji,jj)
869            END_2D
870# endif   
871            CALL lbc_lnk_multi( 'dynspg_ts', zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) ! Boundary conditions
872            !
873            DO jk=1,jpkm1
874               puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + r1_hu(:,:,Kmm)   &
875                  &             * ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) * hu(:,:,Kbb) ) * r1_Dt
876               pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + r1_hv(:,:,Kmm)   &
877                  &             * ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) * hv(:,:,Kbb) ) * r1_Dt
878            END DO
879            ! Save barotropic velocities not transport:
880            puu_b(:,:,Kaa) =  puu_b(:,:,Kaa) / ( hu_0(:,:) + zsshu_a(:,:) + 1._wp - ssumask(:,:) )
881            pvv_b(:,:,Kaa) =  pvv_b(:,:,Kaa) / ( hv_0(:,:) + zsshv_a(:,:) + 1._wp - ssvmask(:,:) )
882         ENDIF
883      ENDIF
884
885
886      ! Correct velocities so that the barotropic velocity equals (un_adv, vn_adv) (in all cases) 
887      DO jk = 1, jpkm1
888         puu(:,:,jk,Kmm) = ( puu(:,:,jk,Kmm) + un_adv(:,:)*r1_hu(:,:,Kmm) - puu_b(:,:,Kmm) ) * umask(:,:,jk)
889         pvv(:,:,jk,Kmm) = ( pvv(:,:,jk,Kmm) + vn_adv(:,:)*r1_hv(:,:,Kmm) - pvv_b(:,:,Kmm) ) * vmask(:,:,jk)
890      END DO
891
892      IF( ln_wd_dl .AND. ln_wd_dl_bc) THEN
893         DO jk = 1, jpkm1
894            puu(:,:,jk,Kmm) = ( un_adv(:,:)*r1_hu(:,:,Kmm) &
895               &            + zuwdav2(:,:)*(puu(:,:,jk,Kmm) - un_adv(:,:)*r1_hu(:,:,Kmm)) ) * umask(:,:,jk) 
896            pvv(:,:,jk,Kmm) = ( vn_adv(:,:)*r1_hv(:,:,Kmm) & 
897               &            + zvwdav2(:,:)*(pvv(:,:,jk,Kmm) - vn_adv(:,:)*r1_hv(:,:,Kmm)) ) * vmask(:,:,jk) 
898         END DO
899      ENDIF
900           
901      CALL iom_put(  "ubar", un_adv(:,:)*r1_hu(:,:,Kmm) )    ! barotropic i-current
902      CALL iom_put(  "vbar", vn_adv(:,:)*r1_hv(:,:,Kmm) )    ! barotropic i-current
903
904      !                    !==  END Phase 3 for MLF time integration  ==!
905#endif
906
907      !
908#if defined key_agrif
909      ! Save time integrated fluxes during child grid integration
910      ! (used to update coarse grid transports at next time step)
911      !
912      IF( .NOT.Agrif_Root() .AND. ln_bt_fw ) THEN
913         IF( Agrif_NbStepint() == 0 ) THEN
914            ub2_i_b(:,:) = 0._wp
915            vb2_i_b(:,:) = 0._wp
916         END IF
917         !
918         za1 = 1._wp / REAL(Agrif_rhot(), wp)
919         ub2_i_b(:,:) = ub2_i_b(:,:) + za1 * ub2_b(:,:)
920         vb2_i_b(:,:) = vb2_i_b(:,:) + za1 * vb2_b(:,:)
921      ENDIF
922#endif     
923      !                                   !* write time-spliting arrays in the restart
924      IF( lrst_oce .AND.ln_bt_fw )   CALL ts_rst( kt, 'WRITE' )
925      !
926      IF( ln_wd_il )   DEALLOCATE( zcpx, zcpy )
927      IF( ln_wd_dl )   DEALLOCATE( ztwdmask, zuwdmask, zvwdmask, zuwdav2, zvwdav2 )
928      !
929      CALL iom_put( "baro_u" , puu_b(:,:,Kmm) )  ! Barotropic  U Velocity
930      CALL iom_put( "baro_v" , pvv_b(:,:,Kmm) )  ! Barotropic  V Velocity
931      !
932   END SUBROUTINE dyn_spg_ts
933
934   
935   SUBROUTINE ts_wgt( ll_av, ll_fw, Kpit, zwgt1, zwgt2)
936      !!---------------------------------------------------------------------
937      !!                   ***  ROUTINE ts_wgt  ***
938      !!
939      !! ** Purpose : Set time-splitting weights for temporal averaging (or not)
940      !!----------------------------------------------------------------------
941      LOGICAL, INTENT(in   ) ::   ll_av     ! temporal averaging=.true.
942      LOGICAL, INTENT(in   ) ::   ll_fw     ! forward time splitting =.true.
943      INTEGER, INTENT(inout) ::   Kpit      ! cycle length
944      !!
945      INTEGER ::  jic, jn, ji   ! local integers
946      REAL(wp) :: za1, za2      ! loca scalars
947      REAL(wp), DIMENSION(3*nn_e), INTENT(inout) ::   zwgt1, zwgt2   ! Primary & Secondary weights
948      !!----------------------------------------------------------------------
949      !
950      zwgt1(:) = 0._wp
951      zwgt2(:) = 0._wp
952      !
953      !                          !==  Set time index when averaged value is requested  ==!
954      IF (ll_fw) THEN   ;   jic =     nn_e
955      ELSE              ;   jic = 2 * nn_e
956      ENDIF
957      !
958      !                          !==  Set primary weights  ==!
959      !
960      IF (ll_av) THEN               != Define simple boxcar window for primary weights
961         !                                       ! (width = nn_e, centered around jic)     
962         SELECT CASE( nn_bt_flt )
963         !
964         CASE( 0 )                  ! No averaging
965            zwgt1(jic) = 1._wp
966            Kpit = jic
967            !
968         CASE( 1 )                  ! Boxcar, width = nn_e
969            DO jn = 1, 3*nn_e
970               za1 = ABS( REAL( jn-jic, wp) ) / REAL( nn_e, wp ) 
971               IF( za1 < 0.5_wp ) THEN
972                  zwgt1(jn) = 1._wp
973                  Kpit = jn
974               ENDIF
975            END DO
976            !
977         CASE( 2 )                  ! Boxcar, width = 2 * nn_e
978            DO jn = 1, 3*nn_e
979               za1 = ABS(REAL( jn-jic, wp) ) / REAL( nn_e, wp ) 
980               IF( za1 < 1._wp ) THEN
981                  zwgt1(jn) = 1._wp
982                  Kpit = jn
983               ENDIF
984            END DO
985            !
986         CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt' )
987         !
988         END SELECT
989
990      ELSE                          !=  No time averaging
991         zwgt1(jic) = 1._wp
992         Kpit = jic
993      ENDIF
994      !
995      !                          !==  Set secondary weights  ==!
996      DO jn = 1, Kpit
997         DO ji = jn, Kpit
998            zwgt2(jn) = zwgt2(jn) + zwgt1(ji)
999         END DO
1000      END DO
1001      !
1002      !                          !==  Normalize weigths  ==!
1003      za1 = 1._wp / SUM( zwgt1(1:Kpit) )
1004      za2 = 1._wp / SUM( zwgt2(1:Kpit) )
1005      DO jn = 1, Kpit
1006         zwgt1(jn) = zwgt1(jn) * za1
1007         zwgt2(jn) = zwgt2(jn) * za2
1008      END DO
1009      !
1010   END SUBROUTINE ts_wgt
1011
1012
1013   SUBROUTINE ts_rst( kt, cdrw )
1014      !!---------------------------------------------------------------------
1015      !!                   ***  ROUTINE ts_rst  ***
1016      !!
1017      !! ** Purpose : Read or write time-splitting arrays in restart file
1018      !!----------------------------------------------------------------------
1019      INTEGER         , INTENT(in) ::   kt     ! ocean time-step
1020      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
1021      !!----------------------------------------------------------------------
1022      !
1023      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise
1024         !                                   ! ---------------
1025         IF( ln_rstart .AND. ln_bt_fw .AND. .NOT.l_1st_euler ) THEN    !* Read the restart file
1026            CALL iom_get( numror, jpdom_auto, 'ub2_b'  , ub2_b  (:,:), cd_type = 'U', psgn = -1._wp )   
1027            CALL iom_get( numror, jpdom_auto, 'vb2_b'  , vb2_b  (:,:), cd_type = 'V', psgn = -1._wp ) 
1028            CALL iom_get( numror, jpdom_auto, 'un_bf'  , un_bf  (:,:), cd_type = 'U', psgn = -1._wp )   
1029            CALL iom_get( numror, jpdom_auto, 'vn_bf'  , vn_bf  (:,:), cd_type = 'V', psgn = -1._wp ) 
1030            IF( .NOT.ln_bt_av ) THEN
1031               CALL iom_get( numror, jpdom_auto, 'sshbb_e'  , sshbb_e(:,:), cd_type = 'T', psgn =  1._wp )   
1032               CALL iom_get( numror, jpdom_auto, 'ubb_e'    ,   ubb_e(:,:), cd_type = 'U', psgn = -1._wp )   
1033               CALL iom_get( numror, jpdom_auto, 'vbb_e'    ,   vbb_e(:,:), cd_type = 'V', psgn = -1._wp )
1034               CALL iom_get( numror, jpdom_auto, 'sshb_e'   ,  sshb_e(:,:), cd_type = 'T', psgn =  1._wp ) 
1035               CALL iom_get( numror, jpdom_auto, 'ub_e'     ,    ub_e(:,:), cd_type = 'U', psgn = -1._wp )   
1036               CALL iom_get( numror, jpdom_auto, 'vb_e'     ,    vb_e(:,:), cd_type = 'V', psgn = -1._wp )
1037            ENDIF
1038#if defined key_agrif
1039            ! Read time integrated fluxes
1040            IF ( .NOT.Agrif_Root() ) THEN
1041               CALL iom_get( numror, jpdom_auto, 'ub2_i_b'  , ub2_i_b(:,:), cd_type = 'U', psgn = -1._wp )   
1042               CALL iom_get( numror, jpdom_auto, 'vb2_i_b'  , vb2_i_b(:,:), cd_type = 'V', psgn = -1._wp )
1043            ELSE
1044               ub2_i_b(:,:) = 0._wp   ;   vb2_i_b(:,:) = 0._wp   ! used in the 1st update of agrif
1045            ENDIF
1046#endif
1047         ELSE                                   !* Start from rest
1048            IF(lwp) WRITE(numout,*)
1049            IF(lwp) WRITE(numout,*) '   ==>>>   start from rest: set barotropic values to 0'
1050            ub2_b  (:,:) = 0._wp   ;   vb2_b  (:,:) = 0._wp   ! used in the 1st interpol of agrif
1051            un_adv (:,:) = 0._wp   ;   vn_adv (:,:) = 0._wp   ! used in the 1st interpol of agrif
1052            un_bf  (:,:) = 0._wp   ;   vn_bf  (:,:) = 0._wp   ! used in the 1st update   of agrif
1053#if defined key_agrif
1054            ub2_i_b(:,:) = 0._wp   ;   vb2_i_b(:,:) = 0._wp   ! used in the 1st update of agrif
1055#endif
1056         ENDIF
1057         !
1058      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
1059         !                                   ! -------------------
1060         IF(lwp) WRITE(numout,*) '---- ts_rst ----'
1061         CALL iom_rstput( kt, nitrst, numrow, 'ub2_b'   , ub2_b  (:,:) )
1062         CALL iom_rstput( kt, nitrst, numrow, 'vb2_b'   , vb2_b  (:,:) )
1063         CALL iom_rstput( kt, nitrst, numrow, 'un_bf'   , un_bf  (:,:) )
1064         CALL iom_rstput( kt, nitrst, numrow, 'vn_bf'   , vn_bf  (:,:) )
1065         !
1066         IF (.NOT.ln_bt_av) THEN
1067            CALL iom_rstput( kt, nitrst, numrow, 'sshbb_e'  , sshbb_e(:,:) ) 
1068            CALL iom_rstput( kt, nitrst, numrow, 'ubb_e'    ,   ubb_e(:,:) )
1069            CALL iom_rstput( kt, nitrst, numrow, 'vbb_e'    ,   vbb_e(:,:) )
1070            CALL iom_rstput( kt, nitrst, numrow, 'sshb_e'   ,  sshb_e(:,:) )
1071            CALL iom_rstput( kt, nitrst, numrow, 'ub_e'     ,    ub_e(:,:) )
1072            CALL iom_rstput( kt, nitrst, numrow, 'vb_e'     ,    vb_e(:,:) )
1073         ENDIF
1074#if defined key_agrif
1075         ! Save time integrated fluxes
1076         IF ( .NOT.Agrif_Root() ) THEN
1077            CALL iom_rstput( kt, nitrst, numrow, 'ub2_i_b'  , ub2_i_b(:,:) )
1078            CALL iom_rstput( kt, nitrst, numrow, 'vb2_i_b'  , vb2_i_b(:,:) )
1079         ENDIF
1080#endif
1081      ENDIF
1082      !
1083   END SUBROUTINE ts_rst
1084
1085
1086   SUBROUTINE dyn_spg_ts_init
1087      !!---------------------------------------------------------------------
1088      !!                   ***  ROUTINE dyn_spg_ts_init  ***
1089      !!
1090      !! ** Purpose : Set time splitting options
1091      !!----------------------------------------------------------------------
1092      INTEGER  ::   ji ,jj              ! dummy loop indices
1093      REAL(wp) ::   zxr2, zyr2, zcmax   ! local scalar
1094      REAL(wp), DIMENSION(jpi,jpj) ::   zcu
1095      !!----------------------------------------------------------------------
1096      !
1097      ! Max courant number for ext. grav. waves
1098      !
1099      DO_2D( 0, 0, 0, 0 )
1100         zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj)
1101         zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj)
1102         zcu(ji,jj) = SQRT( grav * MAX(ht_0(ji,jj),0._wp) * (zxr2 + zyr2) )
1103      END_2D
1104      !
1105      zcmax = MAXVAL( zcu(Nis0:Nie0,Njs0:Nje0) )
1106      CALL mpp_max( 'dynspg_ts', zcmax )
1107
1108      ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax
1109      IF( ln_bt_auto )   nn_e = CEILING( rn_Dt / rn_bt_cmax * zcmax)
1110     
1111      rDt_e = rn_Dt / REAL( nn_e , wp )
1112      zcmax = zcmax * rDt_e
1113      ! Print results
1114      IF(lwp) WRITE(numout,*)
1115      IF(lwp) WRITE(numout,*) 'dyn_spg_ts_init : split-explicit free surface'
1116      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~'
1117      IF( ln_bt_auto ) THEN
1118         IF(lwp) WRITE(numout,*) '     ln_ts_auto =.true. Automatically set nn_e '
1119         IF(lwp) WRITE(numout,*) '     Max. courant number allowed: ', rn_bt_cmax
1120      ELSE
1121         IF(lwp) WRITE(numout,*) '     ln_ts_auto=.false.: Use nn_e in namelist   nn_e = ', nn_e
1122      ENDIF
1123      !
1124      IF(ln_bt_av) THEN
1125         IF(lwp) WRITE(numout,*) '     ln_bt_av =.true.  ==> Time averaging over nn_e time steps is on '
1126      ELSE
1127         IF(lwp) WRITE(numout,*) '     ln_bt_av =.false. => No time averaging of barotropic variables '
1128      ENDIF
1129      !
1130      IF(ln_bt_fw) THEN
1131         IF(lwp) WRITE(numout,*) '     ln_bt_fw=.true.  => Forward integration of barotropic variables '
1132      ELSE
1133         IF(lwp) WRITE(numout,*) '     ln_bt_fw =.false.=> Centred integration of barotropic variables '
1134      ENDIF
1135      !
1136#if defined key_agrif
1137      ! Restrict the use of Agrif to the forward case only
1138!!!      IF( .NOT.ln_bt_fw .AND. .NOT.Agrif_Root() )   CALL ctl_stop( 'AGRIF not implemented if ln_bt_fw=.FALSE.' )
1139#endif
1140      !
1141      IF(lwp) WRITE(numout,*)    '     Time filter choice, nn_bt_flt: ', nn_bt_flt
1142      SELECT CASE ( nn_bt_flt )
1143         CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '           Dirac'
1144         CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = nn_e'
1145         CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = 2*nn_e' 
1146         CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt: should 0,1, or 2' )
1147      END SELECT
1148      !
1149      IF(lwp) WRITE(numout,*) ' '
1150      IF(lwp) WRITE(numout,*) '     nn_e = ', nn_e
1151      IF(lwp) WRITE(numout,*) '     Barotropic time step [s] is :', rDt_e
1152      IF(lwp) WRITE(numout,*) '     Maximum Courant number is   :', zcmax
1153      !
1154      IF(lwp) WRITE(numout,*)    '     Time diffusion parameter rn_bt_alpha: ', rn_bt_alpha
1155      IF ((ln_bt_av.AND.nn_bt_flt/=0).AND.(rn_bt_alpha>0._wp)) THEN
1156         CALL ctl_stop( 'dynspg_ts ERROR: if rn_bt_alpha > 0, remove temporal averaging' )
1157      ENDIF
1158      !
1159      IF( .NOT.ln_bt_av .AND. .NOT.ln_bt_fw ) THEN
1160         CALL ctl_stop( 'dynspg_ts ERROR: No time averaging => only forward integration is possible' )
1161      ENDIF
1162      IF( zcmax>0.9_wp ) THEN
1163         CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_e !' )         
1164      ENDIF
1165      !
1166      !                             ! Allocate time-splitting arrays
1167      IF( dyn_spg_ts_alloc() /= 0    )   CALL ctl_stop('STOP', 'dyn_spg_init: failed to allocate dynspg_ts  arrays' )
1168      !
1169      !                             ! read restart when needed
1170      CALL ts_rst( nit000, 'READ' )
1171      !
1172   END SUBROUTINE dyn_spg_ts_init
1173
1174   
1175   SUBROUTINE dyn_cor_2D_init( Kmm )
1176      !!---------------------------------------------------------------------
1177      !!                   ***  ROUTINE dyn_cor_2D_init  ***
1178      !!
1179      !! ** Purpose : Set time splitting options
1180      !! Set arrays to remove/compute coriolis trend.
1181      !! Do it once during initialization if volume is fixed, else at each long time step.
1182      !! Note that these arrays are also used during barotropic loop. These are however frozen
1183      !! although they should be updated in the variable volume case. Not a big approximation.
1184      !! To remove this approximation, copy lines below inside barotropic loop
1185      !! and update depths at T- points (ht) at each barotropic time step
1186      !!
1187      !! Compute zwz = f/h              (potential planetary voricity)
1188      !! Compute ftne, ftnw, ftse, ftsw (triad of potential planetary voricity)
1189      !!----------------------------------------------------------------------
1190      INTEGER,  INTENT(in)         ::  Kmm  ! Time index
1191      INTEGER  ::   ji ,jj, jk              ! dummy loop indices
1192      REAL(wp) ::   z1_ht
1193      !!----------------------------------------------------------------------
1194      !
1195      SELECT CASE( nvor_scheme )
1196      CASE( np_EEN, np_ENE, np_ENS , np_MIX )   !=  schemes using the same e3f definition
1197         SELECT CASE( nn_e3f_typ )                  !* ff_f/e3 at F-point
1198         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4)
1199            DO_2D( 0, 0, 0, 0 )
1200               zwz(ji,jj) = ( ht(ji,jj+1) + ht(ji+1,jj+1)   &
1201                    &       + ht(ji,jj  ) + ht(ji+1,jj  ) ) * 0.25_wp 
1202               IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj)
1203            END_2D
1204         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask)
1205            DO_2D( 0, 0, 0, 0 )
1206               zwz(ji,jj) =     (    ht(ji,jj+1) +     ht(ji+1,jj+1)      &
1207                    &            +   ht(ji,jj  ) +     ht(ji+1,jj  )  )   &
1208                    &    / ( MAX(ssmask(ji,jj+1) + ssmask(ji+1,jj+1)      &
1209                    &          + ssmask(ji,jj  ) + ssmask(ji+1,jj  ) , 1._wp  )   )
1210               IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj)
1211            END_2D
1212         END SELECT
1213         CALL lbc_lnk( 'dynspg_ts', zwz, 'F', 1._wp )
1214      END SELECT
1215      !
1216      SELECT CASE( nvor_scheme )
1217      CASE( np_EEN )
1218         !
1219         ftne(1,:) = 0._wp   ;   ftnw(1,:) = 0._wp   ;   ftse(1,:) = 0._wp   ;   ftsw(1,:) = 0._wp
1220         DO_2D( 0, 1, 0, 1 )
1221            ftne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1)
1222            ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  )
1223            ftse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1)
1224            ftsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  )
1225         END_2D
1226         !
1227      CASE( np_EET )                            != EEN scheme using e3t energy conserving scheme
1228         ftne(1,:) = 0._wp   ;   ftnw(1,:) = 0._wp   ;   ftse(1,:) = 0._wp   ;   ftsw(1,:) = 0._wp
1229         DO_2D( 0, 1, 0, 1 )
1230            z1_ht = ssmask(ji,jj) / ( ht(ji,jj) + 1._wp - ssmask(ji,jj) )
1231            ftne(ji,jj) = ( ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) ) * z1_ht
1232            ftnw(ji,jj) = ( ff_f(ji-1,jj-1) + ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) ) * z1_ht
1233            ftse(ji,jj) = ( ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) + ff_f(ji-1,jj-1) ) * z1_ht
1234            ftsw(ji,jj) = ( ff_f(ji  ,jj-1) + ff_f(ji-1,jj-1) + ff_f(ji-1,jj  ) ) * z1_ht
1235         END_2D
1236         !
1237      END SELECT
1238      !
1239   END SUBROUTINE dyn_cor_2D_init
1240
1241
1242   SUBROUTINE dyn_cor_2D( pht, phu, phv, punb, pvnb, zhU, zhV,    zu_trd, zv_trd   )
1243      !!---------------------------------------------------------------------
1244      !!                   ***  ROUTINE dyn_cor_2D  ***
1245      !!
1246      !! ** Purpose : Compute u and v coriolis trends
1247      !!----------------------------------------------------------------------
1248      INTEGER  ::   ji ,jj                             ! dummy loop indices
1249      REAL(wp) ::   zx1, zx2, zy1, zy2, z1_hu, z1_hv   !   -      -
1250      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pht, phu, phv, punb, pvnb, zhU, zhV
1251      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: zu_trd, zv_trd
1252      !!----------------------------------------------------------------------
1253      SELECT CASE( nvor_scheme )
1254      CASE( np_ENT )                ! enstrophy conserving scheme (f-point)
1255         DO_2D( 0, 0, 0, 0 )
1256            z1_hu = ssumask(ji,jj) / ( phu(ji,jj) + 1._wp - ssumask(ji,jj) )
1257            z1_hv = ssvmask(ji,jj) / ( phv(ji,jj) + 1._wp - ssvmask(ji,jj) )
1258            zu_trd(ji,jj) = + r1_4 * r1_e1e2u(ji,jj) * z1_hu                    &
1259               &               * (  e1e2t(ji+1,jj)*pht(ji+1,jj)*ff_t(ji+1,jj) * ( pvnb(ji+1,jj) + pvnb(ji+1,jj-1) )   &
1260               &                  + e1e2t(ji  ,jj)*pht(ji  ,jj)*ff_t(ji  ,jj) * ( pvnb(ji  ,jj) + pvnb(ji  ,jj-1) )   )
1261               !
1262            zv_trd(ji,jj) = - r1_4 * r1_e1e2v(ji,jj) * z1_hv                    &
1263               &               * (  e1e2t(ji,jj+1)*pht(ji,jj+1)*ff_t(ji,jj+1) * ( punb(ji,jj+1) + punb(ji-1,jj+1) )   & 
1264               &                  + e1e2t(ji,jj  )*pht(ji,jj  )*ff_t(ji,jj  ) * ( punb(ji,jj  ) + punb(ji-1,jj  ) )   ) 
1265         END_2D
1266         !         
1267      CASE( np_ENE , np_MIX )        ! energy conserving scheme (t-point) ENE or MIX
1268         DO_2D( 0, 0, 0, 0 )
1269            zy1 = ( zhV(ji,jj-1) + zhV(ji+1,jj-1) ) * r1_e1u(ji,jj)
1270            zy2 = ( zhV(ji,jj  ) + zhV(ji+1,jj  ) ) * r1_e1u(ji,jj)
1271            zx1 = ( zhU(ji-1,jj) + zhU(ji-1,jj+1) ) * r1_e2v(ji,jj)
1272            zx2 = ( zhU(ji  ,jj) + zhU(ji  ,jj+1) ) * r1_e2v(ji,jj)
1273            ! energy conserving formulation for planetary vorticity term
1274            zu_trd(ji,jj) =   r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 )
1275            zv_trd(ji,jj) = - r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )
1276         END_2D
1277         !
1278      CASE( np_ENS )                ! enstrophy conserving scheme (f-point)
1279         DO_2D( 0, 0, 0, 0 )
1280            zy1 =   r1_8 * ( zhV(ji  ,jj-1) + zhV(ji+1,jj-1) &
1281              &            + zhV(ji  ,jj  ) + zhV(ji+1,jj  ) ) * r1_e1u(ji,jj)
1282            zx1 = - r1_8 * ( zhU(ji-1,jj  ) + zhU(ji-1,jj+1) &
1283              &            + zhU(ji  ,jj  ) + zhU(ji  ,jj+1) ) * r1_e2v(ji,jj)
1284            zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) )
1285            zv_trd(ji,jj)  = zx1 * ( zwz(ji-1,jj  ) + zwz(ji,jj) )
1286         END_2D
1287         !
1288      CASE( np_EET , np_EEN )      ! energy & enstrophy scheme (using e3t or e3f)         
1289         DO_2D( 0, 0, 0, 0 )
1290            zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zhV(ji  ,jj  ) &
1291             &                                         + ftnw(ji+1,jj) * zhV(ji+1,jj  ) &
1292             &                                         + ftse(ji,jj  ) * zhV(ji  ,jj-1) &
1293             &                                         + ftsw(ji+1,jj) * zhV(ji+1,jj-1) )
1294            zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zhU(ji-1,jj+1) &
1295             &                                         + ftse(ji,jj+1) * zhU(ji  ,jj+1) &
1296             &                                         + ftnw(ji,jj  ) * zhU(ji-1,jj  ) &
1297             &                                         + ftne(ji,jj  ) * zhU(ji  ,jj  ) )
1298         END_2D
1299         !
1300      END SELECT
1301      !
1302   END SUBROUTINE dyn_cor_2D
1303
1304
1305   SUBROUTINE wad_tmsk( pssh, ptmsk )
1306      !!----------------------------------------------------------------------
1307      !!                  ***  ROUTINE wad_lmt  ***
1308      !!                   
1309      !! ** Purpose :   set wetting & drying mask at tracer points
1310      !!              for the current barotropic sub-step
1311      !!
1312      !! ** Method  :   ???
1313      !!
1314      !! ** Action  :  ptmsk : wetting & drying t-mask
1315      !!----------------------------------------------------------------------
1316      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pssh    !
1317      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   ptmsk   !
1318      !
1319      INTEGER  ::   ji, jj   ! dummy loop indices
1320      !!----------------------------------------------------------------------
1321      !
1322      IF( ln_wd_dl_rmp ) THEN     
1323         DO_2D( 1, 1, 1, 1 )
1324            IF    ( pssh(ji,jj) + ht_0(ji,jj) >  2._wp * rn_wdmin1 ) THEN 
1325               !           IF    ( pssh(ji,jj) + ht_0(ji,jj) >          rn_wdmin2 ) THEN
1326               ptmsk(ji,jj) = 1._wp
1327            ELSEIF( pssh(ji,jj) + ht_0(ji,jj) >          rn_wdmin1 ) THEN
1328               ptmsk(ji,jj) = TANH( 50._wp*( ( pssh(ji,jj) + ht_0(ji,jj) -  rn_wdmin1 )*r_rn_wdmin1) )
1329            ELSE
1330               ptmsk(ji,jj) = 0._wp
1331            ENDIF
1332         END_2D
1333      ELSE 
1334         DO_2D( 1, 1, 1, 1 )
1335            IF ( pssh(ji,jj) + ht_0(ji,jj) >  rn_wdmin1 ) THEN   ;   ptmsk(ji,jj) = 1._wp
1336            ELSE                                                 ;   ptmsk(ji,jj) = 0._wp
1337            ENDIF
1338         END_2D
1339      ENDIF
1340      !
1341   END SUBROUTINE wad_tmsk
1342
1343
1344   SUBROUTINE wad_Umsk( pTmsk, phU, phV, pu, pv, pUmsk, pVmsk )
1345      !!----------------------------------------------------------------------
1346      !!                  ***  ROUTINE wad_lmt  ***
1347      !!                   
1348      !! ** Purpose :   set wetting & drying mask at tracer points
1349      !!              for the current barotropic sub-step
1350      !!
1351      !! ** Method  :   ???
1352      !!
1353      !! ** Action  :  ptmsk : wetting & drying t-mask
1354      !!----------------------------------------------------------------------
1355      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pTmsk              ! W & D t-mask
1356      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   phU, phV, pu, pv   ! ocean velocities and transports
1357      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pUmsk, pVmsk       ! W & D u- and v-mask
1358      !
1359      INTEGER  ::   ji, jj   ! dummy loop indices
1360      !!----------------------------------------------------------------------
1361      !
1362      DO_2D( 1, 0, 1, 1 )   ! not jpi-column
1363         IF ( phU(ji,jj) > 0._wp ) THEN   ;   pUmsk(ji,jj) = pTmsk(ji  ,jj) 
1364         ELSE                             ;   pUmsk(ji,jj) = pTmsk(ji+1,jj) 
1365         ENDIF
1366         phU(ji,jj) = pUmsk(ji,jj)*phU(ji,jj)
1367         pu (ji,jj) = pUmsk(ji,jj)*pu (ji,jj)
1368      END_2D
1369      !
1370      DO_2D( 1, 1, 1, 0 )   ! not jpj-row
1371         IF ( phV(ji,jj) > 0._wp ) THEN   ;   pVmsk(ji,jj) = pTmsk(ji,jj  )
1372         ELSE                             ;   pVmsk(ji,jj) = pTmsk(ji,jj+1) 
1373         ENDIF
1374         phV(ji,jj) = pVmsk(ji,jj)*phV(ji,jj) 
1375         pv (ji,jj) = pVmsk(ji,jj)*pv (ji,jj)
1376      END_2D
1377      !
1378   END SUBROUTINE wad_Umsk
1379
1380
1381   SUBROUTINE wad_spg( pshn, zcpx, zcpy )
1382      !!---------------------------------------------------------------------
1383      !!                   ***  ROUTINE  wad_sp  ***
1384      !!
1385      !! ** Purpose :
1386      !!----------------------------------------------------------------------
1387      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pshn
1388      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: zcpx, zcpy
1389      !
1390      INTEGER  ::   ji ,jj               ! dummy loop indices
1391      LOGICAL  ::   ll_tmp1, ll_tmp2
1392      !!----------------------------------------------------------------------
1393      !
1394      DO_2D( 0, 0, 0, 0 )
1395         ll_tmp1 = MIN(  pshn(ji,jj)               ,  pshn(ji+1,jj) ) >                &
1396              &      MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            &
1397              &      MAX(  pshn(ji,jj) + ht_0(ji,jj) ,  pshn(ji+1,jj) + ht_0(ji+1,jj) )  &
1398              &                                                         > rn_wdmin1 + rn_wdmin2
1399         ll_tmp2 = ( ABS( pshn(ji+1,jj)            -  pshn(ji  ,jj))  > 1.E-12 ).AND.( &
1400              &      MAX(   pshn(ji,jj)              ,  pshn(ji+1,jj) ) >                &
1401              &      MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 )
1402         IF(ll_tmp1) THEN
1403            zcpx(ji,jj) = 1.0_wp
1404         ELSEIF(ll_tmp2) THEN
1405            ! no worries about  pshn(ji+1,jj) -  pshn(ji  ,jj) = 0, it won't happen ! here
1406            zcpx(ji,jj) = ABS( (pshn(ji+1,jj) + ht_0(ji+1,jj) - pshn(ji,jj) - ht_0(ji,jj)) &
1407                 &           / (pshn(ji+1,jj) - pshn(ji  ,jj)) )
1408            zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp)
1409         ELSE
1410            zcpx(ji,jj) = 0._wp
1411         ENDIF
1412         !
1413         ll_tmp1 = MIN(  pshn(ji,jj)               ,  pshn(ji,jj+1) ) >                &
1414              &      MAX( -ht_0(ji,jj)               , -ht_0(ji,jj+1) ) .AND.            &
1415              &      MAX(  pshn(ji,jj) + ht_0(ji,jj) ,  pshn(ji,jj+1) + ht_0(ji,jj+1) )  &
1416              &                                                       > rn_wdmin1 + rn_wdmin2
1417         ll_tmp2 = ( ABS( pshn(ji,jj)              -  pshn(ji,jj+1))  > 1.E-12 ).AND.( &
1418              &      MAX(   pshn(ji,jj)              ,  pshn(ji,jj+1) ) >                &
1419              &      MAX(  -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 )
1420         
1421         IF(ll_tmp1) THEN
1422            zcpy(ji,jj) = 1.0_wp
1423         ELSE IF(ll_tmp2) THEN
1424            ! no worries about  pshn(ji,jj+1) -  pshn(ji,jj  ) = 0, it won't happen ! here
1425            zcpy(ji,jj) = ABS( (pshn(ji,jj+1) + ht_0(ji,jj+1) - pshn(ji,jj) - ht_0(ji,jj)) &
1426                 &           / (pshn(ji,jj+1) - pshn(ji,jj  )) )
1427            zcpy(ji,jj) = MAX(  0._wp , MIN( zcpy(ji,jj) , 1.0_wp )  )
1428         ELSE
1429            zcpy(ji,jj) = 0._wp
1430         ENDIF
1431      END_2D
1432      !
1433   END SUBROUTINE wad_spg
1434     
1435
1436   SUBROUTINE dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, pu_RHSi, pv_RHSi, pCdU_u, pCdU_v )
1437      !!----------------------------------------------------------------------
1438      !!                  ***  ROUTINE dyn_drg_init  ***
1439      !!                   
1440      !! ** Purpose : - add the baroclinic top/bottom drag contribution to
1441      !!              the baroclinic part of the barotropic RHS
1442      !!              - compute the barotropic drag coefficients
1443      !!
1444      !! ** Method  :   computation done over the INNER domain only
1445      !!----------------------------------------------------------------------
1446      INTEGER                             , INTENT(in   ) ::  Kbb, Kmm           ! ocean time level indices
1447      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(in   ) ::  puu, pvv           ! ocean velocities and RHS of momentum equation
1448      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(in   ) ::  puu_b, pvv_b       ! barotropic velocities at main time levels
1449      REAL(wp), DIMENSION(jpi,jpj)        , INTENT(inout) ::  pu_RHSi, pv_RHSi   ! baroclinic part of the barotropic RHS
1450      REAL(wp), DIMENSION(jpi,jpj)        , INTENT(  out) ::  pCdU_u , pCdU_v    ! barotropic drag coefficients
1451      !
1452      INTEGER  ::   ji, jj   ! dummy loop indices
1453      INTEGER  ::   ikbu, ikbv, iktu, iktv
1454      REAL(wp) ::   zztmp
1455      REAL(wp), DIMENSION(jpi,jpj) ::   zu_i, zv_i
1456      !!----------------------------------------------------------------------
1457      !
1458      !                    !==  Set the barotropic drag coef.  ==!
1459      !
1460      IF( ln_isfcav.OR.ln_drgice_imp ) THEN          ! top+bottom friction (ocean cavities)
1461         
1462         DO_2D( 0, 0, 0, 0 )
1463            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) )
1464            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji,jj+1)+rCdU_top(ji,jj) )
1465         END_2D
1466      ELSE                          ! bottom friction only
1467         DO_2D( 0, 0, 0, 0 )
1468            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) )
1469            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) )
1470         END_2D
1471      ENDIF
1472      !
1473      !                    !==  BOTTOM stress contribution from baroclinic velocities  ==!
1474      !
1475      IF( ln_bt_fw ) THEN                 ! FORWARD integration: use NOW bottom baroclinic velocities
1476         DO_2D( 0, 0, 0, 0 )
1477            ikbu = mbku(ji,jj)       
1478            ikbv = mbkv(ji,jj)   
1479            zu_i(ji,jj) = puu(ji,jj,ikbu,Kmm) - puu_b(ji,jj,Kmm)
1480            zv_i(ji,jj) = pvv(ji,jj,ikbv,Kmm) - pvv_b(ji,jj,Kmm)
1481         END_2D
1482      ELSE                                ! CENTRED integration: use BEFORE bottom baroclinic velocities       
1483         DO_2D( 0, 0, 0, 0 )
1484            ikbu = mbku(ji,jj)       
1485            ikbv = mbkv(ji,jj)   
1486            zu_i(ji,jj) = puu(ji,jj,ikbu,Kbb) - puu_b(ji,jj,Kbb)
1487            zv_i(ji,jj) = pvv(ji,jj,ikbv,Kbb) - pvv_b(ji,jj,Kbb)
1488         END_2D
1489      ENDIF
1490      !
1491      IF( ln_wd_il ) THEN      ! W/D : use the "clipped" bottom friction   !!gm   explain WHY, please !
1492         zztmp = -1._wp / rDt_e
1493         DO_2D( 0, 0, 0, 0 )
1494            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + zu_i(ji,jj) *  wdrampu(ji,jj) * MAX(                                 & 
1495                 &                              r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) , zztmp  )
1496            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + zv_i(ji,jj) *  wdrampv(ji,jj) * MAX(                                 & 
1497                 &                              r1_hv(ji,jj,Kmm) * r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) , zztmp  )
1498         END_2D
1499      ELSE                    ! use "unclipped" drag (even if explicit friction is used in 3D calculation)
1500         DO_2D( 0, 0, 0, 0 )
1501            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zu_i(ji,jj)
1502            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zv_i(ji,jj)
1503         END_2D
1504      END IF
1505      !
1506      !                    !==  TOP stress contribution from baroclinic velocities  ==!   (no W/D case)
1507      !
1508      IF( ln_isfcav.OR.ln_drgice_imp ) THEN
1509         !
1510         IF( ln_bt_fw ) THEN                ! FORWARD integration: use NOW top baroclinic velocity
1511            DO_2D( 0, 0, 0, 0 )
1512               iktu = miku(ji,jj)
1513               iktv = mikv(ji,jj)
1514               zu_i(ji,jj) = puu(ji,jj,iktu,Kmm) - puu_b(ji,jj,Kmm)
1515               zv_i(ji,jj) = pvv(ji,jj,iktv,Kmm) - pvv_b(ji,jj,Kmm)
1516            END_2D
1517         ELSE                               ! CENTRED integration: use BEFORE top baroclinic velocity
1518            DO_2D( 0, 0, 0, 0 )
1519               iktu = miku(ji,jj)
1520               iktv = mikv(ji,jj)
1521               zu_i(ji,jj) = puu(ji,jj,iktu,Kbb) - puu_b(ji,jj,Kbb)
1522               zv_i(ji,jj) = pvv(ji,jj,iktv,Kbb) - pvv_b(ji,jj,Kbb)
1523            END_2D
1524         ENDIF
1525         !                    ! use "unclipped" top drag (even if explicit friction is used in 3D calculation)       
1526         DO_2D( 0, 0, 0, 0 )
1527            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zu_i(ji,jj)
1528            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zv_i(ji,jj)
1529         END_2D
1530         !
1531      ENDIF
1532      !
1533   END SUBROUTINE dyn_drg_init
1534
1535
1536   SUBROUTINE ts_bck_interp( jn, ll_init,       &   ! <== in
1537      &                      za0, za1, za2, za3 )   ! ==> out
1538      !!----------------------------------------------------------------------
1539      INTEGER ,INTENT(in   ) ::   jn                   ! index of sub time step
1540      LOGICAL ,INTENT(in   ) ::   ll_init              !
1541      REAL(wp),INTENT(  out) ::   za0, za1, za2, za3   ! Half-step back interpolation coefficient
1542      !
1543      REAL(wp) ::   zepsilon, zgamma                   !   -      -
1544      !!----------------------------------------------------------------------
1545      !                             ! set Half-step back interpolation coefficient
1546      IF    ( jn==1 .AND. ll_init ) THEN   !* Forward-backward
1547         za0 = 1._wp                       
1548         za1 = 0._wp                           
1549         za2 = 0._wp
1550         za3 = 0._wp
1551      ELSEIF( jn==2 .AND. ll_init ) THEN   !* AB2-AM3 Coefficients; bet=0 ; gam=-1/6 ; eps=1/12
1552         za0 = 1.0833333333333_wp                 ! za0 = 1-gam-eps
1553         za1 =-0.1666666666666_wp                 ! za1 = gam
1554         za2 = 0.0833333333333_wp                 ! za2 = eps
1555         za3 = 0._wp             
1556      ELSE                                 !* AB3-AM4 Coefficients; bet=0.281105 ; eps=0.013 ; gam=0.0880
1557         IF( rn_bt_alpha == 0._wp ) THEN      ! Time diffusion 
1558            za0 = 0.614_wp                        ! za0 = 1/2 +   gam + 2*eps
1559            za1 = 0.285_wp                        ! za1 = 1/2 - 2*gam - 3*eps
1560            za2 = 0.088_wp                        ! za2 = gam
1561            za3 = 0.013_wp                        ! za3 = eps
1562         ELSE                                 ! no time diffusion
1563            zepsilon = 0.00976186_wp - 0.13451357_wp * rn_bt_alpha
1564            zgamma   = 0.08344500_wp - 0.51358400_wp * rn_bt_alpha
1565            za0 = 0.5_wp + zgamma + 2._wp * rn_bt_alpha + 2._wp * zepsilon
1566            za1 = 1._wp - za0 - zgamma - zepsilon
1567            za2 = zgamma
1568            za3 = zepsilon
1569         ENDIF
1570      ENDIF
1571   END SUBROUTINE ts_bck_interp
1572
1573   !!======================================================================
1574END MODULE dynspg_ts
Note: See TracBrowser for help on using the repository browser.