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.
Changeset 4292 for branches/2013/dev_MERGE_2013/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90 – NEMO

Ignore:
Timestamp:
2013-11-20T17:28:04+01:00 (10 years ago)
Author:
cetlod
Message:

dev_MERGE_2013 : 1st step of the merge, see ticket #1185

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_MERGE_2013/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90

    r4153 r4292  
    66   !! History :  2.0  !  2006-06  (B. Levier, L. Marie)  original code 
    77   !!            3.1  !  2009-02  (G. Madec, M. Leclair, R. Benshila)  pure z* coordinate 
    8    !!---------------------------------------------------------------------- 
    9 #if defined key_vvl 
     8   !!            3.3  !  2011-10  (M. Leclair) totally rewrote domvvl: 
     9   !!                                          vvl option includes z_star and z_tilde coordinates 
    1010   !!---------------------------------------------------------------------- 
    1111   !!   'key_vvl'                              variable volume 
    1212   !!---------------------------------------------------------------------- 
    13    !!   dom_vvl     : defined coefficients to distribute ssh on each layers 
    1413   !!---------------------------------------------------------------------- 
     14   !!   dom_vvl_init     : define initial vertical scale factors, depths and column thickness 
     15   !!   dom_vvl_sf_nxt   : Compute next vertical scale factors 
     16   !!   dom_vvl_sf_swp   : Swap vertical scale factors and update the vertical grid 
     17   !!   dom_vvl_interpol : Interpolate vertical scale factors from one grid point to another 
     18   !!   dom_vvl_rst      : read/write restart file 
     19   !!   dom_vvl_ctl      : Check the vvl options 
     20   !!   dom_vvl_orca_fix : Recompute some area-weighted interpolations of vertical scale factors  
     21   !!                    : to account for manual changes to e[1,2][u,v] in some Straits  
     22   !!---------------------------------------------------------------------- 
     23   !! * Modules used 
    1524   USE oce             ! ocean dynamics and tracers 
    1625   USE dom_oce         ! ocean space and time domain 
    17    USE sbc_oce         ! surface boundary condition: ocean 
    18    USE phycst          ! physical constants 
     26   USE sbc_oce         ! ocean surface boundary condition 
    1927   USE in_out_manager  ! I/O manager 
     28   USE iom             ! I/O manager library 
     29   USE restart         ! ocean restart 
    2030   USE lib_mpp         ! distributed memory computing library 
    2131   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     
    2636   PRIVATE 
    2737 
    28    PUBLIC   dom_vvl         ! called by domain.F90 
    29    PUBLIC   dom_vvl_2       ! called by domain.F90 
    30    PUBLIC   dom_vvl_alloc   ! called by nemogcm.F90 
    31  
    32    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   mut , muu , muv , muf    !: 1/H_0 at t-,u-,v-,f-points  
    33  
    34    REAL(wp),         ALLOCATABLE, SAVE, DIMENSION(:)     ::   r2dt   ! vertical profile time-step, = 2 rdttra  
    35       !                                                              ! except at nit000 (=rdttra) if neuler=0 
     38   !! * Routine accessibility 
     39   PUBLIC  dom_vvl_init       ! called by domain.F90 
     40   PUBLIC  dom_vvl_sf_nxt     ! called by step.F90 
     41   PUBLIC  dom_vvl_sf_swp     ! called by step.F90 
     42   PUBLIC  dom_vvl_interpol   ! called by dynnxt.F90 
     43   PRIVATE dom_vvl_orca_fix   ! called by dom_vvl_interpol 
     44 
     45   !!* Namelist nam_vvl 
     46   LOGICAL , PUBLIC                                      :: ln_vvl_zstar           = .FALSE.   ! zstar  vertical coordinate 
     47   LOGICAL , PUBLIC                                      :: ln_vvl_ztilde          = .FALSE.   ! ztilde vertical coordinate 
     48   LOGICAL , PUBLIC                                      :: ln_vvl_layer           = .FALSE.   ! level  vertical coordinate 
     49   LOGICAL , PUBLIC                                      :: ln_vvl_ztilde_as_zstar = .FALSE.   ! ztilde vertical coordinate 
     50   LOGICAL , PUBLIC                                      :: ln_vvl_zstar_at_eqtor  = .FALSE.   ! ztilde vertical coordinate 
     51   LOGICAL , PUBLIC                                      :: ln_vvl_kepe            = .FALSE.   ! kinetic/potential energy transfer 
     52   !                                                                                           ! conservation: not used yet 
     53   REAL(wp)                                              :: rn_ahe3                =  0.0_wp   ! thickness diffusion coefficient 
     54   REAL(wp)                                              :: rn_rst_e3t             =  30._wp   ! ztilde to zstar restoration timescale [days] 
     55   REAL(wp)                                              :: rn_lf_cutoff           =  5.0_wp   ! cutoff frequency for low-pass filter  [days] 
     56   REAL(wp)                                              :: rn_zdef_max            =  0.9_wp   ! maximum fractional e3t deformation 
     57   LOGICAL , PUBLIC                                      :: ln_vvl_dbg             = .FALSE.   ! debug control prints 
     58 
     59   !! * Module variables 
     60   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: un_td, vn_td                       ! thickness diffusion transport 
     61   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hdiv_lf                            ! low frequency part of hz divergence 
     62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tilde_e3t_b, tilde_e3t_n           ! baroclinic scale factors 
     63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: tilde_e3t_a                        ! baroclinic scale factors 
     64   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: frq_rst_e3t                        ! retoring period for scale factors 
     65   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   :: frq_rst_hdv                        ! retoring period for low freq. divergence 
    3666 
    3767   !! * Substitutions 
     
    3969#  include "vectopt_loop_substitute.h90" 
    4070   !!---------------------------------------------------------------------- 
    41    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     71   !! NEMO/OPA 3.3 , NEMO-Consortium (2010)  
    4272   !! $Id$ 
    4373   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4474   !!---------------------------------------------------------------------- 
    45 CONTAINS        
     75 
     76CONTAINS 
    4677 
    4778   INTEGER FUNCTION dom_vvl_alloc() 
    4879      !!---------------------------------------------------------------------- 
    49       !!                ***  ROUTINE dom_vvl_alloc  *** 
    50       !!---------------------------------------------------------------------- 
     80      !!                ***  FUNCTION dom_vvl_alloc  *** 
     81      !!---------------------------------------------------------------------- 
     82      IF( ln_vvl_zstar ) dom_vvl_alloc = 0 
     83      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 
     84         ALLOCATE( tilde_e3t_b(jpi,jpj,jpk) , tilde_e3t_n(jpi,jpj,jpk) , tilde_e3t_a(jpi,jpj,jpk) ,   & 
     85            &      un_td  (jpi,jpj,jpk)     , vn_td  (jpi,jpj,jpk)     , STAT = dom_vvl_alloc        ) 
     86         IF( lk_mpp             )   CALL mpp_sum ( dom_vvl_alloc ) 
     87         IF( dom_vvl_alloc /= 0 )   CALL ctl_warn('dom_vvl_alloc: failed to allocate arrays') 
     88         un_td = 0.0_wp 
     89         vn_td = 0.0_wp 
     90      ENDIF 
     91      IF( ln_vvl_ztilde ) THEN 
     92         ALLOCATE( frq_rst_e3t(jpi,jpj) , frq_rst_hdv(jpi,jpj) , hdiv_lf(jpi,jpj,jpk) , STAT= dom_vvl_alloc ) 
     93         IF( lk_mpp             )   CALL mpp_sum ( dom_vvl_alloc ) 
     94         IF( dom_vvl_alloc /= 0 )   CALL ctl_warn('dom_vvl_alloc: failed to allocate arrays') 
     95      ENDIF 
     96 
     97   END FUNCTION dom_vvl_alloc 
     98 
     99 
     100   SUBROUTINE dom_vvl_init 
     101      !!---------------------------------------------------------------------- 
     102      !!                ***  ROUTINE dom_vvl_init  *** 
     103      !!                    
     104      !! ** Purpose :  Initialization of all scale factors, depths 
     105      !!               and water column heights 
     106      !! 
     107      !! ** Method  :  - use restart file and/or initialize 
     108      !!               - interpolate scale factors 
     109      !! 
     110      !! ** Action  : - fse3t_(n/b) and tilde_e3t_(n/b) 
     111      !!              - Regrid: fse3(u/v)_n 
     112      !!                        fse3(u/v)_b        
     113      !!                        fse3w_n            
     114      !!                        fse3(u/v)w_b       
     115      !!                        fse3(u/v)w_n       
     116      !!                        fsdept_n, fsdepw_n and fsde3w_n 
     117      !!              - h(t/u/v)_0 
     118      !!              - frq_rst_e3t and frq_rst_hdv 
     119      !! 
     120      !! Reference  : Leclair, M., and G. Madec, 2011, Ocean Modelling. 
     121      !!---------------------------------------------------------------------- 
     122      USE phycst,  ONLY : rpi, rsmall, rad 
     123      !! * Local declarations 
     124      INTEGER ::   ji,jj,jk 
     125      INTEGER ::   ii0, ii1, ij0, ij1 
     126      !!---------------------------------------------------------------------- 
     127      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_init') 
     128 
     129      IF(lwp) WRITE(numout,*) 
     130      IF(lwp) WRITE(numout,*) 'dom_vvl_init : Variable volume activated' 
     131      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
     132 
     133      ! choose vertical coordinate (z_star, z_tilde or layer) 
     134      ! ========================== 
     135      CALL dom_vvl_ctl 
     136 
     137      ! Allocate module arrays 
     138      ! ====================== 
     139      IF( dom_vvl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dom_vvl_init : unable to allocate arrays' ) 
     140 
     141      ! Read or initialize fse3t_(b/n), tilde_e3t_(b/n) and hdiv_lf (and e3t_a(jpk)) 
     142      ! ============================================================================ 
     143      CALL dom_vvl_rst( nit000, 'READ' ) 
     144      fse3t_a(:,:,jpk) = e3t_0(:,:,jpk) 
     145 
     146      ! Reconstruction of all vertical scale factors at now and before time steps 
     147      ! ============================================================================= 
     148      ! Horizontal scale factor interpolations 
     149      ! -------------------------------------- 
     150      CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3u_b(:,:,:), 'U' ) 
     151      CALL dom_vvl_interpol( fse3t_b(:,:,:), fse3v_b(:,:,:), 'V' ) 
     152      CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3u_n(:,:,:), 'U' ) 
     153      CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3v_n(:,:,:), 'V' ) 
     154      CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3f_n(:,:,:), 'F' ) 
     155      ! Vertical scale factor interpolations 
     156      ! ------------------------------------ 
     157      CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3w_n (:,:,:), 'W'  ) 
     158      CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3uw_n(:,:,:), 'UW' ) 
     159      CALL dom_vvl_interpol( fse3v_n(:,:,:), fse3vw_n(:,:,:), 'VW' ) 
     160      CALL dom_vvl_interpol( fse3u_b(:,:,:), fse3uw_b(:,:,:), 'UW' ) 
     161      CALL dom_vvl_interpol( fse3v_b(:,:,:), fse3vw_b(:,:,:), 'VW' ) 
     162      ! t- and w- points depth 
     163      ! ---------------------- 
     164      fsdept_n(:,:,1) = 0.5_wp * fse3w_n(:,:,1) 
     165      fsdepw_n(:,:,1) = 0.0_wp 
     166      fsde3w_n(:,:,1) = fsdept_n(:,:,1) - sshn(:,:) 
     167      DO jk = 2, jpk 
     168         fsdept_n(:,:,jk) = fsdept_n(:,:,jk-1) + fse3w_n(:,:,jk) 
     169         fsdepw_n(:,:,jk) = fsdepw_n(:,:,jk-1) + fse3t_n(:,:,jk-1) 
     170         fsde3w_n(:,:,jk) = fsdept_n(:,:,jk  ) - sshn   (:,:) 
     171      END DO 
     172      ! Reference water column height at t-, u- and v- point 
     173      ! ---------------------------------------------------- 
     174      ht_0(:,:) = 0.0_wp 
     175      hu_0(:,:) = 0.0_wp 
     176      hv_0(:,:) = 0.0_wp 
     177      DO jk = 1, jpk 
     178         ht_0(:,:) = ht_0(:,:) + e3t_0(:,:,jk) * tmask(:,:,jk) 
     179         hu_0(:,:) = hu_0(:,:) + e3u_0(:,:,jk) * umask(:,:,jk) 
     180         hv_0(:,:) = hv_0(:,:) + e3v_0(:,:,jk) * vmask(:,:,jk) 
     181      END DO 
     182 
     183      ! Restoring frequencies for z_tilde coordinate 
     184      ! ============================================ 
     185      IF( ln_vvl_ztilde ) THEN 
     186         ! Values in days provided via the namelist; use rsmall to avoid possible division by zero errors with faulty settings 
     187         frq_rst_e3t(:,:) = 2.0_wp * rpi / ( MAX( rn_rst_e3t  , rsmall ) * 86400.0_wp ) 
     188         frq_rst_hdv(:,:) = 2.0_wp * rpi / ( MAX( rn_lf_cutoff, rsmall ) * 86400.0_wp ) 
     189         IF( ln_vvl_ztilde_as_zstar ) THEN 
     190            ! Ignore namelist settings and use these next two to emulate z-star using z-tilde 
     191            frq_rst_e3t(:,:) = 0.0_wp  
     192            frq_rst_hdv(:,:) = 1.0_wp / rdt 
     193         ENDIF 
     194         IF ( ln_vvl_zstar_at_eqtor ) THEN 
     195            DO jj = 1, jpj 
     196               DO ji = 1, jpi 
     197                  IF( ABS(gphit(ji,jj)) >= 6.) THEN 
     198                     ! values outside the equatorial band and transition zone (ztilde) 
     199                     frq_rst_e3t(ji,jj) =  2.0_wp * rpi / ( MAX( rn_rst_e3t  , rsmall ) * 86400.e0_wp ) 
     200                     frq_rst_hdv(ji,jj) =  2.0_wp * rpi / ( MAX( rn_lf_cutoff, rsmall ) * 86400.e0_wp ) 
     201                  ELSEIF( ABS(gphit(ji,jj)) <= 2.5) THEN 
     202                     ! values inside the equatorial band (ztilde as zstar) 
     203                     frq_rst_e3t(ji,jj) =  0.0_wp 
     204                     frq_rst_hdv(ji,jj) =  1.0_wp / rdt 
     205                  ELSE 
     206                     ! values in the transition band (linearly vary from ztilde to ztilde as zstar values) 
     207                     frq_rst_e3t(ji,jj) = 0.0_wp + (frq_rst_e3t(ji,jj)-0.0_wp)*0.5_wp   & 
     208                        &            * (  1.0_wp - COS( rad*(ABS(gphit(ji,jj))-2.5_wp)  & 
     209                        &                                          * 180._wp / 3.5_wp ) ) 
     210                     frq_rst_hdv(ji,jj) = (1.0_wp / rdt)                                & 
     211                        &            + (  frq_rst_hdv(ji,jj)-(1.e0_wp / rdt) )*0.5_wp   & 
     212                        &            * (  1._wp  - COS( rad*(ABS(gphit(ji,jj))-2.5_wp)  & 
     213                        &                                          * 180._wp / 3.5_wp ) ) 
     214                  ENDIF 
     215               END DO 
     216            END DO 
     217            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN 
     218               ii0 = 103   ;   ii1 = 111        ! Suppress ztilde in the Foxe Basin for ORCA2 
     219               ij0 = 128   ;   ij1 = 135   ;    
     220               frq_rst_e3t( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  0.0_wp 
     221               frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  1.e0_wp / rdt 
     222            ENDIF 
     223         ENDIF 
     224      ENDIF 
     225 
     226      IF( nn_timing == 1 )  CALL timing_stop('dom_vvl_init') 
     227 
     228   END SUBROUTINE dom_vvl_init 
     229 
     230 
     231   SUBROUTINE dom_vvl_sf_nxt( kt )  
     232      !!---------------------------------------------------------------------- 
     233      !!                ***  ROUTINE dom_vvl_sf_nxt  *** 
     234      !!                    
     235      !! ** Purpose :  - compute the after scale factors used in tra_zdf, dynnxt, 
     236      !!                 tranxt and dynspg routines 
     237      !! 
     238      !! ** Method  :  - z_star case:  Repartition of ssh INCREMENT proportionnaly to the level thickness. 
     239      !!               - z_tilde_case: after scale factor increment =  
     240      !!                                    high frequency part of horizontal divergence 
     241      !!                                  + retsoring towards the background grid 
     242      !!                                  + thickness difusion 
     243      !!                               Then repartition of ssh INCREMENT proportionnaly 
     244      !!                               to the "baroclinic" level thickness. 
     245      !! 
     246      !! ** Action  :  - hdiv_lf    : restoring towards full baroclinic divergence in z_tilde case 
     247      !!               - tilde_e3t_a: after increment of vertical scale factor  
     248      !!                              in z_tilde case 
     249      !!               - fse3(t/u/v)_a 
     250      !! 
     251      !! Reference  : Leclair, M., and Madec, G. 2011, Ocean Modelling. 
     252      !!---------------------------------------------------------------------- 
     253      REAL(wp), POINTER, DIMENSION(:,:,:) :: ze3t 
     254      REAL(wp), POINTER, DIMENSION(:,:  ) :: zht, z_scale, zwu, zwv, zhdiv 
     255      !! * Arguments 
     256      INTEGER, INTENT( in )                  :: kt                    ! time step 
     257      !! * Local declarations 
     258      INTEGER                                :: ji, jj, jk            ! dummy loop indices 
     259      INTEGER , DIMENSION(3)                 :: ijk_max, ijk_min      ! temporary integers 
     260      REAL(wp)                               :: z2dt                  ! temporary scalars 
     261      REAL(wp)                               :: z_tmin, z_tmax        ! temporary scalars 
     262      !!---------------------------------------------------------------------- 
     263      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_sf_nxt') 
     264      CALL wrk_alloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
     265      CALL wrk_alloc( jpi, jpj, jpk, ze3t                     ) 
     266 
     267      IF(kt == nit000)   THEN 
     268         IF(lwp) WRITE(numout,*) 
     269         IF(lwp) WRITE(numout,*) 'dom_vvl_sf_nxt : compute after scale factors' 
     270         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~' 
     271      ENDIF 
     272 
     273      ! ******************************* ! 
     274      ! After acale factors at t-points ! 
     275      ! ******************************* ! 
     276 
     277      !                                                ! ----------------- ! 
     278      IF( ln_vvl_zstar ) THEN                          ! z_star coordinate ! 
     279         !                                             ! ----------------- ! 
     280 
     281         z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * tmask(:,:,1) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask(:,:,1) ) 
     282         DO jk = 1, jpkm1 
     283            fse3t_a(:,:,jk) = fse3t_b(:,:,jk) + fse3t_n(:,:,jk) * z_scale(:,:) * tmask(:,:,jk) 
     284         END DO 
     285 
     286      !                                                ! --------------------------- ! 
     287      ELSEIF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN   ! z_tilde or layer coordinate ! 
     288         !                                             ! --------------------------- ! 
     289 
     290         ! I - initialization 
     291         ! ================== 
     292 
     293         ! 1 - barotropic divergence 
     294         ! ------------------------- 
     295         zhdiv(:,:) = 0. 
     296         zht(:,:)   = 0. 
     297         DO jk = 1, jpkm1 
     298            zhdiv(:,:) = zhdiv(:,:) + fse3t_n(:,:,jk) * hdivn(:,:,jk) 
     299            zht  (:,:) = zht  (:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 
     300         END DO 
     301         zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask(:,:,1) ) 
     302 
     303         ! 2 - Low frequency baroclinic horizontal divergence  (z-tilde case only) 
     304         ! -------------------------------------------------- 
     305         IF( ln_vvl_ztilde ) THEN 
     306            IF( kt .GT. nit000 ) THEN 
     307               DO jk = 1, jpkm1 
     308                  hdiv_lf(:,:,jk) = hdiv_lf(:,:,jk) - rdt * frq_rst_hdv(:,:)   & 
     309                     &          * ( hdiv_lf(:,:,jk) - fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) ) 
     310               END DO 
     311            ENDIF 
     312         END IF 
     313 
     314         ! II - after z_tilde increments of vertical scale factors 
     315         ! ======================================================= 
     316         tilde_e3t_a(:,:,:) = 0.0_wp  ! tilde_e3t_a used to store tendency terms 
     317 
     318         ! 1 - High frequency divergence term 
     319         ! ---------------------------------- 
     320         IF( ln_vvl_ztilde ) THEN     ! z_tilde case 
     321            DO jk = 1, jpkm1 
     322               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - ( fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) - hdiv_lf(:,:,jk) ) 
     323            END DO 
     324         ELSE                         ! layer case 
     325            DO jk = 1, jpkm1 
     326               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) -   fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) 
     327            END DO 
     328         END IF 
     329 
     330         ! 2 - Restoring term (z-tilde case only) 
     331         ! ------------------ 
     332         IF( ln_vvl_ztilde ) THEN 
     333            DO jk = 1, jpk 
     334               tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - frq_rst_e3t(:,:) * tilde_e3t_b(:,:,jk) 
     335            END DO 
     336         END IF 
     337 
     338         ! 3 - Thickness diffusion term 
     339         ! ---------------------------- 
     340         zwu(:,:) = 0.0_wp 
     341         zwv(:,:) = 0.0_wp 
     342         ! a - first derivative: diffusive fluxes 
     343         DO jk = 1, jpkm1 
     344            DO jj = 1, jpjm1 
     345               DO ji = 1, fs_jpim1   ! vector opt. 
     346                  un_td(ji,jj,jk) = rn_ahe3 * umask(ji,jj,jk) * re2u_e1u(ji,jj) & 
     347                                  & * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji+1,jj  ,jk) ) 
     348                  vn_td(ji,jj,jk) = rn_ahe3 * vmask(ji,jj,jk) * re1v_e2v(ji,jj) &  
     349                                  & * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji  ,jj+1,jk) ) 
     350                  zwu(ji,jj) = zwu(ji,jj) + un_td(ji,jj,jk) 
     351                  zwv(ji,jj) = zwv(ji,jj) + vn_td(ji,jj,jk) 
     352               END DO 
     353            END DO 
     354         END DO 
     355         ! b - correction for last oceanic u-v points 
     356         DO jj = 1, jpj 
     357            DO ji = 1, jpi 
     358               un_td(ji,jj,mbku(ji,jj)) = un_td(ji,jj,mbku(ji,jj)) - zwu(ji,jj) 
     359               vn_td(ji,jj,mbkv(ji,jj)) = vn_td(ji,jj,mbkv(ji,jj)) - zwv(ji,jj) 
     360            END DO 
     361         END DO 
     362         ! c - second derivative: divergence of diffusive fluxes 
     363         DO jk = 1, jpkm1 
     364            DO jj = 2, jpjm1 
     365               DO ji = fs_2, fs_jpim1   ! vector opt. 
     366                  tilde_e3t_a(ji,jj,jk) = tilde_e3t_a(ji,jj,jk) + (   un_td(ji-1,jj  ,jk) - un_td(ji,jj,jk)    & 
     367                     &                                          +     vn_td(ji  ,jj-1,jk) - vn_td(ji,jj,jk)    & 
     368                     &                                            ) * r1_e12t(ji,jj) 
     369               END DO 
     370            END DO 
     371         END DO 
     372         ! d - thickness diffusion transport: boundary conditions 
     373         !     (stored for tracer advction and continuity equation) 
     374         CALL lbc_lnk( un_td , 'U' , -1.) 
     375         CALL lbc_lnk( vn_td , 'V' , -1.) 
     376 
     377         ! 4 - Time stepping of baroclinic scale factors 
     378         ! --------------------------------------------- 
     379         ! Leapfrog time stepping 
     380         ! ~~~~~~~~~~~~~~~~~~~~~~ 
     381         IF( neuler == 0 .AND. kt == nit000 ) THEN 
     382            z2dt =  rdt 
     383         ELSE 
     384            z2dt = 2.0_wp * rdt 
     385         ENDIF 
     386         CALL lbc_lnk( tilde_e3t_a(:,:,:), 'T', 1. ) 
     387         tilde_e3t_a(:,:,:) = tilde_e3t_b(:,:,:) + z2dt * tmask(:,:,:) * tilde_e3t_a(:,:,:) 
     388 
     389         ! Maximum deformation control 
     390         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     391         ze3t(:,:,jpk) = 0.0_wp 
     392         DO jk = 1, jpkm1 
     393            ze3t(:,:,jk) = tilde_e3t_a(:,:,jk) / e3t_0(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) 
     394         END DO 
     395         z_tmax = MAXVAL( ze3t(:,:,:) ) 
     396         IF( lk_mpp )   CALL mpp_max( z_tmax )                 ! max over the global domain 
     397         z_tmin = MINVAL( ze3t(:,:,:) ) 
     398         IF( lk_mpp )   CALL mpp_min( z_tmin )                 ! min over the global domain 
     399         ! - ML - test: for the moment, stop simulation for too large e3_t variations 
     400         IF( ( z_tmax .GT. rn_zdef_max ) .OR. ( z_tmin .LT. - rn_zdef_max ) ) THEN 
     401            IF( lk_mpp ) THEN 
     402               CALL mpp_maxloc( ze3t, tmask, z_tmax, ijk_max(1), ijk_max(2), ijk_max(3) ) 
     403               CALL mpp_minloc( ze3t, tmask, z_tmin, ijk_min(1), ijk_min(2), ijk_min(3) ) 
     404            ELSE 
     405               ijk_max = MAXLOC( ze3t(:,:,:) ) 
     406               ijk_max(1) = ijk_max(1) + nimpp - 1 
     407               ijk_max(2) = ijk_max(2) + njmpp - 1 
     408               ijk_min = MINLOC( ze3t(:,:,:) ) 
     409               ijk_min(1) = ijk_min(1) + nimpp - 1 
     410               ijk_min(2) = ijk_min(2) + njmpp - 1 
     411            ENDIF 
     412            IF (lwp) THEN 
     413               WRITE(numout, *) 'MAX( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmax 
     414               WRITE(numout, *) 'at i, j, k=', ijk_max 
     415               WRITE(numout, *) 'MIN( tilde_e3t_a(:,:,:) / e3t_0(:,:,:) ) =', z_tmin 
     416               WRITE(numout, *) 'at i, j, k=', ijk_min             
     417               CALL ctl_warn('MAX( ABS( tilde_e3t_a(:,:,:) ) / e3t_0(:,:,:) ) too high') 
     418            ENDIF 
     419         ENDIF 
     420         ! - ML - end test 
     421         ! - ML - Imposing these limits will cause a baroclinicity error which is corrected for below 
     422         tilde_e3t_a(:,:,:) = MIN( tilde_e3t_a(:,:,:),   rn_zdef_max * e3t_0(:,:,:) ) 
     423         tilde_e3t_a(:,:,:) = MAX( tilde_e3t_a(:,:,:), - rn_zdef_max * e3t_0(:,:,:) ) 
     424 
     425         ! Add "tilda" part to the after scale factor 
     426         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     427         fse3t_a(:,:,:) = e3t_0(:,:,:) + tilde_e3t_a(:,:,:) 
     428 
     429         ! III - Barotropic repartition of the sea surface height over the baroclinic profile 
     430         ! ================================================================================== 
     431         ! add e3t(n-1) "star" Asselin-filtered 
     432         DO jk = 1, jpkm1 
     433            fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + fse3t_b(:,:,jk) - e3t_0(:,:,jk) - tilde_e3t_b(:,:,jk) 
     434         END DO 
     435         ! add ( ssh increment + "baroclinicity error" ) proportionnaly to e3t(n) 
     436         ! - ML - baroclinicity error should be better treated in the future 
     437         !        i.e. locally and not spread over the water column. 
     438         !        (keep in mind that the idea is to reduce Eulerian velocity as much as possible) 
     439         zht(:,:) = 0. 
     440         DO jk = 1, jpkm1 
     441            zht(:,:)  = zht(:,:) + tilde_e3t_a(:,:,jk) * tmask(:,:,jk) 
     442         END DO 
     443         z_scale(:,:) = ( ssha(:,:) - sshb(:,:) - zht(:,:) ) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask(:,:,1) ) 
     444         DO jk = 1, jpkm1 
     445            fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + fse3t_n(:,:,jk) * z_scale(:,:) * tmask(:,:,jk) 
     446         END DO 
     447 
     448      ENDIF 
     449 
     450      IF( ln_vvl_dbg ) THEN   ! - ML - test: control prints for debuging 
     451         ! 
     452         IF( lwp ) WRITE(numout, *) 'kt =', kt 
     453         IF ( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 
     454            z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( zht(:,:) ) ) 
     455            IF( lk_mpp ) CALL mpp_max( z_tmax )                             ! max over the global domain 
     456            IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(SUM(tilde_e3t_a))) =', z_tmax 
     457         END IF 
     458         ! 
     459         zht(:,:) = 0.0_wp 
     460         DO jk = 1, jpkm1 
     461            zht(:,:) = zht(:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 
     462         END DO 
     463         z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( ht_0(:,:) + sshn(:,:) - zht(:,:) ) ) 
     464         IF( lk_mpp ) CALL mpp_max( z_tmax )                                ! max over the global domain 
     465         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ht_0+sshn-SUM(fse3t_n))) =', z_tmax 
     466         ! 
     467         zht(:,:) = 0.0_wp 
     468         DO jk = 1, jpkm1 
     469            zht(:,:) = zht(:,:) + fse3t_a(:,:,jk) * tmask(:,:,jk) 
     470         END DO 
     471         z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( ht_0(:,:) + ssha(:,:) - zht(:,:) ) ) 
     472         IF( lk_mpp ) CALL mpp_max( z_tmax )                                ! max over the global domain 
     473         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ht_0+ssha-SUM(fse3t_a))) =', z_tmax 
     474         ! 
     475         zht(:,:) = 0.0_wp 
     476         DO jk = 1, jpkm1 
     477            zht(:,:) = zht(:,:) + fse3t_b(:,:,jk) * tmask(:,:,jk) 
     478         END DO 
     479         z_tmax = MAXVAL( tmask(:,:,1) * tmask_i(:,:) * ABS( ht_0(:,:) + sshb(:,:) - zht(:,:) ) ) 
     480         IF( lk_mpp ) CALL mpp_max( z_tmax )                                ! max over the global domain 
     481         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ht_0+sshb-SUM(fse3t_b))) =', z_tmax 
     482         ! 
     483         z_tmax = MAXVAL( tmask(:,:,1) *  ABS( sshb(:,:) ) ) 
     484         IF( lk_mpp ) CALL mpp_max( z_tmax )                                ! max over the global domain 
     485         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(sshb))) =', z_tmax 
     486         ! 
     487         z_tmax = MAXVAL( tmask(:,:,1) *  ABS( sshn(:,:) ) ) 
     488         IF( lk_mpp ) CALL mpp_max( z_tmax )                                ! max over the global domain 
     489         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(sshn))) =', z_tmax 
     490         ! 
     491         z_tmax = MAXVAL( tmask(:,:,1) *  ABS( ssha(:,:) ) ) 
     492         IF( lk_mpp ) CALL mpp_max( z_tmax )                                ! max over the global domain 
     493         IF( lwp    ) WRITE(numout, *) kt,' MAXVAL(abs(ssha))) =', z_tmax 
     494      END IF 
     495 
     496      ! *********************************** ! 
     497      ! After scale factors at u- v- points ! 
     498      ! *********************************** ! 
     499 
     500      CALL dom_vvl_interpol( fse3t_a(:,:,:), fse3u_a(:,:,:), 'U' ) 
     501      CALL dom_vvl_interpol( fse3t_a(:,:,:), fse3v_a(:,:,:), 'V' ) 
     502 
     503      CALL wrk_dealloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) 
     504      CALL wrk_dealloc( jpi, jpj, jpk, ze3t                     ) 
     505 
     506      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_sf_nxt') 
     507 
     508   END SUBROUTINE dom_vvl_sf_nxt 
     509 
     510 
     511   SUBROUTINE dom_vvl_sf_swp( kt ) 
     512      !!---------------------------------------------------------------------- 
     513      !!                ***  ROUTINE dom_vvl_sf_swp  *** 
     514      !!                    
     515      !! ** Purpose :  compute time filter and swap of scale factors  
     516      !!               compute all depths and related variables for next time step 
     517      !!               write outputs and restart file 
     518      !! 
     519      !! ** Method  :  - swap of e3t with trick for volume/tracer conservation 
     520      !!               - reconstruct scale factor at other grid points (interpolate) 
     521      !!               - recompute depths and water height fields 
     522      !! 
     523      !! ** Action  :  - fse3t_(b/n), tilde_e3t_(b/n) and fse3(u/v)_n ready for next time step 
     524      !!               - Recompute: 
     525      !!                    fse3(u/v)_b        
     526      !!                    fse3w_n            
     527      !!                    fse3(u/v)w_b       
     528      !!                    fse3(u/v)w_n       
     529      !!                    fsdept_n, fsdepw_n  and fsde3w_n 
     530      !!                    h(u/v) and h(u/v)r 
     531      !! 
     532      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
     533      !!              Leclair, M., and G. Madec, 2011, Ocean Modelling. 
     534      !!---------------------------------------------------------------------- 
     535      !! * Arguments 
     536      INTEGER, INTENT( in )               :: kt       ! time step 
     537      !! * Local declarations 
     538      REAL(wp), POINTER, DIMENSION(:,:,:) :: z_e3t_def 
     539      INTEGER                             :: jk       ! dummy loop indices 
     540      !!---------------------------------------------------------------------- 
     541 
     542      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_sf_swp') 
    51543      ! 
    52       ALLOCATE( mut (jpi,jpj,jpk) , muu (jpi,jpj,jpk) , muv (jpi,jpj,jpk) , muf (jpi,jpj,jpk) ,     & 
    53          &      r2dt        (jpk)                                                             , STAT=dom_vvl_alloc ) 
    54          ! 
    55       IF( lk_mpp             )   CALL mpp_sum ( dom_vvl_alloc ) 
    56       IF( dom_vvl_alloc /= 0 )   CALL ctl_warn('dom_vvl_alloc: failed to allocate arrays') 
     544      CALL wrk_alloc( jpi, jpj, jpk, z_e3t_def                ) 
    57545      ! 
    58    END FUNCTION dom_vvl_alloc 
    59  
    60  
    61    SUBROUTINE dom_vvl 
    62       !!---------------------------------------------------------------------- 
    63       !!                ***  ROUTINE dom_vvl  *** 
    64       !!                    
    65       !! ** Purpose :   compute mu coefficients at t-, u-, v- and f-points to  
    66       !!              spread ssh over the whole water column (scale factors) 
    67       !!                set the before and now ssh at u- and v-points  
    68       !!              (also f-point in now case) 
    69       !!---------------------------------------------------------------------- 
     546      IF( kt == nit000 )   THEN 
     547         IF(lwp) WRITE(numout,*) 
     548         IF(lwp) WRITE(numout,*) 'dom_vvl_sf_swp : - time filter and swap of scale factors' 
     549         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~   - interpolate scale factors and compute depths for next time step' 
     550      ENDIF 
    70551      ! 
    71       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    72       REAL(wp) ::   zcoefu, zcoefv , zcoeff                ! local scalars 
    73       REAL(wp) ::   zvt   , zvt_ip1, zvt_jp1, zvt_ip1jp1   !   -      - 
    74       REAL(wp), POINTER, DIMENSION(:,:) ::  zee_t, zee_u, zee_v, zee_f   ! 2D workspace 
    75       !!---------------------------------------------------------------------- 
     552      ! Time filter and swap of scale factors 
     553      ! ===================================== 
     554      ! - ML - fse3(t/u/v)_b are allready computed in dynnxt. 
     555      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 
     556         IF( neuler == 0 .AND. kt == nit000 ) THEN 
     557            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) 
     558         ELSE 
     559            tilde_e3t_b(:,:,:) = tilde_e3t_n(:,:,:) &  
     560            &         + atfp * ( tilde_e3t_b(:,:,:) - 2.0_wp * tilde_e3t_n(:,:,:) + tilde_e3t_a(:,:,:) ) 
     561         ENDIF 
     562         tilde_e3t_n(:,:,:) = tilde_e3t_a(:,:,:) 
     563      ENDIF 
     564      fse3t_n(:,:,:) = fse3t_a(:,:,:) 
     565      fse3u_n(:,:,:) = fse3u_a(:,:,:) 
     566      fse3v_n(:,:,:) = fse3v_a(:,:,:) 
     567 
     568      ! Compute all missing vertical scale factor and depths 
     569      ! ==================================================== 
     570      ! Horizontal scale factor interpolations 
     571      ! -------------------------------------- 
     572      ! - ML - fse3u_b and fse3v_b are allready computed in dynnxt 
     573      CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3f_n (:,:,:), 'F'  ) 
     574      ! Vertical scale factor interpolations 
     575      ! ------------------------------------ 
     576      CALL dom_vvl_interpol( fse3t_n(:,:,:), fse3w_n (:,:,:), 'W'  ) 
     577      CALL dom_vvl_interpol( fse3u_n(:,:,:), fse3uw_n(:,:,:), 'UW' ) 
     578      CALL dom_vvl_interpol( fse3v_n(:,:,:), fse3vw_n(:,:,:), 'VW' ) 
     579      CALL dom_vvl_interpol( fse3u_b(:,:,:), fse3uw_b(:,:,:), 'UW' ) 
     580      CALL dom_vvl_interpol( fse3v_b(:,:,:), fse3vw_b(:,:,:), 'VW' ) 
     581      ! t- and w- points depth 
     582      ! ---------------------- 
     583      fsdept_n(:,:,1) = 0.5_wp * fse3w_n(:,:,1) 
     584      fsdepw_n(:,:,1) = 0.0_wp 
     585      fsde3w_n(:,:,1) = fsdept_n(:,:,1) - sshn(:,:) 
     586      DO jk = 2, jpk 
     587         fsdept_n(:,:,jk) = fsdept_n(:,:,jk-1) + fse3w_n(:,:,jk) 
     588         fsdepw_n(:,:,jk) = fsdepw_n(:,:,jk-1) + fse3t_n(:,:,jk-1) 
     589         fsde3w_n(:,:,jk) = fsdept_n(:,:,jk  ) - sshn   (:,:) 
     590      END DO 
     591      ! Local depth and Inverse of the local depth of the water column at u- and v- points 
     592      ! ---------------------------------------------------------------------------------- 
     593      hu(:,:) = 0. 
     594      hv(:,:) = 0. 
     595      DO jk = 1, jpk 
     596         hu(:,:) = hu(:,:) + fse3u_n(:,:,jk) * umask(:,:,jk) 
     597         hv(:,:) = hv(:,:) + fse3v_n(:,:,jk) * vmask(:,:,jk) 
     598      END DO 
     599      ! Inverse of the local depth 
     600      hur(:,:) = umask(:,:,1) / ( hu(:,:) + 1. - umask(:,:,1) ) 
     601      hvr(:,:) = vmask(:,:,1) / ( hv(:,:) + 1. - vmask(:,:,1) ) 
     602 
     603      ! Write outputs 
     604      ! ============= 
     605      z_e3t_def(:,:,:) = ( ( fse3t_n(:,:,:) - e3t_0(:,:,:) ) / e3t_0(:,:,:) * 100 * tmask(:,:,:) ) ** 2 
     606      CALL iom_put( "e3t_n"  , fse3t_n  (:,:,:) ) 
     607      CALL iom_put( "dept_n" , fsde3w_n (:,:,:) ) 
     608      CALL iom_put( "e3tdef" , z_e3t_def(:,:,:) ) 
     609 
     610      ! write restart file 
     611      ! ================== 
     612      IF( lrst_oce ) CALL dom_vvl_rst( kt, 'WRITE' ) 
    76613      ! 
    77       IF( nn_timing == 1 )  CALL timing_start('dom_vvl') 
     614      CALL wrk_dealloc( jpi, jpj, jpk, z_e3t_def ) 
    78615      ! 
    79       CALL wrk_alloc( jpi, jpj, zee_t, zee_u, zee_v, zee_f ) 
     616      IF( nn_timing == 1 )  CALL timing_stop('dom_vvl_sf_swp') 
     617 
     618   END SUBROUTINE dom_vvl_sf_swp 
     619 
     620 
     621   SUBROUTINE dom_vvl_interpol( pe3_in, pe3_out, pout ) 
     622      !!--------------------------------------------------------------------- 
     623      !!                  ***  ROUTINE dom_vvl__interpol  *** 
     624      !! 
     625      !! ** Purpose :   interpolate scale factors from one grid point to another 
     626      !! 
     627      !! ** Method  :   e3_out = e3_0 + interpolation(e3_in - e3_0) 
     628      !!                - horizontal interpolation: grid cell surface averaging 
     629      !!                - vertical interpolation: simple averaging 
     630      !!---------------------------------------------------------------------- 
     631      !! * Arguments 
     632      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in    ) ::  pe3_in     ! input e3 to be interpolated 
     633      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) ::  pe3_out    ! output interpolated e3 
     634      CHARACTER(LEN=*), INTENT( in )                    ::  pout       ! grid point of out scale factors 
     635      !                                                                !   =  'U', 'V', 'W, 'F', 'UW' or 'VW' 
     636      !! * Local declarations 
     637      INTEGER ::   ji, jj, jk                                          ! dummy loop indices 
     638      LOGICAL ::   l_is_orca                                           ! local logical 
     639      !!---------------------------------------------------------------------- 
     640      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_interpol') 
     641         ! 
     642      l_is_orca = .FALSE. 
     643      IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) l_is_orca = .TRUE.      ! ORCA R2 configuration - will need to correct some locations 
     644 
     645      SELECT CASE ( pout ) 
     646         !               ! ------------------------------------- ! 
     647      CASE( 'U' )        ! interpolation from T-point to U-point ! 
     648         !               ! ------------------------------------- ! 
     649         ! horizontal surface weighted interpolation 
     650         DO jk = 1, jpk 
     651            DO jj = 1, jpjm1 
     652               DO ji = 1, fs_jpim1   ! vector opt. 
     653                  pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * r1_e12u(ji,jj)                                   & 
     654                     &                       * (   e12t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) )     & 
     655                     &                           + e12t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) ) 
     656               END DO 
     657            END DO 
     658         END DO 
     659         ! 
     660         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
     661         ! boundary conditions 
     662         CALL lbc_lnk( pe3_out(:,:,:), 'U', 1. ) 
     663         pe3_out(:,:,:) = pe3_out(:,:,:) + e3u_0(:,:,:) 
     664         !               ! ------------------------------------- ! 
     665      CASE( 'V' )        ! interpolation from T-point to V-point ! 
     666         !               ! ------------------------------------- ! 
     667         ! horizontal surface weighted interpolation 
     668         DO jk = 1, jpk 
     669            DO jj = 1, jpjm1 
     670               DO ji = 1, fs_jpim1   ! vector opt. 
     671                  pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk) * r1_e12v(ji,jj)                                   & 
     672                     &                       * (   e12t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) )     & 
     673                     &                           + e12t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) ) 
     674               END DO 
     675            END DO 
     676         END DO 
     677         ! 
     678         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
     679         ! boundary conditions 
     680         CALL lbc_lnk( pe3_out(:,:,:), 'V', 1. ) 
     681         pe3_out(:,:,:) = pe3_out(:,:,:) + e3v_0(:,:,:) 
     682         !               ! ------------------------------------- ! 
     683      CASE( 'F' )        ! interpolation from U-point to F-point ! 
     684         !               ! ------------------------------------- ! 
     685         ! horizontal surface weighted interpolation 
     686         DO jk = 1, jpk 
     687            DO jj = 1, jpjm1 
     688               DO ji = 1, fs_jpim1   ! vector opt. 
     689                  pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk) * r1_e12f(ji,jj)               & 
     690                     &                       * (   e12u(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3u_0(ji,jj  ,jk) )     & 
     691                     &                           + e12u(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3u_0(ji,jj+1,jk) ) ) 
     692               END DO 
     693            END DO 
     694         END DO 
     695         ! 
     696         IF( l_is_orca ) CALL dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
     697         ! boundary conditions 
     698         CALL lbc_lnk( pe3_out(:,:,:), 'F', 1. ) 
     699         pe3_out(:,:,:) = pe3_out(:,:,:) + e3f_0(:,:,:) 
     700         !               ! ------------------------------------- ! 
     701      CASE( 'W' )        ! interpolation from T-point to W-point ! 
     702         !               ! ------------------------------------- ! 
     703         ! vertical simple interpolation 
     704         pe3_out(:,:,1) = e3w_0(:,:,1) + pe3_in(:,:,1) - e3t_0(:,:,1) 
     705         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing 
     706         DO jk = 2, jpk 
     707            pe3_out(:,:,jk) = e3w_0(:,:,jk) + ( 1.0_wp - 0.5_wp * tmask(:,:,jk) ) * ( pe3_in(:,:,jk-1) - e3t_0(:,:,jk-1) )   & 
     708               &                            +            0.5_wp * tmask(:,:,jk)   * ( pe3_in(:,:,jk  ) - e3t_0(:,:,jk  ) ) 
     709         END DO 
     710         !               ! -------------------------------------- ! 
     711      CASE( 'UW' )       ! interpolation from U-point to UW-point ! 
     712         !               ! -------------------------------------- ! 
     713         ! vertical simple interpolation 
     714         pe3_out(:,:,1) = e3uw_0(:,:,1) + pe3_in(:,:,1) - e3u_0(:,:,1) 
     715         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing 
     716         DO jk = 2, jpk 
     717            pe3_out(:,:,jk) = e3uw_0(:,:,jk) + ( 1.0_wp - 0.5_wp * umask(:,:,jk) ) * ( pe3_in(:,:,jk-1) - e3u_0(:,:,jk-1) )   & 
     718               &                             +            0.5_wp * umask(:,:,jk)   * ( pe3_in(:,:,jk  ) - e3u_0(:,:,jk  ) ) 
     719         END DO 
     720         !               ! -------------------------------------- ! 
     721      CASE( 'VW' )       ! interpolation from V-point to VW-point ! 
     722         !               ! -------------------------------------- ! 
     723         ! vertical simple interpolation 
     724         pe3_out(:,:,1) = e3vw_0(:,:,1) + pe3_in(:,:,1) - e3v_0(:,:,1) 
     725         ! - ML - The use of mask in this formaula enables the special treatment of the last w- point without indirect adressing 
     726         DO jk = 2, jpk 
     727            pe3_out(:,:,jk) = e3vw_0(:,:,jk) + ( 1.0_wp - 0.5_wp * vmask(:,:,jk) ) * ( pe3_in(:,:,jk-1) - e3v_0(:,:,jk-1) )   & 
     728               &                             +            0.5_wp * vmask(:,:,jk)   * ( pe3_in(:,:,jk  ) - e3v_0(:,:,jk  ) ) 
     729         END DO 
     730      END SELECT 
    80731      ! 
    81       IF(lwp) THEN 
     732 
     733      IF( nn_timing == 1 )  CALL timing_stop('dom_vvl_interpol') 
     734 
     735   END SUBROUTINE dom_vvl_interpol 
     736 
     737   SUBROUTINE dom_vvl_rst( kt, cdrw ) 
     738      !!--------------------------------------------------------------------- 
     739      !!                   ***  ROUTINE dom_vvl_rst  *** 
     740      !!                      
     741      !! ** Purpose :   Read or write VVL file in restart file 
     742      !! 
     743      !! ** Method  :   use of IOM library 
     744      !!                if the restart does not contain vertical scale factors, 
     745      !!                they are set to the _0 values 
     746      !!                if the restart does not contain vertical scale factors increments (z_tilde), 
     747      !!                they are set to 0. 
     748      !!---------------------------------------------------------------------- 
     749      !! * Arguments 
     750      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     751      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
     752      !! * Local declarations 
     753      INTEGER ::   id1, id2, id3, id4, id5     ! local integers 
     754      !!---------------------------------------------------------------------- 
     755      ! 
     756      IF( nn_timing == 1 )  CALL timing_start('dom_vvl_rst') 
     757      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     758         !                                   ! =============== 
     759         IF( ln_rstart ) THEN                   !* Read the restart file 
     760            CALL rst_read_open                  !  open the restart file if necessary 
     761            id1 = iom_varid( numror, 'fse3t_b', ldstop = .FALSE. ) 
     762            id2 = iom_varid( numror, 'fse3t_n', ldstop = .FALSE. ) 
     763            id3 = iom_varid( numror, 'tilde_e3t_b', ldstop = .FALSE. ) 
     764            id4 = iom_varid( numror, 'tilde_e3t_n', ldstop = .FALSE. ) 
     765            id5 = iom_varid( numror, 'hdif_lf', ldstop = .FALSE. ) 
     766            !                             ! --------- ! 
     767            !                             ! all cases ! 
     768            !                             ! --------- ! 
     769            IF( MIN( id1, id2 ) > 0 ) THEN       ! all required arrays exist 
     770               CALL iom_get( numror, jpdom_autoglo, 'fse3t_b', fse3t_b(:,:,:) ) 
     771               CALL iom_get( numror, jpdom_autoglo, 'fse3t_n', fse3t_n(:,:,:) ) 
     772               IF( neuler == 0 ) THEN 
     773                  fse3t_b(:,:,:) = fse3t_n(:,:,:) 
     774               ENDIF 
     775            ELSE IF( id1 > 0 ) THEN 
     776               IF(lwp) write(numout,*) 'dom_vvl_rst WARNING : fse3t_n not found in restart files' 
     777               IF(lwp) write(numout,*) 'fse3t_n set equal to fse3t_b.' 
     778               fse3t_b(:,:,:) = fse3t_n(:,:,:) 
     779            ELSE                                 ! one at least array is missing 
     780               CALL ctl_stop( 'dom_vvl_rst: vvl cannot restart from a non vvl run' ) 
     781            ENDIF 
     782            !                             ! ----------- ! 
     783            IF( ln_vvl_zstar ) THEN       ! z_star case ! 
     784               !                          ! ----------- ! 
     785               IF( MIN( id3, id4 ) > 0 ) THEN 
     786                  CALL ctl_stop( 'dom_vvl_rst: z_star cannot restart from a z_tilde or layer run' ) 
     787               ENDIF 
     788               !                          ! ----------------------- ! 
     789            ELSE                          ! z_tilde and layer cases ! 
     790               !                          ! ----------------------- ! 
     791               IF( MIN( id3, id4 ) > 0 ) THEN  ! all required arrays exist 
     792                  CALL iom_get( numror, jpdom_autoglo, 'tilde_e3t_b', tilde_e3t_b(:,:,:) ) 
     793                  CALL iom_get( numror, jpdom_autoglo, 'tilde_e3t_n', tilde_e3t_n(:,:,:) ) 
     794               ELSE                            ! one at least array is missing 
     795                  tilde_e3t_b(:,:,:) = 0.0_wp 
     796                  tilde_e3t_n(:,:,:) = 0.0_wp 
     797               ENDIF 
     798               !                          ! ------------ ! 
     799               IF( ln_vvl_ztilde ) THEN   ! z_tilde case ! 
     800                  !                       ! ------------ ! 
     801                  IF( id5 > 0 ) THEN  ! required array exists 
     802                     CALL iom_get( numror, jpdom_autoglo, 'hdiv_lf', hdiv_lf(:,:,:) ) 
     803                  ELSE                ! array is missing 
     804                     hdiv_lf(:,:,:) = 0.0_wp 
     805                  ENDIF 
     806               ENDIF 
     807            ENDIF 
     808            ! 
     809         ELSE                                   !* Initialize at "rest" 
     810            fse3t_b(:,:,:) = e3t_0(:,:,:) 
     811            fse3t_n(:,:,:) = e3t_0(:,:,:) 
     812            IF( ln_vvl_ztilde .OR. ln_vvl_layer) THEN 
     813               tilde_e3t_b(:,:,:) = 0.0_wp 
     814               tilde_e3t_n(:,:,:) = 0.0_wp 
     815               IF( ln_vvl_ztilde ) hdiv_lf(:,:,:) = 0.0_wp 
     816            END IF 
     817         ENDIF 
     818 
     819      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
     820         !                                   ! =================== 
     821         IF(lwp) WRITE(numout,*) '---- dom_vvl_rst ----' 
     822         !                                           ! --------- ! 
     823         !                                           ! all cases ! 
     824         !                                           ! --------- ! 
     825         CALL iom_rstput( kt, nitrst, numrow, 'fse3t_b', fse3t_b(:,:,:) ) 
     826         CALL iom_rstput( kt, nitrst, numrow, 'fse3t_n', fse3t_n(:,:,:) ) 
     827         !                                           ! ----------------------- ! 
     828         IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN  ! z_tilde and layer cases ! 
     829            !                                        ! ----------------------- ! 
     830            CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_b', tilde_e3t_b(:,:,:) ) 
     831            CALL iom_rstput( kt, nitrst, numrow, 'tilde_e3t_n', tilde_e3t_n(:,:,:) ) 
     832         END IF 
     833         !                                           ! -------------!     
     834         IF( ln_vvl_ztilde ) THEN                    ! z_tilde case ! 
     835            !                                        ! ------------ ! 
     836            CALL iom_rstput( kt, nitrst, numrow, 'hdiv_lf', hdiv_lf(:,:,:) ) 
     837         ENDIF 
     838 
     839      ENDIF 
     840      IF( nn_timing == 1 )  CALL timing_stop('dom_vvl_rst') 
     841 
     842   END SUBROUTINE dom_vvl_rst 
     843 
     844 
     845   SUBROUTINE dom_vvl_ctl 
     846      !!--------------------------------------------------------------------- 
     847      !!                  ***  ROUTINE dom_vvl_ctl  *** 
     848      !!                 
     849      !! ** Purpose :   Control the consistency between namelist options 
     850      !!                for vertical coordinate 
     851      !!---------------------------------------------------------------------- 
     852      INTEGER ::   ioptio 
     853 
     854      NAMELIST/nam_vvl/ ln_vvl_zstar, ln_vvl_ztilde, ln_vvl_layer, ln_vvl_ztilde_as_zstar, & 
     855                      & ln_vvl_zstar_at_eqtor      , rn_ahe3     , rn_rst_e3t            , & 
     856                      & rn_lf_cutoff               , rn_zdef_max , ln_vvl_dbg                ! not yet implemented: ln_vvl_kepe 
     857      !!----------------------------------------------------------------------  
     858 
     859      REWIND ( numnam )               ! Read Namelist nam_vvl : vertical coordinate 
     860      READ   ( numnam, nam_vvl ) 
     861 
     862      IF(lwp) THEN                    ! Namelist print 
    82863         WRITE(numout,*) 
    83          WRITE(numout,*) 'dom_vvl : Variable volume initialization' 
    84          WRITE(numout,*) '~~~~~~~~  compute coef. used to spread ssh over each layers' 
     864         WRITE(numout,*) 'dom_vvl_ctl : choice/control of the variable vertical coordinate' 
     865         WRITE(numout,*) '~~~~~~~~~~~' 
     866         WRITE(numout,*) '           Namelist nam_vvl : chose a vertical coordinate' 
     867         WRITE(numout,*) '              zstar                      ln_vvl_zstar   = ', ln_vvl_zstar 
     868         WRITE(numout,*) '              ztilde                     ln_vvl_ztilde  = ', ln_vvl_ztilde 
     869         WRITE(numout,*) '              layer                      ln_vvl_layer   = ', ln_vvl_layer 
     870         WRITE(numout,*) '              ztilde as zstar   ln_vvl_ztilde_as_zstar  = ', ln_vvl_ztilde_as_zstar 
     871         WRITE(numout,*) '      ztilde near the equator    ln_vvl_zstar_at_eqtor  = ', ln_vvl_zstar_at_eqtor 
     872         ! WRITE(numout,*) '           Namelist nam_vvl : chose kinetic-to-potential energy conservation' 
     873         ! WRITE(numout,*) '                                         ln_vvl_kepe    = ', ln_vvl_kepe 
     874         WRITE(numout,*) '           Namelist nam_vvl : thickness diffusion coefficient' 
     875         WRITE(numout,*) '                                         rn_ahe3        = ', rn_ahe3 
     876         WRITE(numout,*) '           Namelist nam_vvl : maximum e3t deformation fractional change' 
     877         WRITE(numout,*) '                                         rn_zdef_max    = ', rn_zdef_max 
     878         IF( ln_vvl_ztilde_as_zstar ) THEN 
     879            WRITE(numout,*) '           ztilde running in zstar emulation mode; ' 
     880            WRITE(numout,*) '           ignoring namelist timescale parameters and using:' 
     881            WRITE(numout,*) '                 hard-wired : z-tilde to zstar restoration timescale (days)' 
     882            WRITE(numout,*) '                                         rn_rst_e3t     =    0.0' 
     883            WRITE(numout,*) '                 hard-wired : z-tilde cutoff frequency of low-pass filter (days)' 
     884            WRITE(numout,*) '                                         rn_lf_cutoff   =    1.0/rdt' 
     885         ELSE 
     886            WRITE(numout,*) '           Namelist nam_vvl : z-tilde to zstar restoration timescale (days)' 
     887            WRITE(numout,*) '                                         rn_rst_e3t     = ', rn_rst_e3t 
     888            WRITE(numout,*) '           Namelist nam_vvl : z-tilde cutoff frequency of low-pass filter (days)' 
     889            WRITE(numout,*) '                                         rn_lf_cutoff   = ', rn_lf_cutoff 
     890         ENDIF 
     891         WRITE(numout,*) '           Namelist nam_vvl : debug prints' 
     892         WRITE(numout,*) '                                         ln_vvl_dbg     = ', ln_vvl_dbg 
    85893      ENDIF 
    86        
    87       IF( dom_vvl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'dom_vvl : unable to allocate arrays' ) 
    88  
    89       fsdept(:,:,:) = gdept (:,:,:) 
    90       fsdepw(:,:,:) = gdepw (:,:,:) 
    91       fsde3w(:,:,:) = gdep3w(:,:,:) 
    92       fse3t (:,:,:) = e3t   (:,:,:) 
    93       fse3u (:,:,:) = e3u   (:,:,:) 
    94       fse3v (:,:,:) = e3v   (:,:,:) 
    95       fse3f (:,:,:) = e3f   (:,:,:) 
    96       fse3w (:,:,:) = e3w   (:,:,:) 
    97       fse3uw(:,:,:) = e3uw  (:,:,:) 
    98       fse3vw(:,:,:) = e3vw  (:,:,:) 
    99  
    100       !                                 !==  mu computation  ==! 
    101       zee_t(:,:) = fse3t_0(:,:,1)                ! Lower bound : thickness of the first model level 
    102       zee_u(:,:) = fse3u_0(:,:,1) 
    103       zee_v(:,:) = fse3v_0(:,:,1) 
    104       zee_f(:,:) = fse3f_0(:,:,1) 
    105       DO jk = 2, jpkm1                          ! Sum of the masked vertical scale factors 
    106          zee_t(:,:) = zee_t(:,:) + fse3t_0(:,:,jk) * tmask(:,:,jk) 
    107          zee_u(:,:) = zee_u(:,:) + fse3u_0(:,:,jk) * umask(:,:,jk) 
    108          zee_v(:,:) = zee_v(:,:) + fse3v_0(:,:,jk) * vmask(:,:,jk) 
    109          DO jj = 1, jpjm1                      ! f-point : fmask=shlat at coasts, use the product of umask 
    110             zee_f(:,jj) = zee_f(:,jj) + fse3f_0(:,jj,jk) *  umask(:,jj,jk) * umask(:,jj+1,jk) 
    111          END DO 
    112       END DO   
    113       !                                         ! Compute and mask the inverse of the local depth at T, U, V and F points 
    114       zee_t(:,:) = 1._wp / zee_t(:,:) * tmask(:,:,1) 
    115       zee_u(:,:) = 1._wp / zee_u(:,:) * umask(:,:,1) 
    116       zee_v(:,:) = 1._wp / zee_v(:,:) * vmask(:,:,1) 
    117       DO jj = 1, jpjm1                               ! f-point case fmask cannot be used  
    118          zee_f(:,jj) = 1._wp / zee_f(:,jj) * umask(:,jj,1) * umask(:,jj+1,1) 
    119       END DO 
    120       CALL lbc_lnk( zee_f, 'F', 1. )                 ! lateral boundary condition on ee_f 
    121       ! 
    122       DO jk = 1, jpk                            ! mu coefficients 
    123          mut(:,:,jk) = zee_t(:,:) * tmask(:,:,jk)     ! T-point at T levels 
    124          muu(:,:,jk) = zee_u(:,:) * umask(:,:,jk)     ! U-point at T levels 
    125          muv(:,:,jk) = zee_v(:,:) * vmask(:,:,jk)     ! V-point at T levels 
    126       END DO 
    127       DO jk = 1, jpk                                 ! F-point : fmask=shlat at coasts, use the product of umask 
    128          DO jj = 1, jpjm1 
    129                muf(:,jj,jk) = zee_f(:,jj) * umask(:,jj,jk) * umask(:,jj+1,jk)   ! at T levels 
    130          END DO 
    131          muf(:,jpj,jk) = 0._wp 
    132       END DO 
    133       CALL lbc_lnk( muf, 'F', 1. )                   ! lateral boundary condition 
    134  
    135  
    136       hu_0(:,:) = 0.e0                          ! Reference ocean depth at U- and V-points 
    137       hv_0(:,:) = 0.e0 
    138       DO jk = 1, jpk 
    139          hu_0(:,:) = hu_0(:,:) + fse3u_0(:,:,jk) * umask(:,:,jk) 
    140          hv_0(:,:) = hv_0(:,:) + fse3v_0(:,:,jk) * vmask(:,:,jk) 
    141       END DO 
    142        
    143       DO jj = 1, jpjm1                          ! initialise before and now Sea Surface Height at u-, v-, f-points 
    144          DO ji = 1, jpim1   ! NO vector opt. 
    145             zcoefu = 0.50_wp / ( e1u(ji,jj) * e2u(ji,jj) ) * umask(ji,jj,1) 
    146             zcoefv = 0.50_wp / ( e1v(ji,jj) * e2v(ji,jj) ) * vmask(ji,jj,1) 
    147             zcoeff = 0.25_wp / ( e1f(ji,jj) * e2f(ji,jj) ) * umask(ji,jj,1) * umask(ji,jj+1,1) 
    148             ! 
    149             zvt           = e1e2t(ji  ,jj  ) * sshb(ji  ,jj  )    ! before fields 
    150             zvt_ip1       = e1e2t(ji+1,jj  ) * sshb(ji+1,jj  ) 
    151             zvt_jp1       = e1e2t(ji  ,jj+1) * sshb(ji  ,jj+1) 
    152             sshu_b(ji,jj) = zcoefu * ( zvt + zvt_ip1 ) 
    153             sshv_b(ji,jj) = zcoefv * ( zvt + zvt_jp1 ) 
    154             ! 
    155             zvt           = e1e2t(ji  ,jj  ) * sshn(ji  ,jj  )    ! now fields 
    156             zvt_ip1       = e1e2t(ji+1,jj  ) * sshn(ji+1,jj  ) 
    157             zvt_jp1       = e1e2t(ji  ,jj+1) * sshn(ji  ,jj+1) 
    158             zvt_ip1jp1    = e1e2t(ji+1,jj+1) * sshn(ji+1,jj+1) 
    159             sshu_n(ji,jj) = zcoefu * ( zvt + zvt_ip1 ) 
    160             sshv_n(ji,jj) = zcoefv * ( zvt + zvt_jp1 ) 
    161             sshf_n(ji,jj) = zcoeff * ( zvt + zvt_ip1 + zvt_jp1 + zvt_ip1jp1 ) 
    162          END DO 
    163       END DO 
    164       CALL lbc_lnk( sshu_n, 'U', 1. )   ;   CALL lbc_lnk( sshu_b, 'U', 1. )      ! lateral boundary conditions 
    165       CALL lbc_lnk( sshv_n, 'V', 1. )   ;   CALL lbc_lnk( sshv_b, 'V', 1. ) 
    166       CALL lbc_lnk( sshf_n, 'F', 1. ) 
    167       ! 
    168       CALL wrk_dealloc( jpi, jpj, zee_t, zee_u, zee_v, zee_f ) 
    169       ! 
    170       IF( nn_timing == 1 )  CALL timing_stop('dom_vvl') 
    171       ! 
    172    END SUBROUTINE dom_vvl 
    173  
    174  
    175    SUBROUTINE dom_vvl_2( kt, pe3u_b, pe3v_b ) 
    176       !!---------------------------------------------------------------------- 
    177       !!                ***  ROUTINE dom_vvl_2  *** 
    178       !!                    
    179       !! ** Purpose :   compute the vertical scale factors at u- and v-points 
    180       !!              in variable volume case. 
    181       !! 
    182       !! ** Method  :   In variable volume case (non linear sea surface) the  
    183       !!              the vertical scale factor at velocity points is computed 
    184       !!              as the average of the cell surface weighted e3t. 
    185       !!                It uses the sea surface heigth so it have to be initialized 
    186       !!              after ssh is read/set 
    187       !!---------------------------------------------------------------------- 
    188       INTEGER                   , INTENT(in   ) ::   kt               ! ocean time-step index 
    189       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pe3u_b, pe3v_b   ! before vertical scale factor at u- & v-pts 
    190       ! 
    191       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    192       INTEGER  ::   iku, ikv     ! local integers     
    193       INTEGER  ::   ii0, ii1, ij0, ij1   ! temporary integers 
    194       REAL(wp) ::   zvt, zvtip1, zvtjp1  ! local scalars 
    195       !!---------------------------------------------------------------------- 
    196       ! 
    197       IF( nn_timing == 1 )  CALL timing_start('dom_vvl_2') 
    198       ! 
    199       IF( lwp .AND. kt == nit000 ) THEN 
     894 
     895      ioptio = 0                      ! Parameter control 
     896      IF( ln_vvl_ztilde_as_zstar ) ln_vvl_ztilde = .true. 
     897      IF( ln_vvl_zstar           )        ioptio = ioptio + 1 
     898      IF( ln_vvl_ztilde          )        ioptio = ioptio + 1 
     899      IF( ln_vvl_layer           )        ioptio = ioptio + 1 
     900 
     901      IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE vertical coordinate in namelist nam_vvl' ) 
     902 
     903      IF(lwp) THEN                   ! Print the choice 
    200904         WRITE(numout,*) 
    201          WRITE(numout,*) 'dom_vvl_2 : Variable volume, fse3t_b initialization' 
    202          WRITE(numout,*) '~~~~~~~~~ ' 
    203          pe3u_b(:,:,jpk) = fse3u_0(:,:,jpk) 
    204          pe3v_b(:,:,jpk) = fse3v_0(:,:,jpk) 
     905         IF( ln_vvl_zstar           ) WRITE(numout,*) '              zstar vertical coordinate is used' 
     906         IF( ln_vvl_ztilde          ) WRITE(numout,*) '              ztilde vertical coordinate is used' 
     907         IF( ln_vvl_layer           ) WRITE(numout,*) '              layer vertical coordinate is used' 
     908         IF( ln_vvl_ztilde_as_zstar ) WRITE(numout,*) '              to emulate a zstar coordinate' 
     909         ! - ML - Option not developed yet 
     910         ! IF(       ln_vvl_kepe ) WRITE(numout,*) '              kinetic to potential energy transfer : option used' 
     911         ! IF( .NOT. ln_vvl_kepe ) WRITE(numout,*) '              kinetic to potential energy transfer : option not used' 
    205912      ENDIF 
    206        
    207       DO jk = 1, jpkm1           ! set the before scale factors at u- & v-points 
    208          DO jj = 2, jpjm1 
    209             DO ji = fs_2, fs_jpim1 
    210                zvt    = ( fse3t_b(ji  ,jj  ,jk) - fse3t_0(ji  ,jj  ,jk) ) * e1e2t(ji  ,jj  ) 
    211                zvtip1 = ( fse3t_b(ji+1,jj  ,jk) - fse3t_0(ji+1,jj  ,jk) ) * e1e2t(ji+1,jj  ) 
    212                zvtjp1 = ( fse3t_b(ji  ,jj+1,jk) - fse3t_0(ji  ,jj+1,jk) ) * e1e2t(ji  ,jj+1) 
    213                pe3u_b(ji,jj,jk) = fse3u_0(ji,jj,jk) + 0.5_wp * ( zvt + zvtip1 ) / ( e1u(ji,jj) * e2u(ji,jj) ) 
    214                pe3v_b(ji,jj,jk) = fse3v_0(ji,jj,jk) + 0.5_wp * ( zvt + zvtjp1 ) / ( e1v(ji,jj) * e2v(ji,jj) ) 
    215             END DO 
    216          END DO 
    217       END DO 
    218  
    219       ! Correct scale factors at locations that have been individually modified in domhgr 
    220       ! Such modifications break the relationship between e1e2t and e1u*e2u etc. Recompute 
    221       ! scale factors ignoring the modified metric. 
     913 
     914   END SUBROUTINE dom_vvl_ctl 
     915 
     916   SUBROUTINE dom_vvl_orca_fix( pe3_in, pe3_out, pout ) 
     917      !!--------------------------------------------------------------------- 
     918      !!                   ***  ROUTINE dom_vvl_orca_fix  *** 
     919      !!                      
     920      !! ** Purpose :   Correct surface weighted, horizontally interpolated,  
     921      !!                scale factors at locations that have been individually 
     922      !!                modified in domhgr. Such modifications break the 
     923      !!                relationship between e12t and e1u*e2u etc. 
     924      !!                Recompute some scale factors ignoring the modified metric. 
     925      !!---------------------------------------------------------------------- 
     926      !! * Arguments 
     927      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in    ) ::  pe3_in     ! input e3 to be interpolated 
     928      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) ::  pe3_out    ! output interpolated e3 
     929      CHARACTER(LEN=*), INTENT( in )                    ::  pout       ! grid point of out scale factors 
     930      !                                                                !   =  'U', 'V', 'W, 'F', 'UW' or 'VW' 
     931      !! * Local declarations 
     932      INTEGER ::   ji, jj, jk                                          ! dummy loop indices 
     933      INTEGER ::   ij0, ij1, ii0, ii1                                  ! dummy loop indices 
     934      !! acc 
     935      !! Hmm with the time splitting these "fixes" seem to do more harm than good. Temporarily disabled for 
     936      !! the ORCA2 tests (by changing jp_cfg test from 2 to 3) pending further investigations 
     937      !!  
    222938      !                                                ! ===================== 
    223939      IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration 
    224940         !                                             ! ===================== 
     941      !! acc 
    225942         IF( nn_cla == 0 ) THEN 
    226943            ! 
    227944            ii0 = 139   ;   ii1 = 140        ! Gibraltar Strait (e2u was modified) 
    228             ij0 = 102   ;   ij1 = 102    
    229             DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
     945            ij0 = 102   ;   ij1 = 102 
     946            DO jk = 1, jpkm1 
    230947               DO jj = mj0(ij0), mj1(ij1) 
    231948                  DO ji = mi0(ii0), mi1(ii1) 
    232                      zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    233                      pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
     949                     SELECT CASE ( pout ) 
     950                     CASE( 'U' ) 
     951                        pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     952                       &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     953                       &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     954                       &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     955                     CASE( 'F' ) 
     956                        pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     957                       &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     958                       &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     959                       &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     960                     END SELECT 
    234961                  END DO 
    235962               END DO 
     
    237964            ! 
    238965            ii0 = 160   ;   ii1 = 160        ! Bab el Mandeb (e2u and e1v were modified) 
    239             ij0 =  88   ;   ij1 =  88    
    240             DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
     966            ij0 =  88   ;   ij1 =  88 
     967            DO jk = 1, jpkm1 
    241968               DO jj = mj0(ij0), mj1(ij1) 
    242969                  DO ji = mi0(ii0), mi1(ii1) 
    243                      zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    244                      pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
     970                     SELECT CASE ( pout ) 
     971                     CASE( 'U' ) 
     972                        pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     973                       &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     974                       &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     975                       &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     976                     CASE( 'V' ) 
     977                        pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     978                       &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     979                       &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     980                       &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     981                     CASE( 'F' ) 
     982                        pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     983                       &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     984                       &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     985                       &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     986                     END SELECT 
    245987                  END DO 
    246988               END DO 
    247989            END DO 
    248             DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    249                DO jj = mj0(ij0), mj1(ij1) 
    250                   DO ji = mi0(ii0), mi1(ii1) 
    251                      zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    252                      pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    253                   END DO 
    254                END DO 
    255             END DO 
    256990         ENDIF 
    257991 
    258992         ii0 = 145   ;   ii1 = 146        ! Danish Straits (e2u was modified) 
    259          ij0 = 116   ;   ij1 = 116    
    260          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    261             DO jj = mj0(ij0), mj1(ij1) 
    262                DO ji = mi0(ii0), mi1(ii1) 
    263                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    264                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
    265                END DO 
    266             END DO 
    267          END DO 
    268          ! 
     993         ij0 = 116   ;   ij1 = 116 
     994         DO jk = 1, jpkm1 
     995            DO jj = mj0(ij0), mj1(ij1) 
     996               DO ji = mi0(ii0), mi1(ii1) 
     997                  SELECT CASE ( pout ) 
     998                  CASE( 'U' ) 
     999                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     1000                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1001                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1002                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1003                  CASE( 'F' ) 
     1004                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     1005                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1006                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1007                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1008                  END SELECT 
     1009               END DO 
     1010            END DO 
     1011         END DO 
    2691012      ENDIF 
     1013      ! 
    2701014         !                                             ! ===================== 
    2711015      IF( cp_cfg == "orca" .AND. jp_cfg == 1 ) THEN    ! ORCA R1 configuration 
    2721016         !                                             ! ===================== 
    273  
     1017         ! 
    2741018         ii0 = 281   ;   ii1 = 282        ! Gibraltar Strait (e2u was modified) 
    275          ij0 = 200   ;   ij1 = 200    
    276          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    277             DO jj = mj0(ij0), mj1(ij1) 
    278                DO ji = mi0(ii0), mi1(ii1) 
    279                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    280                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
    281                END DO 
    282             END DO 
    283          END DO 
    284  
     1019         ij0 = 200   ;   ij1 = 200 
     1020         DO jk = 1, jpkm1 
     1021            DO jj = mj0(ij0), mj1(ij1) 
     1022               DO ji = mi0(ii0), mi1(ii1) 
     1023                  SELECT CASE ( pout ) 
     1024                  CASE( 'U' ) 
     1025                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     1026                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1027                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1028                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1029                  CASE( 'F' ) 
     1030                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     1031                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1032                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1033                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1034                  END SELECT 
     1035               END DO 
     1036            END DO 
     1037         END DO 
     1038         ! 
    2851039         ii0 = 314   ;   ii1 = 315        ! Bhosporus Strait (e2u was modified) 
    286          ij0 = 208   ;   ij1 = 208    
    287          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    288             DO jj = mj0(ij0), mj1(ij1) 
    289                DO ji = mi0(ii0), mi1(ii1) 
    290                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    291                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
    292                END DO 
    293             END DO 
    294          END DO 
    295  
     1040         ij0 = 208   ;   ij1 = 208 
     1041         DO jk = 1, jpkm1 
     1042            DO jj = mj0(ij0), mj1(ij1) 
     1043               DO ji = mi0(ii0), mi1(ii1) 
     1044                  SELECT CASE ( pout ) 
     1045                  CASE( 'U' ) 
     1046                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        &   
     1047                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1048                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1049                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1050                  CASE( 'F' ) 
     1051                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    &   
     1052                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1053                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1054                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1055                  END SELECT 
     1056               END DO 
     1057            END DO 
     1058         END DO 
     1059         ! 
    2961060         ii0 =  44   ;   ii1 =  44        ! Lombok Strait (e1v was modified) 
    297          ij0 = 124   ;   ij1 = 125    
    298          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    299             DO jj = mj0(ij0), mj1(ij1) 
    300                DO ji = mi0(ii0), mi1(ii1) 
    301                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    302                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    303                END DO 
    304             END DO 
    305          END DO 
    306  
     1061         ij0 = 124   ;   ij1 = 125 
     1062         DO jk = 1, jpkm1 
     1063            DO jj = mj0(ij0), mj1(ij1) 
     1064               DO ji = mi0(ii0), mi1(ii1) 
     1065                  SELECT CASE ( pout ) 
     1066                  CASE( 'V' ) 
     1067                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1068                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1069                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1070                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1071                  END SELECT 
     1072               END DO 
     1073            END DO 
     1074         END DO 
     1075         ! 
    3071076         ii0 =  48   ;   ii1 =  48        ! Sumba Strait (e1v was modified) [closed from bathy_11 on] 
    308          ij0 = 124   ;   ij1 = 125    
    309          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    310             DO jj = mj0(ij0), mj1(ij1) 
    311                DO ji = mi0(ii0), mi1(ii1) 
    312                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    313                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    314                END DO 
    315             END DO 
    316          END DO 
    317  
     1077         ij0 = 124   ;   ij1 = 125 
     1078         DO jk = 1, jpkm1 
     1079            DO jj = mj0(ij0), mj1(ij1) 
     1080               DO ji = mi0(ii0), mi1(ii1) 
     1081                  SELECT CASE ( pout ) 
     1082                  CASE( 'V' ) 
     1083                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1084                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1085                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1086                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1087                  END SELECT 
     1088               END DO 
     1089            END DO 
     1090         END DO 
     1091         ! 
    3181092         ii0 =  53   ;   ii1 =  53        ! Ombai Strait (e1v was modified) 
    319          ij0 = 124   ;   ij1 = 125    
    320          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    321             DO jj = mj0(ij0), mj1(ij1) 
    322                DO ji = mi0(ii0), mi1(ii1) 
    323                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    324                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    325                END DO 
    326             END DO 
    327          END DO 
    328  
     1093         ij0 = 124   ;   ij1 = 125 
     1094         DO jk = 1, jpkm1 
     1095            DO jj = mj0(ij0), mj1(ij1) 
     1096               DO ji = mi0(ii0), mi1(ii1) 
     1097                  SELECT CASE ( pout ) 
     1098                  CASE( 'V' ) 
     1099                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1100                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1101                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1102                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1103                  END SELECT 
     1104               END DO 
     1105            END DO 
     1106         END DO 
     1107         ! 
    3291108         ii0 =  56   ;   ii1 =  56        ! Timor Passage (e1v was modified) 
    330          ij0 = 124   ;   ij1 = 125    
    331          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    332             DO jj = mj0(ij0), mj1(ij1) 
    333                DO ji = mi0(ii0), mi1(ii1) 
    334                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    335                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    336                END DO 
    337             END DO 
    338          END DO 
    339  
     1109         ij0 = 124   ;   ij1 = 125 
     1110         DO jk = 1, jpkm1 
     1111            DO jj = mj0(ij0), mj1(ij1) 
     1112               DO ji = mi0(ii0), mi1(ii1) 
     1113                  SELECT CASE ( pout ) 
     1114                  CASE( 'V' ) 
     1115                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1116                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1117                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1118                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1119                  END SELECT 
     1120               END DO 
     1121            END DO 
     1122         END DO 
     1123         ! 
    3401124         ii0 =  55   ;   ii1 =  55        ! West Halmahera Strait (e1v was modified) 
    341          ij0 = 141   ;   ij1 = 142    
    342          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    343             DO jj = mj0(ij0), mj1(ij1) 
    344                DO ji = mi0(ii0), mi1(ii1) 
    345                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    346                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    347                END DO 
    348             END DO 
    349          END DO 
    350  
     1125         ij0 = 141   ;   ij1 = 142 
     1126         DO jk = 1, jpkm1 
     1127            DO jj = mj0(ij0), mj1(ij1) 
     1128               DO ji = mi0(ii0), mi1(ii1) 
     1129                  SELECT CASE ( pout ) 
     1130                  CASE( 'V' ) 
     1131                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1132                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1133                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1134                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1135                  END SELECT 
     1136               END DO 
     1137            END DO 
     1138         END DO 
     1139         ! 
    3511140         ii0 =  58   ;   ii1 =  58        ! East Halmahera Strait (e1v was modified) 
    352          ij0 = 141   ;   ij1 = 142    
    353          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    354             DO jj = mj0(ij0), mj1(ij1) 
    355                DO ji = mi0(ii0), mi1(ii1) 
    356                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    357                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    358                END DO 
    359             END DO 
    360          END DO 
    361  
    362          ! 
     1141         ij0 = 141   ;   ij1 = 142 
     1142         DO jk = 1, jpkm1 
     1143            DO jj = mj0(ij0), mj1(ij1) 
     1144               DO ji = mi0(ii0), mi1(ii1) 
     1145                  SELECT CASE ( pout ) 
     1146                  CASE( 'V' ) 
     1147                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1148                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1149                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1150                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1151                  END SELECT 
     1152               END DO 
     1153            END DO 
     1154         END DO 
    3631155      ENDIF 
    364       !                                                ! ====================== 
     1156         !                                             ! ===================== 
    3651157      IF( cp_cfg == "orca" .AND. jp_cfg == 05 ) THEN   ! ORCA R05 configuration 
    366          !                                             ! ====================== 
     1158         !                                             ! ===================== 
     1159         ! 
    3671160         ii0 = 563   ;   ii1 = 564        ! Gibraltar Strait (e2u was modified) 
    368          ij0 = 327   ;   ij1 = 327    
    369          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    370             DO jj = mj0(ij0), mj1(ij1) 
    371                DO ji = mi0(ii0), mi1(ii1) 
    372                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    373                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
    374                END DO 
    375             END DO 
    376          END DO 
    377          ! 
    378          ii0 = 627   ;   ii1 = 628        ! Bosphore Strait (e2u was modified) 
    379          ij0 = 343   ;   ij1 = 343    
    380          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    381             DO jj = mj0(ij0), mj1(ij1) 
    382                DO ji = mi0(ii0), mi1(ii1) 
    383                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    384                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
     1161         ij0 = 327   ;   ij1 = 327 
     1162         DO jk = 1, jpkm1 
     1163            DO jj = mj0(ij0), mj1(ij1) 
     1164               DO ji = mi0(ii0), mi1(ii1) 
     1165                  SELECT CASE ( pout ) 
     1166                  CASE( 'U' ) 
     1167                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     1168                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1169                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1170                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1171                  CASE( 'F' ) 
     1172                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     1173                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1174                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1175                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1176                  END SELECT 
     1177               END DO 
     1178            END DO 
     1179         END DO 
     1180         ! 
     1181         ii0 = 627   ;   ii1 = 628        ! Bosphorus Strait (e2u was modified) 
     1182         ij0 = 343   ;   ij1 = 343 
     1183         DO jk = 1, jpkm1 
     1184            DO jj = mj0(ij0), mj1(ij1) 
     1185               DO ji = mi0(ii0), mi1(ii1) 
     1186                  SELECT CASE ( pout ) 
     1187                  CASE( 'U' ) 
     1188                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        &   
     1189                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1190                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1191                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1192                  CASE( 'F' ) 
     1193                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    &   
     1194                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1195                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1196                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1197                  END SELECT 
    3851198               END DO 
    3861199            END DO 
     
    3881201         ! 
    3891202         ii0 =  93   ;   ii1 =  94        ! Sumba Strait (e2u was modified) 
    390          ij0 = 232   ;   ij1 = 232    
    391          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    392             DO jj = mj0(ij0), mj1(ij1) 
    393                DO ji = mi0(ii0), mi1(ii1) 
    394                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    395                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
     1203         ij0 = 232   ;   ij1 = 232 
     1204         DO jk = 1, jpkm1 
     1205            DO jj = mj0(ij0), mj1(ij1) 
     1206               DO ji = mi0(ii0), mi1(ii1) 
     1207                  SELECT CASE ( pout ) 
     1208                  CASE( 'U' ) 
     1209                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     1210                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1211                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1212                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1213                  CASE( 'F' ) 
     1214                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     1215                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1216                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1217                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1218                  END SELECT 
    3961219               END DO 
    3971220            END DO 
     
    3991222         ! 
    4001223         ii0 = 103   ;   ii1 = 103        ! Ombai Strait (e2u was modified) 
    401          ij0 = 232   ;   ij1 = 232    
    402          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    403             DO jj = mj0(ij0), mj1(ij1) 
    404                DO ji = mi0(ii0), mi1(ii1) 
    405                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    406                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
     1224         ij0 = 232   ;   ij1 = 232 
     1225         DO jk = 1, jpkm1 
     1226            DO jj = mj0(ij0), mj1(ij1) 
     1227               DO ji = mi0(ii0), mi1(ii1) 
     1228                  SELECT CASE ( pout ) 
     1229                  CASE( 'U' ) 
     1230                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     1231                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1232                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1233                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1234                  CASE( 'F' ) 
     1235                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     1236                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1237                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1238                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1239                  END SELECT 
    4071240               END DO 
    4081241            END DO 
     
    4101243         ! 
    4111244         ii0 =  15   ;   ii1 =  15        ! Palk Strait (e2u was modified) 
    412          ij0 = 270   ;   ij1 = 270    
    413          DO jk = 1, jpkm1                 ! set the before scale factors at u-points 
    414             DO jj = mj0(ij0), mj1(ij1) 
    415                DO ji = mi0(ii0), mi1(ii1) 
    416                   zvt = fse3t_b(ji,jj,jk) * e1t(ji,jj) 
    417                   pe3u_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji+1,jj,jk) * e1t(ji+1,jj) ) / ( e1u(ji,jj) ) 
     1245         ij0 = 270   ;   ij1 = 270 
     1246         DO jk = 1, jpkm1 
     1247            DO jj = mj0(ij0), mj1(ij1) 
     1248               DO ji = mi0(ii0), mi1(ii1) 
     1249                  SELECT CASE ( pout ) 
     1250                  CASE( 'U' ) 
     1251                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk)                                        & 
     1252                    &                    * (   e1t(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3t_0(ji  ,jj,jk) ) & 
     1253                    &                    +     e1t(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3t_0(ji+1,jj,jk) ) & 
     1254                    &                      ) / e1u(ji,jj)   +   e3u_0(ji,jj,jk) 
     1255                  CASE( 'F' ) 
     1256                     pe3_out(ji,jj,jk) = 0.5_wp * umask(ji,jj,jk) * umask(ji,jj+1,jk)                    & 
     1257                    &                    * (   e1u(ji  ,jj) * ( pe3_in(ji  ,jj,jk) - e3u_0(ji  ,jj,jk) ) & 
     1258                    &                    +     e1u(ji+1,jj) * ( pe3_in(ji+1,jj,jk) - e3u_0(ji+1,jj,jk) ) & 
     1259                    &                      ) / e1f(ji,jj)   +   e3f_0(ji,jj,jk) 
     1260                  END SELECT 
    4181261               END DO 
    4191262            END DO 
     
    4211264         ! 
    4221265         ii0 =  87   ;   ii1 =  87        ! Lombok Strait (e1v was modified) 
    423          ij0 = 232   ;   ij1 = 233    
    424          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    425             DO jj = mj0(ij0), mj1(ij1) 
    426                DO ji = mi0(ii0), mi1(ii1) 
    427                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    428                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
     1266         ij0 = 232   ;   ij1 = 233 
     1267         DO jk = 1, jpkm1 
     1268            DO jj = mj0(ij0), mj1(ij1) 
     1269               DO ji = mi0(ii0), mi1(ii1) 
     1270                  SELECT CASE ( pout ) 
     1271                  CASE( 'V' ) 
     1272                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1273                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1274                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1275                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1276                  END SELECT 
    4291277               END DO 
    4301278            END DO 
     
    4321280         ! 
    4331281         ii0 = 662   ;   ii1 = 662        ! Bab el Mandeb (e1v was modified) 
    434          ij0 = 276   ;   ij1 = 276    
    435          DO jk = 1, jpkm1                 ! set the before scale factors at v-points 
    436             DO jj = mj0(ij0), mj1(ij1) 
    437                DO ji = mi0(ii0), mi1(ii1) 
    438                   zvt = fse3t_b(ji,jj,jk) * e2t(ji,jj) 
    439                   pe3v_b(ji,jj,jk) = 0.5_wp * ( zvt + fse3t_b(ji,jj+1,jk) * e2t(ji,jj+1) ) / ( e2v(ji,jj) ) 
    440                END DO 
    441             END DO 
    442          END DO 
    443          ! 
     1282         ij0 = 276   ;   ij1 = 276 
     1283         DO jk = 1, jpkm1 
     1284            DO jj = mj0(ij0), mj1(ij1) 
     1285               DO ji = mi0(ii0), mi1(ii1) 
     1286                  SELECT CASE ( pout ) 
     1287                  CASE( 'V' ) 
     1288                     pe3_out(ji,jj,jk) = 0.5_wp * vmask(ji,jj,jk)                                        & 
     1289                    &                    * (   e2t(ji,jj  ) * ( pe3_in(ji,jj  ,jk) - e3t_0(ji,jj  ,jk) ) & 
     1290                    &                    +     e2t(ji,jj+1) * ( pe3_in(ji,jj+1,jk) - e3t_0(ji,jj+1,jk) ) & 
     1291                    &                      ) / e2v(ji,jj)   +   e3v_0(ji,jj,jk) 
     1292                  END SELECT 
     1293               END DO 
     1294            END DO 
     1295         END DO 
    4441296      ENDIF 
    445       ! End of individual corrections to scale factors 
    446  
    447       IF( ln_zps ) THEN          ! minimum of the e3t at partial cell level 
    448          DO jj = 2, jpjm1 
    449             DO ji = fs_2, fs_jpim1 
    450                iku = mbku(ji,jj) 
    451                ikv = mbkv(ji,jj) 
    452                pe3u_b(ji,jj,iku) = MIN( fse3t_b(ji,jj,iku), fse3t_b(ji+1,jj  ,iku) )  
    453                pe3v_b(ji,jj,ikv) = MIN( fse3t_b(ji,jj,ikv), fse3t_b(ji  ,jj+1,ikv) )  
    454             END DO 
    455          END DO 
    456       ENDIF 
    457  
    458       pe3u_b(:,:,:) = pe3u_b(:,:,:) - fse3u_0(:,:,:)      ! anomaly to avoid zero along closed boundary/extra halos 
    459       pe3v_b(:,:,:) = pe3v_b(:,:,:) - fse3v_0(:,:,:) 
    460       CALL lbc_lnk( pe3u_b(:,:,:), 'U', 1. )               ! lateral boundary conditions 
    461       CALL lbc_lnk( pe3v_b(:,:,:), 'V', 1. ) 
    462       pe3u_b(:,:,:) = pe3u_b(:,:,:) + fse3u_0(:,:,:)      ! recover the full scale factor 
    463       pe3v_b(:,:,:) = pe3v_b(:,:,:) + fse3v_0(:,:,:) 
    464       ! 
    465       IF( nn_timing == 1 )  CALL timing_stop('dom_vvl_2') 
    466       ! 
    467    END SUBROUTINE dom_vvl_2 
    468     
    469 #else 
    470    !!---------------------------------------------------------------------- 
    471    !!   Default option :                                      Empty routine 
    472    !!---------------------------------------------------------------------- 
    473 CONTAINS 
    474    SUBROUTINE dom_vvl 
    475    END SUBROUTINE dom_vvl 
    476    SUBROUTINE dom_vvl_2(kdum, pudum, pvdum ) 
    477       USE par_kind 
    478       INTEGER                   , INTENT(in   ) ::   kdum        
    479       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pudum, pvdum 
    480    END SUBROUTINE dom_vvl_2 
    481 #endif 
     1297   END SUBROUTINE dom_vvl_orca_fix 
    4821298 
    4831299   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.