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 13463 for NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynhpg.F90 – NEMO

Ignore:
Timestamp:
2020-09-14T17:40:34+02:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2195:update to trunk 13461

Location:
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS

    • 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_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@13382        sette 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynhpg.F90

    r10491 r13463  
    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 
     
    3739   USE trd_oce         ! trends: ocean variables 
    3840   USE trddyn          ! trend manager: dynamics 
    39 !jc   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
     41   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
    4042   ! 
    4143   USE in_out_manager  ! I/O manager 
     
    7375 
    7476   !! * Substitutions 
    75 #  include "vectopt_loop_substitute.h90" 
     77#  include "do_loop_substitute.h90" 
     78#  include "domzgr_substitute.h90" 
     79 
    7680   !!---------------------------------------------------------------------- 
    7781   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    8185CONTAINS 
    8286 
    83    SUBROUTINE dyn_hpg( kt ) 
     87   SUBROUTINE dyn_hpg( kt, Kmm, puu, pvv, Krhs ) 
    8488      !!--------------------------------------------------------------------- 
    8589      !!                  ***  ROUTINE dyn_hpg  *** 
     
    8892      !!              using the scheme defined in the namelist 
    8993      !! 
    90       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
     94      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
    9195      !!             - send trends to trd_dyn for futher diagnostics (l_trddyn=T) 
    9296      !!---------------------------------------------------------------------- 
    93       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     97      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     98      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     99      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
     100      ! 
    94101      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
    95102      !!---------------------------------------------------------------------- 
     
    97104      IF( ln_timing )   CALL timing_start('dyn_hpg') 
    98105      ! 
    99       IF( l_trddyn ) THEN                    ! Temporary saving of ua and va trends (l_trddyn) 
     106      IF( l_trddyn ) THEN                    ! Temporary saving of puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends (l_trddyn) 
    100107         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    101          ztrdu(:,:,:) = ua(:,:,:) 
    102          ztrdv(:,:,:) = va(:,:,:) 
     108         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
     109         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
    103110      ENDIF 
    104111      ! 
    105112      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 
     113      CASE ( np_zco )   ;   CALL hpg_zco    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate 
     114      CASE ( np_zps )   ;   CALL hpg_zps    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate plus partial steps (interpolation) 
     115      CASE ( np_sco )   ;   CALL hpg_sco    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (standard jacobian formulation) 
     116      CASE ( np_djc )   ;   CALL hpg_djc    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Density Jacobian with Cubic polynomial) 
     117      CASE ( np_prj )   ;   CALL hpg_prj    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Pressure Jacobian scheme) 
     118      CASE ( np_isf )   ;   CALL hpg_isf    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate similar to sco modify for ice shelf 
    112119      END SELECT 
    113120      ! 
    114121      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 ) 
     122         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     123         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     124         CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt, Kmm ) 
    118125         DEALLOCATE( ztrdu , ztrdv ) 
    119126      ENDIF 
    120127      ! 
    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' ) 
     128      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' hpg  - Ua: ', mask1=umask,   & 
     129         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    123130      ! 
    124131      IF( ln_timing )   CALL timing_stop('dyn_hpg') 
     
    127134 
    128135 
    129    SUBROUTINE dyn_hpg_init 
     136   SUBROUTINE dyn_hpg_init( Kmm ) 
    130137      !!---------------------------------------------------------------------- 
    131138      !!                 ***  ROUTINE dyn_hpg_init  *** 
     
    137144      !!      with the type of vertical coordinate used (zco, zps, sco) 
    138145      !!---------------------------------------------------------------------- 
     146      INTEGER, INTENT( in ) :: Kmm   ! ocean time level index 
     147      ! 
    139148      INTEGER ::   ioptio = 0      ! temporary integer 
    140149      INTEGER ::   ios             ! Local integer output status for namelist read 
     
    150159      !!---------------------------------------------------------------------- 
    151160      ! 
    152       REWIND( numnam_ref )              ! Namelist namdyn_hpg in reference namelist : Hydrostatic pressure gradient 
    153161      READ  ( numnam_ref, namdyn_hpg, IOSTAT = ios, ERR = 901) 
    154 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist', lwp ) 
    155       ! 
    156       REWIND( numnam_cfg )              ! Namelist namdyn_hpg in configuration namelist : Hydrostatic pressure gradient 
     162901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist' ) 
     163      ! 
    157164      READ  ( numnam_cfg, namdyn_hpg, IOSTAT = ios, ERR = 902 ) 
    158 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist', lwp ) 
     165902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist' ) 
    159166      IF(lwm) WRITE ( numond, namdyn_hpg ) 
    160167      ! 
     
    213220      ENDIF 
    214221      !                           
    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       ! 
    255222   END SUBROUTINE dyn_hpg_init 
    256223 
    257224 
    258    SUBROUTINE hpg_zco( kt ) 
     225   SUBROUTINE hpg_zco( kt, Kmm, puu, pvv, Krhs ) 
    259226      !!--------------------------------------------------------------------- 
    260227      !!                  ***  ROUTINE hpg_zco  *** 
     
    266233      !!      level:    zhpi = grav ..... 
    267234      !!                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 
     235      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     236      !!            puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     237      !!            pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     238      !! 
     239      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     240      !!---------------------------------------------------------------------- 
     241      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     242      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     243      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    275244      ! 
    276245      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
     
    288257 
    289258      ! 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 
     259      DO_2D( 0, 0, 0, 0 ) 
     260         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 
     261         ! hydrostatic pressure gradient 
     262         zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     263         zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
     264         ! add to the general momentum trend 
     265         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     266         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     267      END_2D 
    301268 
    302269      ! 
    303270      ! 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 
     271      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     272         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 
     273         ! hydrostatic pressure gradient 
     274         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
     275            &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
     276            &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     277 
     278         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
     279            &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
     280            &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
     281         ! add to the general momentum trend 
     282         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     283         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     284      END_3D 
    322285      ! 
    323286   END SUBROUTINE hpg_zco 
    324287 
    325288 
    326    SUBROUTINE hpg_zps( kt ) 
     289   SUBROUTINE hpg_zps( kt, Kmm, puu, pvv, Krhs ) 
    327290      !!--------------------------------------------------------------------- 
    328291      !!                 ***  ROUTINE hpg_zps  *** 
     
    330293      !! ** Method  :   z-coordinate plus partial steps case.  blahblah... 
    331294      !! 
    332       !! ** Action  : - Update (ua,va) with the now hydrastatic pressure trend 
    333       !!---------------------------------------------------------------------- 
    334       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     295      !! ** Action  : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     296      !!---------------------------------------------------------------------- 
     297      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     298      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     299      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    335300      !! 
    336301      INTEGER  ::   ji, jj, jk                       ! dummy loop indices 
     
    338303      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars 
    339304      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zhpi, zhpj 
     305      REAL(wp), DIMENSION(jpi,jpj) :: zgtsu, zgtsv, zgru, zgrv 
    340306      !!---------------------------------------------------------------------- 
    341307      ! 
     
    346312      ENDIF 
    347313 
    348       ! Partial steps: bottom before horizontal gradient of t, s, rd at the last ocean level 
    349 !jc      CALL zps_hde    ( kt, jpts, tsn, gtsu, gtsv, rhd, gru , grv ) 
     314      ! Partial steps: Compute NOW horizontal gradient of t, s, rd at the last ocean level 
     315      CALL zps_hde( kt, Kmm, jpts, ts(:,:,:,:,Kmm), zgtsu, zgtsv, rhd, zgru , zgrv ) 
    350316 
    351317      ! Local constant initialization 
     
    353319 
    354320      !  Surface value (also valid in partial step case) 
    355       DO jj = 2, jpjm1 
    356          DO ji = fs_2, fs_jpim1   ! vector opt. 
    357             zcoef1 = zcoef0 * e3w_n(ji,jj,1) 
    358             ! hydrostatic pressure gradient 
    359             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
    360             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    361             ! add to the general momentum trend 
    362             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    363             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    364          END DO 
    365       END DO 
     321      DO_2D( 0, 0, 0, 0 ) 
     322         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 
     323         ! hydrostatic pressure gradient 
     324         zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     325         zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
     326         ! add to the general momentum trend 
     327         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     328         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     329      END_2D 
    366330 
    367331      ! interior value (2=<jk=<jpkm1) 
    368       DO jk = 2, jpkm1 
    369          DO jj = 2, jpjm1 
    370             DO ji = fs_2, fs_jpim1   ! vector opt. 
    371                zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 
    372                ! hydrostatic pressure gradient 
    373                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    374                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
    375                   &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    376  
    377                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    378                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
    379                   &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    380                ! add to the general momentum trend 
    381                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    382                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    383             END DO 
    384          END DO 
    385       END DO 
    386  
    387       ! partial steps correction at the last level  (use gru & grv computed in zpshde.F90) 
    388       DO jj = 2, jpjm1 
    389          DO ji = 2, jpim1 
    390             iku = mbku(ji,jj) 
    391             ikv = mbkv(ji,jj) 
    392             zcoef2 = zcoef0 * MIN( e3w_n(ji,jj,iku), e3w_n(ji+1,jj  ,iku) ) 
    393             zcoef3 = zcoef0 * MIN( e3w_n(ji,jj,ikv), e3w_n(ji  ,jj+1,ikv) ) 
    394             IF( iku > 1 ) THEN            ! on i-direction (level 2 or more) 
    395                ua  (ji,jj,iku) = ua(ji,jj,iku) - zhpi(ji,jj,iku)         ! subtract old value 
    396                zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
    397                   &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) * r1_e1u(ji,jj) 
    398                ua  (ji,jj,iku) = ua(ji,jj,iku) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
    399             ENDIF 
    400             IF( ikv > 1 ) THEN            ! on j-direction (level 2 or more) 
    401                va  (ji,jj,ikv) = va(ji,jj,ikv) - zhpj(ji,jj,ikv)         ! subtract old value 
    402                zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
    403                   &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) * r1_e2v(ji,jj) 
    404                va  (ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
    405             ENDIF 
    406          END DO 
    407       END DO 
     332      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     333         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 
     334         ! hydrostatic pressure gradient 
     335         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
     336            &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
     337            &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     338 
     339         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
     340            &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
     341            &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
     342         ! add to the general momentum trend 
     343         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     344         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     345      END_3D 
     346 
     347      ! partial steps correction at the last level  (use zgru & zgrv computed in zpshde.F90) 
     348      DO_2D( 0, 0, 0, 0 ) 
     349         iku = mbku(ji,jj) 
     350         ikv = mbkv(ji,jj) 
     351         zcoef2 = zcoef0 * MIN( e3w(ji,jj,iku,Kmm), e3w(ji+1,jj  ,iku,Kmm) ) 
     352         zcoef3 = zcoef0 * MIN( e3w(ji,jj,ikv,Kmm), e3w(ji  ,jj+1,ikv,Kmm) ) 
     353         IF( iku > 1 ) THEN            ! on i-direction (level 2 or more) 
     354            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) - zhpi(ji,jj,iku)         ! subtract old value 
     355            zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
     356               &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + zgru(ji,jj) ) * r1_e1u(ji,jj) 
     357            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
     358         ENDIF 
     359         IF( ikv > 1 ) THEN            ! on j-direction (level 2 or more) 
     360            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) - zhpj(ji,jj,ikv)         ! subtract old value 
     361            zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
     362               &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + zgrv(ji,jj) ) * r1_e2v(ji,jj) 
     363            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
     364         ENDIF 
     365      END_2D 
    408366      ! 
    409367   END SUBROUTINE hpg_zps 
    410368 
    411369 
    412    SUBROUTINE hpg_sco( kt ) 
     370   SUBROUTINE hpg_sco( kt, Kmm, puu, pvv, Krhs ) 
    413371      !!--------------------------------------------------------------------- 
    414372      !!                  ***  ROUTINE hpg_sco  *** 
     
    422380      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ] 
    423381      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ] 
    424       !!      add it to the general momentum trend (ua,va). 
    425       !!         ua = ua - 1/e1u * zhpi 
    426       !!         va = va - 1/e2v * zhpj 
    427       !! 
    428       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    429       !!---------------------------------------------------------------------- 
    430       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     382      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     383      !!         puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     384      !!         pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     385      !! 
     386      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     387      !!---------------------------------------------------------------------- 
     388      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     389      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     390      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    431391      !! 
    432392      INTEGER  ::   ji, jj, jk, jii, jjj                 ! dummy loop indices 
     
    451411      ! 
    452412      IF( ln_wd_il ) THEN 
    453         DO jj = 2, jpjm1 
    454            DO ji = 2, jpim1  
    455              ll_tmp1 = MIN(  sshn(ji,jj)               ,  sshn(ji+1,jj) ) >                & 
    456                   &    MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
    457                   &    MAX(  sshn(ji,jj) +  ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    458                   &                                                       > rn_wdmin1 + rn_wdmin2 
    459              ll_tmp2 = ( ABS( sshn(ji,jj)              -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (       & 
    460                   &    MAX(   sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    461                   &    MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    462  
    463              IF(ll_tmp1) THEN 
    464                zcpx(ji,jj) = 1.0_wp 
    465              ELSE IF(ll_tmp2) THEN 
    466                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    467                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    468                            &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    469              ELSE 
    470                zcpx(ji,jj) = 0._wp 
    471              END IF 
    472        
    473              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    474                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    475                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    476                   &                                                      > rn_wdmin1 + rn_wdmin2 
    477              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (        & 
    478                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    479                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    480  
    481              IF(ll_tmp1) THEN 
    482                zcpy(ji,jj) = 1.0_wp 
    483              ELSE IF(ll_tmp2) THEN 
    484                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    485                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    486                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    487              ELSE 
    488                zcpy(ji,jj) = 0._wp 
    489              END IF 
    490            END DO 
    491         END DO 
    492         CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
     413        DO_2D( 0, 0, 0, 0 ) 
     414          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)               ,  ssh(ji+1,jj,Kmm) ) >                & 
     415               &    MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
     416               &    MAX(  ssh(ji,jj,Kmm) +  ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     417               &                                                       > rn_wdmin1 + rn_wdmin2 
     418          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)              -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (       & 
     419               &    MAX(   ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     420               &    MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     421 
     422          IF(ll_tmp1) THEN 
     423            zcpx(ji,jj) = 1.0_wp 
     424          ELSE IF(ll_tmp2) THEN 
     425            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     426            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     427                        &    / (ssh(ji+1,jj,Kmm) - ssh(ji  ,jj,Kmm)) ) 
     428          ELSE 
     429            zcpx(ji,jj) = 0._wp 
     430          END IF 
     431    
     432          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     433               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     434               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     435               &                                                      > rn_wdmin1 + rn_wdmin2 
     436          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (        & 
     437               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     438               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     439 
     440          IF(ll_tmp1) THEN 
     441            zcpy(ji,jj) = 1.0_wp 
     442          ELSE IF(ll_tmp2) THEN 
     443            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     444            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     445                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     446          ELSE 
     447            zcpy(ji,jj) = 0._wp 
     448          END IF 
     449        END_2D 
     450        CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    493451      END IF 
    494452 
    495453      ! Surface value 
    496       DO jj = 2, jpjm1 
    497          DO ji = fs_2, fs_jpim1   ! vector opt. 
    498             ! hydrostatic pressure gradient along s-surfaces 
    499             zhpi(ji,jj,1) = zcoef0 * (  e3w_n(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )    & 
    500                &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e1u(ji,jj) 
    501             zhpj(ji,jj,1) = zcoef0 * (  e3w_n(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )    & 
    502                &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e2v(ji,jj) 
    503             ! s-coordinate pressure gradient correction 
    504             zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    505                &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
    506             zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    507                &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    508             ! 
    509             IF( ln_wd_il ) THEN 
    510                zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    511                zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    512                zuap = zuap * zcpx(ji,jj) 
    513                zvap = zvap * zcpy(ji,jj) 
    514             ENDIF 
    515             ! 
    516             ! add to the general momentum trend 
    517             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
    518             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap 
    519          END DO 
    520       END DO 
     454      DO_2D( 0, 0, 0, 0 ) 
     455         ! hydrostatic pressure gradient along s-surfaces 
     456         zhpi(ji,jj,1) =   & 
     457            &  zcoef0 * (  e3w(ji+1,jj  ,1,Kmm) * ( znad + rhd(ji+1,jj  ,1) )    & 
     458            &            - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) & 
     459            &           * r1_e1u(ji,jj) 
     460         zhpj(ji,jj,1) =   & 
     461            &  zcoef0 * (  e3w(ji  ,jj+1,1,Kmm) * ( znad + rhd(ji  ,jj+1,1) )    & 
     462            &            - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) & 
     463            &           * r1_e2v(ji,jj) 
     464         ! s-coordinate pressure gradient correction 
     465         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     466            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
     467         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     468            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
     469         ! 
     470         IF( ln_wd_il ) THEN 
     471            zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     472            zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     473            zuap = zuap * zcpx(ji,jj) 
     474            zvap = zvap * zcpy(ji,jj) 
     475         ENDIF 
     476         ! 
     477         ! add to the general momentum trend 
     478         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) + zuap 
     479         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) + zvap 
     480      END_2D 
    521481 
    522482      ! interior value (2=<jk=<jpkm1) 
    523       DO jk = 2, jpkm1 
    524          DO jj = 2, jpjm1 
    525             DO ji = fs_2, fs_jpim1   ! vector opt. 
    526                ! hydrostatic pressure gradient along s-surfaces 
    527                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
    528                   &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
    529                   &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
    530                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
    531                   &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
    532                   &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
    533                ! s-coordinate pressure gradient correction 
    534                zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    535                   &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) * r1_e1u(ji,jj) 
    536                zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    537                   &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 
    538                ! 
    539                IF( ln_wd_il ) THEN 
    540                   zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    541                   zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    542                   zuap = zuap * zcpx(ji,jj) 
    543                   zvap = zvap * zcpy(ji,jj) 
    544                ENDIF 
    545                ! 
    546                ! add to the general momentum trend 
    547                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
    548                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) + zvap 
    549             END DO 
    550          END DO 
    551       END DO 
     483      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     484         ! hydrostatic pressure gradient along s-surfaces 
     485         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
     486            &           * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
     487            &              - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
     488         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
     489            &           * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
     490            &              - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
     491         ! s-coordinate pressure gradient correction 
     492         zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     493            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) * r1_e1u(ji,jj) 
     494         zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     495            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) * r1_e2v(ji,jj) 
     496         ! 
     497         IF( ln_wd_il ) THEN 
     498            zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     499            zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     500            zuap = zuap * zcpx(ji,jj) 
     501            zvap = zvap * zcpy(ji,jj) 
     502         ENDIF 
     503         ! 
     504         ! add to the general momentum trend 
     505         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) + zuap 
     506         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) + zvap 
     507      END_3D 
    552508      ! 
    553509      IF( ln_wd_il )  DEALLOCATE( zcpx , zcpy ) 
     
    556512 
    557513 
    558    SUBROUTINE hpg_isf( kt ) 
     514   SUBROUTINE hpg_isf( kt, Kmm, puu, pvv, Krhs ) 
    559515      !!--------------------------------------------------------------------- 
    560516      !!                  ***  ROUTINE hpg_isf  *** 
     
    568524      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ] 
    569525      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ] 
    570       !!      add it to the general momentum trend (ua,va). 
    571       !!         ua = ua - 1/e1u * zhpi 
    572       !!         va = va - 1/e2v * zhpj 
    573       !!      iceload is added and partial cell case are added to the top and bottom 
     526      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     527      !!         puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     528      !!         pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     529      !!      iceload is added 
    574530      !!       
    575       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    576       !!---------------------------------------------------------------------- 
    577       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     531      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     532      !!---------------------------------------------------------------------- 
     533      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     534      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     535      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    578536      !! 
    579537      INTEGER  ::   ji, jj, jk, ikt, iktp1i, iktp1j   ! dummy loop indices 
     
    596554        DO jj = 1, jpj 
    597555          ikt = mikt(ji,jj) 
    598           zts_top(ji,jj,1) = tsn(ji,jj,ikt,1) 
    599           zts_top(ji,jj,2) = tsn(ji,jj,ikt,2) 
     556          zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 
     557          zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 
    600558        END DO 
    601559      END DO 
     
    605563!===== Compute surface value =====================================================  
    606564!================================================================================== 
    607       DO jj = 2, jpjm1 
    608          DO ji = fs_2, fs_jpim1   ! vector opt. 
    609             ikt    = mikt(ji,jj) 
    610             iktp1i = mikt(ji+1,jj) 
    611             iktp1j = mikt(ji,jj+1) 
    612             ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
    613             ! we assume ISF is in isostatic equilibrium 
    614             zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w_n(ji+1,jj,iktp1i)                                    & 
    615                &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
    616                &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         & 
    617                &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    618                &                                  + ( riceload(ji+1,jj) - riceload(ji,jj))                            )  
    619             zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w_n(ji,jj+1,iktp1j)                                    & 
    620                &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
    621                &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         &  
    622                &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    623                &                                  + ( riceload(ji,jj+1) - riceload(ji,jj))                            )  
    624             ! s-coordinate pressure gradient correction (=0 if z coordinate) 
    625             zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    626                &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
    627             zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    628                &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    629             ! add to the general momentum trend 
    630             ua(ji,jj,1) = ua(ji,jj,1) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
    631             va(ji,jj,1) = va(ji,jj,1) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
    632          END DO 
    633       END DO 
     565      DO_2D( 0, 0, 0, 0 ) 
     566         ikt    = mikt(ji,jj) 
     567         iktp1i = mikt(ji+1,jj) 
     568         iktp1j = mikt(ji,jj+1) 
     569         ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
     570         ! we assume ISF is in isostatic equilibrium 
     571         zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w(ji+1,jj,iktp1i,Kmm)                                    & 
     572            &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
     573            &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         & 
     574            &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     575            &                                  + ( risfload(ji+1,jj) - risfload(ji,jj))                            )  
     576         zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w(ji,jj+1,iktp1j,Kmm)                                    & 
     577            &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
     578            &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         &  
     579            &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     580            &                                  + ( risfload(ji,jj+1) - risfload(ji,jj))                            )  
     581         ! s-coordinate pressure gradient correction (=0 if z coordinate) 
     582         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     583            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
     584         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     585            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
     586         ! add to the general momentum trend 
     587         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
     588         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
     589      END_2D 
    634590!==================================================================================      
    635591!===== Compute interior value =====================================================  
    636592!================================================================================== 
    637593      ! interior value (2=<jk=<jpkm1) 
    638       DO jk = 2, jpkm1 
    639          DO jj = 2, jpjm1 
    640             DO ji = fs_2, fs_jpim1   ! vector opt. 
    641                ! hydrostatic pressure gradient along s-surfaces 
    642                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
    643                   &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
    644                   &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
    645                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
    646                   &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
    647                   &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
    648                ! s-coordinate pressure gradient correction 
    649                zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    650                   &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) / e1u(ji,jj) 
    651                zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    652                   &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) / e2v(ji,jj) 
    653                ! add to the general momentum trend 
    654                ua(ji,jj,jk) = ua(ji,jj,jk) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
    655                va(ji,jj,jk) = va(ji,jj,jk) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
    656             END DO 
    657          END DO 
    658       END DO 
     594      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     595         ! hydrostatic pressure gradient along s-surfaces 
     596         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
     597            &           * (  e3w(ji+1,jj,jk,Kmm)                   & 
     598            &                  * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
     599            &              - e3w(ji  ,jj,jk,Kmm)                   & 
     600            &                  * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
     601         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
     602            &           * (  e3w(ji,jj+1,jk,Kmm)                   & 
     603            &                  * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
     604            &              - e3w(ji,jj  ,jk,Kmm)                   & 
     605            &                  * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
     606         ! s-coordinate pressure gradient correction 
     607         zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     608            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) / e1u(ji,jj) 
     609         zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     610            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) / e2v(ji,jj) 
     611         ! add to the general momentum trend 
     612         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
     613         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
     614      END_3D 
    659615      ! 
    660616   END SUBROUTINE hpg_isf 
    661617 
    662618 
    663    SUBROUTINE hpg_djc( kt ) 
     619   SUBROUTINE hpg_djc( kt, Kmm, puu, pvv, Krhs ) 
    664620      !!--------------------------------------------------------------------- 
    665621      !!                  ***  ROUTINE hpg_djc  *** 
     
    669625      !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003 
    670626      !!---------------------------------------------------------------------- 
    671       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     627      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     628      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     629      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    672630      !! 
    673631      INTEGER  ::   ji, jj, jk          ! dummy loop indices 
     
    685643      IF( ln_wd_il ) THEN 
    686644         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
    687         DO jj = 2, jpjm1 
    688            DO ji = 2, jpim1  
    689              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    690                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
    691                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    692                   &                                                      > rn_wdmin1 + rn_wdmin2 
    693              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (        & 
    694                   &    MAX(   sshn(ji,jj)             ,  sshn(ji+1,jj) ) >                & 
    695                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    696              IF(ll_tmp1) THEN 
    697                zcpx(ji,jj) = 1.0_wp 
    698              ELSE IF(ll_tmp2) THEN 
    699                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    700                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    701                            &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    702              ELSE 
    703                zcpx(ji,jj) = 0._wp 
    704              END IF 
    705        
    706              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    707                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    708                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    709                   &                                                      > rn_wdmin1 + rn_wdmin2 
    710              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (        & 
    711                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    712                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    713  
    714              IF(ll_tmp1) THEN 
    715                zcpy(ji,jj) = 1.0_wp 
    716              ELSE IF(ll_tmp2) THEN 
    717                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    718                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    719                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    720              ELSE 
    721                zcpy(ji,jj) = 0._wp 
    722              END IF 
    723            END DO 
    724         END DO 
    725         CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
     645        DO_2D( 0, 0, 0, 0 ) 
     646          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     647               &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
     648               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     649               &                                                      > rn_wdmin1 + rn_wdmin2 
     650          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (        & 
     651               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji+1,jj,Kmm) ) >                & 
     652               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     653          IF(ll_tmp1) THEN 
     654            zcpx(ji,jj) = 1.0_wp 
     655          ELSE IF(ll_tmp2) THEN 
     656            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     657            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     658                        &    / (ssh(ji+1,jj,Kmm) - ssh(ji  ,jj,Kmm)) ) 
     659          ELSE 
     660            zcpx(ji,jj) = 0._wp 
     661          END IF 
     662    
     663          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     664               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     665               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     666               &                                                      > rn_wdmin1 + rn_wdmin2 
     667          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (        & 
     668               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     669               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     670 
     671          IF(ll_tmp1) THEN 
     672            zcpy(ji,jj) = 1.0_wp 
     673          ELSE IF(ll_tmp2) THEN 
     674            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     675            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     676                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     677          ELSE 
     678            zcpy(ji,jj) = 0._wp 
     679          END IF 
     680        END_2D 
     681        CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    726682      END IF 
    727683 
     
    743699!!bug gm   Not a true bug, but... dzz=e3w  for dzx, dzy verify what it is really 
    744700 
    745       DO jk = 2, jpkm1 
    746          DO jj = 2, jpjm1 
    747             DO ji = fs_2, fs_jpim1   ! vector opt. 
    748                drhoz(ji,jj,jk) = rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
    749                dzz  (ji,jj,jk) = gde3w_n(ji  ,jj  ,jk) - gde3w_n(ji,jj,jk-1) 
    750                drhox(ji,jj,jk) = rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
    751                dzx  (ji,jj,jk) = gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk  ) 
    752                drhoy(ji,jj,jk) = rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
    753                dzy  (ji,jj,jk) = gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk  ) 
    754             END DO 
    755          END DO 
    756       END DO 
     701      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     702         drhoz(ji,jj,jk) = rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
     703         dzz  (ji,jj,jk) = gde3w(ji  ,jj  ,jk) - gde3w(ji,jj,jk-1) 
     704         drhox(ji,jj,jk) = rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
     705         dzx  (ji,jj,jk) = gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk  ) 
     706         drhoy(ji,jj,jk) = rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
     707         dzy  (ji,jj,jk) = gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk  ) 
     708      END_3D 
    757709 
    758710      !------------------------------------------------------------------------- 
     
    764716!!bug  gm  idem for drhox, drhoy et ji=jpi and jj=jpj 
    765717 
    766       DO jk = 2, jpkm1 
    767          DO jj = 2, jpjm1 
    768             DO ji = fs_2, fs_jpim1   ! vector opt. 
    769                cffw = 2._wp * drhoz(ji  ,jj  ,jk) * drhoz(ji,jj,jk-1) 
    770  
    771                cffu = 2._wp * drhox(ji+1,jj  ,jk) * drhox(ji,jj,jk  ) 
    772                cffx = 2._wp * dzx  (ji+1,jj  ,jk) * dzx  (ji,jj,jk  ) 
    773  
    774                cffv = 2._wp * drhoy(ji  ,jj+1,jk) * drhoy(ji,jj,jk  ) 
    775                cffy = 2._wp * dzy  (ji  ,jj+1,jk) * dzy  (ji,jj,jk  ) 
    776  
    777                IF( cffw > zep) THEN 
    778                   drhow(ji,jj,jk) = 2._wp *   drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1)   & 
    779                      &                    / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 
    780                ELSE 
    781                   drhow(ji,jj,jk) = 0._wp 
    782                ENDIF 
    783  
    784                dzw(ji,jj,jk) = 2._wp *   dzz(ji,jj,jk) * dzz(ji,jj,jk-1)   & 
    785                   &                  / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 
    786  
    787                IF( cffu > zep ) THEN 
    788                   drhou(ji,jj,jk) = 2._wp *   drhox(ji+1,jj,jk) * drhox(ji,jj,jk)   & 
    789                      &                    / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 
    790                ELSE 
    791                   drhou(ji,jj,jk ) = 0._wp 
    792                ENDIF 
    793  
    794                IF( cffx > zep ) THEN 
    795                   dzu(ji,jj,jk) = 2._wp *   dzx(ji+1,jj,jk) * dzx(ji,jj,jk)   & 
    796                      &                  / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 
    797                ELSE 
    798                   dzu(ji,jj,jk) = 0._wp 
    799                ENDIF 
    800  
    801                IF( cffv > zep ) THEN 
    802                   drhov(ji,jj,jk) = 2._wp *   drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk)   & 
    803                      &                    / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 
    804                ELSE 
    805                   drhov(ji,jj,jk) = 0._wp 
    806                ENDIF 
    807  
    808                IF( cffy > zep ) THEN 
    809                   dzv(ji,jj,jk) = 2._wp *   dzy(ji,jj+1,jk) * dzy(ji,jj,jk)   & 
    810                      &                  / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 
    811                ELSE 
    812                   dzv(ji,jj,jk) = 0._wp 
    813                ENDIF 
    814  
    815             END DO 
    816          END DO 
    817       END DO 
     718      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     719         cffw = 2._wp * drhoz(ji  ,jj  ,jk) * drhoz(ji,jj,jk-1) 
     720 
     721         cffu = 2._wp * drhox(ji+1,jj  ,jk) * drhox(ji,jj,jk  ) 
     722         cffx = 2._wp * dzx  (ji+1,jj  ,jk) * dzx  (ji,jj,jk  ) 
     723 
     724         cffv = 2._wp * drhoy(ji  ,jj+1,jk) * drhoy(ji,jj,jk  ) 
     725         cffy = 2._wp * dzy  (ji  ,jj+1,jk) * dzy  (ji,jj,jk  ) 
     726 
     727         IF( cffw > zep) THEN 
     728            drhow(ji,jj,jk) = 2._wp *   drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1)   & 
     729               &                    / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 
     730         ELSE 
     731            drhow(ji,jj,jk) = 0._wp 
     732         ENDIF 
     733 
     734         dzw(ji,jj,jk) = 2._wp *   dzz(ji,jj,jk) * dzz(ji,jj,jk-1)   & 
     735            &                  / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 
     736 
     737         IF( cffu > zep ) THEN 
     738            drhou(ji,jj,jk) = 2._wp *   drhox(ji+1,jj,jk) * drhox(ji,jj,jk)   & 
     739               &                    / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 
     740         ELSE 
     741            drhou(ji,jj,jk ) = 0._wp 
     742         ENDIF 
     743 
     744         IF( cffx > zep ) THEN 
     745            dzu(ji,jj,jk) = 2._wp *   dzx(ji+1,jj,jk) * dzx(ji,jj,jk)   & 
     746               &                  / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 
     747         ELSE 
     748            dzu(ji,jj,jk) = 0._wp 
     749         ENDIF 
     750 
     751         IF( cffv > zep ) THEN 
     752            drhov(ji,jj,jk) = 2._wp *   drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk)   & 
     753               &                    / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 
     754         ELSE 
     755            drhov(ji,jj,jk) = 0._wp 
     756         ENDIF 
     757 
     758         IF( cffy > zep ) THEN 
     759            dzv(ji,jj,jk) = 2._wp *   dzy(ji,jj+1,jk) * dzy(ji,jj,jk)   & 
     760               &                  / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 
     761         ELSE 
     762            dzv(ji,jj,jk) = 0._wp 
     763         ENDIF 
     764 
     765      END_3D 
    818766 
    819767      !---------------------------------------------------------------------------------- 
     
    833781      !------------------------------------------------------------- 
    834782 
    835 !!bug gm   :  e3w-gde3w = 0.5*e3w  ....  and gde3w(2)-gde3w(1)=e3w(2) ....   to be verified 
    836 !          true if gde3w is really defined as the sum of the e3w scale factors as, it seems to me, it should be 
    837  
    838       DO jj = 2, jpjm1 
    839          DO ji = fs_2, fs_jpim1   ! vector opt. 
    840             rho_k(ji,jj,1) = -grav * ( e3w_n(ji,jj,1) - gde3w_n(ji,jj,1) )               & 
    841                &                   * (  rhd(ji,jj,1)                                     & 
    842                &                     + 0.5_wp * ( rhd    (ji,jj,2) - rhd    (ji,jj,1) )  & 
    843                &                              * ( e3w_n  (ji,jj,1) - gde3w_n(ji,jj,1) )  & 
    844                &                              / ( gde3w_n(ji,jj,2) - gde3w_n(ji,jj,1) )  ) 
    845          END DO 
    846       END DO 
     783!!bug gm   :  e3w-gde3w(:,:,:) = 0.5*e3w  ....  and gde3w(:,:,2)-gde3w(:,:,1)=e3w(:,:,2,Kmm) ....   to be verified 
     784!          true if gde3w(:,:,:) is really defined as the sum of the e3w scale factors as, it seems to me, it should be 
     785 
     786      DO_2D( 0, 0, 0, 0 ) 
     787         rho_k(ji,jj,1) = -grav * ( e3w(ji,jj,1,Kmm) - gde3w(ji,jj,1) )               & 
     788            &                   * (  rhd(ji,jj,1)                                     & 
     789            &                     + 0.5_wp * ( rhd    (ji,jj,2) - rhd    (ji,jj,1) )  & 
     790            &                              * ( e3w  (ji,jj,1,Kmm) - gde3w(ji,jj,1) )  & 
     791            &                              / ( gde3w(ji,jj,2) - gde3w(ji,jj,1) )  ) 
     792      END_2D 
    847793 
    848794!!bug gm    : here also, simplification is possible 
    849795!!bug gm    : optimisation: 1/10 and 1/12 the division should be done before the loop 
    850796 
    851       DO jk = 2, jpkm1 
    852          DO jj = 2, jpjm1 
    853             DO ji = fs_2, fs_jpim1   ! vector opt. 
    854  
    855                rho_k(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
    856                   &                     * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) )                                   & 
    857                   &            - grav * z1_10 * (                                                                   & 
    858                   &     ( drhow  (ji,jj,jk) - drhow  (ji,jj,jk-1) )                                                     & 
    859                   &   * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
    860                   &   - ( dzw    (ji,jj,jk) - dzw    (ji,jj,jk-1) )                                                     & 
    861                   &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
    862                   &                             ) 
    863  
    864                rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                   & 
    865                   &                     * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) )                                   & 
    866                   &            - grav* z1_10 * (                                                                    & 
    867                   &     ( drhou  (ji+1,jj,jk) - drhou  (ji,jj,jk) )                                                     & 
    868                   &   * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
    869                   &   - ( dzu    (ji+1,jj,jk) - dzu    (ji,jj,jk) )                                                     & 
    870                   &   * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
    871                   &                            ) 
    872  
    873                rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                 & 
    874                   &                     * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) )                                   & 
    875                   &            - grav* z1_10 * (                                                                    & 
    876                   &     ( drhov  (ji,jj+1,jk) - drhov  (ji,jj,jk) )                                                     & 
    877                   &   * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
    878                   &   - ( dzv    (ji,jj+1,jk) - dzv    (ji,jj,jk) )                                                     & 
    879                   &   * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
    880                   &                            ) 
    881  
    882             END DO 
    883          END DO 
    884       END DO 
    885       CALL lbc_lnk_multi( 'dynhpg', rho_k, 'W', 1., rho_i, 'U', 1., rho_j, 'V', 1. ) 
     797      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     798 
     799         rho_k(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
     800            &                     * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) )                                   & 
     801            &            - grav * z1_10 * (                                                                   & 
     802            &     ( drhow  (ji,jj,jk) - drhow  (ji,jj,jk-1) )                                                     & 
     803            &   * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
     804            &   - ( dzw    (ji,jj,jk) - dzw    (ji,jj,jk-1) )                                                     & 
     805            &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
     806            &                             ) 
     807 
     808         rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                   & 
     809            &                     * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) )                                   & 
     810            &            - grav* z1_10 * (                                                                    & 
     811            &     ( drhou  (ji+1,jj,jk) - drhou  (ji,jj,jk) )                                                     & 
     812            &   * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
     813            &   - ( dzu    (ji+1,jj,jk) - dzu    (ji,jj,jk) )                                                     & 
     814            &   * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
     815            &                            ) 
     816 
     817         rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                 & 
     818            &                     * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) )                                   & 
     819            &            - grav* z1_10 * (                                                                    & 
     820            &     ( drhov  (ji,jj+1,jk) - drhov  (ji,jj,jk) )                                                     & 
     821            &   * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
     822            &   - ( dzv    (ji,jj+1,jk) - dzv    (ji,jj,jk) )                                                     & 
     823            &   * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
     824            &                            ) 
     825 
     826      END_3D 
     827      CALL lbc_lnk_multi( 'dynhpg', rho_k, 'W', 1.0_wp, rho_i, 'U', 1.0_wp, rho_j, 'V', 1.0_wp ) 
    886828 
    887829      ! --------------- 
    888830      !  Surface value 
    889831      ! --------------- 
    890       DO jj = 2, jpjm1 
    891          DO ji = fs_2, fs_jpim1   ! vector opt. 
    892             zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
    893             zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
    894             IF( ln_wd_il ) THEN 
    895               zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    896               zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    897             ENDIF 
    898             ! add to the general momentum trend 
    899             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    900             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    901          END DO 
    902       END DO 
     832      DO_2D( 0, 0, 0, 0 ) 
     833         zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
     834         zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
     835         IF( ln_wd_il ) THEN 
     836           zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     837           zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     838         ENDIF 
     839         ! add to the general momentum trend 
     840         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     841         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     842      END_2D 
    903843 
    904844      ! ---------------- 
    905845      !  interior value   (2=<jk=<jpkm1) 
    906846      ! ---------------- 
    907       DO jk = 2, jpkm1 
    908          DO jj = 2, jpjm1 
    909             DO ji = fs_2, fs_jpim1   ! vector opt. 
    910                ! hydrostatic pressure gradient along s-surfaces 
    911                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
    912                   &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
    913                   &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    914                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
    915                   &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
    916                   &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
    917                IF( ln_wd_il ) THEN 
    918                  zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    919                  zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    920                ENDIF 
    921                ! add to the general momentum trend 
    922                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    923                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    924             END DO 
    925          END DO 
    926       END DO 
     847      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     848         ! hydrostatic pressure gradient along s-surfaces 
     849         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
     850            &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
     851            &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     852         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
     853            &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
     854            &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
     855         IF( ln_wd_il ) THEN 
     856           zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     857           zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     858         ENDIF 
     859         ! add to the general momentum trend 
     860         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     861         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     862      END_3D 
    927863      ! 
    928864      IF( ln_wd_il )   DEALLOCATE( zcpx, zcpy ) 
     
    931867 
    932868 
    933    SUBROUTINE hpg_prj( kt ) 
     869   SUBROUTINE hpg_prj( kt, Kmm, puu, pvv, Krhs ) 
    934870      !!--------------------------------------------------------------------- 
    935871      !!                  ***  ROUTINE hpg_prj  *** 
     
    940876      !!      all vertical coordinate systems 
    941877      !! 
    942       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
     878      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
    943879      !!---------------------------------------------------------------------- 
    944880      INTEGER, PARAMETER  :: polynomial_type = 1    ! 1: cubic spline, 2: linear 
    945       INTEGER, INTENT(in) ::   kt                   ! ocean time-step index 
     881      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     882      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     883      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    946884      !! 
    947885      INTEGER  ::   ji, jj, jk, jkk                 ! dummy loop indices 
     
    973911      IF( ln_wd_il ) THEN 
    974912         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
    975          DO jj = 2, jpjm1 
    976            DO ji = 2, jpim1  
    977              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    978                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
    979                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    980                   &                                                      > rn_wdmin1 + rn_wdmin2 
    981              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (         & 
    982                   &    MAX(   sshn(ji,jj)             ,  sshn(ji+1,jj) ) >                & 
    983                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    984  
    985              IF(ll_tmp1) THEN 
    986                zcpx(ji,jj) = 1.0_wp 
    987              ELSE IF(ll_tmp2) THEN 
    988                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    989                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    990                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    991                
    992                 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
    993              ELSE 
    994                zcpx(ji,jj) = 0._wp 
    995              END IF 
    996        
    997              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    998                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    999                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    1000                   &                                                      > rn_wdmin1 + rn_wdmin2 
    1001              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (      & 
    1002                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    1003                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    1004  
    1005              IF(ll_tmp1) THEN 
    1006                zcpy(ji,jj) = 1.0_wp 
    1007              ELSE IF(ll_tmp2) THEN 
    1008                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    1009                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    1010                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    1011                 zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
    1012  
    1013                ELSE 
    1014                   zcpy(ji,jj) = 0._wp 
    1015                ENDIF 
    1016             END DO 
    1017          END DO 
    1018          CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
     913         DO_2D( 0, 0, 0, 0 ) 
     914          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     915               &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
     916               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     917               &                                                      > rn_wdmin1 + rn_wdmin2 
     918          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (         & 
     919               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji+1,jj,Kmm) ) >                & 
     920               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     921 
     922          IF(ll_tmp1) THEN 
     923            zcpx(ji,jj) = 1.0_wp 
     924          ELSE IF(ll_tmp2) THEN 
     925            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     926            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     927                        &    / (ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm)) ) 
     928            
     929             zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
     930          ELSE 
     931            zcpx(ji,jj) = 0._wp 
     932          END IF 
     933    
     934          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     935               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     936               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     937               &                                                      > rn_wdmin1 + rn_wdmin2 
     938          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (      & 
     939               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     940               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     941 
     942          IF(ll_tmp1) THEN 
     943            zcpy(ji,jj) = 1.0_wp 
     944          ELSE IF(ll_tmp2) THEN 
     945            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     946            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     947                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     948             zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
     949 
     950            ELSE 
     951               zcpy(ji,jj) = 0._wp 
     952            ENDIF 
     953         END_2D 
     954         CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    1019955      ENDIF 
    1020956 
     
    1024960 
    1025961      ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate 
    1026       DO jj = 1, jpj 
    1027         DO ji = 1, jpi 
    1028           jk = mbkt(ji,jj)+1 
    1029           IF(     jk <=  0   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
    1030           ELSEIF( jk ==  1   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
    1031           ELSEIF( jk < jpkm1 ) THEN 
    1032              DO jkk = jk+1, jpk 
    1033                 zrhh(ji,jj,jkk) = interp1(gde3w_n(ji,jj,jkk  ), gde3w_n(ji,jj,jkk-1),   & 
    1034                    &                      gde3w_n(ji,jj,jkk-2), rhd    (ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 
    1035              END DO 
    1036           ENDIF 
    1037         END DO 
    1038       END DO 
     962      DO_2D( 1, 1, 1, 1 ) 
     963       jk = mbkt(ji,jj) 
     964       IF(     jk <=  1   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
     965       ELSEIF( jk ==  2   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
     966       ELSEIF( jk < jpkm1 ) THEN 
     967          DO jkk = jk+1, jpk 
     968             zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk  ), gde3w(ji,jj,jkk-1),   & 
     969                &                      gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 
     970          END DO 
     971       ENDIF 
     972      END_2D 
    1039973 
    1040974      ! Transfer the depth of "T(:,:,:)" to vertical coordinate "zdept(:,:,:)" 
    1041       DO jj = 1, jpj 
    1042          DO ji = 1, jpi 
    1043             zdept(ji,jj,1) = 0.5_wp * e3w_n(ji,jj,1) - sshn(ji,jj) * znad 
    1044          END DO 
    1045       END DO 
    1046  
    1047       DO jk = 2, jpk 
    1048          DO jj = 1, jpj 
    1049             DO ji = 1, jpi 
    1050                zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w_n(ji,jj,jk) 
    1051             END DO 
    1052          END DO 
    1053       END DO 
     975      DO_2D( 1, 1, 1, 1 ) 
     976         zdept(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) - ssh(ji,jj,Kmm) * znad 
     977      END_2D 
     978 
     979      DO_3D( 1, 1, 1, 1, 2, jpk ) 
     980         zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w(ji,jj,jk,Kmm) 
     981      END_3D 
    1054982 
    1055983      fsp(:,:,:) = zrhh (:,:,:) 
     
    1062990 
    1063991      ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 
    1064       DO jj = 2, jpj 
    1065         DO ji = 2, jpi 
    1066           zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
    1067              &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w_n(ji,jj,1) 
    1068  
    1069           ! assuming linear profile across the top half surface layer 
    1070           zhpi(ji,jj,1) =  0.5_wp * e3w_n(ji,jj,1) * zrhdt1 
    1071         END DO 
    1072       END DO 
     992      DO_2D( 0, 1, 0, 1 ) 
     993       zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
     994          &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm) 
     995 
     996       ! assuming linear profile across the top half surface layer 
     997       zhpi(ji,jj,1) =  0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt1 
     998      END_2D 
    1073999 
    10741000      ! Calculate the pressure "zhpi(:,:,:)" at "T(ji,jj,2:jpkm1)" 
    1075       DO jk = 2, jpkm1 
    1076         DO jj = 2, jpj 
    1077           DO ji = 2, jpi 
    1078             zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
    1079                &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
    1080                &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
    1081                &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
    1082           END DO 
    1083         END DO 
    1084       END DO 
     1001      DO_3D( 0, 1, 0, 1, 2, jpkm1 ) 
     1002      zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
     1003         &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
     1004         &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
     1005         &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
     1006      END_3D 
    10851007 
    10861008      ! Z coordinate of U(ji,jj,1:jpkm1) and V(ji,jj,1:jpkm1) 
    10871009 
    10881010      ! Prepare zsshu_n and zsshv_n 
    1089       DO jj = 2, jpjm1 
    1090         DO ji = 2, jpim1 
     1011      DO_2D( 0, 0, 0, 0 ) 
    10911012!!gm BUG ?    if it is ssh at u- & v-point then it should be: 
    1092 !          zsshu_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji+1,jj) * sshn(ji+1,jj)) * & 
     1013!          zsshu_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji+1,jj) * ssh(ji+1,jj,Kmm)) * & 
    10931014!                         & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1094 !          zsshv_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji,jj+1) * sshn(ji,jj+1)) * & 
     1015!          zsshv_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji,jj+1) * ssh(ji,jj+1,Kmm)) * & 
    10951016!                         & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    10961017!!gm not this: 
    1097           zsshu_n(ji,jj) = (e1e2u(ji,jj) * sshn(ji,jj) + e1e2u(ji+1, jj) * sshn(ji+1,jj)) * & 
    1098                          & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1099           zsshv_n(ji,jj) = (e1e2v(ji,jj) * sshn(ji,jj) + e1e2v(ji+1, jj) * sshn(ji,jj+1)) * & 
    1100                          & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    1101         END DO 
    1102       END DO 
    1103  
    1104       CALL lbc_lnk_multi ('dynhpg', zsshu_n, 'U', 1., zsshv_n, 'V', 1. ) 
    1105  
    1106       DO jj = 2, jpjm1 
    1107         DO ji = 2, jpim1 
    1108           zu(ji,jj,1) = - ( e3u_n(ji,jj,1) - zsshu_n(ji,jj) * znad)  
    1109           zv(ji,jj,1) = - ( e3v_n(ji,jj,1) - zsshv_n(ji,jj) * znad) 
    1110         END DO 
    1111       END DO 
    1112  
    1113       DO jk = 2, jpkm1 
    1114         DO jj = 2, jpjm1 
    1115           DO ji = 2, jpim1 
    1116             zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u_n(ji,jj,jk) 
    1117             zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v_n(ji,jj,jk) 
    1118           END DO 
    1119         END DO 
    1120       END DO 
    1121  
    1122       DO jk = 1, jpkm1 
    1123         DO jj = 2, jpjm1 
    1124           DO ji = 2, jpim1 
    1125             zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u_n(ji,jj,jk) 
    1126             zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v_n(ji,jj,jk) 
    1127           END DO 
    1128         END DO 
    1129       END DO 
    1130  
    1131       DO jk = 1, jpkm1 
    1132         DO jj = 2, jpjm1 
    1133           DO ji = 2, jpim1 
    1134             zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1135             zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1136             zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    1137             zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    1138           END DO 
    1139         END DO 
    1140       END DO 
    1141  
    1142  
    1143       DO jk = 1, jpkm1 
    1144         DO jj = 2, jpjm1 
    1145           DO ji = 2, jpim1 
    1146             zpwes = 0._wp; zpwed = 0._wp 
    1147             zpnss = 0._wp; zpnsd = 0._wp 
    1148             zuijk = zu(ji,jj,jk) 
    1149             zvijk = zv(ji,jj,jk) 
    1150  
    1151             !!!!!     for u equation 
    1152             IF( jk <= mbku(ji,jj) ) THEN 
    1153                IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
    1154                  jis = ji + 1; jid = ji 
    1155                ELSE 
    1156                  jis = ji;     jid = ji +1 
    1157                ENDIF 
    1158  
    1159                ! integrate the pressure on the shallow side 
    1160                jk1 = jk 
    1161                DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
    1162                  IF( jk1 == mbku(ji,jj) ) THEN 
    1163                    zuijk = -zdept(jis,jj,jk1) 
    1164                    EXIT 
    1165                  ENDIF 
    1166                  zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
    1167                  zpwes = zpwes +                                    & 
    1168                       integ_spline(zdept(jis,jj,jk1), zdeps,            & 
    1169                              asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
    1170                              csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
    1171                  jk1 = jk1 + 1 
    1172                END DO 
    1173  
    1174                ! integrate the pressure on the deep side 
    1175                jk1 = jk 
    1176                DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
    1177                  IF( jk1 == 1 ) THEN 
    1178                    zdeps = zdept(jid,jj,1) + MIN(zuijk, sshn(jid,jj)*znad) 
    1179                    zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
    1180                                                      bsp(jid,jj,1),   csp(jid,jj,1), & 
    1181                                                      dsp(jid,jj,1)) * zdeps 
    1182                    zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
    1183                    EXIT 
    1184                  ENDIF 
    1185                  zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
    1186                  zpwed = zpwed +                                        & 
    1187                         integ_spline(zdeps,              zdept(jid,jj,jk1), & 
    1188                                asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
    1189                                csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
    1190                  jk1 = jk1 - 1 
    1191                END DO 
    1192  
    1193                ! update the momentum trends in u direction 
    1194  
    1195                zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
    1196                IF( .NOT.ln_linssh ) THEN 
    1197                  zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
    1198                     &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 
    1199                 ELSE 
    1200                  zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
    1201                ENDIF 
    1202                IF( ln_wd_il ) THEN 
    1203                   zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1204                   zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1205                ENDIF 
    1206                ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
    1207             ENDIF 
    1208  
    1209             !!!!!     for v equation 
    1210             IF( jk <= mbkv(ji,jj) ) THEN 
    1211                IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
    1212                  jjs = jj + 1; jjd = jj 
    1213                ELSE 
    1214                  jjs = jj    ; jjd = jj + 1 
    1215                ENDIF 
    1216  
    1217                ! integrate the pressure on the shallow side 
    1218                jk1 = jk 
    1219                DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
    1220                  IF( jk1 == mbkv(ji,jj) ) THEN 
    1221                    zvijk = -zdept(ji,jjs,jk1) 
    1222                    EXIT 
    1223                  ENDIF 
    1224                  zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
    1225                  zpnss = zpnss +                                      & 
    1226                         integ_spline(zdept(ji,jjs,jk1), zdeps,            & 
    1227                                asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
    1228                                csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
    1229                  jk1 = jk1 + 1 
    1230                END DO 
    1231  
    1232                ! integrate the pressure on the deep side 
    1233                jk1 = jk 
    1234                DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
    1235                  IF( jk1 == 1 ) THEN 
    1236                    zdeps = zdept(ji,jjd,1) + MIN(zvijk, sshn(ji,jjd)*znad) 
    1237                    zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
    1238                                                      bsp(ji,jjd,1),   csp(ji,jjd,1), & 
    1239                                                      dsp(ji,jjd,1) ) * zdeps 
    1240                    zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
    1241                    EXIT 
    1242                  ENDIF 
    1243                  zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
    1244                  zpnsd = zpnsd +                                        & 
    1245                         integ_spline(zdeps,              zdept(ji,jjd,jk1), & 
    1246                                asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
    1247                                csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
    1248                  jk1 = jk1 - 1 
    1249                END DO 
    1250  
    1251  
    1252                ! update the momentum trends in v direction 
    1253  
    1254                zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
    1255                IF( .NOT.ln_linssh ) THEN 
    1256                   zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
    1257                           ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
    1258                ELSE 
    1259                   zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
    1260                ENDIF 
    1261                IF( ln_wd_il ) THEN 
    1262                   zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1263                   zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1264                ENDIF 
    1265  
    1266                va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
    1267             ENDIF 
    1268                ! 
    1269             END DO 
     1018       zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * & 
     1019                      & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
     1020       zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * & 
     1021                      & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
     1022      END_2D 
     1023 
     1024      CALL lbc_lnk_multi ('dynhpg', zsshu_n, 'U', 1.0_wp, zsshv_n, 'V', 1.0_wp ) 
     1025 
     1026      DO_2D( 0, 0, 0, 0 ) 
     1027       zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) * znad)  
     1028       zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) * znad) 
     1029      END_2D 
     1030 
     1031      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     1032      zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm) 
     1033      zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm) 
     1034      END_3D 
     1035 
     1036      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     1037      zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm) 
     1038      zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm) 
     1039      END_3D 
     1040 
     1041      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     1042      zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1043      zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1044      zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1045      zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1046      END_3D 
     1047 
     1048 
     1049      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     1050      zpwes = 0._wp; zpwed = 0._wp 
     1051      zpnss = 0._wp; zpnsd = 0._wp 
     1052      zuijk = zu(ji,jj,jk) 
     1053      zvijk = zv(ji,jj,jk) 
     1054 
     1055      !!!!!     for u equation 
     1056      IF( jk <= mbku(ji,jj) ) THEN 
     1057         IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
     1058           jis = ji + 1; jid = ji 
     1059         ELSE 
     1060           jis = ji;     jid = ji +1 
     1061         ENDIF 
     1062 
     1063         ! integrate the pressure on the shallow side 
     1064         jk1 = jk 
     1065         DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
     1066           IF( jk1 == mbku(ji,jj) ) THEN 
     1067             zuijk = -zdept(jis,jj,jk1) 
     1068             EXIT 
     1069           ENDIF 
     1070           zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
     1071           zpwes = zpwes +                                    & 
     1072                integ_spline(zdept(jis,jj,jk1), zdeps,            & 
     1073                       asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
     1074                       csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
     1075           jk1 = jk1 + 1 
    12701076         END DO 
    1271       END DO 
     1077 
     1078         ! integrate the pressure on the deep side 
     1079         jk1 = jk 
     1080         DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
     1081           IF( jk1 == 1 ) THEN 
     1082             zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 
     1083             zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
     1084                                               bsp(jid,jj,1),   csp(jid,jj,1), & 
     1085                                               dsp(jid,jj,1)) * zdeps 
     1086             zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
     1087             EXIT 
     1088           ENDIF 
     1089           zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
     1090           zpwed = zpwed +                                        & 
     1091                  integ_spline(zdeps,              zdept(jid,jj,jk1), & 
     1092                         asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
     1093                         csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
     1094           jk1 = jk1 - 1 
     1095         END DO 
     1096 
     1097         ! update the momentum trends in u direction 
     1098 
     1099         zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
     1100         IF( .NOT.ln_linssh ) THEN 
     1101           zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
     1102              &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 
     1103          ELSE 
     1104           zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
     1105         ENDIF 
     1106         IF( ln_wd_il ) THEN 
     1107            zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1108            zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1109         ENDIF 
     1110         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
     1111      ENDIF 
     1112 
     1113      !!!!!     for v equation 
     1114      IF( jk <= mbkv(ji,jj) ) THEN 
     1115         IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
     1116           jjs = jj + 1; jjd = jj 
     1117         ELSE 
     1118           jjs = jj    ; jjd = jj + 1 
     1119         ENDIF 
     1120 
     1121         ! integrate the pressure on the shallow side 
     1122         jk1 = jk 
     1123         DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
     1124           IF( jk1 == mbkv(ji,jj) ) THEN 
     1125             zvijk = -zdept(ji,jjs,jk1) 
     1126             EXIT 
     1127           ENDIF 
     1128           zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
     1129           zpnss = zpnss +                                      & 
     1130                  integ_spline(zdept(ji,jjs,jk1), zdeps,            & 
     1131                         asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
     1132                         csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
     1133           jk1 = jk1 + 1 
     1134         END DO 
     1135 
     1136         ! integrate the pressure on the deep side 
     1137         jk1 = jk 
     1138         DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
     1139           IF( jk1 == 1 ) THEN 
     1140             zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad) 
     1141             zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
     1142                                               bsp(ji,jjd,1),   csp(ji,jjd,1), & 
     1143                                               dsp(ji,jjd,1) ) * zdeps 
     1144             zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
     1145             EXIT 
     1146           ENDIF 
     1147           zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
     1148           zpnsd = zpnsd +                                        & 
     1149                  integ_spline(zdeps,              zdept(ji,jjd,jk1), & 
     1150                         asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
     1151                         csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
     1152           jk1 = jk1 - 1 
     1153         END DO 
     1154 
     1155 
     1156         ! update the momentum trends in v direction 
     1157 
     1158         zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
     1159         IF( .NOT.ln_linssh ) THEN 
     1160            zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
     1161                    ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) ) 
     1162         ELSE 
     1163            zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
     1164         ENDIF 
     1165         IF( ln_wd_il ) THEN 
     1166            zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)  
     1167            zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)  
     1168         ENDIF 
     1169 
     1170         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
     1171      ENDIF 
     1172         ! 
     1173      END_3D 
    12721174      ! 
    12731175      IF( ln_wd_il )   DEALLOCATE( zcpx, zcpy ) 
     
    14671369   !!====================================================================== 
    14681370END MODULE dynhpg 
    1469  
Note: See TracChangeset for help on using the changeset viewer.