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 12377 for NEMO/trunk/src/OCE/DYN/dynhpg.F90 – NEMO

Ignore:
Timestamp:
2020-02-12T15:39:06+01:00 (4 years ago)
Author:
acc
Message:

The big one. Merging all 2019 developments from the option 1 branch back onto the trunk.

This changeset reproduces 2019/dev_r11943_MERGE_2019 on the trunk using a 2-URL merge
onto a working copy of the trunk. I.e.:

svn merge --ignore-ancestry \

svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/trunk \
svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/branches/2019/dev_r11943_MERGE_2019 ./

The --ignore-ancestry flag avoids problems that may otherwise arise from the fact that
the merge history been trunk and branch may have been applied in a different order but
care has been taken before this step to ensure that all applicable fixes and updates
are present in the merge branch.

The trunk state just before this step has been branched to releases/release-4.0-HEAD
and that branch has been immediately tagged as releases/release-4.0.2. Any fixes
or additions in response to tickets on 4.0, 4.0.1 or 4.0.2 should be done on
releases/release-4.0-HEAD. From now on future 'point' releases (e.g. 4.0.2) will
remain unchanged with periodic releases as needs demand. Note release-4.0-HEAD is a
transitional naming convention. Future full releases, say 4.2, will have a release-4.2
branch which fulfills this role and the first point release (e.g. 4.2.0) will be made
immediately following the release branch creation.

2020 developments can be started from any trunk revision later than this one.

