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 6043 for branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

Ignore:
Timestamp:
2015-12-14T10:27:28+01:00 (8 years ago)
Author:
timgraham
Message:

Merged head of trunk into branch

Location:
branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN
Files:
7 deleted
16 edited
2 copied

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv.F90

    r5600 r6043  
    7676      CASE ( 3 )    
    7777                      CALL dyn_adv_ubs ( kt )               ! 3rd order UBS      scheme 
    78       ! 
    79       CASE (-1 )                                            ! esopa: test all possibility with control print 
    80                       CALL dyn_keg     ( kt, nn_dynkeg ) 
    81                       CALL dyn_zad     ( kt ) 
    82                       CALL dyn_adv_cen2( kt ) 
    83                       CALL dyn_adv_ubs ( kt ) 
    8478      END SELECT 
    8579      ! 
     
    126120      IF( ln_dynadv_cen2 )   ioptio = ioptio + 1 
    127121      IF( ln_dynadv_ubs  )   ioptio = ioptio + 1 
    128       IF( lk_esopa       )   ioptio =          1 
    129122 
    130123      IF( ioptio /= 1 )   CALL ctl_stop( 'Choose ONE advection scheme in namelist namdyn_adv' ) 
     
    139132      IF( ln_dynadv_cen2 )   nadv =  2 
    140133      IF( ln_dynadv_ubs  )   nadv =  3 
    141       IF( lk_esopa       )   nadv = -1 
    142134 
    143135      IF(lwp) THEN                    ! Print the choice 
     
    151143         IF( nadv ==  2 )   WRITE(numout,*) '         flux form   : 2nd order scheme is used' 
    152144         IF( nadv ==  3 )   WRITE(numout,*) '         flux form   : UBS       scheme is used' 
    153          IF( nadv == -1 )   WRITE(numout,*) '         esopa test: use all advection formulation' 
    154145      ENDIF 
    155146      ! 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_cen2.F90

    r5034 r6043  
    9090         DO jj = 2, jpjm1                          ! divergence of horizontal momentum fluxes 
    9191            DO ji = fs_2, fs_jpim1   ! vector opt. 
    92                zbu = e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) 
    93                zbv = e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) 
     92               zbu = e1e2u(ji,jj) * fse3u(ji,jj,jk) 
     93               zbv = e1e2v(ji,jj) * fse3v(ji,jj,jk) 
    9494               ! 
    9595               ua(ji,jj,jk) = ua(ji,jj,jk) - (  zfu_t(ji+1,jj  ,jk) - zfu_t(ji  ,jj  ,jk)    & 
     
    114114      DO jk = 1, jpkm1                       ! ==================== ! 
    115115         !                                         ! Vertical volume fluxesÊ 
    116          zfw(:,:,jk) = 0.25 * e1t(:,:) * e2t(:,:) * wn(:,:,jk) 
     116         zfw(:,:,jk) = 0.25 * e1e2t(:,:) * wn(:,:,jk) 
    117117         ! 
    118118         IF( jk == 1 ) THEN                        ! surface/bottom advective fluxes                    
     
    144144            DO ji = fs_2, fs_jpim1   ! vector opt. 
    145145               ua(ji,jj,jk) =  ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) )    & 
    146                   &  / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     146                  &  / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
    147147               va(ji,jj,jk) =  va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) )    & 
    148                   &  / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 
     148                  &  / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    149149            END DO 
    150150         END DO 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_ubs.F90

    r5600 r6043  
    181181         DO jj = 2, jpjm1                          ! divergence of horizontal momentum fluxes 
    182182            DO ji = fs_2, fs_jpim1   ! vector opt. 
    183                zbu = e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) 
    184                zbv = e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) 
     183               zbu = e1e2u(ji,jj) * fse3u(ji,jj,jk) 
     184               zbv = e1e2v(ji,jj) * fse3v(ji,jj,jk) 
    185185               ! 
    186186               ua(ji,jj,jk) = ua(ji,jj,jk) - (  zfu_t(ji+1,jj  ,jk) - zfu_t(ji  ,jj  ,jk)    & 
     
    203203      DO jk = 1, jpkm1                       ! ==================== ! 
    204204         !                                         ! Vertical volume fluxesÊ 
    205          zfw(:,:,jk) = 0.25 * e1t(:,:) * e2t(:,:) * wn(:,:,jk) 
     205         zfw(:,:,jk) = 0.25 * e1e2t(:,:) * wn(:,:,jk) 
    206206         ! 
    207207         IF( jk == 1 ) THEN                        ! surface/bottom advective fluxes                    
     
    233233            DO ji = fs_2, fs_jpim1   ! vector opt. 
    234234               ua(ji,jj,jk) =  ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) )    & 
    235                   &  / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     235                  &  / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
    236236               va(ji,jj,jk) =  va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) )    & 
    237                   &  / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 
     237                  &  / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    238238            END DO 
    239239         END DO 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r5600 r6043  
    3636   USE trd_oce         ! trends: ocean variables 
    3737   USE trddyn          ! trend manager: dynamics 
     38!jc   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
    3839   ! 
    3940   USE in_out_manager  ! I/O manager 
     
    5859   LOGICAL , PUBLIC ::   ln_hpg_prj      !: s-coordinate (Pressure Jacobian scheme) 
    5960   LOGICAL , PUBLIC ::   ln_hpg_isf      !: s-coordinate similar to sco modify for isf 
    60    LOGICAL , PUBLIC ::   ln_dynhpg_imp   !: semi-implicite hpg flag 
    6161 
    6262   INTEGER , PUBLIC ::   nhpg  =  0   ! = 0 to 7, type of pressure gradient scheme used ! (deduced from ln_hpg_... flags) (PUBLIC for TAM) 
     
    132132      !! 
    133133      NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco,     & 
    134          &                 ln_hpg_djc, ln_hpg_prj, ln_hpg_isf, ln_dynhpg_imp 
     134         &                 ln_hpg_djc, ln_hpg_prj, ln_hpg_isf 
    135135      !!---------------------------------------------------------------------- 
    136136      ! 
     
    155155         WRITE(numout,*) '      s-coord. (Density Jacobian: Cubic polynomial)     ln_hpg_djc    = ', ln_hpg_djc 
    156156         WRITE(numout,*) '      s-coord. (Pressure Jacobian: Cubic polynomial)    ln_hpg_prj    = ', ln_hpg_prj 
    157          WRITE(numout,*) '      time stepping: centered (F) or semi-implicit (T)  ln_dynhpg_imp = ', ln_dynhpg_imp 
    158157      ENDIF 
    159158      ! 
     
    293292      ENDIF 
    294293 
     294      ! Partial steps: bottom before horizontal gradient of t, s, rd at the last ocean level 
     295!jc      CALL zps_hde    ( kt, jpts, tsn, gtsu, gtsv, rhd, gru , grv ) 
    295296 
    296297      ! Local constant initialization 
     
    491492      ! iniitialised to 0. zhpi zhpi  
    492493      zhpi(:,:,:)=0._wp ; zhpj(:,:,:)=0._wp 
     494 
     495      ! Partial steps: top & bottom before horizontal gradient 
     496!jc      CALL zps_hde_isf( kt, jpts, tsn, gtsu, gtsv, gtui, gtvi,   &  
     497!jc               &       rhd, gru , grv , aru , arv , gzu , gzv , ge3ru , ge3rv ,   & 
     498!jc               &      grui, grvi, arui, arvi, gzui, gzvi, ge3rui, ge3rvi  ) 
    493499 
    494500!==================================================================================      
     
    10461052      DO jj = 2, jpjm1 
    10471053        DO ji = 2, jpim1 
    1048           zsshu_n(ji,jj) = (e12u(ji,jj) * sshn(ji,jj) + e12u(ji+1, jj) * sshn(ji+1,jj)) * & 
    1049                          & r1_e12u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1050           zsshv_n(ji,jj) = (e12v(ji,jj) * sshn(ji,jj) + e12v(ji+1, jj) * sshn(ji,jj+1)) * & 
    1051                          & r1_e12v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
     1054          zsshu_n(ji,jj) = (e1e2u(ji,jj) * sshn(ji,jj) + e1e2u(ji+1, jj) * sshn(ji+1,jj)) * & 
     1055                         & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
     1056          zsshv_n(ji,jj) = (e1e2v(ji,jj) * sshn(ji,jj) + e1e2v(ji+1, jj) * sshn(ji,jj+1)) * & 
     1057                         & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    10521058        END DO 
    10531059      END DO 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90

    r5034 r6043  
    44   !! Ocean physics:  lateral diffusivity trends  
    55   !!===================================================================== 
    6    !! History :  9.0  !  05-11  (G. Madec)  Original code (new step architecture) 
     6   !! History :  2.0  ! 2005-11  (G. Madec)  Original code (new step architecture) 
     7   !!            3.7  ! 2014-01  (F. Lemarie, G. Madec)  restructuration/simplification of ahm specification, 
     8   !!                 !                                  add velocity dependent coefficient and optional read in file 
    79   !!---------------------------------------------------------------------- 
    810 
     
    1416   USE dom_oce        ! ocean space and time domain 
    1517   USE phycst         ! physical constants 
    16    USE ldfdyn_oce     ! ocean dynamics lateral physics 
    17    USE ldftra_oce     ! ocean tracers  lateral physics 
    18    USE ldfslp         ! lateral mixing: slopes of mixing orientation 
    19    USE dynldf_bilapg  ! lateral mixing            (dyn_ldf_bilapg routine) 
    20    USE dynldf_bilap   ! lateral mixing            (dyn_ldf_bilap  routine) 
    21    USE dynldf_iso     ! lateral mixing            (dyn_ldf_iso    routine) 
    22    USE dynldf_lap     ! lateral mixing            (dyn_ldf_lap    routine) 
     18   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. 
     19   USE ldfslp         ! lateral diffusion: slopes of mixing orientation 
     20   USE dynldf_lap_blp ! lateral mixing   (dyn_ldf_lap & dyn_ldf_blp routines) 
     21   USE dynldf_iso     ! lateral mixing                 (dyn_ldf_iso routine ) 
    2322   USE trd_oce        ! trends: ocean variables 
    24    USE trddyn         ! trend manager: dynamics   (trd_dyn        routine) 
     23   USE trddyn         ! trend manager: dynamics   (trd_dyn      routine) 
    2524   ! 
    2625   USE prtctl         ! Print control 
     
    2827   USE lib_mpp        ! distribued memory computing library 
    2928   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    30    USE wrk_nemo        ! Memory Allocation 
    31    USE timing          ! Timing 
     29   USE wrk_nemo       ! Memory Allocation 
     30   USE timing         ! Timing 
    3231 
    3332   IMPLICIT NONE 
     
    3736   PUBLIC   dyn_ldf_init  ! called by opa  module  
    3837 
    39    INTEGER ::   nldf = -2   ! type of lateral diffusion used defined from ln_dynldf_... namlist logicals) 
     38   !                      ! Flag to control the type of lateral viscous operator 
     39   INTEGER, PARAMETER, PUBLIC ::   np_ERROR  =-10   ! error in setting the operator 
     40   INTEGER, PARAMETER, PUBLIC ::   np_no_ldf = 00   ! without operator (i.e. no lateral viscous trend) 
     41   !                          !!      laplacian     !    bilaplacian    ! 
     42   INTEGER, PARAMETER, PUBLIC ::   np_lap    = 10   ,   np_blp    = 20  ! iso-level operator 
     43   INTEGER, PARAMETER, PUBLIC ::   np_lap_i  = 11                       ! iso-neutral or geopotential operator 
     44 
     45   INTEGER ::   nldf   ! type of lateral diffusion used defined from ln_dynldf_... (namlist logicals) 
    4046 
    4147   !! * Substitutions 
     
    4349#  include "vectopt_loop_substitute.h90" 
    4450   !!---------------------------------------------------------------------- 
    45    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     51   !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
    4652   !! $Id$ 
    4753   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    6268      IF( nn_timing == 1 )  CALL timing_start('dyn_ldf') 
    6369      ! 
    64       IF( l_trddyn )   THEN                      ! temporary save of ta and sa trends 
    65          CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv ) 
     70      IF( l_trddyn )   THEN                      ! temporary save of momentum trends 
     71         CALL wrk_alloc( jpi,jpj,jpk,  ztrdu, ztrdv ) 
    6672         ztrdu(:,:,:) = ua(:,:,:)  
    6773         ztrdv(:,:,:) = va(:,:,:)  
     
    7076      SELECT CASE ( nldf )                       ! compute lateral mixing trend and add it to the general trend 
    7177      ! 
    72       CASE ( 0 )    ;   CALL dyn_ldf_lap    ( kt )      ! iso-level laplacian 
    73       CASE ( 1 )    ;   CALL dyn_ldf_iso    ( kt )      ! rotated laplacian (except dk[ dk[.] ] part) 
    74       CASE ( 2 )    ;   CALL dyn_ldf_bilap  ( kt )      ! iso-level bilaplacian 
    75       CASE ( 3 )    ;   CALL dyn_ldf_bilapg ( kt )      ! s-coord. horizontal bilaplacian 
    76       CASE ( 4 )                                        ! iso-level laplacian + bilaplacian 
    77          CALL dyn_ldf_lap    ( kt ) 
    78          CALL dyn_ldf_bilap  ( kt ) 
    79       CASE ( 5 )                                        ! rotated laplacian + bilaplacian (s-coord) 
    80          CALL dyn_ldf_iso    ( kt ) 
    81          CALL dyn_ldf_bilapg ( kt ) 
     78      CASE ( np_lap   )    ;   CALL dyn_ldf_lap  ( kt, ub, vb, ua, va, 1 )      ! iso-level    laplacian 
     79      CASE ( np_lap_i )    ;   CALL dyn_ldf_iso  ( kt )                         ! rotated      laplacian 
     80      CASE ( np_blp   )    ;   CALL dyn_ldf_blp  ( kt, ub, vb, ua, va    )      ! iso-level bi-laplacian 
    8281      ! 
    83       CASE ( -1 )                                       ! esopa: test all possibility with control print 
    84                         CALL dyn_ldf_lap    ( kt ) 
    85                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf0 - Ua: ', mask1=umask,   & 
    86             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    87                         CALL dyn_ldf_iso    ( kt ) 
    88                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf1 - Ua: ', mask1=umask,   & 
    89             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    90                         CALL dyn_ldf_bilap  ( kt ) 
    91                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf2 - Ua: ', mask1=umask,   & 
    92             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    93                         CALL dyn_ldf_bilapg ( kt ) 
    94                         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask,   & 
    95             &                         tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    96       ! 
    97       CASE ( -2 )                                       ! neither laplacian nor bilaplacian schemes used 
    98          IF( kt == nit000 ) THEN 
    99             IF(lwp) WRITE(numout,*) 
    100             IF(lwp) WRITE(numout,*) 'dyn_ldf : no lateral diffusion on momentum setup' 
    101             IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    102          ENDIF 
    10382      END SELECT 
    10483 
     
    10786         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    10887         CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 
    109          CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 
     88         CALL wrk_dealloc( jpi,jpj,jpk,  ztrdu, ztrdv ) 
    11089      ENDIF 
    11190      !                                          ! print sum trends (used for debugging) 
     
    126105      INTEGER ::   ioptio, ierr         ! temporary integers  
    127106      !!---------------------------------------------------------------------- 
    128      
     107      ! 
    129108      !                                   ! Namelist nam_dynldf: already read in ldfdyn module 
    130  
     109      ! 
    131110      IF(lwp) THEN                        ! Namelist print 
    132111         WRITE(numout,*) 
     
    134113         WRITE(numout,*) '~~~~~~~~~~~' 
    135114         WRITE(numout,*) '       Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)' 
    136          WRITE(numout,*) '          laplacian operator          ln_dynldf_lap   = ', ln_dynldf_lap 
    137          WRITE(numout,*) '          bilaplacian operator        ln_dynldf_bilap = ', ln_dynldf_bilap 
    138          WRITE(numout,*) '          iso-level                   ln_dynldf_level = ', ln_dynldf_level 
    139          WRITE(numout,*) '          horizontal (geopotential)   ln_dynldf_hor   = ', ln_dynldf_hor 
    140          WRITE(numout,*) '          iso-neutral                 ln_dynldf_iso   = ', ln_dynldf_iso 
     115         WRITE(numout,*) '          laplacian operator          ln_dynldf_lap = ', ln_dynldf_lap 
     116         WRITE(numout,*) '          bilaplacian operator        ln_dynldf_blp = ', ln_dynldf_blp 
     117         WRITE(numout,*) '          iso-level                   ln_dynldf_lev = ', ln_dynldf_lev 
     118         WRITE(numout,*) '          horizontal (geopotential)   ln_dynldf_hor = ', ln_dynldf_hor 
     119         WRITE(numout,*) '          iso-neutral                 ln_dynldf_iso = ', ln_dynldf_iso 
    141120      ENDIF 
    142  
    143       !                                   ! control the consistency 
     121      !                                   ! use of lateral operator or not 
     122      nldf = np_ERROR 
    144123      ioptio = 0 
    145       IF( ln_dynldf_lap   )   ioptio = ioptio + 1 
    146       IF( ln_dynldf_bilap )   ioptio = ioptio + 1 
    147       IF( ioptio <  1 ) CALL ctl_warn( '          neither laplacian nor bilaplacian operator set for dynamics' ) 
    148       ioptio = 0 
    149       IF( ln_dynldf_level )   ioptio = ioptio + 1 
    150       IF( ln_dynldf_hor   )   ioptio = ioptio + 1 
    151       IF( ln_dynldf_iso   )   ioptio = ioptio + 1 
    152       IF( ioptio >  1 ) CALL ctl_stop( '          use only ONE direction (level/hor/iso)' ) 
    153  
    154       IF( ln_dynldf_iso .AND. ln_traldf_hor ) CALL ctl_stop & 
    155       &   ( 'Not sensible to use geopotential diffusion for tracers with isoneutral diffusion for dynamics' ) 
    156  
    157       !                                   ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 
    158       ierr = 0 
    159       IF ( ln_dynldf_lap ) THEN      ! laplacian operator 
    160          IF ( ln_zco ) THEN                ! z-coordinate 
    161             IF ( ln_dynldf_level )   nldf = 0      ! iso-level  (no rotation) 
    162             IF ( ln_dynldf_hor   )   nldf = 0      ! horizontal (no rotation) 
    163             IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation) 
     124      IF( ln_dynldf_lap )   ioptio = ioptio + 1 
     125      IF( ln_dynldf_blp )   ioptio = ioptio + 1 
     126      IF( ioptio >  1   )   CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' ) 
     127      IF( ioptio == 0   )   nldf = np_no_ldf     ! No lateral mixing operator 
     128      ! 
     129      IF( nldf /= np_no_ldf ) THEN        ! direction ==>> type of operator   
     130         ioptio = 0 
     131         IF( ln_dynldf_lev )   ioptio = ioptio + 1 
     132         IF( ln_dynldf_hor )   ioptio = ioptio + 1 
     133         IF( ln_dynldf_iso )   ioptio = ioptio + 1 
     134         IF( ioptio >  1   )   CALL ctl_stop( '          use only ONE direction (level/hor/iso)' ) 
     135         IF( ioptio == 0   )   CALL ctl_stop( '          use at least ONE direction (level/hor/iso)' ) 
     136         ! 
     137         !                                   ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals 
     138         ierr = 0 
     139         IF ( ln_dynldf_lap ) THEN      ! laplacian operator 
     140            IF ( ln_zco ) THEN                ! z-coordinate 
     141               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
     142               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
     143               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
     144            ENDIF 
     145            IF ( ln_zps ) THEN             ! z-coordinate with partial step 
     146               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level              (no rotation) 
     147               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level              (no rotation) 
     148               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
     149            ENDIF 
     150            IF ( ln_sco ) THEN             ! s-coordinate 
     151               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation) 
     152               IF ( ln_dynldf_hor )   nldf = np_lap_i   ! horizontal             (   rotation) 
     153               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation) 
     154            ENDIF 
    164155         ENDIF 
    165          IF ( ln_zps ) THEN             ! z-coordinate 
    166             IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed 
    167             IF ( ln_dynldf_hor   )   nldf = 0      ! horizontal (no rotation) 
    168             IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation) 
     156         ! 
     157         IF( ln_dynldf_blp ) THEN          ! bilaplacian operator 
     158            IF ( ln_zco ) THEN                ! z-coordinate 
     159               IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level = horizontal (no rotation) 
     160               IF ( ln_dynldf_hor )   nldf = np_blp     ! iso-level = horizontal (no rotation) 
     161               IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
     162            ENDIF 
     163            IF ( ln_zps ) THEN             ! z-coordinate with partial step 
     164               IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation) 
     165               IF ( ln_dynldf_hor )   nldf = np_blp     ! iso-level              (no rotation) 
     166               IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
     167            ENDIF 
     168            IF ( ln_sco ) THEN             ! s-coordinate 
     169               IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation) 
     170               IF ( ln_dynldf_hor )   ierr = 2          ! horizontal             (   rotation) 
     171               IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation) 
     172            ENDIF 
    169173         ENDIF 
    170          IF ( ln_sco ) THEN             ! s-coordinate 
    171             IF ( ln_dynldf_level )   nldf = 0      ! iso-level  (no rotation) 
    172             IF ( ln_dynldf_hor   )   nldf = 1      ! horizontal (   rotation) 
    173             IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation) 
    174          ENDIF 
    175       ENDIF 
    176  
    177       IF( ln_dynldf_bilap ) THEN      ! bilaplacian operator 
    178          IF ( ln_zco ) THEN                ! z-coordinate 
    179             IF ( ln_dynldf_level )   nldf = 2      ! iso-level  (no rotation) 
    180             IF ( ln_dynldf_hor   )   nldf = 2      ! horizontal (no rotation) 
    181             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    182          ENDIF 
    183          IF ( ln_zps ) THEN             ! z-coordinate 
    184             IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed  
    185             IF ( ln_dynldf_hor   )   nldf = 2      ! horizontal (no rotation) 
    186             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    187          ENDIF 
    188          IF ( ln_sco ) THEN             ! s-coordinate 
    189             IF ( ln_dynldf_level )   nldf = 2      ! iso-level  (no rotation) 
    190             IF ( ln_dynldf_hor   )   nldf = 3      ! horizontal (   rotation) 
    191             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    192          ENDIF 
    193       ENDIF 
    194        
    195       IF( ln_dynldf_lap .AND. ln_dynldf_bilap ) THEN  ! mixed laplacian and bilaplacian operators 
    196          IF ( ln_zco ) THEN                ! z-coordinate 
    197             IF ( ln_dynldf_level )   nldf = 4      ! iso-level  (no rotation) 
    198             IF ( ln_dynldf_hor   )   nldf = 4      ! horizontal (no rotation) 
    199             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    200          ENDIF 
    201          IF ( ln_zps ) THEN             ! z-coordinate 
    202             IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed  
    203             IF ( ln_dynldf_hor   )   nldf = 4      ! horizontal (no rotation) 
    204             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    205          ENDIF 
    206          IF ( ln_sco ) THEN             ! s-coordinate 
    207             IF ( ln_dynldf_level )   nldf = 4      ! iso-level  (no rotation) 
    208             IF ( ln_dynldf_hor   )   nldf = 5      ! horizontal (   rotation) 
    209             IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation) 
    210          ENDIF 
    211       ENDIF 
    212  
    213       IF( lk_esopa )                 nldf = -1     ! esopa test 
    214  
    215       IF( ierr == 1 )   CALL ctl_stop( 'iso-level in z-coordinate - partial step, not allowed' ) 
    216       IF( ierr == 2 )   CALL ctl_stop( 'isoneutral bilaplacian operator does not exist' ) 
    217       IF( nldf == 1 .OR. nldf == 3 ) THEN      ! rotation 
    218          IF( .NOT.lk_ldfslp )   CALL ctl_stop( 'the rotation of the diffusive tensor require key_ldfslp' ) 
     174         ! 
     175         IF( ierr == 2 )   CALL ctl_stop( 'rotated bi-laplacian operator does not exist' ) 
     176         ! 
     177         IF( nldf == np_lap_i )   l_ldfslp = .TRUE.      ! rotation require the computation of the slopes 
     178         ! 
    219179      ENDIF 
    220180 
    221181      IF(lwp) THEN 
    222182         WRITE(numout,*) 
    223          IF( nldf == -2 )   WRITE(numout,*) '              neither laplacian nor bilaplacian schemes used' 
    224          IF( nldf == -1 )   WRITE(numout,*) '              ESOPA test All scheme used' 
    225          IF( nldf ==  0 )   WRITE(numout,*) '              laplacian operator' 
    226          IF( nldf ==  1 )   WRITE(numout,*) '              rotated laplacian operator' 
    227          IF( nldf ==  2 )   WRITE(numout,*) '              bilaplacian operator' 
    228          IF( nldf ==  3 )   WRITE(numout,*) '              rotated bilaplacian' 
    229          IF( nldf ==  4 )   WRITE(numout,*) '              laplacian and bilaplacian operators' 
    230          IF( nldf ==  5 )   WRITE(numout,*) '              rotated laplacian and bilaplacian operators' 
     183         IF( nldf == np_no_ldf )   WRITE(numout,*) '              NO lateral viscosity' 
     184         IF( nldf == np_lap    )   WRITE(numout,*) '              iso-level laplacian operator' 
     185         IF( nldf == np_lap_i  )   WRITE(numout,*) '              rotated laplacian operator with iso-level background' 
     186         IF( nldf == np_blp    )   WRITE(numout,*) '              iso-level bi-laplacian operator' 
    231187      ENDIF 
    232188      ! 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_iso.F90

    r5034 r6043  
    22   !!====================================================================== 
    33   !!                     ***  MODULE  dynldf_iso  *** 
    4    !! Ocean dynamics:  lateral viscosity trend 
     4   !! Ocean dynamics:   lateral viscosity trend (rotated laplacian operator) 
    55   !!====================================================================== 
    66   !! History :  OPA  !  97-07  (G. Madec)  Original code 
     
    88   !!             -   !  2004-08  (C. Talandier) New trends organization 
    99   !!            2.0  !  2005-11  (G. Madec)  s-coordinate: horizontal diffusion 
     10   !!            3.7  !  2014-01  (F. Lemarie, G. Madec)  restructuration/simplification of ahm specification, 
     11   !!                 !                                   add velocity dependent coefficient and optional read in file 
    1012   !!---------------------------------------------------------------------- 
    11 #if defined key_ldfslp   ||   defined key_esopa 
    12    !!---------------------------------------------------------------------- 
    13    !!   'key_ldfslp'                      slopes of the direction of mixing 
     13 
    1414   !!---------------------------------------------------------------------- 
    1515   !!   dyn_ldf_iso  : update the momentum trend with the horizontal part 
     
    1919   USE oce             ! ocean dynamics and tracers 
    2020   USE dom_oce         ! ocean space and time domain 
    21    USE ldfdyn_oce      ! ocean dynamics lateral physics 
    22    USE ldftra_oce      ! ocean tracer   lateral physics 
     21   USE ldfdyn          ! lateral diffusion: eddy viscosity coef. 
     22   USE ldftra          ! lateral physics: eddy diffusivity 
    2323   USE zdf_oce         ! ocean vertical physics 
    2424   USE ldfslp          ! iso-neutral slopes  
    2525   ! 
    26    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2726   USE in_out_manager  ! I/O manager 
    2827   USE lib_mpp         ! MPP library 
     28   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2929   USE prtctl          ! Print control 
    3030   USE wrk_nemo        ! Memory Allocation 
     
    4242   !! * Substitutions 
    4343#  include "domzgr_substitute.h90" 
    44 #  include "ldfdyn_substitute.h90" 
    4544#  include "vectopt_loop_substitute.h90" 
    4645   !!---------------------------------------------------------------------- 
     
    8382      !!      horizontal fluxes associated with the rotated lateral mixing: 
    8483      !!      u-component: 
    85       !!         ziut = ( ahmt + ahmb0 ) e2t * e3t / e1t  di[ ub ] 
    86       !!               -      ahmt       e2t * mi-1(uslp) dk[ mi(mk(ub)) ] 
    87       !!         zjuf = ( ahmf + ahmb0 ) e1f * e3f / e2f  dj[ ub ] 
    88       !!               -      ahmf       e1f * mi(vslp)   dk[ mj(mk(ub)) ] 
     84      !!         ziut = ( ahmt + rn_ahm_b ) e2t * e3t / e1t  di[ ub ] 
     85      !!               -  ahmt              e2t * mi-1(uslp) dk[ mi(mk(ub)) ] 
     86      !!         zjuf = ( ahmf + rn_ahm_b ) e1f * e3f / e2f  dj[ ub ] 
     87      !!               -  ahmf              e1f * mi(vslp)   dk[ mj(mk(ub)) ] 
    8988      !!      v-component: 
    90       !!         zivf = ( ahmf + ahmb0 ) e2t * e3t / e1t  di[ vb ] 
    91       !!               -      ahmf       e2t * mj(uslp)   dk[ mi(mk(vb)) ] 
    92       !!         zjvt = ( ahmt + ahmb0 ) e1f * e3f / e2f  dj[ ub ] 
    93       !!               -      ahmt       e1f * mj-1(vslp) dk[ mj(mk(vb)) ] 
     89      !!         zivf = ( ahmf + rn_ahm_b ) e2t * e3t / e1t  di[ vb ] 
     90      !!               -  ahmf              e2t * mj(uslp)   dk[ mi(mk(vb)) ] 
     91      !!         zjvt = ( ahmt + rn_ahm_b ) e1f * e3f / e2f  dj[ ub ] 
     92      !!               -  ahmt              e1f * mj-1(vslp) dk[ mj(mk(vb)) ] 
    9493      !!      take the horizontal divergence of the fluxes: 
    9594      !!         diffu = 1/(e1u*e2u*e3u) {  di  [ ziut ] + dj-1[ zjuf ]  } 
     
    106105      !!      of the rotated operator in dynzdf module 
    107106      !!---------------------------------------------------------------------- 
    108       ! 
    109107      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
    110108      ! 
    111109      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    112110      REAL(wp) ::   zabe1, zabe2, zcof1, zcof2                       ! local scalars 
    113       REAL(wp) ::   zmskt, zmskf, zbu, zbv, zuah, zvah               !   -      - 
     111      REAL(wp) ::   zmskt, zmskf                                     !   -      - 
    114112      REAL(wp) ::   zcoef0, zcoef3, zcoef4, zmkt, zmkf               !   -      - 
    115113      REAL(wp) ::   zuav, zvav, zuwslpi, zuwslpj, zvwslpi, zvwslpj   !   -      - 
     
    130128      ENDIF 
    131129 
    132       ! s-coordinate: Iso-level diffusion on tracer, but geopotential level diffusion on momentum 
     130!!gm bug is dyn_ldf_iso called before tra_ldf_iso ....   <<<<<===== TO BE CHECKED 
     131      ! s-coordinate: Iso-level diffusion on momentum but not on tracer 
    133132      IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN 
    134133         ! 
     
    136135            DO jj = 2, jpjm1 
    137136               DO ji = 2, jpim1 
    138                   uslp (ji,jj,jk) = -1./e1u(ji,jj) * ( fsdept_b(ji+1,jj,jk) - fsdept_b(ji ,jj ,jk) ) * umask(ji,jj,jk) 
    139                   vslp (ji,jj,jk) = -1./e2v(ji,jj) * ( fsdept_b(ji,jj+1,jk) - fsdept_b(ji ,jj ,jk) ) * vmask(ji,jj,jk) 
    140                   wslpi(ji,jj,jk) = -1./e1t(ji,jj) * ( fsdepw_b(ji+1,jj,jk) - fsdepw_b(ji-1,jj,jk) ) * tmask(ji,jj,jk) * 0.5 
    141                   wslpj(ji,jj,jk) = -1./e2t(ji,jj) * ( fsdepw_b(ji,jj+1,jk) - fsdepw_b(ji,jj-1,jk) ) * tmask(ji,jj,jk) * 0.5 
     137                  uslp (ji,jj,jk) = - ( fsdept_b(ji+1,jj,jk) - fsdept_b(ji ,jj ,jk) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 
     138                  vslp (ji,jj,jk) = - ( fsdept_b(ji,jj+1,jk) - fsdept_b(ji ,jj ,jk) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 
     139                  wslpi(ji,jj,jk) = - ( fsdepw_b(ji+1,jj,jk) - fsdepw_b(ji-1,jj,jk) ) * r1_e1t(ji,jj) * tmask(ji,jj,jk) * 0.5 
     140                  wslpj(ji,jj,jk) = - ( fsdepw_b(ji,jj+1,jk) - fsdepw_b(ji,jj-1,jk) ) * r1_e2t(ji,jj) * tmask(ji,jj,jk) * 0.5 
    142141               END DO 
    143142            END DO 
     
    184183            DO jj = 2, jpjm1 
    185184               DO ji = fs_2, jpi   ! vector opt. 
    186                   zabe1 = (fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) / e1t(ji,jj) 
    187  
    188                   zmskt = 1./MAX(  umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)   & 
    189                      &           + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ), 1. ) 
    190  
    191                   zcof1 = - aht0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     185                  zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * MIN( fse3u(ji,jj,jk), fse3u(ji-1,jj,jk) ) * r1_e1t(ji,jj) 
     186 
     187                  zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)     & 
     188                     &                 + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
     189 
     190                  zcof1 = - rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    192191    
     192                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )    & 
     193                     &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)      & 
     194                     &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
     195               END DO 
     196            END DO 
     197         ELSE                   ! other coordinate system (zco or sco) : e3t 
     198            DO jj = 2, jpjm1 
     199               DO ji = fs_2, jpi   ! vector opt. 
     200                  zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * fse3t(ji,jj,jk) * r1_e1t(ji,jj) 
     201 
     202                  zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  ) + umask(ji,jj,jk+1)     & 
     203                     &                 + umask(ji-1,jj,jk+1) + umask(ji,jj,jk  ) , 1._wp ) 
     204 
     205                  zcof1 = - rn_aht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     206 
    193207                  ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
    194208                     &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     & 
     
    196210               END DO 
    197211            END DO 
    198          ELSE                   ! other coordinate system (zco or sco) : e3t 
    199             DO jj = 2, jpjm1 
    200                DO ji = fs_2, jpi   ! vector opt. 
    201                   zabe1 = (fsahmt(ji,jj,jk)+ahmb0) * e2t(ji,jj) * fse3t(ji,jj,jk) / e1t(ji,jj) 
    202  
    203                   zmskt = 1./MAX(  umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)   & 
    204                      &           + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ), 1. ) 
    205  
    206                   zcof1 = - aht0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    207  
    208                   ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
    209                      &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     & 
    210                      &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
    211                END DO 
    212             END DO 
    213212         ENDIF 
    214213 
     
    216215         DO jj = 1, jpjm1 
    217216            DO ji = 1, fs_jpim1   ! vector opt. 
    218                zabe2 = ( fsahmf(ji,jj,jk) + ahmb0 ) * e1f(ji,jj) * fse3f(ji,jj,jk) / e2f(ji,jj) 
    219  
    220                zmskf = 1./MAX(  umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)   & 
    221                   &           + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ), 1. ) 
    222  
    223                zcof2 = - aht0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
     217               zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e1f(ji,jj) * fse3f(ji,jj,jk) * r1_e2f(ji,jj) 
     218 
     219               zmskf = 1._wp / MAX(   umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)     & 
     220                  &                 + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
     221 
     222               zcof2 = - rn_aht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
    224223 
    225224               zjuf(ji,jj) = (  zabe2 * ( ub(ji,jj+1,jk) - ub(ji,jj,jk) )   & 
     
    237236         DO jj = 2, jpjm1 
    238237            DO ji = 1, fs_jpim1   ! vector opt. 
    239                zabe1 = ( fsahmf(ji,jj,jk) + ahmb0 ) * e2f(ji,jj) * fse3f(ji,jj,jk) / e1f(ji,jj) 
    240  
    241                zmskf = 1./MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)   & 
    242                   &           + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    243  
    244                zcof1 = - aht0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
    245  
    246                zivf(ji,jj) = (  zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) )   & 
    247                   &           + zcof1 * ( zdkv (ji,jj) + zdk1v(ji+1,jj)     & 
    248                   &                      +zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk) 
     238               zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e2f(ji,jj) * fse3f(ji,jj,jk) * r1_e1f(ji,jj) 
     239 
     240               zmskf = 1._wp / MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)     & 
     241                  &                + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
     242 
     243               zcof1 = - rn_aht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
     244 
     245               zivf(ji,jj) = (  zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) )    & 
     246                  &           + zcof1 * (  zdkv (ji,jj) + zdk1v(ji+1,jj)      & 
     247                  &                      + zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk) 
    249248            END DO 
    250249         END DO 
     
    254253            DO jj = 2, jpj 
    255254               DO ji = 1, fs_jpim1   ! vector opt. 
    256                   zabe2 = (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) / e2t(ji,jj) 
     255                  zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * MIN( fse3v(ji,jj,jk), fse3v(ji,jj-1,jk) ) * r1_e2t(ji,jj) 
     256 
     257                  zmskt = 1._wp / MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)     & 
     258                     &                + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
     259 
     260                  zcof2 = - rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     261 
     262                  zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )    & 
     263                     &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)      & 
     264                     &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
     265               END DO 
     266            END DO 
     267         ELSE                   ! other coordinate system (zco or sco) : e3t 
     268            DO jj = 2, jpj 
     269               DO ji = 1, fs_jpim1   ! vector opt. 
     270                  zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * fse3t(ji,jj,jk) * r1_e2t(ji,jj) 
    257271 
    258272                  zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
    259273                     &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    260274 
    261                   zcof2 = - aht0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     275                  zcof2 = - rn_aht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    262276 
    263277                  zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )   & 
     
    266280               END DO 
    267281            END DO 
    268          ELSE                   ! other coordinate system (zco or sco) : e3t 
    269             DO jj = 2, jpj 
    270                DO ji = 1, fs_jpim1   ! vector opt. 
    271                   zabe2 = (fsahmt(ji,jj,jk)+ahmb0) * e1t(ji,jj) * fse3t(ji,jj,jk) / e2t(ji,jj) 
    272  
    273                   zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
    274                      &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    275  
    276                   zcof2 = - aht0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    277  
    278                   zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )   & 
    279                      &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)     & 
    280                      &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
    281                END DO 
    282             END DO 
    283282         ENDIF 
    284283 
     
    286285         ! Second derivative (divergence) and add to the general trend 
    287286         ! ----------------------------------------------------------- 
    288  
    289287         DO jj = 2, jpjm1 
    290             DO ji = 2, jpim1          !! Question vectop possible??? !!bug 
    291                ! volume elements 
    292                zbu = e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) 
    293                zbv = e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) 
    294                ! horizontal component of isopycnal momentum diffusive trends 
    295                zuah =( ziut (ji+1,jj) - ziut (ji,jj  ) +   & 
    296                   &    zjuf (ji  ,jj) - zjuf (ji,jj-1)  ) / zbu 
    297                zvah =( zivf (ji,jj  ) - zivf (ji-1,jj) +   & 
    298                   &    zjvt (ji,jj+1) - zjvt (ji,jj  )  ) / zbv 
    299                ! add the trends to the general trends 
    300                ua (ji,jj,jk) = ua (ji,jj,jk) + zuah 
    301                va (ji,jj,jk) = va (ji,jj,jk) + zvah 
     288            DO ji = 2, jpim1          !!gm Question vectop possible??? !!bug 
     289               ua(ji,jj,jk) = ua(ji,jj,jk) + ( ziut(ji+1,jj) - ziut(ji,jj  )    & 
     290                  &                          + zjuf(ji  ,jj) - zjuf(ji,jj-1)  ) / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     291               va(ji,jj,jk) = va(ji,jj,jk) + ( zivf(ji,jj  ) - zivf(ji-1,jj)    & 
     292                  &                          + zjvt(ji,jj+1) - zjvt(ji,jj  )  ) / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    302293            END DO 
    303294         END DO 
     
    358349         DO jk = 2, jpkm1 
    359350            DO ji = 2, jpim1 
    360                zcoef0= 0.5 * aht0 * umask(ji,jj,jk) 
    361  
     351               zcoef0= 0.5 * rn_aht_0 * umask(ji,jj,jk) 
     352               ! 
    362353               zuwslpi = zcoef0 * ( wslpi(ji+1,jj,jk) + wslpi(ji,jj,jk) ) 
    363354               zuwslpj = zcoef0 * ( wslpj(ji+1,jj,jk) + wslpj(ji,jj,jk) ) 
    364  
     355               ! 
    365356               zmkt = 1./MAX(  tmask(ji,jj,jk-1)+tmask(ji+1,jj,jk-1)   & 
    366357                             + tmask(ji,jj,jk  )+tmask(ji+1,jj,jk  ), 1. ) 
    367                zmkf = 1./MAX(  fmask(ji,jj-1,jk-1)+fmask(ji,jj,jk-1)   & 
    368                              + fmask(ji,jj-1,jk  )+fmask(ji,jj,jk  ), 1. ) 
     358               zmkf = 1./MAX(  fmask(ji,jj-1,jk-1) + fmask(ji,jj,jk-1)   & 
     359                             + fmask(ji,jj-1,jk  ) + fmask(ji,jj,jk  ), 1. ) 
    369360 
    370361               zcoef3 = - e2u(ji,jj) * zmkt * zuwslpi 
     
    376367                                       +zdj1u(ji,jk  ) + zdju (ji  ,jk  ) ) 
    377368               ! update avmu (add isopycnal vertical coefficient to avmu) 
    378                ! Caution: zcoef0 include aht0, so divided by aht0 to obtain slp^2 * aht0 
    379                avmu(ji,jj,jk) = avmu(ji,jj,jk) + ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / aht0 
     369               ! Caution: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
     370               avmu(ji,jj,jk) = avmu(ji,jj,jk) + ( zuwslpi * zuwslpi + zuwslpj * zuwslpj ) / rn_aht_0 
    380371            END DO 
    381372         END DO 
     
    384375         DO jk = 2, jpkm1 
    385376            DO ji = 2, jpim1 
    386                zcoef0= 0.5 * aht0 * vmask(ji,jj,jk) 
     377               zcoef0 = 0.5 * rn_aht_0 * vmask(ji,jj,jk) 
    387378 
    388379               zvwslpi = zcoef0 * ( wslpi(ji,jj+1,jk) + wslpi(ji,jj,jk) ) 
     
    398389               ! vertical flux on v field 
    399390               zfvw(ji,jk) = zcoef3 * ( zdiv (ji,jk-1) + zdiv (ji-1,jk-1)     & 
    400                                        +zdiv (ji,jk  ) + zdiv (ji-1,jk  ) )   & 
    401                            + zcoef4 * ( zdjv (ji,jk-1) + zdj1v(ji  ,jk-1)     & 
    402                                        +zdjv (ji,jk  ) + zdj1v(ji  ,jk  ) ) 
     391                  &                    +zdiv (ji,jk  ) + zdiv (ji-1,jk  ) )   & 
     392                  &        + zcoef4 * ( zdjv (ji,jk-1) + zdj1v(ji  ,jk-1)     & 
     393                  &                    +zdjv (ji,jk  ) + zdj1v(ji  ,jk  ) ) 
    403394               ! update avmv (add isopycnal vertical coefficient to avmv) 
    404                ! Caution: zcoef0 include aht0, so divided by aht0 to obtain slp^2 * aht0 
    405                avmv(ji,jj,jk) = avmv(ji,jj,jk) + ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / aht0 
     395               ! Caution: zcoef0 include rn_aht_0, so divided by rn_aht_0 to obtain slp^2 * rn_aht_0 
     396               avmv(ji,jj,jk) = avmv(ji,jj,jk) + ( zvwslpi * zvwslpi + zvwslpj * zvwslpj ) / rn_aht_0 
    406397            END DO 
    407398         END DO 
     
    412403         DO jk = 1, jpkm1 
    413404            DO ji = 2, jpim1 
    414                ! volume elements 
    415                zbu = e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) 
    416                zbv = e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) 
    417                ! part of the k-component of isopycnal momentum diffusive trends 
    418                zuav = ( zfuw(ji,jk) - zfuw(ji,jk+1) ) / zbu 
    419                zvav = ( zfvw(ji,jk) - zfvw(ji,jk+1) ) / zbv 
    420                ! add the trends to the general trends 
    421                ua(ji,jj,jk) = ua(ji,jj,jk) + zuav 
    422                va(ji,jj,jk) = va(ji,jj,jk) + zvav 
     405               ua(ji,jj,jk) = ua(ji,jj,jk) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     406               va(ji,jj,jk) = va(ji,jj,jk) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    423407            END DO 
    424408         END DO 
     
    432416   END SUBROUTINE dyn_ldf_iso 
    433417 
    434 # else 
    435    !!---------------------------------------------------------------------- 
    436    !!   Dummy module                           NO rotation of mixing tensor 
    437    !!---------------------------------------------------------------------- 
    438 CONTAINS 
    439    SUBROUTINE dyn_ldf_iso( kt )               ! Empty routine 
    440       INTEGER, INTENT(in) :: kt 
    441       WRITE(*,*) 'dyn_ldf_iso: You should not have seen this print! error?', kt 
    442    END SUBROUTINE dyn_ldf_iso 
    443 #endif 
    444  
    445418   !!====================================================================== 
    446419END MODULE dynldf_iso 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynnxt.F90

    r5600 r6043  
    1919   !!            3.5  !  2013-07  (J. Chanut) Compliant with time splitting changes 
    2020   !!            3.7  !  2014-04  (G. Madec) add the diagnostic of the time filter trends 
     21   !!            3.7  !  2015-11  (J. Chanut) Free surface simplification 
    2122   !!------------------------------------------------------------------------- 
    2223   
     
    2829   USE sbc_oce         ! Surface boundary condition: ocean fields 
    2930   USE phycst          ! physical constants 
    30    USE dynspg_oce      ! type of surface pressure gradient 
    3131   USE dynadv          ! dynamics: vector invariant versus flux form 
    3232   USE domvvl          ! variable volume 
     
    6868      !!                  ***  ROUTINE dyn_nxt  *** 
    6969      !!                    
    70       !! ** Purpose :   Compute the after horizontal velocity. Apply the boundary  
    71       !!             condition on the after velocity, achieved the time stepping  
     70      !! ** Purpose :   Finalize after horizontal velocity. Apply the boundary  
     71      !!             condition on the after velocity, achieve the time stepping  
    7272      !!             by applying the Asselin filter on now fields and swapping  
    7373      !!             the fields. 
    7474      !! 
    75       !! ** Method  : * After velocity is compute using a leap-frog scheme: 
    76       !!                       (ua,va) = (ub,vb) + 2 rdt (ua,va) 
    77       !!             Note that with flux form advection and variable volume layer 
    78       !!             (lk_vvl=T), the leap-frog is applied on thickness weighted 
    79       !!             velocity. 
    80       !!             Note also that in filtered free surface (lk_dynspg_flt=T), 
    81       !!             the time stepping has already been done in dynspg module 
     75      !! ** Method  : * Ensure after velocities transport matches time splitting 
     76      !!             estimate (ln_dynspg_ts=T) 
    8277      !! 
    8378      !!              * Apply lateral boundary conditions on after velocity  
     
    10196      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    10297      INTEGER  ::   iku, ikv     ! local integers 
    103 #if ! defined key_dynspg_flt 
    104       REAL(wp) ::   z2dt         ! temporary scalar 
    105 #endif 
    106       REAL(wp) ::   zue3a, zue3n, zue3b, zuf, zec      ! local scalars 
     98      REAL(wp) ::   zue3a, zue3n, zue3b, zuf           ! local scalars 
    10799      REAL(wp) ::   zve3a, zve3n, zve3b, zvf, z1_2dt   !   -      - 
    108100      REAL(wp), POINTER, DIMENSION(:,:)   ::  zue, zve 
     
    112104      IF( nn_timing == 1 )   CALL timing_start('dyn_nxt') 
    113105      ! 
    114       CALL wrk_alloc( jpi,jpj,jpk,  ze3u_f, ze3v_f, zua, zva ) 
    115       IF( lk_dynspg_ts )   CALL wrk_alloc( jpi,jpj, zue, zve ) 
     106      IF( ln_dynspg_ts )   CALL wrk_alloc( jpi,jpj, zue, zve ) 
     107      IF( lk_vvl.AND.(.NOT.ln_dynadv_vec ) ) CALL wrk_alloc( jpi,jpj,jpk, ze3u_f, ze3v_f ) 
     108      IF( l_trddyn     )   CALL wrk_alloc( jpi,jpj,jpk, zua, zva ) 
    116109      ! 
    117110      IF( kt == nit000 ) THEN 
     
    121114      ENDIF 
    122115 
    123 #if defined key_dynspg_flt 
    124       ! 
    125       ! Next velocity :   Leap-frog time stepping already done in dynspg_flt.F routine 
    126       ! ------------- 
    127  
    128       ! Update after velocity on domain lateral boundaries      (only local domain required) 
    129       ! -------------------------------------------------- 
    130       CALL lbc_lnk( ua, 'U', -1. )         ! local domain boundaries 
    131       CALL lbc_lnk( va, 'V', -1. )  
    132       ! 
    133 #else 
    134  
    135 # if defined key_dynspg_exp 
    136       ! Next velocity :   Leap-frog time stepping 
    137       ! ------------- 
    138       z2dt = 2. * rdt                                 ! Euler or leap-frog time step  
    139       IF( neuler == 0 .AND. kt == nit000 )  z2dt = rdt 
    140       ! 
    141       IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
     116      IF ( ln_dynspg_ts ) THEN 
     117         ! Ensure below that barotropic velocities match time splitting estimate 
     118         ! Compute actual transport and replace it with ts estimate at "after" time step 
     119         zue(:,:) = fse3u_a(:,:,1) * ua(:,:,1) * umask(:,:,1) 
     120         zve(:,:) = fse3v_a(:,:,1) * va(:,:,1) * vmask(:,:,1) 
     121         DO jk = 2, jpkm1 
     122            zue(:,:) = zue(:,:) + fse3u_a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 
     123            zve(:,:) = zve(:,:) + fse3v_a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk) 
     124         END DO 
    142125         DO jk = 1, jpkm1 
    143             ua(:,:,jk) = ( ub(:,:,jk) + z2dt * ua(:,:,jk) ) * umask(:,:,jk) 
    144             va(:,:,jk) = ( vb(:,:,jk) + z2dt * va(:,:,jk) ) * vmask(:,:,jk) 
    145          END DO 
    146       ELSE                                            ! applied on thickness weighted velocity 
    147          DO jk = 1, jpkm1 
    148             ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
    149                &           + z2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
    150                &         / fse3u_a(:,:,jk) * umask(:,:,jk) 
    151             va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
    152                &           + z2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
    153                &         / fse3v_a(:,:,jk) * vmask(:,:,jk) 
    154          END DO 
    155       ENDIF 
    156 # endif 
    157  
    158 # if defined key_dynspg_ts 
    159 !!gm IF ( lk_dynspg_ts ) THEN .... 
    160       ! Ensure below that barotropic velocities match time splitting estimate 
    161       ! Compute actual transport and replace it with ts estimate at "after" time step 
    162       zue(:,:) = fse3u_a(:,:,1) * ua(:,:,1) * umask(:,:,1) 
    163       zve(:,:) = fse3v_a(:,:,1) * va(:,:,1) * vmask(:,:,1) 
    164       DO jk = 2, jpkm1 
    165          zue(:,:) = zue(:,:) + fse3u_a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 
    166          zve(:,:) = zve(:,:) + fse3v_a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk) 
    167       END DO 
    168       DO jk = 1, jpkm1 
    169          ua(:,:,jk) = ( ua(:,:,jk) - zue(:,:) * hur_a(:,:) + ua_b(:,:) ) * umask(:,:,jk) 
    170          va(:,:,jk) = ( va(:,:,jk) - zve(:,:) * hvr_a(:,:) + va_b(:,:) ) * vmask(:,:,jk) 
    171       END DO 
    172  
    173       IF (lk_dynspg_ts.AND.(.NOT.ln_bt_fw)) THEN 
    174          ! Remove advective velocity from "now velocities"  
    175          ! prior to asselin filtering      
    176          ! In the forward case, this is done below after asselin filtering    
    177          ! so that asselin contribution is removed at the same time  
    178          DO jk = 1, jpkm1 
    179             un(:,:,jk) = ( un(:,:,jk) - un_adv(:,:) + un_b(:,:) )*umask(:,:,jk) 
    180             vn(:,:,jk) = ( vn(:,:,jk) - vn_adv(:,:) + vn_b(:,:) )*vmask(:,:,jk) 
    181          END DO   
    182       ENDIF 
    183 !!gm ENDIF 
    184 # endif 
     126            ua(:,:,jk) = ( ua(:,:,jk) - zue(:,:) * hur_a(:,:) + ua_b(:,:) ) * umask(:,:,jk) 
     127            va(:,:,jk) = ( va(:,:,jk) - zve(:,:) * hvr_a(:,:) + va_b(:,:) ) * vmask(:,:,jk) 
     128         END DO 
     129 
     130         IF ( .NOT.ln_bt_fw ) THEN 
     131            ! Remove advective velocity from "now velocities"  
     132            ! prior to asselin filtering      
     133            ! In the forward case, this is done below after asselin filtering    
     134            ! so that asselin contribution is removed at the same time  
     135            DO jk = 1, jpkm1 
     136               un(:,:,jk) = ( un(:,:,jk) - un_adv(:,:) + un_b(:,:) )*umask(:,:,jk) 
     137               vn(:,:,jk) = ( vn(:,:,jk) - vn_adv(:,:) + vn_b(:,:) )*vmask(:,:,jk) 
     138            END DO   
     139         ENDIF 
     140      ENDIF 
    185141 
    186142      ! Update after velocity on domain lateral boundaries 
    187143      ! --------------------------------------------------       
    188       CALL lbc_lnk( ua, 'U', -1. )     !* local domain boundaries 
    189       CALL lbc_lnk( va, 'V', -1. )  
    190       ! 
    191 # if defined key_bdy 
    192       !                                !* BDY open boundaries 
    193       IF( lk_bdy .AND. lk_dynspg_exp ) CALL bdy_dyn( kt ) 
    194       IF( lk_bdy .AND. lk_dynspg_ts  ) CALL bdy_dyn( kt, dyn3d_only=.true. ) 
    195  
    196 !!$   Do we need a call to bdy_vol here?? 
    197       ! 
    198 # endif 
    199       ! 
    200144# if defined key_agrif 
    201145      CALL Agrif_dyn( kt )             !* AGRIF zoom boundaries 
    202146# endif 
    203 #endif 
    204  
     147      ! 
     148      CALL lbc_lnk( ua, 'U', -1. )     !* local domain boundaries 
     149      CALL lbc_lnk( va, 'V', -1. )  
     150      ! 
     151# if defined key_bdy 
     152      !                                !* BDY open boundaries 
     153      IF( lk_bdy .AND. ln_dynspg_exp ) CALL bdy_dyn( kt ) 
     154      IF( lk_bdy .AND. ln_dynspg_ts  ) CALL bdy_dyn( kt, dyn3d_only=.true. ) 
     155 
     156!!$   Do we need a call to bdy_vol here?? 
     157      ! 
     158# endif 
     159      ! 
    205160      IF( l_trddyn ) THEN             ! prepare the atf trend computation + some diagnostics 
    206161         z1_2dt = 1._wp / (2. * rdt)        ! Euler or leap-frog time step  
     
    259214            ! (used as a now filtered scale factor until the swap) 
    260215            ! ---------------------------------------------------- 
    261             IF (lk_dynspg_ts.AND.ln_bt_fw) THEN 
     216            IF (ln_dynspg_ts.AND.ln_bt_fw) THEN 
    262217               ! No asselin filtering on thicknesses if forward time splitting 
    263                   fse3t_b(:,:,:) = fse3t_n(:,:,:) 
     218               fse3t_b(:,:,:) = fse3t_n(:,:,:) 
    264219            ELSE 
    265220               fse3t_b(:,:,:) = fse3t_n(:,:,:) + atfp * ( fse3t_b(:,:,:) - 2._wp * fse3t_n(:,:,:) + fse3t_a(:,:,:) ) 
    266221               ! Add volume filter correction: compatibility with tracer advection scheme 
    267222               ! => time filter + conservation correction (only at the first level) 
    268                fse3t_b(:,:,1) = fse3t_b(:,:,1) - atfp * rdt * r1_rau0 * ( emp_b(:,:) - emp(:,:) & 
    269                               &                                          -rnf_b(:,:) + rnf(:,:) ) * tmask(:,:,1) 
     223               IF ( nn_isf == 0) THEN   ! if no ice shelf melting 
     224                  fse3t_b(:,:,1) = fse3t_b(:,:,1) - atfp * rdt * r1_rau0 * ( emp_b(:,:) - emp(:,:) & 
     225                                 &                                          -rnf_b(:,:) + rnf(:,:) ) * tmask(:,:,1) 
     226               ELSE                     ! if ice shelf melting 
     227                  DO jj = 1,jpj 
     228                     DO ji = 1,jpi 
     229                        jk = mikt(ji,jj) 
     230                        fse3t_b(ji,jj,jk) = fse3t_b(ji,jj,jk) - atfp * rdt * r1_rau0                       & 
     231                                          &                          * ( (emp_b(ji,jj)    - emp(ji,jj)   ) & 
     232                                          &                            - (rnf_b(ji,jj)    - rnf(ji,jj)   ) & 
     233                                          &                            + (fwfisf_b(ji,jj) - fwfisf(ji,jj)) ) * tmask(ji,jj,jk) 
     234                     END DO 
     235                  END DO 
     236               END IF 
    270237            ENDIF 
    271238            ! 
     
    324291         ENDIF 
    325292         ! 
    326          IF (lk_dynspg_ts.AND.ln_bt_fw) THEN 
     293         IF (ln_dynspg_ts.AND.ln_bt_fw) THEN 
    327294            ! Revert "before" velocities to time split estimate 
    328295            ! Doing it here also means that asselin filter contribution is removed   
     
    388355      IF(ln_ctl)   CALL prt_ctl( tab3d_1=un, clinfo1=' nxt  - Un: ', mask1=umask,   & 
    389356         &                       tab3d_2=vn, clinfo2=' Vn: '       , mask2=vmask ) 
    390       !  
    391       CALL wrk_dealloc( jpi,jpj,jpk,  ze3u_f, ze3v_f, zua, zva ) 
    392       IF( lk_dynspg_ts )   CALL wrk_dealloc( jpi,jpj, zue, zve ) 
     357      ! 
     358      IF( ln_dynspg_ts )   CALL wrk_dealloc( jpi,jpj, zue, zve ) 
     359      IF( lk_vvl.AND.(.NOT.ln_dynadv_vec ) ) CALL wrk_dealloc( jpi,jpj,jpk, ze3u_f, ze3v_f ) 
     360      IF( l_trddyn     )   CALL wrk_dealloc( jpi,jpj,jpk, zua, zva ) 
    393361      ! 
    394362      IF( nn_timing == 1 )  CALL timing_stop('dyn_nxt') 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg.F90

    r5600 r6043  
    66   !! History :  1.0  ! 2005-12  (C. Talandier, G. Madec, V. Garnier)  Original code 
    77   !!            3.2  ! 2009-07  (R. Benshila)  Suppression of rigid-lid option 
    8    !!---------------------------------------------------------------------- 
    9  
    10    !!---------------------------------------------------------------------- 
    11    !!   dyn_spg     : update the dynamics trend with the lateral diffusion 
    12    !!   dyn_spg_ctl : initialization, namelist read, and parameters control 
     8   !!            3.7  ! 2015-11  (J. Chanut) Suppression of filtered free surface  
     9   !!---------------------------------------------------------------------- 
     10 
     11   !!---------------------------------------------------------------------- 
     12   !!   dyn_spg     : update the dynamics trend with surface pressure gradient  
     13   !!   dyn_spg_init: initialization, namelist read, and parameters control 
    1314   !!---------------------------------------------------------------------- 
    1415   USE oce            ! ocean dynamics and tracers variables 
     
    1819   USE sbc_oce        ! surface boundary condition: ocean 
    1920   USE sbcapr         ! surface boundary condition: atmospheric pressure 
    20    USE dynspg_oce     ! surface pressure gradient variables 
    2121   USE dynspg_exp     ! surface pressure gradient     (dyn_spg_exp routine) 
    2222   USE dynspg_ts      ! surface pressure gradient     (dyn_spg_ts  routine) 
    23    USE dynspg_flt     ! surface pressure gradient     (dyn_spg_flt routine) 
    24    USE dynadv         ! dynamics: vector invariant versus flux form 
    25    USE dynhpg, ONLY: ln_dynhpg_imp 
    2623   USE sbctide 
    2724   USE updtide 
     
    3229   USE in_out_manager ! I/O manager 
    3330   USE lib_mpp        ! MPP library 
    34    USE solver         ! solver initialization 
    3531   USE wrk_nemo       ! Memory Allocation 
    3632   USE timing         ! Timing 
     
    4339   PUBLIC   dyn_spg_init   ! routine called by opa module 
    4440 
    45    INTEGER ::   nspg = 0   ! type of surface pressure gradient scheme defined from lk_dynspg_...  
     41   INTEGER ::   nspg = 0   ! type of surface pressure gradient scheme defined from ln_dynspg_...  
    4642 
    4743   !! * Substitutions 
     
    5551CONTAINS 
    5652 
    57    SUBROUTINE dyn_spg( kt, kindic ) 
     53   SUBROUTINE dyn_spg( kt ) 
    5854      !!---------------------------------------------------------------------- 
    5955      !!                  ***  ROUTINE dyn_spg  *** 
     
    6662      !!gm            the after velocity, in the 2 other (ua,va) are still the trends 
    6763      !! 
    68       !! ** Method  :   Three schemes: 
     64      !! ** Method  :   Two schemes: 
    6965      !!              - explicit computation      : the spg is evaluated at now 
    70       !!              - filtered computation      : the Roulet & madec (2000) technique is used 
    7166      !!              - split-explicit computation: a time splitting technique is used 
    7267      !! 
     
    7772      !!             Note that as all external forcing a time averaging over a two rdt 
    7873      !!             period is used to prevent the divergence of odd and even time step. 
    79       !! 
    80       !! N.B. : When key_esopa is used all the scheme are tested, regardless  
    81       !!        of the physical meaning of the results.  
    8274      !!---------------------------------------------------------------------- 
    8375      ! 
    8476      INTEGER, INTENT(in   ) ::   kt       ! ocean time-step index 
    85       INTEGER, INTENT(  out) ::   kindic   ! solver flag 
    8677      ! 
    8778      INTEGER  ::   ji, jj, jk                             ! dummy loop indices 
     
    10697 
    10798      IF(      ln_apr_dyn                                                &   ! atmos. pressure 
    108          .OR.  ( .NOT.lk_dynspg_ts .AND. (ln_tide_pot .AND. lk_tide) )   &   ! tide potential (no time slitting) 
     99         .OR.  ( .NOT.ln_dynspg_ts .AND. (ln_tide_pot .AND. lk_tide) )   &   ! tide potential (no time slitting) 
    109100         .OR.  nn_ice_embd == 2  ) THEN                                      ! embedded sea-ice 
    110101         ! 
     
    116107         END DO          
    117108         ! 
    118          IF( ln_apr_dyn .AND. (.NOT. lk_dynspg_ts) ) THEN                    !==  Atmospheric pressure gradient (added later in time-split case) ==! 
     109         IF( ln_apr_dyn .AND. (.NOT. ln_dynspg_ts) ) THEN                    !==  Atmospheric pressure gradient (added later in time-split case) ==! 
    119110            zg_2 = grav * 0.5 
    120111            DO jj = 2, jpjm1                          ! gradient of Patm using inverse barometer ssh 
    121112               DO ji = fs_2, fs_jpim1   ! vector opt. 
    122113                  spgu(ji,jj) = spgu(ji,jj) + zg_2 * (  ssh_ib (ji+1,jj) - ssh_ib (ji,jj)    & 
    123                      &                      + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj)  ) /e1u(ji,jj) 
     114                     &                      + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
    124115                  spgv(ji,jj) = spgv(ji,jj) + zg_2 * (  ssh_ib (ji,jj+1) - ssh_ib (ji,jj)    & 
    125                      &                      + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj)  ) /e2v(ji,jj) 
     116                     &                      + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
    126117               END DO 
    127118            END DO 
     
    129120         ! 
    130121         !                                    !==  tide potential forcing term  ==! 
    131          IF( .NOT.lk_dynspg_ts .AND. ( ln_tide_pot .AND. lk_tide )  ) THEN   ! N.B. added directly at sub-time-step in ts-case 
     122         IF( .NOT.ln_dynspg_ts .AND. ( ln_tide_pot .AND. lk_tide )  ) THEN   ! N.B. added directly at sub-time-step in ts-case 
    132123            ! 
    133124            CALL upd_tide( kt )                      ! update tide potential 
     
    135126            DO jj = 2, jpjm1                         ! add tide potential forcing 
    136127               DO ji = fs_2, fs_jpim1   ! vector opt. 
    137                   spgu(ji,jj) = spgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 
    138                   spgv(ji,jj) = spgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 
     128                  spgu(ji,jj) = spgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
     129                  spgv(ji,jj) = spgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
    139130               END DO  
    140131            END DO 
     
    149140            DO jj = 2, jpjm1 
    150141               DO ji = fs_2, fs_jpim1   ! vector opt. 
    151                   spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) / e1u(ji,jj) 
    152                   spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) / e2v(ji,jj) 
     142                  spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 
     143                  spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 
    153144               END DO 
    154145            END DO 
     
    174165      CASE (  0 )   ;   CALL dyn_spg_exp( kt )              ! explicit 
    175166      CASE (  1 )   ;   CALL dyn_spg_ts ( kt )              ! time-splitting 
    176       CASE (  2 )   ;   CALL dyn_spg_flt( kt, kindic )      ! filtered 
    177167      !                                                     
    178       CASE ( -1 )                                ! esopa: test all possibility with control print 
    179                         CALL dyn_spg_exp( kt ) 
    180                         CALL prt_ctl( tab3d_1=ua, clinfo1=' spg0 - Ua: ', mask1=umask, & 
    181          &                            tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    182                         CALL dyn_spg_ts ( kt ) 
    183                         CALL prt_ctl( tab3d_1=ua, clinfo1=' spg1 - Ua: ', mask1=umask, & 
    184          &                           tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    185                         CALL dyn_spg_flt( kt, kindic ) 
    186                         CALL prt_ctl( tab3d_1=ua, clinfo1=' spg2 - Ua: ', mask1=umask, & 
    187          &                            tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    188168      END SELECT 
    189169      !                     
    190170      IF( l_trddyn )   THEN                      ! save the surface pressure gradient trends for further diagnostics 
    191          SELECT CASE ( nspg ) 
    192          CASE ( 0, 1 ) 
    193             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    194             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    195          CASE( 2 ) 
    196             z2dt = 2. * rdt 
    197             IF( neuler == 0 .AND. kt == nit000 )   z2dt = rdt 
    198             ztrdu(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) / z2dt - ztrdu(:,:,:) 
    199             ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / z2dt - ztrdv(:,:,:) 
    200          END SELECT 
     171         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
     172         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    201173         CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt ) 
    202174         ! 
     
    216188      !!                  ***  ROUTINE dyn_spg_init  *** 
    217189      !!                 
    218       !! ** Purpose :   Control the consistency between cpp options for  
     190      !! ** Purpose :   Control the consistency between namelist options for  
    219191      !!              surface pressure gradient schemes 
    220192      !!---------------------------------------------------------------------- 
    221       INTEGER ::   ioptio 
     193      INTEGER ::   ioptio, ios 
     194      ! 
     195      NAMELIST/namdyn_spg/ ln_dynspg_exp, ln_dynspg_ts, & 
     196      &                    ln_bt_fw, ln_bt_av, ln_bt_auto, & 
     197      &                    nn_baro, rn_bt_cmax, nn_bt_flt 
    222198      !!---------------------------------------------------------------------- 
    223199      ! 
    224200      IF( nn_timing == 1 )  CALL timing_start('dyn_spg_init') 
    225201      ! 
    226       IF(lwp) THEN             ! Control print 
     202      REWIND( numnam_ref )              ! Namelist namdyn_spg in reference namelist : Free surface 
     203      READ  ( numnam_ref, namdyn_spg, IOSTAT = ios, ERR = 901) 
     204901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_spg in reference namelist', lwp ) 
     205 
     206      REWIND( numnam_cfg )              ! Namelist namdyn_spg in configuration namelist : Free surface 
     207      READ  ( numnam_cfg, namdyn_spg, IOSTAT = ios, ERR = 902 ) 
     208902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_spg in configuration namelist', lwp ) 
     209      IF(lwm) WRITE ( numond, namdyn_spg ) 
     210      ! 
     211      IF(lwp) THEN             ! Namelist print 
    227212         WRITE(numout,*) 
    228213         WRITE(numout,*) 'dyn_spg_init : choice of the surface pressure gradient scheme' 
    229214         WRITE(numout,*) '~~~~~~~~~~~' 
    230          WRITE(numout,*) '     Explicit free surface                  lk_dynspg_exp = ', lk_dynspg_exp 
    231          WRITE(numout,*) '     Free surface with time splitting       lk_dynspg_ts  = ', lk_dynspg_ts 
    232          WRITE(numout,*) '     Filtered free surface cst volume       lk_dynspg_flt = ', lk_dynspg_flt 
    233       ENDIF 
    234  
    235       IF( lk_dynspg_ts ) CALL dyn_spg_ts_init( nit000 ) 
    236       ! (do it now, to set nn_baro, used to allocate some arrays later on) 
    237       !                        ! allocate dyn_spg arrays 
    238       IF( lk_dynspg_ts ) THEN 
    239          IF( dynspg_oce_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_spg_init: failed to allocate dynspg_oce arrays') 
     215         WRITE(numout,*) '     Explicit free surface                  ln_dynspg_exp = ', ln_dynspg_exp 
     216         WRITE(numout,*) '     Free surface with time splitting       ln_dynspg_ts  = ', ln_dynspg_ts 
     217      ENDIF 
     218 
     219      IF( ln_dynspg_ts ) THEN 
     220         CALL dyn_spg_ts_init( nit000  ) ! do it first, to set nn_baro, used to allocate some arrays later on 
     221         !                               ! allocate dyn_spg arrays 
    240222         IF( dyn_spg_ts_alloc() /= 0 )   CALL ctl_stop('STOP', 'dyn_spg_init: failed to allocate dynspg_ts  arrays') 
    241223         IF ((neuler/=0).AND.(ln_bt_fw)) CALL ts_rst( nit000, 'READ' ) 
     
    244226      !                        ! Control of surface pressure gradient scheme options 
    245227      ioptio = 0 
    246       IF(lk_dynspg_exp)   ioptio = ioptio + 1 
    247       IF(lk_dynspg_ts )   ioptio = ioptio + 1 
    248       IF(lk_dynspg_flt)   ioptio = ioptio + 1 
    249       ! 
    250       IF( ( ioptio > 1 .AND. .NOT. lk_esopa ) .OR. ( ioptio == 0 .AND. .NOT. lk_c1d ) )   & 
    251            &   CALL ctl_stop( ' Choose only one surface pressure gradient scheme with a key cpp' ) 
    252       IF( ( lk_dynspg_ts .OR. lk_dynspg_exp ) .AND. ln_isfcav )   & 
    253            &   CALL ctl_stop( ' dynspg_ts and dynspg_exp not tested with ice shelf cavity ' ) 
    254       ! 
    255       IF( lk_esopa     )   nspg = -1 
    256       IF( lk_dynspg_exp)   nspg =  0 
    257       IF( lk_dynspg_ts )   nspg =  1 
    258       IF( lk_dynspg_flt)   nspg =  2 
    259       ! 
    260       IF( lk_esopa     )   nspg = -1 
     228      IF(ln_dynspg_exp)   ioptio = ioptio + 1 
     229      IF(ln_dynspg_ts )   ioptio = ioptio + 1 
     230      ! 
     231      IF(  ioptio > 1  .OR. ( ioptio == 0 .AND. .NOT. lk_c1d ) )   & 
     232           &   CALL ctl_stop( ' Choose only one surface pressure gradient scheme' ) 
     233      IF( ln_dynspg_ts .AND. ln_isfcav )   & 
     234           &   CALL ctl_stop( ' dynspg_ts not tested with ice shelf cavity ' ) 
     235      ! 
     236      IF( ln_dynspg_exp)   nspg =  0 
     237      IF( ln_dynspg_ts )   nspg =  1 
    261238      ! 
    262239      IF(lwp) THEN 
    263240         WRITE(numout,*) 
    264          IF( nspg == -1 )   WRITE(numout,*) '     ESOPA test All scheme used' 
    265241         IF( nspg ==  0 )   WRITE(numout,*) '     explicit free surface' 
    266242         IF( nspg ==  1 )   WRITE(numout,*) '     free surface with time splitting scheme' 
    267          IF( nspg ==  2 )   WRITE(numout,*) '     filtered free surface' 
    268       ENDIF 
    269  
    270 #if defined key_dynspg_flt || defined key_esopa 
    271       CALL solver_init( nit000 )   ! Elliptic solver initialisation 
    272 #endif 
    273  
    274       !                        ! Control of timestep choice 
    275       IF( lk_dynspg_ts .OR. lk_dynspg_exp ) THEN 
    276          IF( nn_cla == 1 )   CALL ctl_stop( 'Crossland advection not implemented for this free surface formulation' ) 
    277       ENDIF 
    278  
    279       !               ! Control of hydrostatic pressure choice 
    280       IF( lk_dynspg_ts .AND. ln_dynhpg_imp ) THEN 
    281          CALL ctl_stop( 'Semi-implicit hpg not compatible with time splitting' ) 
    282243      ENDIF 
    283244      ! 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_exp.F90

    r5034 r6043  
    77   !!            3.2  !  2009-06  (G. Madec, M. Leclair, R. Benshila) introduce sshwzv module 
    88   !!---------------------------------------------------------------------- 
    9 #if defined key_dynspg_exp   ||   defined key_esopa 
    109   !!---------------------------------------------------------------------- 
    11    !!   'key_dynspg_exp'                              explicit free surface 
     10   !!                     explicit free surface 
    1211   !!---------------------------------------------------------------------- 
    1312   !!   dyn_spg_exp  : update the momentum trend with the surface  
     
    3130   PRIVATE 
    3231 
    33    PUBLIC   dyn_spg_exp   ! routine called by step.F90 
     32   PUBLIC   dyn_spg_exp   ! routine called by dyn_spg  
    3433 
    3534   !! * Substitutions 
     
    101100   END SUBROUTINE dyn_spg_exp 
    102101 
    103 #else 
    104    !!---------------------------------------------------------------------- 
    105    !!   Default case :   Empty module   No standart explicit free surface  
    106    !!---------------------------------------------------------------------- 
    107 CONTAINS 
    108    SUBROUTINE dyn_spg_exp( kt )       ! Empty routine 
    109       WRITE(*,*) 'dyn_spg_exp: You should not have seen this print! error?', kt 
    110    END SUBROUTINE dyn_spg_exp 
    111 #endif 
    112  
    113102   !!====================================================================== 
    114103END MODULE dynspg_exp 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r5600 r6043  
    1111   !!             3.5  ! 2013-07  (J. Chanut) Switch to Forward-backward time stepping 
    1212   !!             3.6  ! 2013-11  (A. Coward) Update for z-tilde compatibility 
     13   !!             3.7  ! 2015-11  (J. Chanut) free surface simplification 
    1314   !!--------------------------------------------------------------------- 
    14 #if defined key_dynspg_ts   ||   defined key_esopa 
    1515   !!---------------------------------------------------------------------- 
    16    !!   'key_dynspg_ts'         split explicit free surface 
     16   !!                       split explicit free surface 
    1717   !!---------------------------------------------------------------------- 
    1818   !!   dyn_spg_ts  : compute surface pressure gradient trend using a time- 
     
    2323   USE sbc_oce         ! surface boundary condition: ocean 
    2424   USE sbcisf          ! ice shelf variable (fwfisf) 
    25    USE dynspg_oce      ! surface pressure gradient variables 
    2625   USE phycst          ! physical constants 
    2726   USE dynvor          ! vorticity term 
    2827   USE bdy_par         ! for lk_bdy 
    29    USE bdytides        ! open boundary condition data      
     28   USE bdytides        ! open boundary condition data 
    3029   USE bdydyn2d        ! open boundary conditions on barotropic variables 
    3130   USE sbctide         ! tides 
     
    6867   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse   ! (only used with een vorticity scheme) 
    6968 
    70    ! Arrays below are saved to allow testing of the "no time averaging" option 
    71    ! If this option is not retained, these could be replaced by temporary arrays 
    72    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  sshbb_e, sshb_e, & ! Instantaneous barotropic arrays 
    73                                                    ubb_e, ub_e,     & 
    74                                                    vbb_e, vb_e 
    75  
    7669   !! * Substitutions 
    7770#  include "domzgr_substitute.h90" 
     
    8881      !!                  ***  routine dyn_spg_ts_alloc  *** 
    8982      !!---------------------------------------------------------------------- 
    90       INTEGER :: ierr(3) 
     83      INTEGER :: ierr(4) 
    9184      !!---------------------------------------------------------------------- 
    9285      ierr(:) = 0 
    9386 
    94       ALLOCATE( sshb_e(jpi,jpj), sshbb_e(jpi,jpj), & 
    95          &      ub_e(jpi,jpj)  , vb_e(jpi,jpj)   , & 
    96          &      ubb_e(jpi,jpj) , vbb_e(jpi,jpj)  , STAT= ierr(1) ) 
     87      ALLOCATE( ssha_e(jpi,jpj),  sshn_e(jpi,jpj), sshb_e(jpi,jpj), sshbb_e(jpi,jpj), & 
     88         &        ua_e(jpi,jpj),    un_e(jpi,jpj),   ub_e(jpi,jpj),   ubb_e(jpi,jpj), & 
     89         &        va_e(jpi,jpj),    vn_e(jpi,jpj),   vb_e(jpi,jpj),   vbb_e(jpi,jpj), & 
     90         &        hu_e(jpi,jpj),   hur_e(jpi,jpj),   hv_e(jpi,jpj),   hvr_e(jpi,jpj), STAT= ierr(1) ) 
    9791 
    9892      ALLOCATE( wgtbtp1(3*nn_baro), wgtbtp2(3*nn_baro), zwz(jpi,jpj), STAT= ierr(2) ) 
    9993 
    100       IF( ln_dynvor_een .or. ln_dynvor_een_old ) ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , &  
    101                                                     &      ftsw(jpi,jpj) , ftse(jpi,jpj) , STAT=ierr(3) ) 
     94      IF( ln_dynvor_een ) ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , &  
     95         &                          ftsw(jpi,jpj) , ftse(jpi,jpj) , STAT=ierr(3) ) 
     96 
     97      ALLOCATE( ub2_b(jpi,jpj), vb2_b(jpi,jpj), un_adv(jpi,jpj), vn_adv(jpi,jpj), & 
     98#if defined key_agrif 
     99         &      ub2_i_b(jpi,jpj), vb2_i_b(jpi,jpj)                              , & 
     100#endif 
     101         &      STAT= ierr(4)) 
    102102 
    103103      dyn_spg_ts_alloc = MAXVAL(ierr(:)) 
    104104 
    105105      IF( lk_mpp                )   CALL mpp_sum( dyn_spg_ts_alloc ) 
    106       IF( dyn_spg_ts_alloc /= 0 )   CALL ctl_warn('dynspg_oce_alloc: failed to allocate arrays') 
     106      IF( dyn_spg_ts_alloc /= 0 )   CALL ctl_warn('dyn_spg_ts_alloc: failed to allocate arrays') 
    107107      ! 
    108108   END FUNCTION dyn_spg_ts_alloc 
     109 
    109110 
    110111   SUBROUTINE dyn_spg_ts( kt ) 
     
    145146      INTEGER  ::   ikbu, ikbv, noffset      ! local integers 
    146147      REAL(wp) ::   zraur, z1_2dt_b, z2dt_bf    ! local scalars 
    147       REAL(wp) ::   zx1, zy1, zx2, zy2         !   -      - 
    148       REAL(wp) ::   z1_12, z1_8, z1_4, z1_2    !   -      - 
    149       REAL(wp) ::   zu_spg, zv_spg             !   -      - 
    150       REAL(wp) ::   zhura, zhvra               !   -      - 
    151       REAL(wp) ::   za0, za1, za2, za3           !   -      - 
    152       ! 
    153       REAL(wp), POINTER, DIMENSION(:,:) :: zun_e, zvn_e, zsshp2_e 
     148      REAL(wp) ::   zx1, zy1, zx2, zy2          !   -      - 
     149      REAL(wp) ::   z1_12, z1_8, z1_4, z1_2  !   -      - 
     150      REAL(wp) ::   zu_spg, zv_spg              !   -      - 
     151      REAL(wp) ::   zhura, zhvra          !   -      - 
     152      REAL(wp) ::   za0, za1, za2, za3    !   -      - 
     153      ! 
     154      REAL(wp), POINTER, DIMENSION(:,:) :: zsshp2_e 
    154155      REAL(wp), POINTER, DIMENSION(:,:) :: zu_trd, zv_trd, zu_frc, zv_frc, zssh_frc 
    155       REAL(wp), POINTER, DIMENSION(:,:) :: zu_sum, zv_sum, zwx, zwy, zhdiv 
     156      REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zhdiv 
    156157      REAL(wp), POINTER, DIMENSION(:,:) :: zhup2_e, zhvp2_e, zhust_e, zhvst_e 
    157158      REAL(wp), POINTER, DIMENSION(:,:) :: zsshu_a, zsshv_a 
     
    163164      !                                         !* Allocate temporary arrays 
    164165      CALL wrk_alloc( jpi, jpj, zsshp2_e, zhdiv ) 
    165       CALL wrk_alloc( jpi, jpj, zu_trd, zv_trd, zun_e, zvn_e  ) 
    166       CALL wrk_alloc( jpi, jpj, zwx, zwy, zu_sum, zv_sum, zssh_frc, zu_frc, zv_frc) 
     166      CALL wrk_alloc( jpi, jpj, zu_trd, zv_trd) 
     167      CALL wrk_alloc( jpi, jpj, zwx, zwy, zssh_frc, zu_frc, zv_frc) 
    167168      CALL wrk_alloc( jpi, jpj, zhup2_e, zhvp2_e, zhust_e, zhvst_e) 
    168169      CALL wrk_alloc( jpi, jpj, zsshu_a, zsshv_a                                   ) 
     
    187188      ! 
    188189                                                       ! time offset in steps for bdy data update 
    189       IF (.NOT.ln_bt_fw) THEN ; noffset=-2*nn_baro ; ELSE ;  noffset = 0 ; ENDIF 
     190      IF (.NOT.ln_bt_fw) THEN ; noffset=-nn_baro ; ELSE ;  noffset = 0 ; ENDIF 
    190191      ! 
    191192      IF( kt == nit000 ) THEN                !* initialisation 
     
    219220      ! 
    220221      IF ( kt == nit000 .OR. lk_vvl ) THEN 
    221          IF ( ln_dynvor_een_old ) THEN 
    222             DO jj = 1, jpjm1 
    223                DO ji = 1, jpim1 
    224                   zwz(ji,jj) =   ( ht(ji  ,jj+1) + ht(ji+1,jj+1) +                    & 
    225                         &          ht(ji  ,jj  ) + ht(ji+1,jj  )   ) / 4._wp   
    226                   IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = 1._wp / zwz(ji,jj) 
    227                END DO 
    228             END DO 
     222         IF ( ln_dynvor_een ) THEN              !==  EEN scheme  ==! 
     223            SELECT CASE( nn_een_e3f )              !* ff/e3 at F-point 
     224            CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
     225               DO jj = 1, jpjm1 
     226                  DO ji = 1, jpim1 
     227                     zwz(ji,jj) =   ( ht(ji  ,jj+1) + ht(ji+1,jj+1) +                    & 
     228                        &             ht(ji  ,jj  ) + ht(ji+1,jj  )   ) / 4._wp   
     229                     IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff(ji,jj) / zwz(ji,jj) 
     230                  END DO 
     231               END DO 
     232            CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
     233               DO jj = 1, jpjm1 
     234                  DO ji = 1, jpim1 
     235                     zwz(ji,jj) =   ( ht(ji  ,jj+1) + ht(ji+1,jj+1) +                     & 
     236                        &             ht(ji  ,jj  ) + ht(ji+1,jj  )   )                   & 
     237                        &       / ( MAX( 1._wp, tmask(ji  ,jj+1, 1) + tmask(ji+1,jj+1, 1) +    & 
     238                        &                       tmask(ji  ,jj  , 1) + tmask(ji+1,jj  , 1) ) ) 
     239                     IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff(ji,jj) / zwz(ji,jj) 
     240                  END DO 
     241               END DO 
     242            END SELECT 
    229243            CALL lbc_lnk( zwz, 'F', 1._wp ) 
    230             zwz(:,:) = ff(:,:) * zwz(:,:) 
    231  
     244            ! 
    232245            ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
    233246            DO jj = 2, jpj 
    234                DO ji = fs_2, jpi   ! vector opt. 
     247               DO ji = 2, jpi 
    235248                  ftne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
    236249                  ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) 
     
    239252               END DO 
    240253            END DO 
    241          ELSE IF ( ln_dynvor_een ) THEN 
    242             DO jj = 1, jpjm1 
    243                DO ji = 1, jpim1 
    244                   zwz(ji,jj) =   ( ht(ji  ,jj+1) + ht(ji+1,jj+1) +                     & 
    245                         &          ht(ji  ,jj  ) + ht(ji+1,jj  )   )                   & 
    246                         &      / ( MAX( 1.0_wp, tmask(ji  ,jj+1, 1) + tmask(ji+1,jj+1, 1) +    & 
    247                         &                       tmask(ji  ,jj  , 1) + tmask(ji+1,jj  , 1) ) ) 
    248                   IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = 1._wp / zwz(ji,jj) 
    249                END DO 
    250             END DO 
    251             CALL lbc_lnk( zwz, 'F', 1._wp ) 
    252             zwz(:,:) = ff(:,:) * zwz(:,:) 
    253  
    254             ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
    255             DO jj = 2, jpj 
    256                DO ji = fs_2, jpi   ! vector opt. 
    257                   ftne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
    258                   ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) 
    259                   ftse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1) 
    260                   ftsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  ) 
    261                END DO 
    262             END DO 
    263          ELSE 
     254            ! 
     255         ELSE                                !== all other schemes (ENE, ENS, MIX) 
    264256            zwz(:,:) = 0._wp 
    265             zhf(:,:) = 0. 
     257            zhf(:,:) = 0._wp 
    266258            IF ( .not. ln_sco ) THEN 
     259 
     260!!gm  agree the JC comment  : this should be done in a much clear way 
     261 
    267262! JC: It not clear yet what should be the depth at f-points over land in z-coordinate case 
    268263!     Set it to zero for the time being  
     
    276271 
    277272            DO jj = 1, jpjm1 
    278                zhf(:,jj) = zhf(:,jj)*(1._wp- umask(:,jj,1) * umask(:,jj+1,1)) 
     273               zhf(:,jj) = zhf(:,jj) * (1._wp- umask(:,jj,1) * umask(:,jj+1,1)) 
    279274            END DO 
    280275 
     
    297292      ! If forward start at previous time step, and centered integration,  
    298293      ! then update averaging weights: 
    299       IF ((.NOT.ln_bt_fw).AND.((neuler==0).AND.(kt==nit000+1))) THEN 
     294      IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 
    300295         ll_fw_start=.FALSE. 
    301296         CALL ts_wgt(ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2) 
     
    338333         DO jj = 2, jpjm1 
    339334            DO ji = fs_2, fs_jpim1   ! vector opt. 
    340                zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj) 
    341                zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
    342                zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj) 
    343                zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
     335               zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) * r1_e1u(ji,jj) 
     336               zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
     337               zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 
     338               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    344339               ! energy conserving formulation for planetary vorticity term 
    345340               zu_trd(ji,jj) = z1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     
    352347            DO ji = fs_2, fs_jpim1   ! vector opt. 
    353348               zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    354                  &            + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
     349                 &            + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    355350               zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    356                  &            + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
     351                 &            + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    357352               zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    358353               zv_trd(ji,jj)  = zx1 * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
     
    360355         END DO 
    361356         ! 
    362       ELSEIF ( ln_dynvor_een .or. ln_dynvor_een_old ) THEN  ! enstrophy and energy conserving scheme 
     357      ELSEIF ( ln_dynvor_een ) THEN  ! enstrophy and energy conserving scheme 
    363358         DO jj = 2, jpjm1 
    364359            DO ji = fs_2, fs_jpim1   ! vector opt. 
    365                zu_trd(ji,jj) = + z1_12 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
    366                 &                                      + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
    367                 &                                      + ftse(ji,jj  ) * zwy(ji  ,jj-1) & 
    368                 &                                      + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    369                zv_trd(ji,jj) = - z1_12 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 
    370                 &                                      + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
    371                 &                                      + ftnw(ji,jj  ) * zwx(ji-1,jj  ) & 
    372                 &                                      + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     360               zu_trd(ji,jj) = + z1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
     361                &                                         + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
     362                &                                         + ftse(ji,jj  ) * zwy(ji  ,jj-1) & 
     363                &                                         + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
     364               zv_trd(ji,jj) = - z1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 
     365                &                                         + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
     366                &                                         + ftnw(ji,jj  ) * zwx(ji-1,jj  ) & 
     367                &                                         + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    373368            END DO 
    374369         END DO 
     
    381376         DO jj = 2, jpjm1  
    382377            DO ji = fs_2, fs_jpim1   ! vector opt. 
    383                zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) / e1u(ji,jj) 
    384                zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) / e2v(ji,jj) 
     378               zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) * r1_e1u(ji,jj) 
     379               zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) * r1_e2v(ji,jj) 
    385380            END DO 
    386381         END DO 
     
    431426            DO jj = 2, jpjm1               
    432427               DO ji = fs_2, fs_jpim1   ! vector opt. 
    433                   zu_spg =  grav * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) ) /e1u(ji,jj) 
    434                   zv_spg =  grav * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) ) /e2v(ji,jj) 
     428                  zu_spg =  grav * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) ) * r1_e1u(ji,jj) 
     429                  zv_spg =  grav * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) ) * r1_e2v(ji,jj) 
    435430                  zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg 
    436431                  zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg 
     
    441436               DO ji = fs_2, fs_jpim1   ! vector opt. 
    442437                  zu_spg =  grav * z1_2 * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)    & 
    443                       &                    + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) /e1u(ji,jj) 
     438                      &                    + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
    444439                  zv_spg =  grav * z1_2 * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)    & 
    445                       &                    + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) /e2v(ji,jj) 
     440                      &                    + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
    446441                  zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg 
    447442                  zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg 
     
    454449      !                                         ! Surface net water flux and rivers 
    455450      IF (ln_bt_fw) THEN 
    456          zssh_frc(:,:) = zraur * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) ) 
     451         zssh_frc(:,:) = zraur * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
    457452      ELSE 
    458453         zssh_frc(:,:) = zraur * z1_2 * (  emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:)   & 
    459                 &                        + rdivisf * ( fwfisf(:,:) + fwfisf_b(:,:) )       ) 
     454                &                        + fwfisf(:,:) + fwfisf_b(:,:)                     ) 
    460455      ENDIF 
    461456#if defined key_asminc 
     
    465460      ENDIF 
    466461#endif 
    467       !                                   !* Fill boundary data arrays with AGRIF 
    468       !                                   ! ------------------------------------- 
     462      !                                   !* Fill boundary data arrays for AGRIF 
     463      !                                   ! ------------------------------------ 
    469464#if defined key_agrif 
    470465         IF( .NOT.Agrif_Root() ) CALL agrif_dta_ts( kt ) 
     
    490485      IF (ln_bt_fw) THEN                  ! FORWARD integration: start from NOW fields                     
    491486         sshn_e(:,:) = sshn (:,:)             
    492          zun_e (:,:) = un_b (:,:)             
    493          zvn_e (:,:) = vn_b (:,:) 
     487         un_e (:,:) = un_b (:,:)             
     488         vn_e (:,:) = vn_b (:,:) 
    494489         ! 
    495490         hu_e  (:,:) = hu   (:,:)        
     
    499494      ELSE                                ! CENTRED integration: start from BEFORE fields 
    500495         sshn_e(:,:) = sshb (:,:) 
    501          zun_e (:,:) = ub_b (:,:)          
    502          zvn_e (:,:) = vb_b (:,:) 
     496         un_e (:,:) = ub_b (:,:)          
     497         vn_e (:,:) = vb_b (:,:) 
    503498         ! 
    504499         hu_e  (:,:) = hu_b (:,:)        
     
    514509      va_b  (:,:) = 0._wp 
    515510      ssha  (:,:) = 0._wp       ! Sum for after averaged sea level 
    516       zu_sum(:,:) = 0._wp       ! Sum for now transport issued from ts loop 
    517       zv_sum(:,:) = 0._wp 
     511      un_adv(:,:) = 0._wp       ! Sum for now transport issued from ts loop 
     512      vn_adv(:,:) = 0._wp 
    518513      !                                             ! ==================== ! 
    519514      DO jn = 1, icycle                             !  sub-time-step loop  ! 
     
    523518         ! Update only tidal forcing at open boundaries 
    524519#if defined key_tide 
    525          IF ( lk_bdy .AND. lk_tide )      CALL bdy_dta_tides( kt, kit=jn, time_offset=(noffset+1) ) 
    526          IF ( ln_tide_pot .AND. lk_tide ) CALL upd_tide( kt, kit=jn, koffset=noffset ) 
     520         IF ( lk_bdy .AND. lk_tide ) CALL bdy_dta_tides( kt, kit=jn, time_offset=(noffset+1) ) 
     521         IF ( ln_tide_pot .AND. lk_tide ) CALL upd_tide( kt, kit=jn, time_offset=noffset ) 
    527522#endif 
    528523         ! 
     
    539534 
    540535         ! Extrapolate barotropic velocities at step jit+0.5: 
    541          ua_e(:,:) = za1 * zun_e(:,:) + za2 * ub_e(:,:) + za3 * ubb_e(:,:) 
    542          va_e(:,:) = za1 * zvn_e(:,:) + za2 * vb_e(:,:) + za3 * vbb_e(:,:) 
     536         ua_e(:,:) = za1 * un_e(:,:) + za2 * ub_e(:,:) + za3 * ubb_e(:,:) 
     537         va_e(:,:) = za1 * vn_e(:,:) + za2 * vb_e(:,:) + za3 * vbb_e(:,:) 
    543538 
    544539         IF( lk_vvl ) THEN                                !* Update ocean depth (variable volume case only) 
     
    549544            DO jj = 2, jpjm1                                    ! Sea Surface Height at u- & v-points 
    550545               DO ji = 2, fs_jpim1   ! Vector opt. 
    551                   zwx(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e12u(ji,jj)     & 
    552                      &              * ( e12t(ji  ,jj) * zsshp2_e(ji  ,jj)  & 
    553                      &              +   e12t(ji+1,jj) * zsshp2_e(ji+1,jj) ) 
    554                   zwy(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e12v(ji,jj)     & 
    555                      &              * ( e12t(ji,jj  ) * zsshp2_e(ji,jj  )  & 
    556                      &              +   e12t(ji,jj+1) * zsshp2_e(ji,jj+1) ) 
     546                  zwx(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e1e2u(ji,jj)     & 
     547                     &              * ( e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)  & 
     548                     &              +   e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) 
     549                  zwy(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e1e2v(ji,jj)     & 
     550                     &              * ( e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )  & 
     551                     &              +   e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) 
    557552               END DO 
    558553            END DO 
     
    602597         ! Sum over sub-time-steps to compute advective velocities 
    603598         za2 = wgtbtp2(jn) 
    604          zu_sum  (:,:) = zu_sum  (:,:) + za2 * zwx  (:,:) / e2u  (:,:) 
    605          zv_sum  (:,:) = zv_sum  (:,:) + za2 * zwy  (:,:) / e1v  (:,:) 
     599         un_adv(:,:) = un_adv(:,:) + za2 * zwx(:,:) * r1_e2u(:,:) 
     600         vn_adv(:,:) = vn_adv(:,:) + za2 * zwy(:,:) * r1_e1v(:,:) 
    606601         ! 
    607602         ! Set next sea level: 
     
    609604            DO ji = fs_2, fs_jpim1   ! vector opt. 
    610605               zhdiv(ji,jj) = (   zwx(ji,jj) - zwx(ji-1,jj)   & 
    611                   &             + zwy(ji,jj) - zwy(ji,jj-1)   ) * r1_e12t(ji,jj) 
     606                  &             + zwy(ji,jj) - zwy(ji,jj-1)   ) * r1_e1e2t(ji,jj) 
    612607            END DO 
    613608         END DO 
     
    627622            DO jj = 2, jpjm1 
    628623               DO ji = 2, jpim1      ! NO Vector Opt. 
    629                   zsshu_a(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e12u(ji,jj)  & 
    630                      &              * ( e12t(ji  ,jj  ) * ssha_e(ji  ,jj  ) & 
    631                      &              +   e12t(ji+1,jj  ) * ssha_e(ji+1,jj  ) ) 
    632                   zsshv_a(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e12v(ji,jj)  & 
    633                      &              * ( e12t(ji  ,jj  ) * ssha_e(ji  ,jj  ) & 
    634                      &              +   e12t(ji  ,jj+1) * ssha_e(ji  ,jj+1) ) 
     624                  zsshu_a(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e1e2u(ji,jj)  & 
     625                     &              * ( e1e2t(ji  ,jj  ) * ssha_e(ji  ,jj  ) & 
     626                     &              +   e1e2t(ji+1,jj  ) * ssha_e(ji+1,jj  ) ) 
     627                  zsshv_a(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e1e2v(ji,jj)  & 
     628                     &              * ( e1e2t(ji  ,jj  ) * ssha_e(ji  ,jj  ) & 
     629                     &              +   e1e2t(ji  ,jj+1) * ssha_e(ji  ,jj+1) ) 
    635630               END DO 
    636631            END DO 
     
    666661            DO jj = 2, jpjm1                             
    667662               DO ji = 2, jpim1 
    668                   zx1 = z1_2 * umask(ji  ,jj,1) *  r1_e12u(ji  ,jj)    & 
    669                      &      * ( e12t(ji  ,jj  ) * zsshp2_e(ji  ,jj)    & 
    670                      &      +   e12t(ji+1,jj  ) * zsshp2_e(ji+1,jj  ) ) 
    671                   zy1 = z1_2 * vmask(ji  ,jj,1) *  r1_e12v(ji  ,jj  )  & 
    672                      &       * ( e12t(ji ,jj  ) * zsshp2_e(ji  ,jj  )  & 
    673                      &       +   e12t(ji ,jj+1) * zsshp2_e(ji  ,jj+1) ) 
     663                  zx1 = z1_2 * umask(ji  ,jj,1) *  r1_e1e2u(ji  ,jj)    & 
     664                     &      * ( e1e2t(ji  ,jj  ) * zsshp2_e(ji  ,jj)    & 
     665                     &      +   e1e2t(ji+1,jj  ) * zsshp2_e(ji+1,jj  ) ) 
     666                  zy1 = z1_2 * vmask(ji  ,jj,1) *  r1_e1e2v(ji  ,jj  )  & 
     667                     &       * ( e1e2t(ji ,jj  ) * zsshp2_e(ji  ,jj  )  & 
     668                     &       +   e1e2t(ji ,jj+1) * zsshp2_e(ji  ,jj+1) ) 
    674669                  zhust_e(ji,jj) = hu_0(ji,jj) + zx1  
    675670                  zhvst_e(ji,jj) = hv_0(ji,jj) + zy1 
     
    688683            DO jj = 2, jpjm1 
    689684               DO ji = fs_2, fs_jpim1   ! vector opt. 
    690                   zy1 = ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj) 
    691                   zy2 = ( zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
    692                   zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) / e2v(ji,jj) 
    693                   zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
     685                  zy1 = ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) ) * r1_e1u(ji,jj) 
     686                  zy2 = ( zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
     687                  zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 
     688                  zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    694689                  zu_trd(ji,jj) = z1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    695690                  zv_trd(ji,jj) =-z1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
     
    701696               DO ji = fs_2, fs_jpim1   ! vector opt. 
    702697                  zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    703                    &             + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
     698                   &             + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    704699                  zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    705                    &             + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
     700                   &             + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    706701                  zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    707702                  zv_trd(ji,jj)  = zx1 * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
     
    709704            END DO 
    710705            ! 
    711          ELSEIF ( ln_dynvor_een .or. ln_dynvor_een_old ) THEN !==  energy and enstrophy conserving scheme  ==! 
     706         ELSEIF ( ln_dynvor_een ) THEN !==  energy and enstrophy conserving scheme  ==! 
    712707            DO jj = 2, jpjm1 
    713708               DO ji = fs_2, fs_jpim1   ! vector opt. 
    714                   zu_trd(ji,jj) = + z1_12 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
    715                      &                                    + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
    716                      &                                    + ftse(ji,jj  ) * zwy(ji  ,jj-1) &  
    717                      &                                    + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    718                   zv_trd(ji,jj) = - z1_12 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) &  
    719                      &                                    + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
    720                      &                                    + ftnw(ji,jj  ) * zwx(ji-1,jj  ) &  
    721                      &                                    + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     709                  zu_trd(ji,jj) = + z1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
     710                     &                                       + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
     711                     &                                       + ftse(ji,jj  ) * zwy(ji  ,jj-1) &  
     712                     &                                       + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
     713                  zv_trd(ji,jj) = - z1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) &  
     714                     &                                       + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
     715                     &                                       + ftnw(ji,jj  ) * zwx(ji-1,jj  ) &  
     716                     &                                       + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    722717               END DO 
    723718            END DO 
     
    729724            DO jj = 2, jpjm1 
    730725               DO ji = fs_2, fs_jpim1   ! vector opt. 
    731                   zu_spg = grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) / e1u(ji,jj) 
    732                   zv_spg = grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) / e2v(ji,jj) 
     726                  zu_spg = grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
     727                  zv_spg = grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
    733728                  zu_trd(ji,jj) = zu_trd(ji,jj) + zu_spg 
    734729                  zv_trd(ji,jj) = zv_trd(ji,jj) + zv_spg 
     
    738733         ! 
    739734         ! Add bottom stresses: 
    740          zu_trd(:,:) = zu_trd(:,:) + bfrua(:,:) * zun_e(:,:) * hur_e(:,:) 
    741          zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * zvn_e(:,:) * hvr_e(:,:) 
     735         zu_trd(:,:) = zu_trd(:,:) + bfrua(:,:) * un_e(:,:) * hur_e(:,:) 
     736         zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * vn_e(:,:) * hvr_e(:,:) 
    742737         ! 
    743738         ! Surface pressure trend: 
     
    745740            DO ji = fs_2, fs_jpim1   ! vector opt. 
    746741               ! Add surface pressure gradient 
    747                zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) / e1u(ji,jj) 
    748                zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) / e2v(ji,jj) 
     742               zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 
     743               zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 
    749744               zwx(ji,jj) = zu_spg 
    750745               zwy(ji,jj) = zv_spg 
     
    756751            DO jj = 2, jpjm1 
    757752               DO ji = fs_2, fs_jpim1   ! vector opt. 
    758                   ua_e(ji,jj) = (                                zun_e(ji,jj)   &  
     753                  ua_e(ji,jj) = (                                 un_e(ji,jj)   &  
    759754                            &     + rdtbt * (                      zwx(ji,jj)   & 
    760755                            &                                 + zu_trd(ji,jj)   & 
     
    762757                            &   ) * umask(ji,jj,1) 
    763758 
    764                   va_e(ji,jj) = (                                zvn_e(ji,jj)   & 
     759                  va_e(ji,jj) = (                                 vn_e(ji,jj)   & 
    765760                            &     + rdtbt * (                      zwy(ji,jj)   & 
    766761                            &                                 + zv_trd(ji,jj)   & 
     
    777772                  zhvra = vmask(ji,jj,1)/(hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - vmask(ji,jj,1)) 
    778773 
    779                   ua_e(ji,jj) = (                hu_e(ji,jj)  *  zun_e(ji,jj)   &  
     774                  ua_e(ji,jj) = (                hu_e(ji,jj)  *   un_e(ji,jj)   &  
    780775                            &     + rdtbt * ( zhust_e(ji,jj)  *    zwx(ji,jj)   &  
    781776                            &               + zhup2_e(ji,jj)  * zu_trd(ji,jj)   & 
     
    783778                            &   ) * zhura 
    784779 
    785                   va_e(ji,jj) = (                hv_e(ji,jj)  *  zvn_e(ji,jj)   & 
     780                  va_e(ji,jj) = (                hv_e(ji,jj)  *   vn_e(ji,jj)   & 
    786781                            &     + rdtbt * ( zhvst_e(ji,jj)  *    zwy(ji,jj)   & 
    787782                            &               + zhvp2_e(ji,jj)  * zv_trd(ji,jj)   & 
     
    807802#if defined key_bdy   
    808803                                                           ! open boundaries 
    809          IF( lk_bdy ) CALL bdy_dyn2d( jn, ua_e, va_e, zun_e, zvn_e, hur_e, hvr_e, ssha_e ) 
     804         IF( lk_bdy ) CALL bdy_dyn2d( jn, ua_e, va_e, un_e, vn_e, hur_e, hvr_e, ssha_e ) 
    810805#endif 
    811806#if defined key_agrif                                                            
     
    815810         !                                             !  ---- 
    816811         ubb_e  (:,:) = ub_e  (:,:) 
    817          ub_e   (:,:) = zun_e (:,:) 
    818          zun_e  (:,:) = ua_e  (:,:) 
     812         ub_e   (:,:) = un_e (:,:) 
     813         un_e   (:,:) = ua_e  (:,:) 
    819814         ! 
    820815         vbb_e  (:,:) = vb_e  (:,:) 
    821          vb_e   (:,:) = zvn_e (:,:) 
    822          zvn_e  (:,:) = va_e  (:,:) 
     816         vb_e   (:,:) = vn_e (:,:) 
     817         vn_e   (:,:) = va_e  (:,:) 
    823818         ! 
    824819         sshbb_e(:,:) = sshb_e(:,:) 
     
    845840      ! ----------------------------------------------------------------------------- 
    846841      ! 
    847       ! At this stage ssha holds a time averaged value 
    848       !                                                ! Sea Surface Height at u-,v- and f-points 
    849       IF( lk_vvl ) THEN                                ! (required only in key_vvl case) 
    850          DO jj = 1, jpjm1 
    851             DO ji = 1, jpim1      ! NO Vector Opt. 
    852                zsshu_a(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e12u(ji,jj) & 
    853                   &              * ( e12t(ji  ,jj) * ssha(ji  ,jj)    & 
    854                   &              +   e12t(ji+1,jj) * ssha(ji+1,jj) ) 
    855                zsshv_a(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e12v(ji,jj) & 
    856                   &              * ( e12t(ji,jj  ) * ssha(ji,jj  )    & 
    857                   &              +   e12t(ji,jj+1) * ssha(ji,jj+1) ) 
    858             END DO 
    859          END DO 
    860          CALL lbc_lnk_multi( zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) ! Boundary conditions 
    861       ENDIF 
    862       ! 
    863842      ! Set advection velocity correction: 
     843      zwx(:,:) = un_adv(:,:) 
     844      zwy(:,:) = vn_adv(:,:) 
    864845      IF (((kt==nit000).AND.(neuler==0)).OR.(.NOT.ln_bt_fw)) THEN      
    865          un_adv(:,:) = zu_sum(:,:)*hur(:,:) 
    866          vn_adv(:,:) = zv_sum(:,:)*hvr(:,:) 
     846         un_adv(:,:) = zwx(:,:)*hur(:,:) 
     847         vn_adv(:,:) = zwy(:,:)*hvr(:,:) 
    867848      ELSE 
    868          un_adv(:,:) = z1_2 * ( ub2_b(:,:) + zu_sum(:,:)) * hur(:,:) 
    869          vn_adv(:,:) = z1_2 * ( vb2_b(:,:) + zv_sum(:,:)) * hvr(:,:) 
     849         un_adv(:,:) = z1_2 * ( ub2_b(:,:) + zwx(:,:)) * hur(:,:) 
     850         vn_adv(:,:) = z1_2 * ( vb2_b(:,:) + zwy(:,:)) * hvr(:,:) 
    870851      END IF 
    871852 
    872853      IF (ln_bt_fw) THEN ! Save integrated transport for next computation 
    873          ub2_b(:,:) = zu_sum(:,:) 
    874          vb2_b(:,:) = zv_sum(:,:) 
     854         ub2_b(:,:) = zwx(:,:) 
     855         vb2_b(:,:) = zwy(:,:) 
    875856      ENDIF 
    876857      ! 
     
    882863         END DO 
    883864      ELSE 
     865         ! At this stage, ssha has been corrected: compute new depths at velocity points 
     866         DO jj = 1, jpjm1 
     867            DO ji = 1, jpim1      ! NO Vector Opt. 
     868               zsshu_a(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e1e2u(ji,jj) & 
     869                  &              * ( e1e2t(ji  ,jj) * ssha(ji  ,jj)    & 
     870                  &              +   e1e2t(ji+1,jj) * ssha(ji+1,jj) ) 
     871               zsshv_a(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e1e2v(ji,jj) & 
     872                  &              * ( e1e2t(ji,jj  ) * ssha(ji,jj  )    & 
     873                  &              +   e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 
     874            END DO 
     875         END DO 
     876         CALL lbc_lnk_multi( zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) ! Boundary conditions 
     877         ! 
    884878         DO jk=1,jpkm1 
    885879            ua(:,:,jk) = ua(:,:,jk) + hur(:,:) * ( ua_b(:,:) - ub_b(:,:) * hu_b(:,:) ) * z1_2dt_b 
     
    900894#if defined key_agrif 
    901895      ! Save time integrated fluxes during child grid integration 
    902       ! (used to update coarse grid transports) 
    903       ! Useless with 2nd order momentum schemes 
     896      ! (used to update coarse grid transports at next time step) 
    904897      ! 
    905898      IF ( (.NOT.Agrif_Root()).AND.(ln_bt_fw) ) THEN 
     
    921914      ! 
    922915      CALL wrk_dealloc( jpi, jpj, zsshp2_e, zhdiv ) 
    923       CALL wrk_dealloc( jpi, jpj, zu_trd, zv_trd, zun_e, zvn_e ) 
    924       CALL wrk_dealloc( jpi, jpj, zwx, zwy, zu_sum, zv_sum, zssh_frc, zu_frc, zv_frc ) 
     916      CALL wrk_dealloc( jpi, jpj, zu_trd, zv_trd ) 
     917      CALL wrk_dealloc( jpi, jpj, zwx, zwy, zssh_frc, zu_frc, zv_frc ) 
    925918      CALL wrk_dealloc( jpi, jpj, zhup2_e, zhvp2_e, zhust_e, zhvst_e ) 
    926919      CALL wrk_dealloc( jpi, jpj, zsshu_a, zsshv_a                                   ) 
     
    10701063      ! 
    10711064      INTEGER  :: ji ,jj 
    1072       INTEGER  ::   ios                 ! Local integer output status for namelist read 
    10731065      REAL(wp) :: zxr2, zyr2, zcmax 
    10741066      REAL(wp), POINTER, DIMENSION(:,:) :: zcu 
    10751067      !! 
    1076       NAMELIST/namsplit/ ln_bt_fw, ln_bt_av, ln_bt_nn_auto, & 
    1077       &                  nn_baro, rn_bt_cmax, nn_bt_flt 
    10781068      !!---------------------------------------------------------------------- 
    10791069      ! 
    1080       REWIND( numnam_ref )              ! Namelist namsplit in reference namelist : time splitting parameters 
    1081       READ  ( numnam_ref, namsplit, IOSTAT = ios, ERR = 901) 
    1082 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsplit in reference namelist', lwp ) 
    1083  
    1084       REWIND( numnam_cfg )              ! Namelist namsplit in configuration namelist : time splitting parameters 
    1085       READ  ( numnam_cfg, namsplit, IOSTAT = ios, ERR = 902 ) 
    1086 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsplit in configuration namelist', lwp ) 
    1087       IF(lwm) WRITE ( numond, namsplit ) 
    1088       ! 
    1089       !         ! Max courant number for ext. grav. waves 
     1070      ! Max courant number for ext. grav. waves 
    10901071      ! 
    10911072      CALL wrk_alloc( jpi, jpj, zcu ) 
    10921073      ! 
    1093       IF (lk_vvl) THEN  
    1094          DO jj = 1, jpj 
    1095             DO ji =1, jpi 
    1096                zxr2 = 1./(e1t(ji,jj)*e1t(ji,jj)) 
    1097                zyr2 = 1./(e2t(ji,jj)*e2t(ji,jj)) 
    1098                zcu(ji,jj) = sqrt(grav*ht_0(ji,jj)*(zxr2 + zyr2) ) 
    1099             END DO 
    1100          END DO 
    1101       ELSE 
    1102          DO jj = 1, jpj 
    1103             DO ji =1, jpi 
    1104                zxr2 = 1./(e1t(ji,jj)*e1t(ji,jj)) 
    1105                zyr2 = 1./(e2t(ji,jj)*e2t(ji,jj)) 
    1106                zcu(ji,jj) = sqrt(grav*ht(ji,jj)*(zxr2 + zyr2) ) 
    1107             END DO 
    1108          END DO 
    1109       ENDIF 
    1110  
    1111       zcmax = MAXVAL(zcu(:,:)) 
     1074      DO jj = 1, jpj 
     1075         DO ji =1, jpi 
     1076            zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
     1077            zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 
     1078            zcu(ji,jj) = SQRT( grav * ht_0(ji,jj) * (zxr2 + zyr2) ) 
     1079         END DO 
     1080      END DO 
     1081      ! 
     1082      zcmax = MAXVAL( zcu(:,:) ) 
    11121083      IF( lk_mpp )   CALL mpp_max( zcmax ) 
    11131084 
    11141085      ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax 
    1115       IF (ln_bt_nn_auto) nn_baro = CEILING( rdt / rn_bt_cmax * zcmax) 
     1086      IF (ln_bt_auto) nn_baro = CEILING( rdt / rn_bt_cmax * zcmax) 
    11161087       
    1117       rdtbt = rdt / FLOAT(nn_baro) 
     1088      rdtbt = rdt / REAL( nn_baro , wp ) 
    11181089      zcmax = zcmax * rdtbt 
    11191090                     ! Print results 
     
    11211092      IF(lwp) WRITE(numout,*) 'dyn_spg_ts : split-explicit free surface' 
    11221093      IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 
    1123       IF( ln_bt_nn_auto ) THEN 
    1124          IF(lwp) WRITE(numout,*) '     ln_ts_nn_auto=.true. Automatically set nn_baro ' 
     1094      IF( ln_bt_auto ) THEN 
     1095         IF(lwp) WRITE(numout,*) '     ln_ts_auto=.true. Automatically set nn_baro ' 
    11251096         IF(lwp) WRITE(numout,*) '     Max. courant number allowed: ', rn_bt_cmax 
    11261097      ELSE 
    1127          IF(lwp) WRITE(numout,*) '     ln_ts_nn_auto=.false.: Use nn_baro in namelist ' 
     1098         IF(lwp) WRITE(numout,*) '     ln_ts_auto=.false.: Use nn_baro in namelist ' 
    11281099      ENDIF 
    11291100 
     
    11701141   END SUBROUTINE dyn_spg_ts_init 
    11711142 
    1172 #else 
    1173    !!--------------------------------------------------------------------------- 
    1174    !!   Default case :   Empty module   No split explicit free surface 
    1175    !!--------------------------------------------------------------------------- 
    1176 CONTAINS 
    1177    INTEGER FUNCTION dyn_spg_ts_alloc()    ! Dummy function 
    1178       dyn_spg_ts_alloc = 0 
    1179    END FUNCTION dyn_spg_ts_alloc 
    1180    SUBROUTINE dyn_spg_ts( kt )            ! Empty routine 
    1181       INTEGER, INTENT(in) :: kt 
    1182       WRITE(*,*) 'dyn_spg_ts: You should not have seen this print! error?', kt 
    1183    END SUBROUTINE dyn_spg_ts 
    1184    SUBROUTINE ts_rst( kt, cdrw )          ! Empty routine 
    1185       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1186       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    1187       WRITE(*,*) 'ts_rst    : You should not have seen this print! error?', kt, cdrw 
    1188    END SUBROUTINE ts_rst   
    1189    SUBROUTINE dyn_spg_ts_init( kt )       ! Empty routine 
    1190       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1191       WRITE(*,*) 'dyn_spg_ts_init   : You should not have seen this print! error?', kt 
    1192    END SUBROUTINE dyn_spg_ts_init 
    1193 #endif 
    1194     
    11951143   !!====================================================================== 
    11961144END MODULE dynspg_ts 
    1197  
    1198  
    1199  
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90

    r5034 r6043  
    1616   !!            3.3  ! 2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    1717   !!            3.7  ! 2014-04  (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity  
     18   !!             -   ! 2014-06  (G. Madec) suppression of velocity curl from in-core memory 
    1819   !!---------------------------------------------------------------------- 
    1920 
     
    2223   !!       vor_ens  : enstrophy conserving scheme       (ln_dynvor_ens=T) 
    2324   !!       vor_ene  : energy conserving scheme          (ln_dynvor_ene=T) 
    24    !!       vor_mix  : mixed enstrophy/energy conserving (ln_dynvor_mix=T) 
    2525   !!       vor_een  : energy and enstrophy conserving   (ln_dynvor_een=T) 
    2626   !!   dyn_vor_init : set and control of the different vorticity option 
     
    3232   USE trd_oce        ! trends: ocean variables 
    3333   USE trddyn         ! trend manager: dynamics 
     34   USE c1d            ! 1D vertical configuration 
     35   ! 
    3436   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    3537   USE prtctl         ! Print control 
     
    4446 
    4547   PUBLIC   dyn_vor        ! routine called by step.F90 
    46    PUBLIC   dyn_vor_init   ! routine called by opa.F90 
     48   PUBLIC   dyn_vor_init   ! routine called by nemogcm.F90 
    4749 
    4850   !                                   !!* Namelist namdyn_vor: vorticity term 
    49    LOGICAL, PUBLIC ::   ln_dynvor_ene   !: energy conserving scheme 
    50    LOGICAL, PUBLIC ::   ln_dynvor_ens   !: enstrophy conserving scheme 
    51    LOGICAL, PUBLIC ::   ln_dynvor_mix   !: mixed scheme 
    52    LOGICAL, PUBLIC ::   ln_dynvor_een   !: energy and enstrophy conserving scheme 
    53    LOGICAL, PUBLIC ::   ln_dynvor_een_old !: energy and enstrophy conserving scheme (original formulation) 
    54  
    55    INTEGER ::   nvor = 0   ! type of vorticity trend used 
    56    INTEGER ::   ncor = 1   ! coriolis 
    57    INTEGER ::   nrvm = 2   ! =2 relative vorticity ; =3 metric term 
    58    INTEGER ::   ntot = 4   ! =4 total vorticity (relative + planetary) ; =5 coriolis + metric term 
    59  
     51   LOGICAL, PUBLIC ::   ln_dynvor_ene   !: energy conserving scheme    (ENE) 
     52   LOGICAL, PUBLIC ::   ln_dynvor_ens   !: enstrophy conserving scheme (ENS) 
     53   LOGICAL, PUBLIC ::   ln_dynvor_mix   !: mixed scheme                (MIX) 
     54   LOGICAL, PUBLIC ::   ln_dynvor_een   !: energy and enstrophy conserving scheme (EEN) 
     55   INTEGER, PUBLIC ::      nn_een_e3f      !: e3f=masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1) 
     56   LOGICAL, PUBLIC ::   ln_dynvor_msk   !: vorticity multiplied by fmask (=T) or not (=F) (all vorticity schemes) 
     57 
     58   INTEGER ::   nvor_scheme        ! choice of the type of advection scheme 
     59   !                               ! associated indices: 
     60   INTEGER, PUBLIC, PARAMETER ::   np_ENE = 1   ! ENE scheme 
     61   INTEGER, PUBLIC, PARAMETER ::   np_ENS = 2   ! ENS scheme 
     62   INTEGER, PUBLIC, PARAMETER ::   np_MIX = 3   ! MIX scheme 
     63   INTEGER, PUBLIC, PARAMETER ::   np_EEN = 4   ! EEN scheme 
     64 
     65   INTEGER ::   ncor, nrvm, ntot   ! choice of calculated vorticity  
     66   !                               ! associated indices: 
     67   INTEGER, PARAMETER ::   np_COR = 1         ! Coriolis (planetary) 
     68   INTEGER, PARAMETER ::   np_RVO = 2         ! relative vorticity 
     69   INTEGER, PARAMETER ::   np_MET = 3         ! metric term 
     70   INTEGER, PARAMETER ::   np_CRV = 4         ! relative + planetary (total vorticity) 
     71   INTEGER, PARAMETER ::   np_CME = 5         ! Coriolis + metric term 
     72    
     73   REAL(wp) ::   r1_4  = 0.250_wp         ! =1/4 
     74   REAL(wp) ::   r1_8  = 0.125_wp         ! =1/8 
     75   REAL(wp) ::   r1_12 = 1._wp / 12._wp   ! 1/12 
     76    
    6077   !! * Substitutions 
    6178#  include "domzgr_substitute.h90" 
    6279#  include "vectopt_loop_substitute.h90" 
    6380   !!---------------------------------------------------------------------- 
    64    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     81   !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
    6582   !! $Id$ 
    6683   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    87104      IF( l_trddyn )   CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
    88105      ! 
    89       !                                          ! vorticity term  
    90       SELECT CASE ( nvor )                       ! compute the vorticity trend and add it to the general trend 
    91       ! 
    92       CASE ( -1 )                                      ! esopa: test all possibility with control print 
    93          CALL vor_ene( kt, ntot, ua, va ) 
    94          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor0 - Ua: ', mask1=umask, & 
    95             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    96          CALL vor_ens( kt, ntot, ua, va ) 
    97          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor1 - Ua: ', mask1=umask, & 
    98             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    99          CALL vor_mix( kt ) 
    100          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor2 - Ua: ', mask1=umask, & 
    101             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    102          CALL vor_een( kt, ntot, ua, va ) 
    103          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor3 - Ua: ', mask1=umask, & 
    104             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    105          ! 
    106       CASE ( 0 )                                       ! energy conserving scheme 
    107          IF( l_trddyn )   THEN 
    108             ztrdu(:,:,:) = ua(:,:,:) 
    109             ztrdv(:,:,:) = va(:,:,:) 
    110             CALL vor_ene( kt, nrvm, ua, va )                ! relative vorticity or metric trend 
     106      SELECT CASE ( nvor_scheme )               !==  vorticity trend added to the general trend  ==! 
     107      ! 
     108      CASE ( np_ENE )                                 !* energy conserving scheme 
     109         IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
     110            ztrdu(:,:,:) = ua(:,:,:) 
     111            ztrdv(:,:,:) = va(:,:,:) 
     112            CALL vor_ene( kt, nrvm, ua, va )                      ! relative vorticity or metric trend 
    111113            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    112114            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    114116            ztrdu(:,:,:) = ua(:,:,:) 
    115117            ztrdv(:,:,:) = va(:,:,:) 
    116             CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend 
     118            CALL vor_ene( kt, ncor, ua, va )                      ! planetary vorticity trend 
    117119            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    118120            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    119121            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    120122         ELSE 
    121             CALL vor_ene( kt, ntot, ua, va )                ! total vorticity 
    122          ENDIF 
    123          ! 
    124       CASE ( 1 )                                       ! enstrophy conserving scheme 
    125          IF( l_trddyn )   THEN     
    126             ztrdu(:,:,:) = ua(:,:,:) 
    127             ztrdv(:,:,:) = va(:,:,:) 
    128             CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend 
     123            CALL vor_ene( kt, ntot, ua, va )                ! total vorticity trend 
     124         ENDIF 
     125         ! 
     126      CASE ( np_ENS )                                 !* enstrophy conserving scheme 
     127         IF( l_trddyn ) THEN                                ! trend diagnostics: splitthe trend in two     
     128            ztrdu(:,:,:) = ua(:,:,:) 
     129            ztrdv(:,:,:) = va(:,:,:) 
     130            CALL vor_ens( kt, nrvm, ua, va )                      ! relative vorticity or metric trend 
    129131            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    130132            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    132134            ztrdu(:,:,:) = ua(:,:,:) 
    133135            ztrdv(:,:,:) = va(:,:,:) 
    134             CALL vor_ens( kt, ncor, ua, va )                ! planetary vorticity trend 
     136            CALL vor_ens( kt, ncor, ua, va )                      ! planetary vorticity trend 
    135137            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    136138            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    137139            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    138140         ELSE 
    139             CALL vor_ens( kt, ntot, ua, va )                ! total vorticity 
    140          ENDIF 
    141          ! 
    142       CASE ( 2 )                                       ! mixed ene-ens scheme 
    143          IF( l_trddyn )   THEN 
    144             ztrdu(:,:,:) = ua(:,:,:) 
    145             ztrdv(:,:,:) = va(:,:,:) 
    146             CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend (ens) 
     141            CALL vor_ens( kt, ntot, ua, va )                ! total vorticity trend 
     142         ENDIF 
     143         ! 
     144      CASE ( np_MIX )                                 !* mixed ene-ens scheme 
     145         IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
     146            ztrdu(:,:,:) = ua(:,:,:) 
     147            ztrdv(:,:,:) = va(:,:,:) 
     148            CALL vor_ens( kt, nrvm, ua, va )                      ! relative vorticity or metric trend (ens) 
    147149            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    148150            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    150152            ztrdu(:,:,:) = ua(:,:,:) 
    151153            ztrdv(:,:,:) = va(:,:,:) 
    152             CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend (ene) 
     154            CALL vor_ene( kt, ncor, ua, va )                      ! planetary vorticity trend (ene) 
    153155            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    154156            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    155157            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    156158         ELSE 
    157             CALL vor_mix( kt )                               ! total vorticity (mix=ens-ene) 
    158          ENDIF 
    159          ! 
    160       CASE ( 3 )                                       ! energy and enstrophy conserving scheme 
    161          IF( l_trddyn )   THEN 
    162             ztrdu(:,:,:) = ua(:,:,:) 
    163             ztrdv(:,:,:) = va(:,:,:) 
    164             CALL vor_een( kt, nrvm, ua, va )                ! relative vorticity or metric trend 
     159            CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend (ens) 
     160            CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend (ene) 
     161        ENDIF 
     162         ! 
     163      CASE ( np_EEN )                                 !* energy and enstrophy conserving scheme 
     164         IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
     165            ztrdu(:,:,:) = ua(:,:,:) 
     166            ztrdv(:,:,:) = va(:,:,:) 
     167            CALL vor_een( kt, nrvm, ua, va )                      ! relative vorticity or metric trend 
    165168            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    166169            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    168171            ztrdu(:,:,:) = ua(:,:,:) 
    169172            ztrdv(:,:,:) = va(:,:,:) 
    170             CALL vor_een( kt, ncor, ua, va )                ! planetary vorticity trend 
     173            CALL vor_een( kt, ncor, ua, va )                      ! planetary vorticity trend 
    171174            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    172175            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    173176            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    174177         ELSE 
    175             CALL vor_een( kt, ntot, ua, va )                ! total vorticity 
     178            CALL vor_een( kt, ntot, ua, va )                ! total vorticity trend 
    176179         ENDIF 
    177180         ! 
     
    197200      !! 
    198201      !! ** Method  :   Trend evaluated using now fields (centered in time)  
    199       !!      and the Sadourny (1975) flux form formulation : conserves the 
    200       !!      horizontal kinetic energy. 
    201       !!      The trend of the vorticity term is given by: 
    202       !!       * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 
    203       !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f  mi(e1v*e3v vn) ] 
    204       !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f  mj(e2u*e3u un) ] 
    205       !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 
    206       !!          voru = 1/e1u  mj-1[ (rotn+f)  mi(e1v vn) ] 
    207       !!          vorv = 1/e2v  mi-1[ (rotn+f)  mj(e2u un) ] 
    208       !!      Add this trend to the general momentum trend (ua,va): 
    209       !!          (ua,va) = (ua,va) + ( voru , vorv ) 
     202      !!       and the Sadourny (1975) flux form formulation : conserves the 
     203      !!       horizontal kinetic energy. 
     204      !!         The general trend of momentum is increased due to the vorticity  
     205      !!       term which is given by: 
     206      !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f  mi(e1v*e3v vn) ] 
     207      !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f  mj(e2u*e3u un) ] 
     208      !!       where rvor is the relative vorticity 
    210209      !! 
    211210      !! ** Action : - Update (ua,va) with the now vorticity term trend 
     
    213212      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    214213      !!---------------------------------------------------------------------- 
    215       ! 
    216214      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    217215      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
     
    220218      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
    221219      ! 
    222       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    223       REAL(wp) ::   zx1, zy1, zfact2, zx2, zy2   ! local scalars 
    224       REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz 
     220      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
     221      REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars 
     222      REAL(wp), POINTER, DIMENSION(:,:) ::   zwx, zwy, zwz   ! 2D workspace 
    225223      !!---------------------------------------------------------------------- 
    226224      ! 
     
    234232         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    235233      ENDIF 
    236  
    237       zfact2 = 0.5 * 0.5      ! Local constant initialization 
    238  
    239 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 
     234      ! 
    240235      !                                                ! =============== 
    241236      DO jk = 1, jpkm1                                 ! Horizontal slab 
    242237         !                                             ! =============== 
    243238         ! 
    244          ! Potential vorticity and horizontal fluxes 
    245          ! ----------------------------------------- 
    246          SELECT CASE( kvor )      ! vorticity considered 
    247          CASE ( 1 )   ;   zwz(:,:) =                  ff(:,:)      ! planetary vorticity (Coriolis) 
    248          CASE ( 2 )   ;   zwz(:,:) =   rotn(:,:,jk)                ! relative  vorticity 
    249          CASE ( 3 )                                                ! metric term 
     239         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
     240         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
     241            zwz(:,:) = ff(:,:)  
     242         CASE ( np_RVO )                           !* relative vorticity 
     243            DO jj = 1, jpjm1 
     244               DO ji = 1, fs_jpim1   ! vector opt. 
     245                  zwz(ji,jj) = (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     246                     &          - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     247               END DO 
     248            END DO 
     249         CASE ( np_MET )                           !* metric term 
    250250            DO jj = 1, jpjm1 
    251251               DO ji = 1, fs_jpim1   ! vector opt. 
    252252                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    253253                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    254                        &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 
    255                END DO 
    256             END DO 
    257          CASE ( 4 )   ;   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) )    ! total (relative + planetary vorticity) 
    258          CASE ( 5 )                                                ! total (coriolis + metric) 
    259             DO jj = 1, jpjm1 
    260                DO ji = 1, fs_jpim1   ! vector opt. 
    261                   zwz(ji,jj) = ( ff (ji,jj)                                                                       & 
    262                        &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    263                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    264                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                               & 
    265                        &       ) 
    266                END DO 
    267             END DO 
     254                       &     * 0.5 * r1_e1e2f(ji,jj) 
     255               END DO 
     256            END DO 
     257         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
     258            DO jj = 1, jpjm1 
     259               DO ji = 1, fs_jpim1   ! vector opt. 
     260                  zwz(ji,jj) = ff(ji,jj) + (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     261                     &                      - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     262                     &                   * r1_e1e2f(ji,jj) 
     263               END DO 
     264            END DO 
     265         CASE ( np_CME )                           !* Coriolis + metric 
     266            DO jj = 1, jpjm1 
     267               DO ji = 1, fs_jpim1   ! vector opt. 
     268                  zwz(ji,jj) = ff(ji,jj)                                                                        & 
     269                       &     + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
     270                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
     271                       &     * 0.5 * r1_e1e2f(ji,jj) 
     272               END DO 
     273            END DO 
     274         CASE DEFAULT                                             ! error 
     275            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
    268276         END SELECT 
     277         ! 
     278         IF( ln_dynvor_msk ) THEN          !==  mask/unmask vorticity ==! 
     279            DO jj = 1, jpjm1 
     280               DO ji = 1, fs_jpim1   ! vector opt. 
     281                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     282               END DO 
     283            END DO 
     284         ENDIF 
    269285 
    270286         IF( ln_sco ) THEN 
     
    276292            zwy(:,:) = e1v(:,:) * vn(:,:,jk) 
    277293         ENDIF 
    278  
    279          ! Compute and add the vorticity term trend 
    280          ! ---------------------------------------- 
     294         !                                   !==  compute and add the vorticity term trend  =! 
    281295         DO jj = 2, jpjm1 
    282296            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    285299               zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 
    286300               zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1) 
    287                pua(ji,jj,jk) = pua(ji,jj,jk) + zfact2 / e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    288                pva(ji,jj,jk) = pva(ji,jj,jk) - zfact2 / e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )  
     301               pua(ji,jj,jk) = pua(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     302               pva(ji,jj,jk) = pva(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )  
    289303            END DO   
    290304         END DO   
     
    299313 
    300314 
    301    SUBROUTINE vor_mix( kt ) 
    302       !!---------------------------------------------------------------------- 
    303       !!                 ***  ROUTINE vor_mix  *** 
    304       !! 
    305       !! ** Purpose :   Compute the now total vorticity trend and add it to 
    306       !!      the general trend of the momentum equation. 
    307       !! 
    308       !! ** Method  :   Trend evaluated using now fields (centered in time) 
    309       !!      Mixte formulation : conserves the potential enstrophy of a hori- 
    310       !!      zontally non-divergent flow for (rotzu x uh), the relative vor- 
    311       !!      ticity term and the horizontal kinetic energy for (f x uh), the 
    312       !!      coriolis term. the now trend of the vorticity term is given by: 
    313       !!       * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 
    314       !!          voru = 1/e1u  mj-1(rotn/e3f) mj-1[ mi(e1v*e3v vn) ] 
    315       !!              +1/e1u  mj-1[ f/e3f          mi(e1v*e3v vn) ] 
    316       !!          vorv = 1/e2v  mi-1(rotn/e3f) mi-1[ mj(e2u*e3u un) ] 
    317       !!              +1/e2v  mi-1[ f/e3f          mj(e2u*e3u un) ] 
    318       !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 
    319       !!          voru = 1/e1u  mj-1(rotn) mj-1[ mi(e1v vn) ] 
    320       !!              +1/e1u  mj-1[ f          mi(e1v vn) ] 
    321       !!          vorv = 1/e2v  mi-1(rotn) mi-1[ mj(e2u un) ] 
    322       !!              +1/e2v  mi-1[ f          mj(e2u un) ] 
    323       !!      Add this now trend to the general momentum trend (ua,va): 
    324       !!          (ua,va) = (ua,va) + ( voru , vorv ) 
    325       !! 
    326       !! ** Action : - Update (ua,va) arrays with the now vorticity term trend 
    327       !! 
    328       !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    329       !!---------------------------------------------------------------------- 
    330       ! 
    331       INTEGER, INTENT(in) ::   kt   ! ocean timestep index 
    332       ! 
    333       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    334       REAL(wp) ::   zfact1, zua, zcua, zx1, zy1   ! local scalars 
    335       REAL(wp) ::   zfact2, zva, zcva, zx2, zy2   !   -      - 
    336       REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww 
    337       !!---------------------------------------------------------------------- 
    338       ! 
    339       IF( nn_timing == 1 )  CALL timing_start('vor_mix') 
    340       ! 
    341       CALL wrk_alloc( jpi, jpj, zwx, zwy, zwz, zww )  
    342       ! 
    343       IF( kt == nit000 ) THEN 
    344          IF(lwp) WRITE(numout,*) 
    345          IF(lwp) WRITE(numout,*) 'dyn:vor_mix : vorticity term: mixed energy/enstrophy conserving scheme' 
    346          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    347       ENDIF 
    348  
    349       zfact1 = 0.5 * 0.25      ! Local constant initialization 
    350       zfact2 = 0.5 * 0.5 
    351  
    352 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, zww ) 
    353       !                                                ! =============== 
    354       DO jk = 1, jpkm1                                 ! Horizontal slab 
    355          !                                             ! =============== 
    356          ! 
    357          ! Relative and planetary potential vorticity and horizontal fluxes 
    358          ! ---------------------------------------------------------------- 
    359          IF( ln_sco ) THEN         
    360             IF( ln_dynadv_vec ) THEN 
    361                zww(:,:) = rotn(:,:,jk) / fse3f(:,:,jk) 
    362             ELSE                        
    363                DO jj = 1, jpjm1 
    364                   DO ji = 1, fs_jpim1   ! vector opt. 
    365                      zww(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    366                         &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    367                         &       * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) * fse3f(ji,jj,jk) ) 
    368                   END DO 
    369                END DO 
    370             ENDIF 
    371             zwz(:,:) = ff  (:,:)    / fse3f(:,:,jk) 
    372             zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
    373             zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 
    374          ELSE 
    375             IF( ln_dynadv_vec ) THEN 
    376                zww(:,:) = rotn(:,:,jk) 
    377             ELSE                        
    378                DO jj = 1, jpjm1 
    379                   DO ji = 1, fs_jpim1   ! vector opt. 
    380                      zww(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    381                         &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    382                         &       * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) ) 
    383                   END DO 
    384                END DO 
    385             ENDIF 
    386             zwz(:,:) = ff (:,:) 
    387             zwx(:,:) = e2u(:,:) * un(:,:,jk) 
    388             zwy(:,:) = e1v(:,:) * vn(:,:,jk) 
    389          ENDIF 
    390  
    391          ! Compute and add the vorticity term trend 
    392          ! ---------------------------------------- 
    393          DO jj = 2, jpjm1 
    394             DO ji = fs_2, fs_jpim1   ! vector opt. 
    395                zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj) 
    396                zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
    397                zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj) 
    398                zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
    399                ! enstrophy conserving formulation for relative vorticity term 
    400                zua = zfact1 * ( zww(ji  ,jj-1) + zww(ji,jj) ) * ( zy1 + zy2 ) 
    401                zva =-zfact1 * ( zww(ji-1,jj  ) + zww(ji,jj) ) * ( zx1 + zx2 ) 
    402                ! energy conserving formulation for planetary vorticity term 
    403                zcua = zfact2 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    404                zcva =-zfact2 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    405                ! mixed vorticity trend added to the momentum trends 
    406                ua(ji,jj,jk) = ua(ji,jj,jk) + zcua + zua 
    407                va(ji,jj,jk) = va(ji,jj,jk) + zcva + zva 
    408             END DO   
    409          END DO   
    410          !                                             ! =============== 
    411       END DO                                           !   End of slab 
    412       !                                                ! =============== 
    413       CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz, zww )  
    414       ! 
    415       IF( nn_timing == 1 )  CALL timing_stop('vor_mix') 
    416       ! 
    417    END SUBROUTINE vor_mix 
    418  
    419  
    420315   SUBROUTINE vor_ens( kt, kvor, pua, pva ) 
    421316      !!---------------------------------------------------------------------- 
     
    429324      !!      potential enstrophy of a horizontally non-divergent flow. the 
    430325      !!      trend of the vorticity term is given by: 
    431       !!       * s-coordinate (ln_sco=T), the e3. are inside the derivative: 
    432       !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f ]  mj-1[ mi(e1v*e3v vn) ] 
    433       !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f ]  mi-1[ mj(e2u*e3u un) ] 
    434       !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 
    435       !!          voru = 1/e1u  mj-1[ rotn+f ]  mj-1[ mi(e1v vn) ] 
    436       !!          vorv = 1/e2v  mi-1[ rotn+f ]  mi-1[ mj(e2u un) ] 
     326      !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f ]  mj-1[ mi(e1v*e3v vn) ] 
     327      !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f ]  mi-1[ mj(e2u*e3u un) ] 
    437328      !!      Add this trend to the general momentum trend (ua,va): 
    438329      !!          (ua,va) = (ua,va) + ( voru , vorv ) 
     
    442333      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    443334      !!---------------------------------------------------------------------- 
    444       ! 
    445335      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    446336      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
     
    449339      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
    450340      ! 
    451       INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    452       REAL(wp) ::   zfact1, zuav, zvau   ! temporary scalars 
    453       REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww 
     341      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     342      REAL(wp) ::   zuav, zvau   ! local scalars 
     343      REAL(wp), POINTER, DIMENSION(:,:) ::   zwx, zwy, zwz, zww   ! 2D workspace 
    454344      !!---------------------------------------------------------------------- 
    455345      ! 
     
    463353         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    464354      ENDIF 
    465  
    466       zfact1 = 0.5 * 0.25      ! Local constant initialization 
    467  
    468 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 
    469355      !                                                ! =============== 
    470356      DO jk = 1, jpkm1                                 ! Horizontal slab 
    471357         !                                             ! =============== 
    472358         ! 
    473          ! Potential vorticity and horizontal fluxes 
    474          ! ----------------------------------------- 
    475          SELECT CASE( kvor )      ! vorticity considered 
    476          CASE ( 1 )   ;   zwz(:,:) =                  ff(:,:)      ! planetary vorticity (Coriolis) 
    477          CASE ( 2 )   ;   zwz(:,:) =   rotn(:,:,jk)                ! relative  vorticity 
    478          CASE ( 3 )                                                ! metric term 
     359         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
     360         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
     361            zwz(:,:) = ff(:,:)  
     362         CASE ( np_RVO )                           !* relative vorticity 
     363            DO jj = 1, jpjm1 
     364               DO ji = 1, fs_jpim1   ! vector opt. 
     365                  zwz(ji,jj) = (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     366                     &          - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     367               END DO 
     368            END DO 
     369         CASE ( np_MET )                           !* metric term 
    479370            DO jj = 1, jpjm1 
    480371               DO ji = 1, fs_jpim1   ! vector opt. 
    481372                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    482373                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    483                        &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 
    484                END DO 
    485             END DO 
    486          CASE ( 4 )   ;   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) )    ! total (relative + planetary vorticity) 
    487          CASE ( 5 )                                                ! total (coriolis + metric) 
    488             DO jj = 1, jpjm1 
    489                DO ji = 1, fs_jpim1   ! vector opt. 
    490                   zwz(ji,jj) = ( ff (ji,jj)                                                                       & 
    491                        &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    492                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    493                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                & 
    494                        &       ) 
    495                END DO 
    496             END DO 
     374                       &     * 0.5 * r1_e1e2f(ji,jj) 
     375               END DO 
     376            END DO 
     377         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
     378            DO jj = 1, jpjm1 
     379               DO ji = 1, fs_jpim1   ! vector opt. 
     380                  zwz(ji,jj) = ff(ji,jj) + (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     381                     &                      - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     382                     &                   * r1_e1e2f(ji,jj) 
     383               END DO 
     384            END DO 
     385         CASE ( np_CME )                           !* Coriolis + metric 
     386            DO jj = 1, jpjm1 
     387               DO ji = 1, fs_jpim1   ! vector opt. 
     388                  zwz(ji,jj) = ff(ji,jj)                                                                       & 
     389                       &     + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
     390                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
     391                       &     * 0.5 * r1_e1e2f(ji,jj) 
     392               END DO 
     393            END DO 
     394         CASE DEFAULT                                             ! error 
     395            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
    497396         END SELECT 
    498397         ! 
    499          IF( ln_sco ) THEN 
    500             DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop  
    501                DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    502                   zwz(ji,jj) = zwz(ji,jj) / fse3f(ji,jj,jk) 
    503                   zwx(ji,jj) = e2u(ji,jj) * fse3u(ji,jj,jk) * un(ji,jj,jk) 
    504                   zwy(ji,jj) = e1v(ji,jj) * fse3v(ji,jj,jk) * vn(ji,jj,jk) 
    505                END DO 
    506             END DO 
     398         IF( ln_dynvor_msk ) THEN           !==  mask/unmask vorticity ==! 
     399            DO jj = 1, jpjm1 
     400               DO ji = 1, fs_jpim1   ! vector opt. 
     401                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     402               END DO 
     403            END DO 
     404         ENDIF 
     405         ! 
     406         IF( ln_sco ) THEN                   !==  horizontal fluxes  ==! 
     407            zwz(:,:) = zwz(:,:) / fse3f(:,:,jk) 
     408            zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
     409            zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 
    507410         ELSE 
    508             DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop  
    509                DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    510                   zwx(ji,jj) = e2u(ji,jj) * un(ji,jj,jk) 
    511                   zwy(ji,jj) = e1v(ji,jj) * vn(ji,jj,jk) 
    512                END DO 
    513             END DO 
    514          ENDIF 
    515          ! 
    516          ! Compute and add the vorticity term trend 
    517          ! ---------------------------------------- 
     411            zwx(:,:) = e2u(:,:) * un(:,:,jk) 
     412            zwy(:,:) = e1v(:,:) * vn(:,:,jk) 
     413         ENDIF 
     414         !                                   !==  compute and add the vorticity term trend  =! 
    518415         DO jj = 2, jpjm1 
    519416            DO ji = fs_2, fs_jpim1   ! vector opt. 
    520                zuav = zfact1 / e1u(ji,jj) * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
    521                   &                         + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) 
    522                zvau =-zfact1 / e2v(ji,jj) * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   & 
    523                   &                         + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) 
     417               zuav = r1_8 * r1_e1u(ji,jj) * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
     418                  &                       + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) 
     419               zvau =-r1_8 * r1_e2v(ji,jj) * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   & 
     420                  &                       + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) 
    524421               pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    525422               pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
     
    553450      !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 
    554451      !!---------------------------------------------------------------------- 
    555       ! 
    556452      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    557       INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
    558       !                                                           ! =nrvm (relative vorticity or metric) 
     453      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; =nrvm (relative or metric) 
    559454      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua    ! total u-trend 
    560455      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
    561       !! 
    562       INTEGER  ::   ji, jj, jk                                    ! dummy loop indices 
    563       INTEGER  ::   ierr                                          ! local integer 
    564       REAL(wp) ::   zfac12, zua, zva                              ! local scalars 
    565       REAL(wp) ::   zmsk, ze3                                     ! local scalars 
    566       !                                                           !  3D workspace  
    567       REAL(wp), POINTER    , DIMENSION(:,:  )         :: zwx, zwy, zwz 
    568       REAL(wp), POINTER    , DIMENSION(:,:  )         :: ztnw, ztne, ztsw, ztse 
    569 #if defined key_vvl 
    570       REAL(wp), POINTER    , DIMENSION(:,:,:)         :: ze3f     !  3D workspace (lk_vvl=T) 
    571 #else 
    572       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE   :: ze3f     ! lk_vvl=F, ze3f=1/e3f saved one for all 
    573 #endif 
     456      ! 
     457      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     458      INTEGER  ::   ierr         ! local integer 
     459      REAL(wp) ::   zua, zva     ! local scalars 
     460      REAL(wp) ::   zmsk, ze3    ! local scalars 
     461      ! 
     462      REAL(wp), POINTER, DIMENSION(:,:)   :: zwx, zwy, zwz, z1_e3f 
     463      REAL(wp), POINTER, DIMENSION(:,:)   :: ztnw, ztne, ztsw, ztse 
    574464      !!---------------------------------------------------------------------- 
    575465      ! 
    576466      IF( nn_timing == 1 )  CALL timing_start('vor_een') 
    577467      ! 
    578       CALL wrk_alloc( jpi, jpj,      zwx , zwy , zwz        )  
    579       CALL wrk_alloc( jpi, jpj,      ztnw, ztne, ztsw, ztse )  
    580 #if defined key_vvl 
    581       CALL wrk_alloc( jpi, jpj, jpk, ze3f                   ) 
    582 #endif 
     468      CALL wrk_alloc( jpi,jpj,   zwx , zwy , zwz , z1_e3f )  
     469      CALL wrk_alloc( jpi,jpj,   ztnw, ztne, ztsw, ztse   )  
    583470      ! 
    584471      IF( kt == nit000 ) THEN 
     
    586473         IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 
    587474         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    588 #if ! defined key_vvl 
    589          IF( .NOT.ALLOCATED(ze3f) ) THEN 
    590             ALLOCATE( ze3f(jpi,jpj,jpk) , STAT=ierr ) 
    591             IF( lk_mpp    )   CALL mpp_sum ( ierr ) 
    592             IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'dyn:vor_een : unable to allocate arrays' ) 
    593          ENDIF 
    594          ze3f(:,:,:) = 0._wp 
    595 #endif 
    596475      ENDIF 
    597  
    598       IF( kt == nit000 .OR. lk_vvl ) THEN      ! reciprocal of e3 at F-point (masked averaging of e3t over ocean points) 
    599  
    600          IF( ln_dynvor_een_old ) THEN ! original formulation 
    601             DO jk = 1, jpk 
    602                DO jj = 1, jpjm1 
    603                   DO ji = 1, jpim1 
    604                      ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
    605                         &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
    606                      IF( ze3 /= 0._wp )   ze3f(ji,jj,jk) = 4.0_wp / ze3 
    607                   END DO 
    608                END DO 
    609             END DO 
    610          ELSE ! new formulation from NEMO 3.6 
    611             DO jk = 1, jpk 
    612                DO jj = 1, jpjm1 
    613                   DO ji = 1, jpim1 
    614                      ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
    615                         &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
    616                      zmsk = (                   tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   & 
    617                         &                     + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk) ) 
    618                      IF( ze3 /= 0._wp )   ze3f(ji,jj,jk) = zmsk / ze3 
    619                   END DO 
    620                END DO 
    621             END DO 
    622          ENDIF 
    623  
    624          CALL lbc_lnk( ze3f, 'F', 1. ) 
    625       ENDIF 
    626  
    627       zfac12 = 1._wp / 12._wp    ! Local constant initialization 
    628  
    629        
    630 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, ztnw, ztne, ztsw, ztse ) 
     476      ! 
    631477      !                                                ! =============== 
    632478      DO jk = 1, jpkm1                                 ! Horizontal slab 
    633479         !                                             ! =============== 
    634           
    635          ! Potential vorticity and horizontal fluxes 
    636          ! ----------------------------------------- 
    637          SELECT CASE( kvor )      ! vorticity considered 
    638          CASE ( 1 )                                                ! planetary vorticity (Coriolis) 
    639             zwz(:,:) = ff(:,:)      * ze3f(:,:,jk) 
    640          CASE ( 2 )                                                ! relative  vorticity 
    641             zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) 
    642          CASE ( 3 )                                                ! metric term 
     480         ! 
     481         SELECT CASE( nn_een_e3f )           ! == reciprocal of e3 at F-point 
     482         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
     483            DO jj = 1, jpjm1 
     484               DO ji = 1, fs_jpim1   ! vector opt. 
     485                  ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
     486                     &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
     487                  IF( ze3 /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = 4.0_wp / ze3 
     488                  ELSE                      ;   z1_e3f(ji,jj) = 0.0_wp 
     489                  ENDIF 
     490               END DO 
     491            END DO 
     492         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
     493            DO jj = 1, jpjm1 
     494               DO ji = 1, fs_jpim1   ! vector opt. 
     495                  ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
     496                     &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
     497                  zmsk = (                   tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   & 
     498                     &                     + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk) ) 
     499                  IF( ze3 /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = zmsk / ze3 
     500                  ELSE                      ;   z1_e3f(ji,jj) = 0.0_wp 
     501                  ENDIF 
     502               END DO 
     503            END DO 
     504         END SELECT 
     505         ! 
     506         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
     507         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
     508            DO jj = 1, jpjm1 
     509               DO ji = 1, fs_jpim1   ! vector opt. 
     510                  zwz(ji,jj) = ff(ji,jj) * z1_e3f(ji,jj) 
     511               END DO 
     512            END DO 
     513         CASE ( np_RVO )                           !* relative vorticity 
     514            DO jj = 1, jpjm1 
     515               DO ji = 1, fs_jpim1   ! vector opt. 
     516                  zwz(ji,jj) = (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     517                     &          - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     518                     &       * r1_e1e2f(ji,jj) * z1_e3f(ji,jj) 
     519               END DO 
     520            END DO 
     521         CASE ( np_MET )                           !* metric term 
    643522            DO jj = 1, jpjm1 
    644523               DO ji = 1, fs_jpim1   ! vector opt. 
    645524                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    646525                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    647                        &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 
    648                END DO 
    649             END DO 
    650             CALL lbc_lnk( zwz, 'F', 1. ) 
    651         CASE ( 4 )                                                ! total (relative + planetary vorticity) 
    652             zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) 
    653          CASE ( 5 )                                                ! total (coriolis + metric) 
    654             DO jj = 1, jpjm1 
    655                DO ji = 1, fs_jpim1   ! vector opt. 
    656                   zwz(ji,jj) = ( ff (ji,jj)                                                                       & 
    657                        &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    658                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    659                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                & 
    660                        &       ) * ze3f(ji,jj,jk) 
    661                END DO 
    662             END DO 
    663             CALL lbc_lnk( zwz, 'F', 1. ) 
     526                       &     * 0.5 * r1_e1e2f(ji,jj) * z1_e3f(ji,jj) 
     527               END DO 
     528            END DO 
     529         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
     530            DO jj = 1, jpjm1 
     531               DO ji = 1, fs_jpim1   ! vector opt. 
     532                  zwz(ji,jj) = (  ff(ji,jj) + (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     533                     &                         - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     534                     &                      * r1_e1e2f(ji,jj)    ) * z1_e3f(ji,jj) 
     535               END DO 
     536            END DO 
     537         CASE ( np_CME )                           !* Coriolis + metric 
     538            DO jj = 1, jpjm1 
     539               DO ji = 1, fs_jpim1   ! vector opt. 
     540                  zwz(ji,jj) = (  ff(ji,jj)                                                                        & 
     541                       &        + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
     542                       &            - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
     543                       &        * 0.5 * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     544               END DO 
     545            END DO 
     546         CASE DEFAULT                                             ! error 
     547            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
    664548         END SELECT 
    665  
     549         ! 
     550         IF( ln_dynvor_msk ) THEN          !==  mask/unmask vorticity ==! 
     551            DO jj = 1, jpjm1 
     552               DO ji = 1, fs_jpim1   ! vector opt. 
     553                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     554               END DO 
     555            END DO 
     556         ENDIF 
     557         ! 
     558         CALL lbc_lnk( zwz, 'F', 1. ) 
     559         ! 
     560         !                                   !==  horizontal fluxes  ==! 
    666561         zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
    667562         zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 
    668563 
    669          ! Compute and add the vorticity term trend 
    670          ! ---------------------------------------- 
     564         !                                   !==  compute and add the vorticity term trend  =! 
    671565         jj = 2 
    672566         ztne(1,:) = 0   ;   ztnw(1,:) = 0   ;   ztse(1,:) = 0   ;   ztsw(1,:) = 0 
    673          DO ji = 2, jpi    
     567         DO ji = 2, jpi          ! split in 2 parts due to vector opt. 
    674568               ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
    675569               ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) 
     
    687581         DO jj = 2, jpjm1 
    688582            DO ji = fs_2, fs_jpim1   ! vector opt. 
    689                zua = + zfac12 / e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    690                   &                           + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    691                zva = - zfac12 / e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    692                   &                           + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     583               zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     584                  &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
     585               zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     586                  &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    693587               pua(ji,jj,jk) = pua(ji,jj,jk) + zua 
    694588               pva(ji,jj,jk) = pva(ji,jj,jk) + zva 
     
    698592      END DO                                           !   End of slab 
    699593      !                                                ! =============== 
    700       CALL wrk_dealloc( jpi, jpj,      zwx , zwy , zwz        )  
    701       CALL wrk_dealloc( jpi, jpj,      ztnw, ztne, ztsw, ztse )  
    702 #if defined key_vvl 
    703       CALL wrk_dealloc( jpi, jpj, jpk, ze3f                   ) 
    704 #endif 
     594      ! 
     595      CALL wrk_dealloc( jpi,jpj,   zwx , zwy , zwz , z1_e3f )  
     596      CALL wrk_dealloc( jpi,jpj,   ztnw, ztne, ztsw, ztse   )  
    705597      ! 
    706598      IF( nn_timing == 1 )  CALL timing_stop('vor_een') 
     
    720612      INTEGER ::   ios             ! Local integer output status for namelist read 
    721613      !! 
    722       NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, ln_dynvor_een_old 
     614      NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, nn_een_e3f, ln_dynvor_msk 
    723615      !!---------------------------------------------------------------------- 
    724616 
     
    737629         WRITE(numout,*) '~~~~~~~~~~~~' 
    738630         WRITE(numout,*) '        Namelist namdyn_vor : choice of the vorticity term scheme' 
    739          WRITE(numout,*) '           energy    conserving scheme                ln_dynvor_ene = ', ln_dynvor_ene 
    740          WRITE(numout,*) '           enstrophy conserving scheme                ln_dynvor_ens = ', ln_dynvor_ens 
    741          WRITE(numout,*) '           mixed enstrophy/energy conserving scheme   ln_dynvor_mix = ', ln_dynvor_mix 
    742          WRITE(numout,*) '           enstrophy and energy conserving scheme     ln_dynvor_een = ', ln_dynvor_een 
    743          WRITE(numout,*) '           enstrophy and energy conserving scheme (old) ln_dynvor_een_old= ', ln_dynvor_een_old 
     631         WRITE(numout,*) '           energy    conserving scheme                    ln_dynvor_ene = ', ln_dynvor_ene 
     632         WRITE(numout,*) '           enstrophy conserving scheme                    ln_dynvor_ens = ', ln_dynvor_ens 
     633         WRITE(numout,*) '           mixed enstrophy/energy conserving scheme       ln_dynvor_mix = ', ln_dynvor_mix 
     634         WRITE(numout,*) '           enstrophy and energy conserving scheme         ln_dynvor_een = ', ln_dynvor_een 
     635         WRITE(numout,*) '              e3f = averaging /4 (=0) or /sum(tmask) (=1)    nn_een_e3f = ', nn_een_e3f 
     636         WRITE(numout,*) '           masked (=1) or unmasked(=0) vorticity          ln_dynvor_msk = ', ln_dynvor_msk 
    744637      ENDIF 
    745638 
     639!!gm  this should be removed when choosing a unique strategy for fmask at the coast 
    746640      ! If energy, enstrophy or mixed advection of momentum in vector form change the value for masks 
    747641      ! at angles with three ocean points and one land point 
     642      IF(lwp) WRITE(numout,*) 
     643      IF(lwp) WRITE(numout,*) '           namlbc: change fmask value in the angles (T)   ln_vorlat = ', ln_vorlat 
    748644      IF( ln_vorlat .AND. ( ln_dynvor_ene .OR. ln_dynvor_ens .OR. ln_dynvor_mix ) ) THEN 
    749645         DO jk = 1, jpk 
     
    759655          ! 
    760656      ENDIF 
    761  
    762       ioptio = 0                     ! Control of vorticity scheme options 
    763       IF( ln_dynvor_ene )   ioptio = ioptio + 1 
    764       IF( ln_dynvor_ens )   ioptio = ioptio + 1 
    765       IF( ln_dynvor_mix )   ioptio = ioptio + 1 
    766       IF( ln_dynvor_een )   ioptio = ioptio + 1 
    767       IF( ln_dynvor_een_old )   ioptio = ioptio + 1 
    768       IF( lk_esopa      )   ioptio =          1 
    769  
    770       IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 
    771  
    772       !                              ! Set nvor (type of scheme for vorticity) 
    773       IF( ln_dynvor_ene )   nvor =  0 
    774       IF( ln_dynvor_ens )   nvor =  1 
    775       IF( ln_dynvor_mix )   nvor =  2 
    776       IF( ln_dynvor_een .or. ln_dynvor_een_old )   nvor =  3 
    777       IF( lk_esopa      )   nvor = -1 
    778        
    779       !                              ! Set ncor, nrvm, ntot (type of vorticity) 
    780       IF(lwp) WRITE(numout,*) 
    781       ncor = 1 
     657!!gm end 
     658 
     659      ioptio = 0                     ! type of scheme for vorticity (set nvor_scheme) 
     660      IF( ln_dynvor_ene ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_ENE   ;   ENDIF 
     661      IF( ln_dynvor_ens ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_ENS   ;   ENDIF 
     662      IF( ln_dynvor_mix ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_MIX   ;   ENDIF 
     663      IF( ln_dynvor_een ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_EEN   ;   ENDIF 
     664      ! 
     665      IF( ( ioptio /= 1).AND.( .NOT.lk_c1d ) ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 
     666      !                       
     667      IF(lwp) WRITE(numout,*)        ! type of calculated vorticity (set ncor, nrvm, ntot) 
     668      ncor = np_COR 
    782669      IF( ln_dynadv_vec ) THEN      
    783670         IF(lwp) WRITE(numout,*) '         Vector form advection : vorticity = Coriolis + relative vorticity' 
    784          nrvm = 2 
    785          ntot = 4 
     671         nrvm = np_RVO        ! relative vorticity 
     672         ntot = np_CRV        ! relative + planetary vorticity 
    786673      ELSE                         
    787674         IF(lwp) WRITE(numout,*) '         Flux form advection   : vorticity = Coriolis + metric term' 
    788          nrvm = 3 
    789          ntot = 5 
     675         nrvm = np_MET        ! metric term 
     676         ntot = np_CME        ! Coriolis + metric term 
    790677      ENDIF 
    791678       
    792679      IF(lwp) THEN                   ! Print the choice 
    793680         WRITE(numout,*) 
    794          IF( nvor ==  0 )   WRITE(numout,*) '         vorticity scheme : energy conserving scheme' 
    795          IF( nvor ==  1 )   WRITE(numout,*) '         vorticity scheme : enstrophy conserving scheme' 
    796          IF( nvor ==  2 )   WRITE(numout,*) '         vorticity scheme : mixed enstrophy/energy conserving scheme' 
    797          IF( nvor ==  3 )   WRITE(numout,*) '         vorticity scheme : energy and enstrophy conserving scheme' 
    798          IF( nvor == -1 )   WRITE(numout,*) '         esopa test: use all lateral physics options' 
     681         IF( nvor_scheme ==  np_ENE )   WRITE(numout,*) '         vorticity scheme ==>> energy conserving scheme' 
     682         IF( nvor_scheme ==  np_ENS )   WRITE(numout,*) '         vorticity scheme ==>> enstrophy conserving scheme' 
     683         IF( nvor_scheme ==  np_MIX )   WRITE(numout,*) '         vorticity scheme ==>> mixed enstrophy/energy conserving scheme' 
     684         IF( nvor_scheme ==  np_EEN )   WRITE(numout,*) '         vorticity scheme ==>> energy and enstrophy conserving scheme' 
    799685      ENDIF 
    800686      ! 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90

    r5600 r6043  
    4949      !! 
    5050      !! ** Method  :   The now vertical advection of momentum is given by: 
    51       !!         w dz(u) = ua + 1/(e1u*e2u*e3u) mk+1[ mi(e1t*e2t*wn) dk(un) ] 
    52       !!         w dz(v) = va + 1/(e1v*e2v*e3v) mk+1[ mj(e1t*e2t*wn) dk(vn) ] 
     51      !!         w dz(u) = ua + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*wn) dk(un) ] 
     52      !!         w dz(v) = va + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*wn) dk(vn) ] 
    5353      !!      Add this trend to the general trend (ua,va): 
    5454      !!         (ua,va) = (ua,va) + w dz(u,v) 
     
    8585         DO jj = 2, jpj                   ! vertical fluxes  
    8686            DO ji = fs_2, jpi             ! vector opt. 
    87                zww(ji,jj) = 0.25_wp * e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk) 
     87               zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 
    8888            END DO 
    8989         END DO 
     
    121121            DO ji = fs_2, fs_jpim1       ! vector opt. 
    122122               !                         ! vertical momentum advective trends 
    123                zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 
    124                zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 
     123               zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     124               zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    125125               !                         ! add the trends to the general momentum trends 
    126126               ua(ji,jj,jk) = ua(ji,jj,jk) + zua 
     
    146146      ! 
    147147   END SUBROUTINE dyn_zad 
     148 
    148149 
    149150   SUBROUTINE dyn_zad_zts ( kt ) 
     
    182183      IF( nn_timing == 1 )  CALL timing_start('dyn_zad_zts') 
    183184      ! 
    184       CALL wrk_alloc( jpi,jpj,jpk, zwuw , zwvw, zww )  
    185       CALL wrk_alloc( jpi,jpj,jpk,3, zus, zvs )  
     185      CALL wrk_alloc( jpi,jpj,jpk,     zwuw, zwvw, zww )  
     186      CALL wrk_alloc( jpi,jpj,jpk,3,   zus , zvs )  
    186187      ! 
    187188      IF( kt == nit000 ) THEN 
     
    205206         DO jj = 2, jpj                    
    206207            DO ji = fs_2, jpi             ! vector opt. 
    207                zww(ji,jj,jk) = 0.25_wp * e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk) 
     208               zww(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 
    208209            END DO 
    209210         END DO 
    210211      END DO 
    211       ! 
    212       ! Surface and bottom advective fluxes set to zero 
    213       DO jj = 2, jpjm1         
     212 
     213      DO jj = 2, jpjm1                    ! Surface and bottom advective fluxes set to zero 
    214214         DO ji = fs_2, fs_jpim1           ! vector opt. 
     215 !!gm missing ISF boundary condition 
    215216            zwuw(ji,jj, 1 ) = 0._wp 
    216217            zwvw(ji,jj, 1 ) = 0._wp 
     
    251252               DO ji = fs_2, fs_jpim1       ! vector opt. 
    252253                  !                         ! vertical momentum advective trends 
    253                   zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) ) 
    254                   zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) ) 
     254                  zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1e2u(ji,jj) * fse3u(ji,jj,jk) ) 
     255                  zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1e2v(ji,jj) * fse3v(ji,jj,jk) ) 
    255256                  zus(ji,jj,jk,jta) = zus(ji,jj,jk,jtb) + zua * zts 
    256257                  zvs(ji,jj,jk,jta) = zvs(ji,jj,jk,jtb) + zva * zts 
     
    283284         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    284285      ! 
    285       CALL wrk_dealloc( jpi,jpj,jpk, zwuw , zwvw, zww )  
    286       CALL wrk_dealloc( jpi,jpj,jpk,3, zus, zvs )  
     286      CALL wrk_dealloc( jpi,jpj,jpk,     zwuw, zwvw, zww )  
     287      CALL wrk_dealloc( jpi,jpj,jpk,3,   zus , zvs )  
    287288      ! 
    288289      IF( nn_timing == 1 )  CALL timing_stop('dyn_zad_zts') 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf.F90

    r5034 r6043  
    99 
    1010   !!---------------------------------------------------------------------- 
    11    !!   dyn_zdf      : Update the momentum trend with the vertical diffusion 
    12    !!   dyn_zdf_init : initializations of the vertical diffusion scheme 
     11   !!   dyn_zdf       : Update the momentum trend with the vertical diffusion 
     12   !!   dyn_zdf_init  : initializations of the vertical diffusion scheme 
    1313   !!---------------------------------------------------------------------- 
    14    USE oce             ! ocean dynamics and tracers variables 
    15    USE dom_oce         ! ocean space and time domain variables  
    16    USE zdf_oce         ! ocean vertical physics variables 
    17  
    18    USE dynzdf_exp      ! vertical diffusion: explicit (dyn_zdf_exp     routine) 
    19    USE dynzdf_imp      ! vertical diffusion: implicit (dyn_zdf_imp     routine) 
    20  
    21    USE ldfdyn_oce      ! ocean dynamics: lateral physics 
    22    USE trd_oce         ! trends: ocean variables 
    23    USE trddyn          ! trend manager: dynamics 
    24    USE in_out_manager  ! I/O manager 
    25    USE lib_mpp         ! MPP library 
    26    USE prtctl          ! Print control 
    27    USE wrk_nemo        ! Memory Allocation 
    28    USE timing          ! Timing 
     14   USE oce            ! ocean dynamics and tracers variables 
     15   USE dom_oce        ! ocean space and time domain variables  
     16   USE zdf_oce        ! ocean vertical physics variables 
     17   USE dynzdf_exp     ! vertical diffusion: explicit (dyn_zdf_exp     routine) 
     18   USE dynzdf_imp     ! vertical diffusion: implicit (dyn_zdf_imp     routine) 
     19   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. 
     20   USE trd_oce        ! trends: ocean variables 
     21   USE trddyn         ! trend manager: dynamics 
     22   ! 
     23   USE in_out_manager ! I/O manager 
     24   USE lib_mpp        ! MPP library 
     25   USE prtctl         ! Print control 
     26   USE wrk_nemo       ! Memory Allocation 
     27   USE timing         ! Timing 
    2928 
    3029   IMPLICIT NONE 
     
    6160      !!--------------------------------------------------------------------- 
    6261      ! 
    63       IF( nn_timing == 1 )  CALL timing_start('dyn_zdf') 
     62      IF( nn_timing == 1 )   CALL timing_start('dyn_zdf') 
    6463      ! 
    6564      !                                          ! set time step 
     
    7978      CASE ( 1 )   ;   CALL dyn_zdf_imp( kt, r2dt )      ! implicit scheme 
    8079      ! 
    81       CASE ( -1 )                                        ! esopa: test all possibility with control print 
    82                        CALL dyn_zdf_exp( kt, r2dt ) 
    83                        CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf0 - Ua: ', mask1=umask,               & 
    84                           &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    85                        CALL dyn_zdf_imp( kt, r2dt ) 
    86                        CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf1 - Ua: ', mask1=umask,               & 
    87                           &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    8880      END SELECT 
    8981 
     
    9688      !                                          ! print mean trends (used for debugging) 
    9789      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf  - Ua: ', mask1=umask,               & 
    98             &                    tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    99       ! 
    100       IF( nn_timing == 1 )  CALL timing_stop('dyn_zdf') 
     90         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     91         ! 
     92      IF( nn_timing == 1 )   CALL timing_stop('dyn_zdf') 
    10193      ! 
    10294   END SUBROUTINE dyn_zdf 
     
    114106      USE zdftke 
    115107      USE zdfgls 
    116       USE zdfkpp 
    117108      !!---------------------------------------------------------------------- 
    118109      ! 
     
    123114      ! 
    124115      ! Force implicit schemes 
    125       IF( lk_zdftke .OR. lk_zdfgls .OR. lk_zdfkpp )   nzdf = 1   ! TKE, GLS or KPP physics 
    126       IF( ln_dynldf_iso                           )   nzdf = 1   ! iso-neutral lateral physics 
    127       IF( ln_dynldf_hor .AND. ln_sco              )   nzdf = 1   ! horizontal lateral physics in s-coordinate 
    128       ! 
    129       IF( lk_esopa )    nzdf = -1                   ! Esopa key: All schemes used 
     116      IF( lk_zdftke .OR. lk_zdfgls   )   nzdf = 1   ! TKE or GLS physics 
     117      IF( ln_dynldf_iso              )   nzdf = 1   ! iso-neutral lateral physics 
     118      IF( ln_dynldf_hor .AND. ln_sco )   nzdf = 1   ! horizontal lateral physics in s-coordinate 
    130119      ! 
    131120      IF(lwp) THEN                                  ! Print the choice 
     
    133122         WRITE(numout,*) 'dyn_zdf_init : vertical dynamics physics scheme' 
    134123         WRITE(numout,*) '~~~~~~~~~~~' 
    135          IF( nzdf == -1 )   WRITE(numout,*) '              ESOPA test All scheme used' 
    136124         IF( nzdf ==  0 )   WRITE(numout,*) '              Explicit time-splitting scheme' 
    137125         IF( nzdf ==  1 )   WRITE(numout,*) '              Implicit (euler backward) scheme' 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90

    r3625 r6043  
    88   !!   NEMO     0.5  !  2002-08  (G. Madec)  F90: Free form and module 
    99   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps 
     10   !!            3.7  !  2015-11  (J. Chanut) output velocities instead of trends 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    1819   USE phycst          ! physical constants 
    1920   USE zdf_oce         ! ocean vertical physics 
     21   USE dynadv, ONLY: ln_dynadv_vec ! Momentum advection form 
    2022   USE sbc_oce         ! surface boundary condition: ocean 
    2123   USE lib_mpp         ! MPP library 
     
    118120         ! 
    119121      END DO                           ! End of time splitting 
     122 
     123      ! Time step momentum here to be compliant with what is done in the implicit case 
     124      ! 
     125      IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
     126         DO jk = 1, jpkm1 
     127            ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 
     128            va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 
     129         END DO 
     130      ELSE                                            ! applied on thickness weighted velocity 
     131         DO jk = 1, jpkm1 
     132            ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
     133               &           + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
     134               &         / fse3u_a(:,:,jk) * umask(:,:,jk) 
     135            va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
     136               &           + p2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
     137               &         / fse3v_a(:,:,jk) * vmask(:,:,jk) 
     138         END DO 
     139      ENDIF 
    120140      ! 
    121141      CALL wrk_dealloc( jpi,jpj,jpk, zwx, zwy, zwz, zww )  
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90

    r5600 r6043  
    2525   USE wrk_nemo        ! Memory Allocation 
    2626   USE timing          ! Timing 
    27    USE dynadv          ! dynamics: vector invariant versus flux form 
    28    USE dynspg_oce, ONLY: lk_dynspg_ts 
     27   USE dynadv, ONLY: ln_dynadv_vec ! Momentum advection form 
    2928 
    3029   IMPLICIT NONE 
     
    8786      ENDIF 
    8887 
    89       ! 0. Local constant initialization 
    90       ! -------------------------------- 
    91       z1_p2dt = 1._wp / p2dt      ! inverse of the timestep 
    92  
    93       ! 1. Apply semi-implicit bottom friction 
     88      ! 1. Time step dynamics 
     89      ! --------------------- 
     90 
     91      IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
     92         DO jk = 1, jpkm1 
     93            ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 
     94            va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 
     95         END DO 
     96      ELSE                                            ! applied on thickness weighted velocity 
     97         DO jk = 1, jpkm1 
     98            ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
     99               &           + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
     100               &                               / fse3u_a(:,:,jk) * umask(:,:,jk) 
     101            va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
     102               &           + p2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
     103               &                               / fse3v_a(:,:,jk) * vmask(:,:,jk) 
     104         END DO 
     105      ENDIF 
     106 
     107      ! 2. Apply semi-implicit bottom friction 
    94108      ! -------------------------------------- 
    95109      ! Only needed for semi-implicit bottom friction setup. The explicit 
     
    97111      ! column vector of the tri-diagonal matrix equation 
    98112      ! 
    99  
    100113      IF( ln_bfrimp ) THEN 
    101114         DO jj = 2, jpjm1 
     
    119132      ENDIF 
    120133 
    121 #if defined key_dynspg_ts 
    122       IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN      ! applied on velocity 
    123          DO jk = 1, jpkm1 
    124             ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 
    125             va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 
    126          END DO 
    127       ELSE                                            ! applied on thickness weighted velocity 
    128          DO jk = 1, jpkm1 
    129             ua(:,:,jk) = (          ub(:,:,jk) * fse3u_b(:,:,jk)      & 
    130                &           + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk)  )   & 
    131                &                               / fse3u_a(:,:,jk) * umask(:,:,jk) 
    132             va(:,:,jk) = (          vb(:,:,jk) * fse3v_b(:,:,jk)      & 
    133                &           + p2dt * va(:,:,jk) * fse3v_n(:,:,jk)  )   & 
    134                &                               / fse3v_a(:,:,jk) * vmask(:,:,jk) 
    135          END DO 
    136       ENDIF 
    137  
    138       IF ( ln_bfrimp .AND.lk_dynspg_ts ) THEN 
     134      ! With split-explicit free surface, barotropic stress is treated explicitly 
     135      ! Update velocities at the bottom. 
     136      ! J. Chanut: The bottom stress is computed considering after barotropic velocities, which does  
     137      !            not lead to the effective stress seen over the whole barotropic loop.  
     138      IF ( ln_bfrimp .AND.ln_dynspg_ts ) THEN 
    139139         ! remove barotropic velocities: 
    140140         DO jk = 1, jpkm1 
     
    166166         END IF 
    167167      ENDIF 
    168 #endif 
    169  
    170       ! 2. Vertical diffusion on u 
     168 
     169      ! 3. Vertical diffusion on u 
    171170      ! --------------------------- 
    172171      ! Matrix and second member construction 
     
    209208      !----------------------------------------------------------------------- 
    210209      ! 
    211       !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    212       DO jk = 2, jpkm1 
     210      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    213211         DO jj = 2, jpjm1    
    214212            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    220218      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    221219         DO ji = fs_2, fs_jpim1   ! vector opt. 
    222 #if defined key_dynspg_ts 
    223220            ze3ua =  ( 1._wp - r_vvl ) * fse3u_n(ji,jj,1) + r_vvl   * fse3u_a(ji,jj,1)  
    224221            ua(ji,jj,1) = ua(ji,jj,1) + p2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    225222               &                                      / ( ze3ua * rau0 ) * umask(ji,jj,1)  
    226 #else 
    227             ua(ji,jj,1) = ub(ji,jj,1) & 
    228                &                   + p2dt *(ua(ji,jj,1) +  0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    229                &                                      / ( fse3u(ji,jj,1) * rau0     ) * umask(ji,jj,1) )  
    230 #endif 
    231223         END DO 
    232224      END DO 
     
    234226         DO jj = 2, jpjm1 
    235227            DO ji = fs_2, fs_jpim1 
    236 #if defined key_dynspg_ts 
    237228               zrhs = ua(ji,jj,jk)   ! zrhs=right hand side 
    238 #else 
    239                zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) 
    240 #endif 
    241229               ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 
    242230            END DO 
     
    257245      END DO 
    258246 
    259 #if ! defined key_dynspg_ts 
    260       ! Normalization to obtain the general momentum trend ua 
    261       DO jk = 1, jpkm1 
    262          DO jj = 2, jpjm1    
    263             DO ji = fs_2, fs_jpim1   ! vector opt. 
    264                ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) * z1_p2dt 
    265             END DO 
    266          END DO 
    267       END DO 
    268 #endif 
    269  
    270       ! 3. Vertical diffusion on v 
     247      ! 4. Vertical diffusion on v 
    271248      ! --------------------------- 
    272249      ! Matrix and second member construction 
     
    309286      !----------------------------------------------------------------------- 
    310287      ! 
    311       !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    312       DO jk = 2, jpkm1         
     288      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    313289         DO jj = 2, jpjm1    
    314290            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    319295      ! 
    320296      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    321          DO ji = fs_2, fs_jpim1   ! vector opt. 
    322 #if defined key_dynspg_ts             
     297         DO ji = fs_2, fs_jpim1   ! vector opt.           
    323298            ze3va =  ( 1._wp - r_vvl ) * fse3v_n(ji,jj,1) + r_vvl   * fse3v_a(ji,jj,1)  
    324299            va(ji,jj,1) = va(ji,jj,1) + p2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    325300               &                                      / ( ze3va * rau0 )  
    326 #else 
    327             va(ji,jj,1) = vb(ji,jj,1) & 
    328                &                   + p2dt *(va(ji,jj,1) +  0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    329                &                                                       / ( fse3v(ji,jj,1) * rau0     )  ) 
    330 #endif 
    331301         END DO 
    332302      END DO 
     
    334304         DO jj = 2, jpjm1 
    335305            DO ji = fs_2, fs_jpim1   ! vector opt. 
    336 #if defined key_dynspg_ts 
    337306               zrhs = va(ji,jj,jk)   ! zrhs=right hand side 
    338 #else 
    339                zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) 
    340 #endif 
    341307               va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 
    342308            END DO 
     
    357323      END DO 
    358324 
    359       ! Normalization to obtain the general momentum trend va 
    360 #if ! defined key_dynspg_ts 
    361       DO jk = 1, jpkm1 
    362          DO jj = 2, jpjm1    
    363             DO ji = fs_2, fs_jpim1   ! vector opt. 
    364                va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) * z1_p2dt 
    365             END DO 
    366          END DO 
    367       END DO 
    368 #endif 
    369  
    370325      ! J. Chanut: Lines below are useless ? 
    371       !! restore bottom layer avmu(v)  
     326      !! restore avmu(v)=0. at bottom (and top if ln_isfcav=T interfaces) 
    372327      IF( ln_bfrimp ) THEN 
    373328        DO jj = 2, jpjm1 
  • branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90

    r5600 r6043  
    2020   USE sbc_oce         ! surface boundary condition: ocean 
    2121   USE domvvl          ! Variable volume 
    22    USE divcur          ! hor. divergence and curl      (div & cur routines) 
    23    USE restart         ! only for lrst_oce 
    24    USE in_out_manager  ! I/O manager 
    25    USE prtctl          ! Print control 
    26    USE phycst 
    27    USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    28    USE lib_mpp         ! MPP library 
     22   USE divhor          ! horizontal divergence 
     23   USE phycst          ! physical constants 
    2924   USE bdy_oce 
    3025   USE bdy_par          
    3126   USE bdydyn2d        ! bdy_ssh routine 
    3227#if defined key_agrif 
    33    USE agrif_opa_update 
    3428   USE agrif_opa_interp 
    3529#endif 
     
    3731   USE asminc          ! Assimilation increment 
    3832#endif 
     33   USE in_out_manager  ! I/O manager 
     34   USE restart         ! only for lrst_oce 
     35   USE prtctl          ! Print control 
     36   USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
     37   USE lib_mpp         ! MPP library 
    3938   USE wrk_nemo        ! Memory Allocation 
    4039   USE timing          ! Timing 
     
    6766      !!      by the time step. 
    6867      !! 
    69       !! ** action  :   ssha    : after sea surface height 
     68      !! ** action  :   ssha, after sea surface height 
    7069      !! 
    7170      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    7271      !!---------------------------------------------------------------------- 
    73       ! 
    74       REAL(wp), POINTER, DIMENSION(:,:  ) ::  zhdiv 
    75       INTEGER, INTENT(in) ::   kt                      ! time step 
     72      INTEGER, INTENT(in) ::   kt   ! time step 
    7673      !  
    77       INTEGER             ::   jk                      ! dummy loop indice 
    78       REAL(wp)            ::   z2dt, z1_rau0           ! local scalars 
    79       !!---------------------------------------------------------------------- 
    80       ! 
    81       IF( nn_timing == 1 )  CALL timing_start('ssh_nxt') 
    82       ! 
    83       CALL wrk_alloc( jpi, jpj, zhdiv )  
     74      INTEGER  ::   jk            ! dummy loop indice 
     75      REAL(wp) ::   z2dt, zcoef   ! local scalars 
     76      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhdiv   ! 2D workspace 
     77      !!---------------------------------------------------------------------- 
     78      ! 
     79      IF( nn_timing == 1 )   CALL timing_start('ssh_nxt') 
     80      ! 
     81      CALL wrk_alloc( jpi,jpj,   zhdiv )  
    8482      ! 
    8583      IF( kt == nit000 ) THEN 
    86          ! 
    8784         IF(lwp) WRITE(numout,*) 
    8885         IF(lwp) WRITE(numout,*) 'ssh_nxt : after sea surface height' 
    8986         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    90          ! 
    91       ENDIF 
    92       ! 
    93       CALL div_cur( kt )                              ! Horizontal divergence & Relative vorticity 
     87      ENDIF 
     88      ! 
     89      CALL div_hor( kt )                              ! Horizontal divergence 
    9490      ! 
    9591      z2dt = 2._wp * rdt                              ! set time step size (Euler/Leapfrog) 
     
    107103      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 
    108104      !  
    109       z1_rau0 = 0.5_wp * r1_rau0 
    110       ssha(:,:) = (  sshb(:,:) - z2dt * ( z1_rau0 * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
    111  
    112 #if ! defined key_dynspg_ts 
    113       ! These lines are not necessary with time splitting since 
    114       ! boundary condition on sea level is set during ts loop 
    115 #if defined key_agrif 
    116       CALL agrif_ssh( kt ) 
    117 #endif 
    118 #if defined key_bdy 
    119       IF (lk_bdy) THEN 
    120          CALL lbc_lnk( ssha, 'T', 1. ) ! Not sure that's necessary 
    121          CALL bdy_ssh( ssha ) ! Duplicate sea level across open boundaries 
    122       ENDIF 
    123 #endif 
    124 #endif 
     105      zcoef = 0.5_wp * r1_rau0 
     106      ssha(:,:) = (  sshb(:,:) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
     107 
     108      IF ( .NOT.ln_dynspg_ts ) THEN 
     109         ! These lines are not necessary with time splitting since 
     110         ! boundary condition on sea level is set during ts loop 
     111# if defined key_agrif 
     112         CALL agrif_ssh( kt ) 
     113# endif 
     114# if defined key_bdy 
     115         IF( lk_bdy ) THEN 
     116            CALL lbc_lnk( ssha, 'T', 1. )    ! Not sure that's necessary 
     117            CALL bdy_ssh( ssha )            ! Duplicate sea level across open boundaries 
     118         ENDIF 
     119# endif 
     120      ENDIF 
    125121 
    126122#if defined key_asminc 
    127       !                                                ! Include the IAU weighted SSH increment 
    128       IF( lk_asminc .AND. ln_sshinc .AND. ln_asmiau ) THEN 
     123      IF( lk_asminc .AND. ln_sshinc .AND. ln_asmiau ) THEN     ! Include the IAU weighted SSH increment 
    129124         CALL ssh_asm_inc( kt ) 
    130125         ssha(:,:) = ssha(:,:) + z2dt * ssh_iau(:,:) 
    131126      ENDIF 
    132127#endif 
    133  
    134128      !                                           !------------------------------! 
    135129      !                                           !           outputs            ! 
     
    160154      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    161155      !!---------------------------------------------------------------------- 
    162       ! 
    163       INTEGER, INTENT(in) ::   kt           ! time step 
     156      INTEGER, INTENT(in) ::   kt   ! time step 
     157      ! 
     158      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     159      REAL(wp) ::   z1_2dt       ! local scalars 
    164160      REAL(wp), POINTER, DIMENSION(:,:  ) ::  z2d 
    165161      REAL(wp), POINTER, DIMENSION(:,:,:) ::  z3d, zhdiv 
    166       ! 
    167       INTEGER             ::   ji, jj, jk   ! dummy loop indices 
    168       REAL(wp)            ::   z1_2dt       ! local scalars 
    169       !!---------------------------------------------------------------------- 
    170        
    171       IF( nn_timing == 1 )  CALL timing_start('wzv') 
     162      !!---------------------------------------------------------------------- 
     163      ! 
     164      IF( nn_timing == 1 )   CALL timing_start('wzv') 
    172165      ! 
    173166      IF( kt == nit000 ) THEN 
    174          ! 
    175167         IF(lwp) WRITE(numout,*) 
    176168         IF(lwp) WRITE(numout,*) 'wzv : now vertical velocity ' 
     
    178170         ! 
    179171         wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
    180          ! 
    181172      ENDIF 
    182173      !                                           !------------------------------! 
     
    194185            DO jj = 2, jpjm1 
    195186               DO ji = fs_2, fs_jpim1   ! vector opt. 
    196                   zhdiv(ji,jj,jk) = r1_e12t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 
     187                  zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 
    197188               END DO 
    198189            END DO 
     
    217208 
    218209#if defined key_bdy 
    219       IF (lk_bdy) THEN 
     210      IF( lk_bdy ) THEN 
    220211         DO jk = 1, jpkm1 
    221212            wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:) 
     
    225216      ! 
    226217      IF( nn_timing == 1 )  CALL timing_stop('wzv') 
    227  
    228  
     218      ! 
    229219   END SUBROUTINE wzv 
     220 
    230221 
    231222   SUBROUTINE ssh_swp( kt ) 
     
    259250      ENDIF 
    260251 
    261 # if defined key_dynspg_ts 
    262       IF( ( neuler == 0 .AND. kt == nit000 ) .OR. ln_bt_fw ) THEN    !** Euler time-stepping: no filter 
    263 # else 
    264       IF ( neuler == 0 .AND. kt == nit000 ) THEN   !** Euler time-stepping at first time-step : no filter 
    265 #endif 
     252      IF( ( neuler == 0 .AND. kt == nit000 ) .OR. ( ln_bt_fw .AND. ln_dynspg_ts ) ) THEN  
     253                                                   !** Euler time-stepping: no filter 
    266254         sshb(:,:) = sshn(:,:)                           ! before <-- now 
    267255         sshn(:,:) = ssha(:,:)                           ! now    <-- after  (before already = now) 
     256         ! 
    268257      ELSE                                         !** Leap-Frog time-stepping: Asselin filter + swap 
    269258         sshb(:,:) = sshn(:,:) + atfp * ( sshb(:,:) - 2 * sshn(:,:) + ssha(:,:) )     ! before <-- now filtered 
    270          IF( lk_vvl ) sshb(:,:) = sshb(:,:) - atfp * rdt / rau0 * ( emp_b(:,:) - emp(:,:) - rnf_b(:,:) + rnf(:,:) ) * ssmask(:,:) 
     259         IF( lk_vvl ) sshb(:,:) = sshb(:,:) - atfp * rdt / rau0 * ( emp_b(:,:)    - emp(:,:)    & 
     260                                &                                 - rnf_b(:,:)    + rnf(:,:)    & 
     261                                &                                 + fwfisf_b(:,:) - fwfisf(:,:) ) * ssmask(:,:) 
    271262         sshn(:,:) = ssha(:,:)                           ! now <-- after 
    272263      ENDIF 
    273       ! 
    274       ! Update velocity at AGRIF zoom boundaries 
    275 #if defined key_agrif 
    276       IF ( .NOT.Agrif_Root() ) CALL Agrif_Update_Dyn( kt ) 
    277 #endif 
    278264      ! 
    279265      IF(ln_ctl)   CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb  - : ', mask1=tmask, ovlap=1 ) 
Note: See TracChangeset for help on using the changeset viewer.