Location:
NEMO/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r11615_ENHANCE-04_namelists_as_internalfiles_agrif@HEAD      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
  • NEMO/trunk/src/OCE/DYN/dynhpg.F90

    r11536 r12377  
    3131   !!---------------------------------------------------------------------- 
    3232   USE oce             ! ocean dynamics and tracers 
     33   USE isf_oce , ONLY : risfload  ! ice shelf  (risfload variable) 
     34   USE isfload , ONLY : isf_load  ! ice shelf  (isf_load routine ) 
    3335   USE sbc_oce         ! surface variable (only for the flag with ice shelf) 
    3436   USE dom_oce         ! ocean space and time domain 
     
    7375 
    7476   !! * Substitutions 
    75 #  include "vectopt_loop_substitute.h90" 
     77#  include "do_loop_substitute.h90" 
    7678   !!---------------------------------------------------------------------- 
    7779   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    8183CONTAINS 
    8284 
    83    SUBROUTINE dyn_hpg( kt ) 
     85   SUBROUTINE dyn_hpg( kt, Kmm, puu, pvv, Krhs ) 
    8486      !!--------------------------------------------------------------------- 
    8587      !!                  ***  ROUTINE dyn_hpg  *** 
     
    8890      !!              using the scheme defined in the namelist 
    8991      !! 
    90       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
     92      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
    9193      !!             - send trends to trd_dyn for futher diagnostics (l_trddyn=T) 
    9294      !!---------------------------------------------------------------------- 
    93       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     95      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     96      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     97      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
     98      ! 
    9499      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
    95100      !!---------------------------------------------------------------------- 
     
    97102      IF( ln_timing )   CALL timing_start('dyn_hpg') 
    98103      ! 
    99       IF( l_trddyn ) THEN                    ! Temporary saving of ua and va trends (l_trddyn) 
     104      IF( l_trddyn ) THEN                    ! Temporary saving of puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends (l_trddyn) 
    100105         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    101          ztrdu(:,:,:) = ua(:,:,:) 
    102          ztrdv(:,:,:) = va(:,:,:) 
     106         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
     107         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
    103108      ENDIF 
    104109      ! 
    105110      SELECT CASE ( nhpg )      ! Hydrostatic pressure gradient computation 
    106       CASE ( np_zco )   ;   CALL hpg_zco    ( kt )      ! z-coordinate 
    107       CASE ( np_zps )   ;   CALL hpg_zps    ( kt )      ! z-coordinate plus partial steps (interpolation) 
    108       CASE ( np_sco )   ;   CALL hpg_sco    ( kt )      ! s-coordinate (standard jacobian formulation) 
    109       CASE ( np_djc )   ;   CALL hpg_djc    ( kt )      ! s-coordinate (Density Jacobian with Cubic polynomial) 
    110       CASE ( np_prj )   ;   CALL hpg_prj    ( kt )      ! s-coordinate (Pressure Jacobian scheme) 
    111       CASE ( np_isf )   ;   CALL hpg_isf    ( kt )      ! s-coordinate similar to sco modify for ice shelf 
     111      CASE ( np_zco )   ;   CALL hpg_zco    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate 
     112      CASE ( np_zps )   ;   CALL hpg_zps    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate plus partial steps (interpolation) 
     113      CASE ( np_sco )   ;   CALL hpg_sco    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (standard jacobian formulation) 
     114      CASE ( np_djc )   ;   CALL hpg_djc    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Density Jacobian with Cubic polynomial) 
     115      CASE ( np_prj )   ;   CALL hpg_prj    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Pressure Jacobian scheme) 
     116      CASE ( np_isf )   ;   CALL hpg_isf    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate similar to sco modify for ice shelf 
    112117      END SELECT 
    113118      ! 
    114119      IF( l_trddyn ) THEN      ! save the hydrostatic pressure gradient trends for momentum trend diagnostics 
    115          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    116          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    117          CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt ) 
     120         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     121         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     122         CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt, Kmm ) 
    118123         DEALLOCATE( ztrdu , ztrdv ) 
    119124      ENDIF 
    120125      ! 
    121       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' hpg  - Ua: ', mask1=umask,   & 
    122          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     126      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' hpg  - Ua: ', mask1=umask,   & 
     127         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    123128      ! 
    124129      IF( ln_timing )   CALL timing_stop('dyn_hpg') 
     
    127132 
    128133 
    129    SUBROUTINE dyn_hpg_init 
     134   SUBROUTINE dyn_hpg_init( Kmm ) 
    130135      !!---------------------------------------------------------------------- 
    131136      !!                 ***  ROUTINE dyn_hpg_init  *** 
     
    137142      !!      with the type of vertical coordinate used (zco, zps, sco) 
    138143      !!---------------------------------------------------------------------- 
     144      INTEGER, INTENT( in ) :: Kmm   ! ocean time level index 
     145      ! 
    139146      INTEGER ::   ioptio = 0      ! temporary integer 
    140147      INTEGER ::   ios             ! Local integer output status for namelist read 
     
    150157      !!---------------------------------------------------------------------- 
    151158      ! 
    152       REWIND( numnam_ref )              ! Namelist namdyn_hpg in reference namelist : Hydrostatic pressure gradient 
    153159      READ  ( numnam_ref, namdyn_hpg, IOSTAT = ios, ERR = 901) 
    154160901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist' ) 
    155161      ! 
    156       REWIND( numnam_cfg )              ! Namelist namdyn_hpg in configuration namelist : Hydrostatic pressure gradient 
    157162      READ  ( numnam_cfg, namdyn_hpg, IOSTAT = ios, ERR = 902 ) 
    158163902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist' ) 
     
    213218      ENDIF 
    214219      !                           
    215       IF ( .NOT. ln_isfcav ) THEN     !--- no ice shelf load 
    216          riceload(:,:) = 0._wp 
    217          ! 
    218       ELSE                            !--- set an ice shelf load 
    219          ! 
    220          IF(lwp) WRITE(numout,*) 
    221          IF(lwp) WRITE(numout,*) '   ice shelf case: set the ice-shelf load' 
    222          ALLOCATE( zts_top(jpi,jpj,jpts) , zrhd(jpi,jpj,jpk) , zrhdtop_isf(jpi,jpj) , ziceload(jpi,jpj) )  
    223          ! 
    224          znad = 1._wp                     !- To use density and not density anomaly 
    225          ! 
    226          !                                !- assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
    227          zts_top(:,:,jp_tem) = -1.9_wp   ;   zts_top(:,:,jp_sal) = 34.4_wp 
    228          ! 
    229          DO jk = 1, jpk                   !- compute density of the water displaced by the ice shelf  
    230             CALL eos( zts_top(:,:,:), gdept_n(:,:,jk), zrhd(:,:,jk) ) 
    231          END DO 
    232          ! 
    233          !                                !- compute rhd at the ice/oce interface (ice shelf side) 
    234          CALL eos( zts_top , risfdep, zrhdtop_isf ) 
    235          ! 
    236          !                                !- Surface value + ice shelf gradient 
    237          ziceload = 0._wp                       ! compute pressure due to ice shelf load  
    238          DO jj = 1, jpj                         ! (used to compute hpgi/j for all the level from 1 to miku/v) 
    239             DO ji = 1, jpi                      ! divided by 2 later 
    240                ikt = mikt(ji,jj) 
    241                ziceload(ji,jj) = ziceload(ji,jj) + (znad + zrhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
    242                DO jk = 2, ikt-1 
    243                   ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_n(ji,jj,jk) & 
    244                      &                              * (1._wp - tmask(ji,jj,jk)) 
    245                END DO 
    246                IF (ikt  >=  2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) & 
    247                   &                                              * ( risfdep(ji,jj) - gdept_n(ji,jj,ikt-1) ) 
    248             END DO 
    249          END DO 
    250          riceload(:,:) = ziceload(:,:)  ! need to be saved for diaar5 
    251          ! 
    252          DEALLOCATE( zts_top , zrhd , zrhdtop_isf , ziceload )  
    253       ENDIF 
    254       ! 
    255220   END SUBROUTINE dyn_hpg_init 
    256221 
    257222 
    258    SUBROUTINE hpg_zco( kt ) 
     223   SUBROUTINE hpg_zco( kt, Kmm, puu, pvv, Krhs ) 
    259224      !!--------------------------------------------------------------------- 
    260225      !!                  ***  ROUTINE hpg_zco  *** 
     
    266231      !!      level:    zhpi = grav ..... 
    267232      !!                zhpj = grav ..... 
    268       !!      add it to the general momentum trend (ua,va). 
    269       !!            ua = ua - 1/e1u * zhpi 
    270       !!            va = va - 1/e2v * zhpj 
    271       !! 
    272       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    273       !!---------------------------------------------------------------------- 
    274       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     233      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     234      !!            puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     235      !!            pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     236      !! 
     237      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     238      !!---------------------------------------------------------------------- 
     239      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     240      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     241      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    275242      ! 
    276243      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
     
    288255 
    289256      ! Surface value 
    290       DO jj = 2, jpjm1 
    291          DO ji = fs_2, fs_jpim1   ! vector opt. 
    292             zcoef1 = zcoef0 * e3w_n(ji,jj,1) 
    293             ! hydrostatic pressure gradient 
    294             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
    295             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    296             ! add to the general momentum trend 
    297             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    298             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    299          END DO 
    300       END DO 
     257      DO_2D_00_00 
     258         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 
     259         ! hydrostatic pressure gradient 
     260         zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     261         zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
     262         ! add to the general momentum trend 
     263         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     264         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     265      END_2D 
    301266 
    302267      ! 
    303268      ! interior value (2=<jk=<jpkm1) 
    304       DO jk = 2, jpkm1 
    305          DO jj = 2, jpjm1 
    306             DO ji = fs_2, fs_jpim1   ! vector opt. 
    307                zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 
    308                ! hydrostatic pressure gradient 
    309                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    310                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
    311                   &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    312  
    313                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    314                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
    315                   &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    316                ! add to the general momentum trend 
    317                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    318                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    319             END DO 
    320          END DO 
    321       END DO 
     269      DO_3D_00_00( 2, jpkm1 ) 
     270         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 
     271         ! hydrostatic pressure gradient 
     272         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
     273            &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
     274            &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     275 
     276         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
     277            &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
     278            &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
     279         ! add to the general momentum trend 
     280         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     281         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     282      END_3D 
    322283      ! 
    323284   END SUBROUTINE hpg_zco 
    324285 
    325286 
    326    SUBROUTINE hpg_zps( kt ) 
     287   SUBROUTINE hpg_zps( kt, Kmm, puu, pvv, Krhs ) 
    327288      !!--------------------------------------------------------------------- 
    328289      !!                 ***  ROUTINE hpg_zps  *** 
     
    330291      !! ** Method  :   z-coordinate plus partial steps case.  blahblah... 
    331292      !! 
    332       !! ** Action  : - Update (ua,va) with the now hydrastatic pressure trend 
    333       !!---------------------------------------------------------------------- 
    334       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     293      !! ** Action  : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     294      !!---------------------------------------------------------------------- 
     295      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     296      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     297      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    335298      !! 
    336299      INTEGER  ::   ji, jj, jk                       ! dummy loop indices 
     
    348311 
    349312      ! Partial steps: Compute NOW horizontal gradient of t, s, rd at the last ocean level 
    350       CALL zps_hde( kt, jpts, tsn, zgtsu, zgtsv, rhd, zgru , zgrv ) 
     313      CALL zps_hde( kt, Kmm, jpts, ts(:,:,:,:,Kmm), zgtsu, zgtsv, rhd, zgru , zgrv ) 
    351314 
    352315      ! Local constant initialization 
     
    354317 
    355318      !  Surface value (also valid in partial step case) 
    356       DO jj = 2, jpjm1 
    357          DO ji = fs_2, fs_jpim1   ! vector opt. 
    358             zcoef1 = zcoef0 * e3w_n(ji,jj,1) 
    359             ! hydrostatic pressure gradient 
    360             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
    361             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    362             ! add to the general momentum trend 
    363             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    364             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    365          END DO 
    366       END DO 
     319      DO_2D_00_00 
     320         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 
     321         ! hydrostatic pressure gradient 
     322         zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     323         zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
     324         ! add to the general momentum trend 
     325         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     326         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     327      END_2D 
    367328 
    368329      ! interior value (2=<jk=<jpkm1) 
    369       DO jk = 2, jpkm1 
    370          DO jj = 2, jpjm1 
    371             DO ji = fs_2, fs_jpim1   ! vector opt. 
    372                zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 
    373                ! hydrostatic pressure gradient 
    374                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    375                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
    376                   &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    377  
    378                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    379                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
    380                   &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    381                ! add to the general momentum trend 
    382                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    383                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    384             END DO 
    385          END DO 
    386       END DO 
     330      DO_3D_00_00( 2, jpkm1 ) 
     331         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 
     332         ! hydrostatic pressure gradient 
     333         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
     334            &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
     335            &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     336 
     337         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
     338            &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
     339            &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
     340         ! add to the general momentum trend 
     341         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     342         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     343      END_3D 
    387344 
    388345      ! partial steps correction at the last level  (use zgru & zgrv computed in zpshde.F90) 
    389       DO jj = 2, jpjm1 
    390          DO ji = 2, jpim1 
    391             iku = mbku(ji,jj) 
    392             ikv = mbkv(ji,jj) 
    393             zcoef2 = zcoef0 * MIN( e3w_n(ji,jj,iku), e3w_n(ji+1,jj  ,iku) ) 
    394             zcoef3 = zcoef0 * MIN( e3w_n(ji,jj,ikv), e3w_n(ji  ,jj+1,ikv) ) 
    395             IF( iku > 1 ) THEN            ! on i-direction (level 2 or more) 
    396                ua  (ji,jj,iku) = ua(ji,jj,iku) - zhpi(ji,jj,iku)         ! subtract old value 
    397                zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
    398                   &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + zgru(ji,jj) ) * r1_e1u(ji,jj) 
    399                ua  (ji,jj,iku) = ua(ji,jj,iku) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
    400             ENDIF 
    401             IF( ikv > 1 ) THEN            ! on j-direction (level 2 or more) 
    402                va  (ji,jj,ikv) = va(ji,jj,ikv) - zhpj(ji,jj,ikv)         ! subtract old value 
    403                zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
    404                   &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + zgrv(ji,jj) ) * r1_e2v(ji,jj) 
    405                va  (ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
    406             ENDIF 
    407          END DO 
    408       END DO 
     346      DO_2D_00_00 
     347         iku = mbku(ji,jj) 
     348         ikv = mbkv(ji,jj) 
     349         zcoef2 = zcoef0 * MIN( e3w(ji,jj,iku,Kmm), e3w(ji+1,jj  ,iku,Kmm) ) 
     350         zcoef3 = zcoef0 * MIN( e3w(ji,jj,ikv,Kmm), e3w(ji  ,jj+1,ikv,Kmm) ) 
     351         IF( iku > 1 ) THEN            ! on i-direction (level 2 or more) 
     352            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) - zhpi(ji,jj,iku)         ! subtract old value 
     353            zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
     354               &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + zgru(ji,jj) ) * r1_e1u(ji,jj) 
     355            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
     356         ENDIF 
     357         IF( ikv > 1 ) THEN            ! on j-direction (level 2 or more) 
     358            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) - zhpj(ji,jj,ikv)         ! subtract old value 
     359            zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
     360               &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + zgrv(ji,jj) ) * r1_e2v(ji,jj) 
     361            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
     362         ENDIF 
     363      END_2D 
    409364      ! 
    410365   END SUBROUTINE hpg_zps 
    411366 
    412367 
    413    SUBROUTINE hpg_sco( kt ) 
     368   SUBROUTINE hpg_sco( kt, Kmm, puu, pvv, Krhs ) 
    414369      !!--------------------------------------------------------------------- 
    415370      !!                  ***  ROUTINE hpg_sco  *** 
     
    423378      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ] 
    424379      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ] 
    425       !!      add it to the general momentum trend (ua,va). 
    426       !!         ua = ua - 1/e1u * zhpi 
    427       !!         va = va - 1/e2v * zhpj 
    428       !! 
    429       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    430       !!---------------------------------------------------------------------- 
    431       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     380      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     381      !!         puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     382      !!         pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     383      !! 
     384      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     385      !!---------------------------------------------------------------------- 
     386      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     387      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     388      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    432389      !! 
    433390      INTEGER  ::   ji, jj, jk, jii, jjj                 ! dummy loop indices 
     
    452409      ! 
    453410      IF( ln_wd_il ) THEN 
    454         DO jj = 2, jpjm1 
    455            DO ji = 2, jpim1  
    456              ll_tmp1 = MIN(  sshn(ji,jj)               ,  sshn(ji+1,jj) ) >                & 
    457                   &    MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
    458                   &    MAX(  sshn(ji,jj) +  ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    459                   &                                                       > rn_wdmin1 + rn_wdmin2 
    460              ll_tmp2 = ( ABS( sshn(ji,jj)              -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (       & 
    461                   &    MAX(   sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    462                   &    MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    463  
    464              IF(ll_tmp1) THEN 
    465                zcpx(ji,jj) = 1.0_wp 
    466              ELSE IF(ll_tmp2) THEN 
    467                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    468                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    469                            &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    470              ELSE 
    471                zcpx(ji,jj) = 0._wp 
    472              END IF 
    473        
    474              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    475                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    476                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    477                   &                                                      > rn_wdmin1 + rn_wdmin2 
    478              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (        & 
    479                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    480                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    481  
    482              IF(ll_tmp1) THEN 
    483                zcpy(ji,jj) = 1.0_wp 
    484              ELSE IF(ll_tmp2) THEN 
    485                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    486                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    487                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    488              ELSE 
    489                zcpy(ji,jj) = 0._wp 
    490              END IF 
    491            END DO 
    492         END DO 
     411        DO_2D_00_00 
     412          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)               ,  ssh(ji+1,jj,Kmm) ) >                & 
     413               &    MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
     414               &    MAX(  ssh(ji,jj,Kmm) +  ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     415               &                                                       > rn_wdmin1 + rn_wdmin2 
     416          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)              -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (       & 
     417               &    MAX(   ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     418               &    MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     419 
     420          IF(ll_tmp1) THEN 
     421            zcpx(ji,jj) = 1.0_wp 
     422          ELSE IF(ll_tmp2) THEN 
     423            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     424            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     425                        &    / (ssh(ji+1,jj,Kmm) - ssh(ji  ,jj,Kmm)) ) 
     426          ELSE 
     427            zcpx(ji,jj) = 0._wp 
     428          END IF 
     429    
     430          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     431               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     432               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     433               &                                                      > rn_wdmin1 + rn_wdmin2 
     434          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (        & 
     435               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     436               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     437 
     438          IF(ll_tmp1) THEN 
     439            zcpy(ji,jj) = 1.0_wp 
     440          ELSE IF(ll_tmp2) THEN 
     441            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     442            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     443                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     444          ELSE 
     445            zcpy(ji,jj) = 0._wp 
     446          END IF 
     447        END_2D 
    493448        CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
    494449      END IF 
    495450 
    496451      ! Surface value 
    497       DO jj = 2, jpjm1 
    498          DO ji = fs_2, fs_jpim1   ! vector opt. 
    499             ! hydrostatic pressure gradient along s-surfaces 
    500             zhpi(ji,jj,1) = zcoef0 * (  e3w_n(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )    & 
    501                &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e1u(ji,jj) 
    502             zhpj(ji,jj,1) = zcoef0 * (  e3w_n(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )    & 
    503                &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e2v(ji,jj) 
    504             ! s-coordinate pressure gradient correction 
    505             zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    506                &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
    507             zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    508                &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    509             ! 
    510             IF( ln_wd_il ) THEN 
    511                zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    512                zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    513                zuap = zuap * zcpx(ji,jj) 
    514                zvap = zvap * zcpy(ji,jj) 
    515             ENDIF 
    516             ! 
    517             ! add to the general momentum trend 
    518             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
    519             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap 
    520          END DO 
    521       END DO 
     452      DO_2D_00_00 
     453         ! hydrostatic pressure gradient along s-surfaces 
     454         zhpi(ji,jj,1) = zcoef0 * (  e3w(ji+1,jj  ,1,Kmm) * ( znad + rhd(ji+1,jj  ,1) )    & 
     455            &                      - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e1u(ji,jj) 
     456         zhpj(ji,jj,1) = zcoef0 * (  e3w(ji  ,jj+1,1,Kmm) * ( znad + rhd(ji  ,jj+1,1) )    & 
     457            &                      - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e2v(ji,jj) 
     458         ! s-coordinate pressure gradient correction 
     459         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     460            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
     461         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     462            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
     463         ! 
     464         IF( ln_wd_il ) THEN 
     465            zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     466            zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     467            zuap = zuap * zcpx(ji,jj) 
     468            zvap = zvap * zcpy(ji,jj) 
     469         ENDIF 
     470         ! 
     471         ! add to the general momentum trend 
     472         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) + zuap 
     473         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) + zvap 
     474      END_2D 
    522475 
    523476      ! interior value (2=<jk=<jpkm1) 
    524       DO jk = 2, jpkm1 
    525          DO jj = 2, jpjm1 
    526             DO ji = fs_2, fs_jpim1   ! vector opt. 
    527                ! hydrostatic pressure gradient along s-surfaces 
    528                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
    529                   &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
    530                   &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
    531                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
    532                   &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
    533                   &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
    534                ! s-coordinate pressure gradient correction 
    535                zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    536                   &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) * r1_e1u(ji,jj) 
    537                zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    538                   &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 
    539                ! 
    540                IF( ln_wd_il ) THEN 
    541                   zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    542                   zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    543                   zuap = zuap * zcpx(ji,jj) 
    544                   zvap = zvap * zcpy(ji,jj) 
    545                ENDIF 
    546                ! 
    547                ! add to the general momentum trend 
    548                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
    549                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) + zvap 
    550             END DO 
    551          END DO 
    552       END DO 
     477      DO_3D_00_00( 2, jpkm1 ) 
     478         ! hydrostatic pressure gradient along s-surfaces 
     479         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
     480            &           * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
     481            &              - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
     482         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
     483            &           * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
     484            &              - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
     485         ! s-coordinate pressure gradient correction 
     486         zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     487            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) * r1_e1u(ji,jj) 
     488         zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     489            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) * r1_e2v(ji,jj) 
     490         ! 
     491         IF( ln_wd_il ) THEN 
     492            zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     493            zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     494            zuap = zuap * zcpx(ji,jj) 
     495            zvap = zvap * zcpy(ji,jj) 
     496         ENDIF 
     497         ! 
     498         ! add to the general momentum trend 
     499         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) + zuap 
     500         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) + zvap 
     501      END_3D 
    553502      ! 
    554503      IF( ln_wd_il )  DEALLOCATE( zcpx , zcpy ) 
     
    557506 
    558507 
    559    SUBROUTINE hpg_isf( kt ) 
     508   SUBROUTINE hpg_isf( kt, Kmm, puu, pvv, Krhs ) 
    560509      !!--------------------------------------------------------------------- 
    561510      !!                  ***  ROUTINE hpg_isf  *** 
     
    569518      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ] 
    570519      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ] 
    571       !!      add it to the general momentum trend (ua,va). 
    572       !!         ua = ua - 1/e1u * zhpi 
    573       !!         va = va - 1/e2v * zhpj 
    574       !!      iceload is added and partial cell case are added to the top and bottom 
     520      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     521      !!         puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     522      !!         pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     523      !!      iceload is added 
    575524      !!       
    576       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    577       !!---------------------------------------------------------------------- 
    578       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     525      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     526      !!---------------------------------------------------------------------- 
     527      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     528      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     529      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    579530      !! 
    580531      INTEGER  ::   ji, jj, jk, ikt, iktp1i, iktp1j   ! dummy loop indices 
     
    597548        DO jj = 1, jpj 
    598549          ikt = mikt(ji,jj) 
    599           zts_top(ji,jj,1) = tsn(ji,jj,ikt,1) 
    600           zts_top(ji,jj,2) = tsn(ji,jj,ikt,2) 
     550          zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 
     551          zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 
    601552        END DO 
    602553      END DO 
     
    606557!===== Compute surface value =====================================================  
    607558!================================================================================== 
    608       DO jj = 2, jpjm1 
    609          DO ji = fs_2, fs_jpim1   ! vector opt. 
    610             ikt    = mikt(ji,jj) 
    611             iktp1i = mikt(ji+1,jj) 
    612             iktp1j = mikt(ji,jj+1) 
    613             ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
    614             ! we assume ISF is in isostatic equilibrium 
    615             zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w_n(ji+1,jj,iktp1i)                                    & 
    616                &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
    617                &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         & 
    618                &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    619                &                                  + ( riceload(ji+1,jj) - riceload(ji,jj))                            )  
    620             zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w_n(ji,jj+1,iktp1j)                                    & 
    621                &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
    622                &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         &  
    623                &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    624                &                                  + ( riceload(ji,jj+1) - riceload(ji,jj))                            )  
    625             ! s-coordinate pressure gradient correction (=0 if z coordinate) 
    626             zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    627                &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
    628             zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    629                &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    630             ! add to the general momentum trend 
    631             ua(ji,jj,1) = ua(ji,jj,1) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
    632             va(ji,jj,1) = va(ji,jj,1) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
    633          END DO 
    634       END DO 
     559      DO_2D_00_00 
     560         ikt    = mikt(ji,jj) 
     561         iktp1i = mikt(ji+1,jj) 
     562         iktp1j = mikt(ji,jj+1) 
     563         ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
     564         ! we assume ISF is in isostatic equilibrium 
     565         zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w(ji+1,jj,iktp1i,Kmm)                                    & 
     566            &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
     567            &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         & 
     568            &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     569            &                                  + ( risfload(ji+1,jj) - risfload(ji,jj))                            )  
     570         zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w(ji,jj+1,iktp1j,Kmm)                                    & 
     571            &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
     572            &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         &  
     573            &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     574            &                                  + ( risfload(ji,jj+1) - risfload(ji,jj))                            )  
     575         ! s-coordinate pressure gradient correction (=0 if z coordinate) 
     576         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     577            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
     578         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     579            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
     580         ! add to the general momentum trend 
     581         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
     582         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
     583      END_2D 
    635584!==================================================================================      
    636585!===== Compute interior value =====================================================  
    637586!================================================================================== 
    638587      ! interior value (2=<jk=<jpkm1) 
    639       DO jk = 2, jpkm1 
    640          DO jj = 2, jpjm1 
    641             DO ji = fs_2, fs_jpim1   ! vector opt. 
    642                ! hydrostatic pressure gradient along s-surfaces 
    643                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
    644                   &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
    645                   &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
    646                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
    647                   &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
    648                   &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
    649                ! s-coordinate pressure gradient correction 
    650                zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    651                   &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) / e1u(ji,jj) 
    652                zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    653                   &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) / e2v(ji,jj) 
    654                ! add to the general momentum trend 
    655                ua(ji,jj,jk) = ua(ji,jj,jk) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
    656                va(ji,jj,jk) = va(ji,jj,jk) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
    657             END DO 
    658          END DO 
    659       END DO 
     588      DO_3D_00_00( 2, jpkm1 ) 
     589         ! hydrostatic pressure gradient along s-surfaces 
     590         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
     591            &           * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
     592            &              - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
     593         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
     594            &           * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
     595            &              - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
     596         ! s-coordinate pressure gradient correction 
     597         zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     598            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) / e1u(ji,jj) 
     599         zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     600            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) / e2v(ji,jj) 
     601         ! add to the general momentum trend 
     602         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
     603         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
     604      END_3D 
    660605      ! 
    661606   END SUBROUTINE hpg_isf 
    662607 
    663608 
    664    SUBROUTINE hpg_djc( kt ) 
     609   SUBROUTINE hpg_djc( kt, Kmm, puu, pvv, Krhs ) 
    665610      !!--------------------------------------------------------------------- 
    666611      !!                  ***  ROUTINE hpg_djc  *** 
     
    670615      !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003 
    671616      !!---------------------------------------------------------------------- 
    672       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     617      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     618      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     619      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    673620      !! 
    674621      INTEGER  ::   ji, jj, jk          ! dummy loop indices 
     
    686633      IF( ln_wd_il ) THEN 
    687634         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
    688         DO jj = 2, jpjm1 
    689            DO ji = 2, jpim1  
    690              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    691                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
    692                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    693                   &                                                      > rn_wdmin1 + rn_wdmin2 
    694              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (        & 
    695                   &    MAX(   sshn(ji,jj)             ,  sshn(ji+1,jj) ) >                & 
    696                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    697              IF(ll_tmp1) THEN 
    698                zcpx(ji,jj) = 1.0_wp 
    699              ELSE IF(ll_tmp2) THEN 
    700                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    701                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    702                            &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    703              ELSE 
    704                zcpx(ji,jj) = 0._wp 
    705              END IF 
    706        
    707              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    708                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    709                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    710                   &                                                      > rn_wdmin1 + rn_wdmin2 
    711              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (        & 
    712                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    713                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    714  
    715              IF(ll_tmp1) THEN 
    716                zcpy(ji,jj) = 1.0_wp 
    717              ELSE IF(ll_tmp2) THEN 
    718                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    719                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    720                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    721              ELSE 
    722                zcpy(ji,jj) = 0._wp 
    723              END IF 
    724            END DO 
    725         END DO 
     635        DO_2D_00_00 
     636          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     637               &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
     638               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     639               &                                                      > rn_wdmin1 + rn_wdmin2 
     640          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (        & 
     641               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji+1,jj,Kmm) ) >                & 
     642               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     643          IF(ll_tmp1) THEN 
     644            zcpx(ji,jj) = 1.0_wp 
     645          ELSE IF(ll_tmp2) THEN 
     646            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     647            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     648                        &    / (ssh(ji+1,jj,Kmm) - ssh(ji  ,jj,Kmm)) ) 
     649          ELSE 
     650            zcpx(ji,jj) = 0._wp 
     651          END IF 
     652    
     653          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     654               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     655               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     656               &                                                      > rn_wdmin1 + rn_wdmin2 
     657          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (        & 
     658               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     659               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     660 
     661          IF(ll_tmp1) THEN 
     662            zcpy(ji,jj) = 1.0_wp 
     663          ELSE IF(ll_tmp2) THEN 
     664            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     665            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     666                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     667          ELSE 
     668            zcpy(ji,jj) = 0._wp 
     669          END IF 
     670        END_2D 
    726671        CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
    727672      END IF 
     
    744689!!bug gm   Not a true bug, but... dzz=e3w  for dzx, dzy verify what it is really 
    745690 
    746       DO jk = 2, jpkm1 
    747          DO jj = 2, jpjm1 
    748             DO ji = fs_2, fs_jpim1   ! vector opt. 
    749                drhoz(ji,jj,jk) = rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
    750                dzz  (ji,jj,jk) = gde3w_n(ji  ,jj  ,jk) - gde3w_n(ji,jj,jk-1) 
    751                drhox(ji,jj,jk) = rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
    752                dzx  (ji,jj,jk) = gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk  ) 
    753                drhoy(ji,jj,jk) = rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
    754                dzy  (ji,jj,jk) = gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk  ) 
    755             END DO 
    756          END DO 
    757       END DO 
     691      DO_3D_00_00( 2, jpkm1 ) 
     692         drhoz(ji,jj,jk) = rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
     693         dzz  (ji,jj,jk) = gde3w(ji  ,jj  ,jk) - gde3w(ji,jj,jk-1) 
     694         drhox(ji,jj,jk) = rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
     695         dzx  (ji,jj,jk) = gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk  ) 
     696         drhoy(ji,jj,jk) = rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
     697         dzy  (ji,jj,jk) = gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk  ) 
     698      END_3D 
    758699 
    759700      !------------------------------------------------------------------------- 
     
    765706!!bug  gm  idem for drhox, drhoy et ji=jpi and jj=jpj 
    766707 
    767       DO jk = 2, jpkm1 
    768          DO jj = 2, jpjm1 
    769             DO ji = fs_2, fs_jpim1   ! vector opt. 
    770                cffw = 2._wp * drhoz(ji  ,jj  ,jk) * drhoz(ji,jj,jk-1) 
    771  
    772                cffu = 2._wp * drhox(ji+1,jj  ,jk) * drhox(ji,jj,jk  ) 
    773                cffx = 2._wp * dzx  (ji+1,jj  ,jk) * dzx  (ji,jj,jk  ) 
    774  
    775                cffv = 2._wp * drhoy(ji  ,jj+1,jk) * drhoy(ji,jj,jk  ) 
    776                cffy = 2._wp * dzy  (ji  ,jj+1,jk) * dzy  (ji,jj,jk  ) 
    777  
    778                IF( cffw > zep) THEN 
    779                   drhow(ji,jj,jk) = 2._wp *   drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1)   & 
    780                      &                    / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 
    781                ELSE 
    782                   drhow(ji,jj,jk) = 0._wp 
    783                ENDIF 
    784  
    785                dzw(ji,jj,jk) = 2._wp *   dzz(ji,jj,jk) * dzz(ji,jj,jk-1)   & 
    786                   &                  / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 
    787  
    788                IF( cffu > zep ) THEN 
    789                   drhou(ji,jj,jk) = 2._wp *   drhox(ji+1,jj,jk) * drhox(ji,jj,jk)   & 
    790                      &                    / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 
    791                ELSE 
    792                   drhou(ji,jj,jk ) = 0._wp 
    793                ENDIF 
    794  
    795                IF( cffx > zep ) THEN 
    796                   dzu(ji,jj,jk) = 2._wp *   dzx(ji+1,jj,jk) * dzx(ji,jj,jk)   & 
    797                      &                  / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 
    798                ELSE 
    799                   dzu(ji,jj,jk) = 0._wp 
    800                ENDIF 
    801  
    802                IF( cffv > zep ) THEN 
    803                   drhov(ji,jj,jk) = 2._wp *   drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk)   & 
    804                      &                    / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 
    805                ELSE 
    806                   drhov(ji,jj,jk) = 0._wp 
    807                ENDIF 
    808  
    809                IF( cffy > zep ) THEN 
    810                   dzv(ji,jj,jk) = 2._wp *   dzy(ji,jj+1,jk) * dzy(ji,jj,jk)   & 
    811                      &                  / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 
    812                ELSE 
    813                   dzv(ji,jj,jk) = 0._wp 
    814                ENDIF 
    815  
    816             END DO 
    817          END DO 
    818       END DO 
     708      DO_3D_00_00( 2, jpkm1 ) 
     709         cffw = 2._wp * drhoz(ji  ,jj  ,jk) * drhoz(ji,jj,jk-1) 
     710 
     711         cffu = 2._wp * drhox(ji+1,jj  ,jk) * drhox(ji,jj,jk  ) 
     712         cffx = 2._wp * dzx  (ji+1,jj  ,jk) * dzx  (ji,jj,jk  ) 
     713 
     714         cffv = 2._wp * drhoy(ji  ,jj+1,jk) * drhoy(ji,jj,jk  ) 
     715         cffy = 2._wp * dzy  (ji  ,jj+1,jk) * dzy  (ji,jj,jk  ) 
     716 
     717         IF( cffw > zep) THEN 
     718            drhow(ji,jj,jk) = 2._wp *   drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1)   & 
     719               &                    / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 
     720         ELSE 
     721            drhow(ji,jj,jk) = 0._wp 
     722         ENDIF 
     723 
     724         dzw(ji,jj,jk) = 2._wp *   dzz(ji,jj,jk) * dzz(ji,jj,jk-1)   & 
     725            &                  / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 
     726 
     727         IF( cffu > zep ) THEN 
     728            drhou(ji,jj,jk) = 2._wp *   drhox(ji+1,jj,jk) * drhox(ji,jj,jk)   & 
     729               &                    / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 
     730         ELSE 
     731            drhou(ji,jj,jk ) = 0._wp 
     732         ENDIF 
     733 
     734         IF( cffx > zep ) THEN 
     735            dzu(ji,jj,jk) = 2._wp *   dzx(ji+1,jj,jk) * dzx(ji,jj,jk)   & 
     736               &                  / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 
     737         ELSE 
     738            dzu(ji,jj,jk) = 0._wp 
     739         ENDIF 
     740 
     741         IF( cffv > zep ) THEN 
     742            drhov(ji,jj,jk) = 2._wp *   drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk)   & 
     743               &                    / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 
     744         ELSE 
     745            drhov(ji,jj,jk) = 0._wp 
     746         ENDIF 
     747 
     748         IF( cffy > zep ) THEN 
     749            dzv(ji,jj,jk) = 2._wp *   dzy(ji,jj+1,jk) * dzy(ji,jj,jk)   & 
     750               &                  / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 
     751         ELSE 
     752            dzv(ji,jj,jk) = 0._wp 
     753         ENDIF 
     754 
     755      END_3D 
    819756 
    820757      !---------------------------------------------------------------------------------- 
     
    837774!          true if gde3w is really defined as the sum of the e3w scale factors as, it seems to me, it should be 
    838775 
    839       DO jj = 2, jpjm1 
    840          DO ji = fs_2, fs_jpim1   ! vector opt. 
    841             rho_k(ji,jj,1) = -grav * ( e3w_n(ji,jj,1) - gde3w_n(ji,jj,1) )               & 
    842                &                   * (  rhd(ji,jj,1)                                     & 
    843                &                     + 0.5_wp * ( rhd    (ji,jj,2) - rhd    (ji,jj,1) )  & 
    844                &                              * ( e3w_n  (ji,jj,1) - gde3w_n(ji,jj,1) )  & 
    845                &                              / ( gde3w_n(ji,jj,2) - gde3w_n(ji,jj,1) )  ) 
    846          END DO 
    847       END DO 
     776      DO_2D_00_00 
     777         rho_k(ji,jj,1) = -grav * ( e3w(ji,jj,1,Kmm) - gde3w(ji,jj,1) )               & 
     778            &                   * (  rhd(ji,jj,1)                                     & 
     779            &                     + 0.5_wp * ( rhd    (ji,jj,2) - rhd    (ji,jj,1) )  & 
     780            &                              * ( e3w  (ji,jj,1,Kmm) - gde3w(ji,jj,1) )  & 
     781            &                              / ( gde3w(ji,jj,2) - gde3w(ji,jj,1) )  ) 
     782      END_2D 
    848783 
    849784!!bug gm    : here also, simplification is possible 
    850785!!bug gm    : optimisation: 1/10 and 1/12 the division should be done before the loop 
    851786 
    852       DO jk = 2, jpkm1 
    853          DO jj = 2, jpjm1 
    854             DO ji = fs_2, fs_jpim1   ! vector opt. 
    855  
    856                rho_k(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
    857                   &                     * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) )                                   & 
    858                   &            - grav * z1_10 * (                                                                   & 
    859                   &     ( drhow  (ji,jj,jk) - drhow  (ji,jj,jk-1) )                                                     & 
    860                   &   * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
    861                   &   - ( dzw    (ji,jj,jk) - dzw    (ji,jj,jk-1) )                                                     & 
    862                   &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
    863                   &                             ) 
    864  
    865                rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                   & 
    866                   &                     * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) )                                   & 
    867                   &            - grav* z1_10 * (                                                                    & 
    868                   &     ( drhou  (ji+1,jj,jk) - drhou  (ji,jj,jk) )                                                     & 
    869                   &   * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
    870                   &   - ( dzu    (ji+1,jj,jk) - dzu    (ji,jj,jk) )                                                     & 
    871                   &   * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
    872                   &                            ) 
    873  
    874                rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                 & 
    875                   &                     * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) )                                   & 
    876                   &            - grav* z1_10 * (                                                                    & 
    877                   &     ( drhov  (ji,jj+1,jk) - drhov  (ji,jj,jk) )                                                     & 
    878                   &   * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
    879                   &   - ( dzv    (ji,jj+1,jk) - dzv    (ji,jj,jk) )                                                     & 
    880                   &   * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
    881                   &                            ) 
    882  
    883             END DO 
    884          END DO 
    885       END DO 
     787      DO_3D_00_00( 2, jpkm1 ) 
     788 
     789         rho_k(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
     790            &                     * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) )                                   & 
     791            &            - grav * z1_10 * (                                                                   & 
     792            &     ( drhow  (ji,jj,jk) - drhow  (ji,jj,jk-1) )                                                     & 
     793            &   * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
     794            &   - ( dzw    (ji,jj,jk) - dzw    (ji,jj,jk-1) )                                                     & 
     795            &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
     796            &                             ) 
     797 
     798         rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                   & 
     799            &                     * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) )                                   & 
     800            &            - grav* z1_10 * (                                                                    & 
     801            &     ( drhou  (ji+1,jj,jk) - drhou  (ji,jj,jk) )                                                     & 
     802            &   * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
     803            &   - ( dzu    (ji+1,jj,jk) - dzu    (ji,jj,jk) )                                                     & 
     804            &   * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
     805            &                            ) 
     806 
     807         rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                 & 
     808            &                     * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) )                                   & 
     809            &            - grav* z1_10 * (                                                                    & 
     810            &     ( drhov  (ji,jj+1,jk) - drhov  (ji,jj,jk) )                                                     & 
     811            &   * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
     812            &   - ( dzv    (ji,jj+1,jk) - dzv    (ji,jj,jk) )                                                     & 
     813            &   * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
     814            &                            ) 
     815 
     816      END_3D 
    886817      CALL lbc_lnk_multi( 'dynhpg', rho_k, 'W', 1., rho_i, 'U', 1., rho_j, 'V', 1. ) 
    887818 
     
    889820      !  Surface value 
    890821      ! --------------- 
    891       DO jj = 2, jpjm1 
    892          DO ji = fs_2, fs_jpim1   ! vector opt. 
    893             zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
    894             zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
    895             IF( ln_wd_il ) THEN 
    896               zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    897               zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    898             ENDIF 
    899             ! add to the general momentum trend 
    900             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    901             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    902          END DO 
    903       END DO 
     822      DO_2D_00_00 
     823         zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
     824         zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
     825         IF( ln_wd_il ) THEN 
     826           zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     827           zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     828         ENDIF 
     829         ! add to the general momentum trend 
     830         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     831         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     832      END_2D 
    904833 
    905834      ! ---------------- 
    906835      !  interior value   (2=<jk=<jpkm1) 
    907836      ! ---------------- 
    908       DO jk = 2, jpkm1 
    909          DO jj = 2, jpjm1 
    910             DO ji = fs_2, fs_jpim1   ! vector opt. 
    911                ! hydrostatic pressure gradient along s-surfaces 
    912                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
    913                   &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
    914                   &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    915                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
    916                   &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
    917                   &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
    918                IF( ln_wd_il ) THEN 
    919                  zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    920                  zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    921                ENDIF 
    922                ! add to the general momentum trend 
    923                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    924                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    925             END DO 
    926          END DO 
    927       END DO 
     837      DO_3D_00_00( 2, jpkm1 ) 
     838         ! hydrostatic pressure gradient along s-surfaces 
     839         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
     840            &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
     841            &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     842         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
     843            &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
     844            &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
     845         IF( ln_wd_il ) THEN 
     846           zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     847           zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     848         ENDIF 
     849         ! add to the general momentum trend 
     850         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     851         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     852      END_3D 
    928853      ! 
    929854      IF( ln_wd_il )   DEALLOCATE( zcpx, zcpy ) 
     
    932857 
    933858 
    934    SUBROUTINE hpg_prj( kt ) 
     859   SUBROUTINE hpg_prj( kt, Kmm, puu, pvv, Krhs ) 
    935860      !!--------------------------------------------------------------------- 
    936861      !!                  ***  ROUTINE hpg_prj  *** 
     
    941866      !!      all vertical coordinate systems 
    942867      !! 
    943       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
     868      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
    944869      !!---------------------------------------------------------------------- 
    945870      INTEGER, PARAMETER  :: polynomial_type = 1    ! 1: cubic spline, 2: linear 
    946       INTEGER, INTENT(in) ::   kt                   ! ocean time-step index 
     871      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     872      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     873      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    947874      !! 
    948875      INTEGER  ::   ji, jj, jk, jkk                 ! dummy loop indices 
     
    974901      IF( ln_wd_il ) THEN 
    975902         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
    976          DO jj = 2, jpjm1 
    977            DO ji = 2, jpim1  
    978              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    979                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
    980                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    981                   &                                                      > rn_wdmin1 + rn_wdmin2 
    982              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (         & 
    983                   &    MAX(   sshn(ji,jj)             ,  sshn(ji+1,jj) ) >                & 
    984                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    985  
    986              IF(ll_tmp1) THEN 
    987                zcpx(ji,jj) = 1.0_wp 
    988              ELSE IF(ll_tmp2) THEN 
    989                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    990                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    991                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    992                
    993                 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
    994              ELSE 
    995                zcpx(ji,jj) = 0._wp 
    996              END IF 
    997        
    998              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    999                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    1000                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    1001                   &                                                      > rn_wdmin1 + rn_wdmin2 
    1002              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (      & 
    1003                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    1004                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    1005  
    1006              IF(ll_tmp1) THEN 
    1007                zcpy(ji,jj) = 1.0_wp 
    1008              ELSE IF(ll_tmp2) THEN 
    1009                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    1010                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    1011                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    1012                 zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
    1013  
    1014                ELSE 
    1015                   zcpy(ji,jj) = 0._wp 
    1016                ENDIF 
    1017             END DO 
    1018          END DO 
     903         DO_2D_00_00 
     904          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     905               &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
     906               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     907               &                                                      > rn_wdmin1 + rn_wdmin2 
     908          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (         & 
     909               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji+1,jj,Kmm) ) >                & 
     910               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     911 
     912          IF(ll_tmp1) THEN 
     913            zcpx(ji,jj) = 1.0_wp 
     914          ELSE IF(ll_tmp2) THEN 
     915            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     916            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     917                        &    / (ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm)) ) 
     918            
     919             zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
     920          ELSE 
     921            zcpx(ji,jj) = 0._wp 
     922          END IF 
     923    
     924          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     925               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     926               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     927               &                                                      > rn_wdmin1 + rn_wdmin2 
     928          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (      & 
     929               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     930               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     931 
     932          IF(ll_tmp1) THEN 
     933            zcpy(ji,jj) = 1.0_wp 
     934          ELSE IF(ll_tmp2) THEN 
     935            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     936            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     937                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     938             zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
     939 
     940            ELSE 
     941               zcpy(ji,jj) = 0._wp 
     942            ENDIF 
     943         END_2D 
    1019944         CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
    1020945      ENDIF 
     
    1025950 
    1026951      ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate 
    1027       DO jj = 1, jpj 
    1028         DO ji = 1, jpi 
    1029           jk = mbkt(ji,jj)+1 
    1030           IF(     jk <=  0   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
    1031           ELSEIF( jk ==  1   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
    1032           ELSEIF( jk < jpkm1 ) THEN 
    1033              DO jkk = jk+1, jpk 
    1034                 zrhh(ji,jj,jkk) = interp1(gde3w_n(ji,jj,jkk  ), gde3w_n(ji,jj,jkk-1),   & 
    1035                    &                      gde3w_n(ji,jj,jkk-2), rhd    (ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 
    1036              END DO 
    1037           ENDIF 
    1038         END DO 
    1039       END DO 
     952      DO_2D_11_11 
     953       jk = mbkt(ji,jj)+1 
     954       IF(     jk <=  0   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
     955       ELSEIF( jk ==  1   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
     956       ELSEIF( jk < jpkm1 ) THEN 
     957          DO jkk = jk+1, jpk 
     958             zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk  ), gde3w(ji,jj,jkk-1),   & 
     959                &                      gde3w(ji,jj,jkk-2), rhd    (ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 
     960          END DO 
     961       ENDIF 
     962      END_2D 
    1040963 
    1041964      ! Transfer the depth of "T(:,:,:)" to vertical coordinate "zdept(:,:,:)" 
    1042       DO jj = 1, jpj 
    1043          DO ji = 1, jpi 
    1044             zdept(ji,jj,1) = 0.5_wp * e3w_n(ji,jj,1) - sshn(ji,jj) * znad 
    1045          END DO 
    1046       END DO 
    1047  
    1048       DO jk = 2, jpk 
    1049          DO jj = 1, jpj 
    1050             DO ji = 1, jpi 
    1051                zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w_n(ji,jj,jk) 
    1052             END DO 
    1053          END DO 
    1054       END DO 
     965      DO_2D_11_11 
     966         zdept(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) - ssh(ji,jj,Kmm) * znad 
     967      END_2D 
     968 
     969      DO_3D_11_11( 2, jpk ) 
     970         zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w(ji,jj,jk,Kmm) 
     971      END_3D 
    1055972 
    1056973      fsp(:,:,:) = zrhh (:,:,:) 
     
    1063980 
    1064981      ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 
    1065       DO jj = 2, jpj 
    1066         DO ji = 2, jpi 
    1067           zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
    1068              &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w_n(ji,jj,1) 
    1069  
    1070           ! assuming linear profile across the top half surface layer 
    1071           zhpi(ji,jj,1) =  0.5_wp * e3w_n(ji,jj,1) * zrhdt1 
    1072         END DO 
    1073       END DO 
     982      DO_2D_01_01 
     983       zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
     984          &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm) 
     985 
     986       ! assuming linear profile across the top half surface layer 
     987       zhpi(ji,jj,1) =  0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt1 
     988      END_2D 
    1074989 
    1075990      ! Calculate the pressure "zhpi(:,:,:)" at "T(ji,jj,2:jpkm1)" 
    1076       DO jk = 2, jpkm1 
    1077         DO jj = 2, jpj 
    1078           DO ji = 2, jpi 
    1079             zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
    1080                &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
    1081                &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
    1082                &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
    1083           END DO 
    1084         END DO 
    1085       END DO 
     991      DO_3D_01_01( 2, jpkm1 ) 
     992      zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
     993         &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
     994         &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
     995         &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
     996      END_3D 
    1086997 
    1087998      ! Z coordinate of U(ji,jj,1:jpkm1) and V(ji,jj,1:jpkm1) 
    1088999 
    10891000      ! Prepare zsshu_n and zsshv_n 
    1090       DO jj = 2, jpjm1 
    1091         DO ji = 2, jpim1 
     1001      DO_2D_00_00 
    10921002!!gm BUG ?    if it is ssh at u- & v-point then it should be: 
    1093 !          zsshu_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji+1,jj) * sshn(ji+1,jj)) * & 
     1003!          zsshu_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji+1,jj) * ssh(ji+1,jj,Kmm)) * & 
    10941004!                         & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1095 !          zsshv_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji,jj+1) * sshn(ji,jj+1)) * & 
     1005!          zsshv_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji,jj+1) * ssh(ji,jj+1,Kmm)) * & 
    10961006!                         & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    10971007!!gm not this: 
    1098           zsshu_n(ji,jj) = (e1e2u(ji,jj) * sshn(ji,jj) + e1e2u(ji+1, jj) * sshn(ji+1,jj)) * & 
    1099                          & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1100           zsshv_n(ji,jj) = (e1e2v(ji,jj) * sshn(ji,jj) + e1e2v(ji+1, jj) * sshn(ji,jj+1)) * & 
    1101                          & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    1102         END DO 
    1103       END DO 
     1008       zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * & 
     1009                      & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
     1010       zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * & 
     1011                      & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
     1012      END_2D 
    11041013 
    11051014      CALL lbc_lnk_multi ('dynhpg', zsshu_n, 'U', 1., zsshv_n, 'V', 1. ) 
    11061015 
    1107       DO jj = 2, jpjm1 
    1108         DO ji = 2, jpim1 
    1109           zu(ji,jj,1) = - ( e3u_n(ji,jj,1) - zsshu_n(ji,jj) * znad)  
    1110           zv(ji,jj,1) = - ( e3v_n(ji,jj,1) - zsshv_n(ji,jj) * znad) 
    1111         END DO 
    1112       END DO 
    1113  
    1114       DO jk = 2, jpkm1 
    1115         DO jj = 2, jpjm1 
    1116           DO ji = 2, jpim1 
    1117             zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u_n(ji,jj,jk) 
    1118             zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v_n(ji,jj,jk) 
    1119           END DO 
    1120         END DO 
    1121       END DO 
    1122  
    1123       DO jk = 1, jpkm1 
    1124         DO jj = 2, jpjm1 
    1125           DO ji = 2, jpim1 
    1126             zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u_n(ji,jj,jk) 
    1127             zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v_n(ji,jj,jk) 
    1128           END DO 
    1129         END DO 
    1130       END DO 
    1131  
    1132       DO jk = 1, jpkm1 
    1133         DO jj = 2, jpjm1 
    1134           DO ji = 2, jpim1 
    1135             zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1136             zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1137             zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    1138             zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    1139           END DO 
    1140         END DO 
    1141       END DO 
    1142  
    1143  
    1144       DO jk = 1, jpkm1 
    1145         DO jj = 2, jpjm1 
    1146           DO ji = 2, jpim1 
    1147             zpwes = 0._wp; zpwed = 0._wp 
    1148             zpnss = 0._wp; zpnsd = 0._wp 
    1149             zuijk = zu(ji,jj,jk) 
    1150             zvijk = zv(ji,jj,jk) 
    1151  
    1152             !!!!!     for u equation 
    1153             IF( jk <= mbku(ji,jj) ) THEN 
    1154                IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
    1155                  jis = ji + 1; jid = ji 
    1156                ELSE 
    1157                  jis = ji;     jid = ji +1 
    1158                ENDIF 
    1159  
    1160                ! integrate the pressure on the shallow side 
    1161                jk1 = jk 
    1162                DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
    1163                  IF( jk1 == mbku(ji,jj) ) THEN 
    1164                    zuijk = -zdept(jis,jj,jk1) 
    1165                    EXIT 
    1166                  ENDIF 
    1167                  zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
    1168                  zpwes = zpwes +                                    & 
    1169                       integ_spline(zdept(jis,jj,jk1), zdeps,            & 
    1170                              asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
    1171                              csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
    1172                  jk1 = jk1 + 1 
    1173                END DO 
    1174  
    1175                ! integrate the pressure on the deep side 
    1176                jk1 = jk 
    1177                DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
    1178                  IF( jk1 == 1 ) THEN 
    1179                    zdeps = zdept(jid,jj,1) + MIN(zuijk, sshn(jid,jj)*znad) 
    1180                    zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
    1181                                                      bsp(jid,jj,1),   csp(jid,jj,1), & 
    1182                                                      dsp(jid,jj,1)) * zdeps 
    1183                    zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
    1184                    EXIT 
    1185                  ENDIF 
    1186                  zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
    1187                  zpwed = zpwed +                                        & 
    1188                         integ_spline(zdeps,              zdept(jid,jj,jk1), & 
    1189                                asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
    1190                                csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
    1191                  jk1 = jk1 - 1 
    1192                END DO 
    1193  
    1194                ! update the momentum trends in u direction 
    1195  
    1196                zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
    1197                IF( .NOT.ln_linssh ) THEN 
    1198                  zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
    1199                     &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 
    1200                 ELSE 
    1201                  zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
    1202                ENDIF 
    1203                IF( ln_wd_il ) THEN 
    1204                   zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1205                   zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1206                ENDIF 
    1207                ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
    1208             ENDIF 
    1209  
    1210             !!!!!     for v equation 
    1211             IF( jk <= mbkv(ji,jj) ) THEN 
    1212                IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
    1213                  jjs = jj + 1; jjd = jj 
    1214                ELSE 
    1215                  jjs = jj    ; jjd = jj + 1 
    1216                ENDIF 
    1217  
    1218                ! integrate the pressure on the shallow side 
    1219                jk1 = jk 
    1220                DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
    1221                  IF( jk1 == mbkv(ji,jj) ) THEN 
    1222                    zvijk = -zdept(ji,jjs,jk1) 
    1223                    EXIT 
    1224                  ENDIF 
    1225                  zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
    1226                  zpnss = zpnss +                                      & 
    1227                         integ_spline(zdept(ji,jjs,jk1), zdeps,            & 
    1228                                asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
    1229                                csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
    1230                  jk1 = jk1 + 1 
    1231                END DO 
    1232  
    1233                ! integrate the pressure on the deep side 
    1234                jk1 = jk 
    1235                DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
    1236                  IF( jk1 == 1 ) THEN 
    1237                    zdeps = zdept(ji,jjd,1) + MIN(zvijk, sshn(ji,jjd)*znad) 
    1238                    zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
    1239                                                      bsp(ji,jjd,1),   csp(ji,jjd,1), & 
    1240                                                      dsp(ji,jjd,1) ) * zdeps 
    1241                    zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
    1242                    EXIT 
    1243                  ENDIF 
    1244                  zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
    1245                  zpnsd = zpnsd +                                        & 
    1246                         integ_spline(zdeps,              zdept(ji,jjd,jk1), & 
    1247                                asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
    1248                                csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
    1249                  jk1 = jk1 - 1 
    1250                END DO 
    1251  
    1252  
    1253                ! update the momentum trends in v direction 
    1254  
    1255                zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
    1256                IF( .NOT.ln_linssh ) THEN 
    1257                   zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
    1258                           ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
    1259                ELSE 
    1260                   zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
    1261                ENDIF 
    1262                IF( ln_wd_il ) THEN 
    1263                   zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1264                   zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1265                ENDIF 
    1266  
    1267                va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
    1268             ENDIF 
    1269                ! 
    1270             END DO 
     1016      DO_2D_00_00 
     1017       zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) * znad)  
     1018       zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) * znad) 
     1019      END_2D 
     1020 
     1021      DO_3D_00_00( 2, jpkm1 ) 
     1022      zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm) 
     1023      zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm) 
     1024      END_3D 
     1025 
     1026      DO_3D_00_00( 1, jpkm1 ) 
     1027      zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm) 
     1028      zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm) 
     1029      END_3D 
     1030 
     1031      DO_3D_00_00( 1, jpkm1 ) 
     1032      zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1033      zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1034      zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1035      zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1036      END_3D 
     1037 
     1038 
     1039      DO_3D_00_00( 1, jpkm1 ) 
     1040      zpwes = 0._wp; zpwed = 0._wp 
     1041      zpnss = 0._wp; zpnsd = 0._wp 
     1042      zuijk = zu(ji,jj,jk) 
     1043      zvijk = zv(ji,jj,jk) 
     1044 
     1045      !!!!!     for u equation 
     1046      IF( jk <= mbku(ji,jj) ) THEN 
     1047         IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
     1048           jis = ji + 1; jid = ji 
     1049         ELSE 
     1050           jis = ji;     jid = ji +1 
     1051         ENDIF 
     1052 
     1053         ! integrate the pressure on the shallow side 
     1054         jk1 = jk 
     1055         DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
     1056           IF( jk1 == mbku(ji,jj) ) THEN 
     1057             zuijk = -zdept(jis,jj,jk1) 
     1058             EXIT 
     1059           ENDIF 
     1060           zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
     1061           zpwes = zpwes +                                    & 
     1062                integ_spline(zdept(jis,jj,jk1), zdeps,            & 
     1063                       asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
     1064                       csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
     1065           jk1 = jk1 + 1 
    12711066         END DO 
    1272       END DO 
     1067 
     1068         ! integrate the pressure on the deep side 
     1069         jk1 = jk 
     1070         DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
     1071           IF( jk1 == 1 ) THEN 
     1072             zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 
     1073             zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
     1074                                               bsp(jid,jj,1),   csp(jid,jj,1), & 
     1075                                               dsp(jid,jj,1)) * zdeps 
     1076             zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
     1077             EXIT 
     1078           ENDIF 
     1079           zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
     1080           zpwed = zpwed +                                        & 
     1081                  integ_spline(zdeps,              zdept(jid,jj,jk1), & 
     1082                         asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
     1083                         csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
     1084           jk1 = jk1 - 1 
     1085         END DO 
     1086 
     1087         ! update the momentum trends in u direction 
     1088 
     1089         zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
     1090         IF( .NOT.ln_linssh ) THEN 
     1091           zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
     1092              &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 
     1093          ELSE 
     1094           zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
     1095         ENDIF 
     1096         IF( ln_wd_il ) THEN 
     1097            zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1098            zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1099         ENDIF 
     1100         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
     1101      ENDIF 
     1102 
     1103      !!!!!     for v equation 
     1104      IF( jk <= mbkv(ji,jj) ) THEN 
     1105         IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
     1106           jjs = jj + 1; jjd = jj 
     1107         ELSE 
     1108           jjs = jj    ; jjd = jj + 1 
     1109         ENDIF 
     1110 
     1111         ! integrate the pressure on the shallow side 
     1112         jk1 = jk 
     1113         DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
     1114           IF( jk1 == mbkv(ji,jj) ) THEN 
     1115             zvijk = -zdept(ji,jjs,jk1) 
     1116             EXIT 
     1117           ENDIF 
     1118           zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
     1119           zpnss = zpnss +                                      & 
     1120                  integ_spline(zdept(ji,jjs,jk1), zdeps,            & 
     1121                         asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
     1122                         csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
     1123           jk1 = jk1 + 1 
     1124         END DO 
     1125 
     1126         ! integrate the pressure on the deep side 
     1127         jk1 = jk 
     1128         DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
     1129           IF( jk1 == 1 ) THEN 
     1130             zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad) 
     1131             zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
     1132                                               bsp(ji,jjd,1),   csp(ji,jjd,1), & 
     1133                                               dsp(ji,jjd,1) ) * zdeps 
     1134             zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
     1135             EXIT 
     1136           ENDIF 
     1137           zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
     1138           zpnsd = zpnsd +                                        & 
     1139                  integ_spline(zdeps,              zdept(ji,jjd,jk1), & 
     1140                         asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
     1141                         csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
     1142           jk1 = jk1 - 1 
     1143         END DO 
     1144 
     1145 
     1146         ! update the momentum trends in v direction 
     1147 
     1148         zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
     1149         IF( .NOT.ln_linssh ) THEN 
     1150            zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
     1151                    ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) ) 
     1152         ELSE 
     1153            zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
     1154         ENDIF 
     1155         IF( ln_wd_il ) THEN 
     1156            zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)  
     1157            zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)  
     1158         ENDIF 
     1159 
     1160         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
     1161      ENDIF 
     1162         ! 
     1163      END_3D 
    12731164      ! 
    12741165      IF( ln_wd_il )   DEALLOCATE( zcpx, zcpy ) 
Note: See TracChangeset for help on using the changeset viewer.