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 6808 for branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90 – NEMO

Ignore:
Timestamp:
2016-07-19T10:38:35+02:00 (8 years ago)
Author:
jamesharle
Message:

merge with trunk@6232 for consistency with SSB code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r5224 r6808  
    3333   USE sbc_oce         ! surface variable (only for the flag with ice shelf) 
    3434   USE dom_oce         ! ocean space and time domain 
     35   USE wet_dry         ! wetting and drying 
    3536   USE phycst          ! physical constants 
    3637   USE trd_oce         ! trends: ocean variables 
    3738   USE trddyn          ! trend manager: dynamics 
     39!jc   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
    3840   ! 
    3941   USE in_out_manager  ! I/O manager 
     
    4446   USE wrk_nemo        ! Memory Allocation 
    4547   USE timing          ! Timing 
     48   USE iom 
    4649 
    4750   IMPLICIT NONE 
     
    5154   PUBLIC   dyn_hpg_init   ! routine called by opa module 
    5255 
    53    !                                    !!* Namelist namdyn_hpg : hydrostatic pressure gradient 
    54    LOGICAL , PUBLIC ::   ln_hpg_zco      !: z-coordinate - full steps 
    55    LOGICAL , PUBLIC ::   ln_hpg_zps      !: z-coordinate - partial steps (interpolation) 
    56    LOGICAL , PUBLIC ::   ln_hpg_sco      !: s-coordinate (standard jacobian formulation) 
    57    LOGICAL , PUBLIC ::   ln_hpg_djc      !: s-coordinate (Density Jacobian with Cubic polynomial) 
    58    LOGICAL , PUBLIC ::   ln_hpg_prj      !: s-coordinate (Pressure Jacobian scheme) 
    59    LOGICAL , PUBLIC ::   ln_hpg_isf      !: s-coordinate similar to sco modify for isf 
    60    LOGICAL , PUBLIC ::   ln_dynhpg_imp   !: semi-implicite hpg flag 
     56   !                                 !!* Namelist namdyn_hpg : hydrostatic pressure gradient 
     57   LOGICAL , PUBLIC ::   ln_hpg_zco   !: z-coordinate - full steps 
     58   LOGICAL , PUBLIC ::   ln_hpg_zps   !: z-coordinate - partial steps (interpolation) 
     59   LOGICAL , PUBLIC ::   ln_hpg_sco   !: s-coordinate (standard jacobian formulation) 
     60   LOGICAL , PUBLIC ::   ln_hpg_djc   !: s-coordinate (Density Jacobian with Cubic polynomial) 
     61   LOGICAL , PUBLIC ::   ln_hpg_prj   !: s-coordinate (Pressure Jacobian scheme) 
     62   LOGICAL , PUBLIC ::   ln_hpg_isf   !: s-coordinate similar to sco modify for isf 
    6163 
    6264   INTEGER , PUBLIC ::   nhpg  =  0   ! = 0 to 7, type of pressure gradient scheme used ! (deduced from ln_hpg_... flags) (PUBLIC for TAM) 
    6365 
    6466   !! * Substitutions 
    65 #  include "domzgr_substitute.h90" 
    6667#  include "vectopt_loop_substitute.h90" 
    6768   !!---------------------------------------------------------------------- 
     
    131132      INTEGER ::   ios             ! Local integer output status for namelist read 
    132133      !! 
     134      INTEGER  ::   ji, jj, jk, ikt    ! dummy loop indices      ISF 
     135      REAL(wp) ::   znad 
     136      REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztstop, zrhd ! hypothesys on isf density 
     137      REAL(wp), POINTER, DIMENSION(:,:)     ::  zrhdtop_isf  ! density at bottom of ISF 
     138      REAL(wp), POINTER, DIMENSION(:,:)     ::  ziceload     ! density at bottom of ISF 
     139      !! 
    133140      NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco,     & 
    134          &                 ln_hpg_djc, ln_hpg_prj, ln_hpg_isf, ln_dynhpg_imp 
     141         &                 ln_hpg_djc, ln_hpg_prj, ln_hpg_isf 
    135142      !!---------------------------------------------------------------------- 
    136143      ! 
    137144      REWIND( numnam_ref )              ! Namelist namdyn_hpg in reference namelist : Hydrostatic pressure gradient 
    138145      READ  ( numnam_ref, namdyn_hpg, IOSTAT = ios, ERR = 901) 
    139 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist', lwp ) 
    140  
     146901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist', lwp ) 
     147      ! 
    141148      REWIND( numnam_cfg )              ! Namelist namdyn_hpg in configuration namelist : Hydrostatic pressure gradient 
    142149      READ  ( numnam_cfg, namdyn_hpg, IOSTAT = ios, ERR = 902 ) 
    143 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist', lwp ) 
     150902   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist', lwp ) 
    144151      IF(lwm) WRITE ( numond, namdyn_hpg ) 
    145152      ! 
     
    155162         WRITE(numout,*) '      s-coord. (Density Jacobian: Cubic polynomial)     ln_hpg_djc    = ', ln_hpg_djc 
    156163         WRITE(numout,*) '      s-coord. (Pressure Jacobian: Cubic polynomial)    ln_hpg_prj    = ', ln_hpg_prj 
    157          WRITE(numout,*) '      time stepping: centered (F) or semi-implicit (T)  ln_dynhpg_imp = ', ln_dynhpg_imp 
    158164      ENDIF 
    159165      ! 
     
    163169                           & either  ln_hpg_sco or  ln_hpg_prj instead') 
    164170      ! 
    165       IF( lk_vvl .AND. .NOT. (ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )   & 
    166          &   CALL ctl_stop('dyn_hpg_init : variable volume key_vvl requires:& 
    167                            & the standard jacobian formulation hpg_sco or & 
    168                            & the pressure jacobian formulation hpg_prj') 
     171      IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )        & 
     172         &   CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ', & 
     173         &                 '   the standard jacobian formulation hpg_sco    or '    , & 
     174         &                 '   the pressure jacobian formulation hpg_prj'            ) 
    169175 
    170176      IF(       ln_hpg_isf .AND. .NOT. ln_isfcav )   & 
     
    191197      IF( ioptio /= 1 )   CALL ctl_stop( 'NO or several hydrostatic pressure gradient options used' ) 
    192198      !  
    193       ! initialisation of ice load 
    194       riceload(:,:)=0.0 
     199      ! initialisation of ice shelf load 
     200      IF ( .NOT. ln_isfcav ) riceload(:,:)=0.0 
     201      IF (       ln_isfcav ) THEN 
     202         CALL wrk_alloc( jpi,jpj, 2,  ztstop)  
     203         CALL wrk_alloc( jpi,jpj,jpk, zrhd  ) 
     204         CALL wrk_alloc( jpi,jpj,     zrhdtop_isf, ziceload)  
     205         ! 
     206         IF(lwp) WRITE(numout,*) 
     207         IF(lwp) WRITE(numout,*) 'dyn:hpg_isf : hydrostatic pressure gradient trend for ice shelf' 
     208         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'   
     209 
     210         ! To use density and not density anomaly 
     211         znad=1._wp 
     212          
     213         ! assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
     214         ztstop(:,:,1)=-1.9_wp ; ztstop(:,:,2)=34.4_wp 
     215 
     216         ! compute density of the water displaced by the ice shelf  
     217         DO jk = 1, jpk 
     218            CALL eos(ztstop(:,:,:),gdept_n(:,:,jk),zrhd(:,:,jk)) 
     219         END DO 
     220       
     221         ! compute rhd at the ice/oce interface (ice shelf side) 
     222         CALL eos(ztstop,risfdep,zrhdtop_isf) 
     223 
     224         ! Surface value + ice shelf gradient 
     225         ! compute pressure due to ice shelf load (used to compute hpgi/j for all the level from 1 to miku/v) 
     226         ! divided by 2 later 
     227         ziceload = 0._wp 
     228         DO jj = 1, jpj 
     229            DO ji = 1, jpi 
     230               ikt=mikt(ji,jj) 
     231               ziceload(ji,jj) = ziceload(ji,jj) + (znad + zrhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
     232               DO jk=2,ikt-1 
     233                  ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_n(ji,jj,jk) & 
     234                     &                              * (1._wp - tmask(ji,jj,jk)) 
     235               END DO 
     236               IF (ikt  >=  2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) & 
     237                                  &                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
     238            END DO 
     239         END DO 
     240         riceload(:,:)=ziceload(:,:)  ! need to be saved for diaar5 
     241 
     242         CALL wrk_dealloc( jpi,jpj, 2,  ztstop)  
     243         CALL wrk_dealloc( jpi,jpj,jpk, zrhd  ) 
     244         CALL wrk_dealloc( jpi,jpj,     zrhdtop_isf, ziceload)  
     245      END IF 
    195246      ! 
    196247   END SUBROUTINE dyn_hpg_init 
     
    214265      !!---------------------------------------------------------------------- 
    215266      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    216       !! 
     267      ! 
    217268      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    218269      REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars 
     
    220271      !!---------------------------------------------------------------------- 
    221272      ! 
    222       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
     273      CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    223274      ! 
    224275      IF( kt == nit000 ) THEN 
     
    233284      DO jj = 2, jpjm1 
    234285         DO ji = fs_2, fs_jpim1   ! vector opt. 
    235             zcoef1 = zcoef0 * fse3w(ji,jj,1) 
     286            zcoef1 = zcoef0 * e3w_n(ji,jj,1) 
    236287            ! hydrostatic pressure gradient 
    237             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) / e1u(ji,jj) 
    238             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) / e2v(ji,jj) 
     288            zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     289            zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    239290            ! add to the general momentum trend 
    240291            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
     
    248299         DO jj = 2, jpjm1 
    249300            DO ji = fs_2, fs_jpim1   ! vector opt. 
    250                zcoef1 = zcoef0 * fse3w(ji,jj,jk) 
     301               zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 
    251302               ! hydrostatic pressure gradient 
    252303               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    253                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )   & 
    254                   &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) / e1u(ji,jj) 
     304                  &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
     305                  &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    255306 
    256307               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    257                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )   & 
    258                   &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) / e2v(ji,jj) 
     308                  &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
     309                  &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    259310               ! add to the general momentum trend 
    260311               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
     
    264315      END DO 
    265316      ! 
    266       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
     317      CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    267318      ! 
    268319   END SUBROUTINE hpg_zco 
     
    285336      !!---------------------------------------------------------------------- 
    286337      ! 
    287       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
     338      CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    288339      ! 
    289340      IF( kt == nit000 ) THEN 
     
    293344      ENDIF 
    294345 
     346      ! Partial steps: bottom before horizontal gradient of t, s, rd at the last ocean level 
     347!jc      CALL zps_hde    ( kt, jpts, tsn, gtsu, gtsv, rhd, gru , grv ) 
    295348 
    296349      ! Local constant initialization 
     
    300353      DO jj = 2, jpjm1 
    301354         DO ji = fs_2, fs_jpim1   ! vector opt. 
    302             zcoef1 = zcoef0 * fse3w(ji,jj,1) 
     355            zcoef1 = zcoef0 * e3w_n(ji,jj,1) 
    303356            ! hydrostatic pressure gradient 
    304             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) / e1u(ji,jj) 
    305             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) / e2v(ji,jj) 
     357            zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     358            zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    306359            ! add to the general momentum trend 
    307360            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
     
    309362         END DO 
    310363      END DO 
    311  
    312364 
    313365      ! interior value (2=<jk=<jpkm1) 
     
    315367         DO jj = 2, jpjm1 
    316368            DO ji = fs_2, fs_jpim1   ! vector opt. 
    317                zcoef1 = zcoef0 * fse3w(ji,jj,jk) 
     369               zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 
    318370               ! hydrostatic pressure gradient 
    319371               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    320372                  &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
    321                   &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) / e1u(ji,jj) 
     373                  &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    322374 
    323375               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    324376                  &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
    325                   &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) / e2v(ji,jj) 
     377                  &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    326378               ! add to the general momentum trend 
    327379               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
     
    330382         END DO 
    331383      END DO 
    332  
    333384 
    334385      ! partial steps correction at the last level  (use gru & grv computed in zpshde.F90) 
     
    337388            iku = mbku(ji,jj) 
    338389            ikv = mbkv(ji,jj) 
    339             zcoef2 = zcoef0 * MIN( fse3w(ji,jj,iku), fse3w(ji+1,jj  ,iku) ) 
    340             zcoef3 = zcoef0 * MIN( fse3w(ji,jj,ikv), fse3w(ji  ,jj+1,ikv) ) 
     390            zcoef2 = zcoef0 * MIN( e3w_n(ji,jj,iku), e3w_n(ji+1,jj  ,iku) ) 
     391            zcoef3 = zcoef0 * MIN( e3w_n(ji,jj,ikv), e3w_n(ji  ,jj+1,ikv) ) 
    341392            IF( iku > 1 ) THEN            ! on i-direction (level 2 or more) 
    342393               ua  (ji,jj,iku) = ua(ji,jj,iku) - zhpi(ji,jj,iku)         ! subtract old value 
    343394               zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
    344                   &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) / e1u(ji,jj) 
     395                  &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) * r1_e1u(ji,jj) 
    345396               ua  (ji,jj,iku) = ua(ji,jj,iku) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
    346397            ENDIF 
     
    348399               va  (ji,jj,ikv) = va(ji,jj,ikv) - zhpj(ji,jj,ikv)         ! subtract old value 
    349400               zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
    350                   &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) / e2v(ji,jj) 
     401                  &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) * r1_e2v(ji,jj) 
    351402               va  (ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
    352403            ENDIF 
     
    354405      END DO 
    355406      ! 
    356       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
     407      CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    357408      ! 
    358409   END SUBROUTINE hpg_zps 
     410 
    359411 
    360412   SUBROUTINE hpg_sco( kt ) 
     
    378430      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    379431      !! 
    380       INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    381       REAL(wp) ::   zcoef0, zuap, zvap, znad   ! temporary scalars 
     432      INTEGER  ::   ji, jj, jk, jii, jjj                 ! dummy loop indices 
     433      REAL(wp) ::   zcoef0, zuap, zvap, znad, ztmp       ! temporary scalars 
     434      LOGICAL  ::   ll_tmp1, ll_tmp2, ll_tmp3            ! local logical variables 
    382435      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
     436      REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy !W/D pressure filter 
    383437      !!---------------------------------------------------------------------- 
    384438      ! 
    385439      CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
     440      IF(ln_wd) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
    386441      ! 
    387442      IF( kt == nit000 ) THEN 
     
    390445         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, OPA original scheme used' 
    391446      ENDIF 
    392  
    393       ! Local constant initialization 
     447      ! 
    394448      zcoef0 = - grav * 0.5_wp 
    395       ! To use density and not density anomaly 
    396       IF ( lk_vvl ) THEN   ;     znad = 1._wp          ! Variable volume 
    397       ELSE                 ;     znad = 0._wp         ! Fixed volume 
     449      IF ( ln_linssh ) THEN   ;   znad = 0._wp         ! Fixed    volume: density anomaly 
     450      ELSE                    ;   znad = 1._wp         ! Variable volume: density 
    398451      ENDIF 
     452      ! 
     453      IF(ln_wd) THEN 
     454        DO jj = 2, jpjm1 
     455           DO ji = 2, jpim1  
     456             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj))  
     457             ll_tmp2 = MAX(sshn(ji,jj) + bathy(ji,jj), sshn(ji+1,jj) + bathy(ji+1,jj)) > rn_wdmin1 + rn_wdmin2 
     458             ll_tmp3 = MAX(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) + & 
     459                                                       & rn_wdmin1 + rn_wdmin2 
     460 
     461             IF(ll_tmp1.AND.ll_tmp2) THEN 
     462               zcpx(ji,jj) = 1.0_wp 
     463               wduflt(ji,jj) = 1.0_wp 
     464             ELSE IF(ll_tmp3) THEN 
     465               ! no worries about sshn(ji+1,jj)-sshn(ji,jj) = 0, it won't happen ! here 
     466               zcpx(ji,jj) = ABS((sshn(ji+1,jj) + bathy(ji+1,jj) - sshn(ji,jj) - bathy(ji,jj)) / & 
     467                           &     (sshn(ji+1,jj) - sshn(ji,jj))) 
     468               wduflt(ji,jj) = 1.0_wp 
     469             ELSE 
     470               zcpx(ji,jj) = 0._wp 
     471               wduflt(ji,jj) = 0.0_wp 
     472             END IF 
     473       
     474             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1))  
     475             ll_tmp2 = MAX(sshn(ji,jj) + bathy(ji,jj), sshn(ji,jj+1) + bathy(ji,jj+1)) > rn_wdmin1 + rn_wdmin2 
     476             ll_tmp3 = MAX(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) + & 
     477                                                       & rn_wdmin1 + rn_wdmin2 
     478 
     479             IF(ll_tmp1.AND.ll_tmp2) THEN 
     480               zcpy(ji,jj) = 1.0_wp 
     481               wdvflt(ji,jj) = 1.0_wp 
     482             ELSE IF(ll_tmp3) THEN 
     483               ! no worries about sshn(ji,jj+1)-sshn(ji,jj) = 0, it won't happen ! here 
     484               zcpy(ji,jj) = ABS((sshn(ji,jj+1) + bathy(ji,jj+1) - sshn(ji,jj) - bathy(ji,jj)) / & 
     485                           &     (sshn(ji,jj+1) - sshn(ji,jj))) 
     486               wdvflt(ji,jj) = 1.0_wp 
     487             ELSE 
     488               zcpy(ji,jj) = 0._wp 
     489               wdvflt(ji,jj) = 0.0_wp 
     490             END IF 
     491           END DO 
     492        END DO 
     493        CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     494      ENDIF 
     495 
    399496 
    400497      ! Surface value 
     
    402499         DO ji = fs_2, fs_jpim1   ! vector opt. 
    403500            ! hydrostatic pressure gradient along s-surfaces 
    404             zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( fse3w(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )   & 
    405                &                                  - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
    406             zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( fse3w(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )   & 
    407                &                                  - fse3w(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) ) ) 
     501            zhpi(ji,jj,1) = zcoef0 * (  e3w_n(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )    & 
     502               &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e1u(ji,jj) 
     503            zhpj(ji,jj,1) = zcoef0 * (  e3w_n(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )    & 
     504               &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e2v(ji,jj) 
    408505            ! s-coordinate pressure gradient correction 
    409             zuap = -zcoef0 * ( rhd   (ji+1,jj,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    410                &           * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) / e1u(ji,jj) 
    411             zvap = -zcoef0 * ( rhd   (ji,jj+1,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    412                &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) 
     506            zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     507               &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
     508            zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     509               &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
     510 
     511 
     512            IF(ln_wd) THEN 
     513 
     514              zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     515              zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     516              zuap = zuap * zcpx(ji,jj) 
     517              zvap = zvap * zcpy(ji,jj) 
     518            ENDIF 
     519 
    413520            ! add to the general momentum trend 
    414521            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
     
    422529            DO ji = fs_2, fs_jpim1   ! vector opt. 
    423530               ! hydrostatic pressure gradient along s-surfaces 
    424                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
    425                   &           * (  fse3w(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
    426                   &              - fse3w(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
    427                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
    428                   &           * (  fse3w(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
    429                   &              - fse3w(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
     531               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
     532                  &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
     533                  &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
     534               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
     535                  &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
     536                  &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
    430537               ! s-coordinate pressure gradient correction 
    431                zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    432                   &           * ( fsde3w(ji+1,jj  ,jk) - fsde3w(ji,jj,jk) ) / e1u(ji,jj) 
    433                zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    434                   &           * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) / e2v(ji,jj) 
     538               zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     539                  &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) * r1_e1u(ji,jj) 
     540               zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     541                  &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 
     542 
     543               IF(ln_wd) THEN 
     544                 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     545                 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     546                 zuap = zuap * zcpx(ji,jj) 
     547                 zvap = zvap * zcpy(ji,jj) 
     548               ENDIF 
     549 
    435550               ! add to the general momentum trend 
    436551               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
     
    441556      ! 
    442557      CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
     558      IF(ln_wd) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
    443559      ! 
    444560   END SUBROUTINE hpg_sco 
     561 
    445562 
    446563   SUBROUTINE hpg_isf( kt ) 
    447564      !!--------------------------------------------------------------------- 
    448       !!                  ***  ROUTINE hpg_sco  *** 
     565      !!                  ***  ROUTINE hpg_isf  *** 
    449566      !! 
    450567      !! ** Method  :   s-coordinate case. Jacobian scheme. 
     
    465582      INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
    466583      !! 
    467       INTEGER  ::   ji, jj, jk, iku, ikv, ikt, iktp1i, iktp1j                 ! dummy loop indices 
    468       REAL(wp) ::   zcoef0, zuap, zvap, znad, ze3wu, ze3wv, zuapint, zvapint, zhpjint, zhpiint, zdzwt, zdzwtjp1, zdzwtip1             ! temporary scalars 
    469       REAL(wp), POINTER, DIMENSION(:,:,:)   ::  zhpi, zhpj, zrhd 
     584      INTEGER  ::   ji, jj, jk, ikt, iktp1i, iktp1j   ! dummy loop indices 
     585      REAL(wp) ::   zcoef0, zuap, zvap, znad          ! temporary scalars 
     586      REAL(wp), POINTER, DIMENSION(:,:,:)   ::  zhpi, zhpj 
    470587      REAL(wp), POINTER, DIMENSION(:,:,:)   ::  ztstop 
    471       REAL(wp), POINTER, DIMENSION(:,:)     ::  ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj 
    472       !!---------------------------------------------------------------------- 
    473       ! 
    474       CALL wrk_alloc( jpi,jpj, 2, ztstop)  
    475       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj, zrhd) 
    476       CALL wrk_alloc( jpi,jpj, ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj)  
    477       ! 
    478      IF( kt == nit000 ) THEN 
    479          IF(lwp) WRITE(numout,*) 
    480          IF(lwp) WRITE(numout,*) 'dyn:hpg_isf : hydrostatic pressure gradient trend for ice shelf' 
    481          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, OPA original scheme used' 
    482       ENDIF 
    483  
     588      REAL(wp), POINTER, DIMENSION(:,:)     ::  zrhdtop_oce 
     589      !!---------------------------------------------------------------------- 
     590      ! 
     591      CALL wrk_alloc( jpi,jpj,  2, ztstop)  
     592      CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj) 
     593      CALL wrk_alloc( jpi,jpj,     zrhdtop_oce ) 
     594      ! 
    484595      ! Local constant initialization 
    485596      zcoef0 = - grav * 0.5_wp 
     597   
    486598      ! To use density and not density anomaly 
    487 !      IF ( lk_vvl ) THEN   ;     znad = 1._wp          ! Variable volume 
    488 !      ELSE                 ;     znad = 0._wp         ! Fixed volume 
    489 !      ENDIF 
    490599      znad=1._wp 
     600 
    491601      ! iniitialised to 0. zhpi zhpi  
    492602      zhpi(:,:,:)=0._wp ; zhpj(:,:,:)=0._wp 
    493603 
    494 !==================================================================================      
    495 !=====Compute iceload and contribution of the half first wet layer =================  
    496 !=================================================================================== 
    497  
    498       ! assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
    499       ztstop(:,:,1)=-1.9_wp ; ztstop(:,:,2)=34.4_wp 
    500  
    501       ! compute density of the water displaced by the ice shelf  
    502       zrhd = rhd ! save rhd 
    503       DO jk = 1, jpk 
    504            zdept(:,:)=gdept_1d(jk) 
    505            CALL eos(ztstop(:,:,:),zdept(:,:),rhd(:,:,jk)) 
    506       END DO 
    507       WHERE ( tmask(:,:,:) == 1._wp) 
    508         rhd(:,:,:) = zrhd(:,:,:) ! replace wet cell by the saved rhd 
    509       END WHERE 
    510        
    511       ! compute rhd at the ice/oce interface (ice shelf side) 
    512       CALL eos(ztstop,risfdep,zrhdtop_isf) 
    513  
    514604      ! compute rhd at the ice/oce interface (ocean side) 
     605      ! usefull to reduce residual current in the test case ISOMIP with no melting 
    515606      DO ji=1,jpi 
    516607        DO jj=1,jpj 
     
    520611        END DO 
    521612      END DO 
    522       CALL eos(ztstop,risfdep,zrhdtop_oce) 
    523       ! 
    524       ! Surface value + ice shelf gradient 
    525       ! compute pressure due to ice shelf load (used to compute hpgi/j for all the level from 1 to miku/v) 
    526       ziceload = 0._wp 
    527       DO jj = 1, jpj 
    528          DO ji = 1, jpi   ! vector opt. 
    529             ikt=mikt(ji,jj) 
    530             ziceload(ji,jj) = ziceload(ji,jj) + (znad + rhd(ji,jj,1) ) * fse3w(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
    531             DO jk=2,ikt-1 
    532                ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + rhd(ji,jj,jk-1) + rhd(ji,jj,jk)) * fse3w(ji,jj,jk) & 
    533                   &                              * (1._wp - tmask(ji,jj,jk)) 
    534             END DO 
    535             IF (ikt .GE. 2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + rhd(ji,jj,ikt-1)) & 
    536                                &                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
    537          END DO 
    538       END DO 
    539       riceload(:,:) = 0.0_wp ; riceload(:,:)=ziceload(:,:)  ! need to be saved for diaar5 
    540       ! compute zp from z=0 to first T wet point (correction due to zps not yet applied) 
     613      CALL eos( ztstop, risfdep, zrhdtop_oce ) 
     614 
     615!==================================================================================      
     616!===== Compute surface value =====================================================  
     617!================================================================================== 
    541618      DO jj = 2, jpjm1 
    542619         DO ji = fs_2, fs_jpim1   ! vector opt. 
    543             ikt=mikt(ji,jj) ; iktp1i=mikt(ji+1,jj); iktp1j=mikt(ji,jj+1) 
     620            ikt    = mikt(ji,jj) 
     621            iktp1i = mikt(ji+1,jj) 
     622            iktp1j = mikt(ji,jj+1) 
    544623            ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
    545624            ! we assume ISF is in isostatic equilibrium 
    546             zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * fse3w(ji+1,jj  ,iktp1i)                                    & 
    547                &                                  * ( 2._wp * znad + rhd(ji+1,jj  ,iktp1i) + zrhdtop_oce(ji+1,jj  ) )   & 
    548                &                                  - 0.5_wp * fse3w(ji  ,jj  ,ikt   )                                    & 
    549                &                                  * ( 2._wp * znad + rhd(ji  ,jj  ,ikt   ) + zrhdtop_oce(ji  ,jj  ) )   & 
    550                &                                  + ( ziceload(ji+1,jj) - ziceload(ji,jj))                              )  
    551             zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * fse3w(ji  ,jj+1,iktp1j)                                    & 
    552                &                                  * ( 2._wp * znad + rhd(ji  ,jj+1,iktp1j) + zrhdtop_oce(ji  ,jj+1) )   & 
    553                &                                  - 0.5_wp * fse3w(ji  ,jj  ,ikt   )                                    &  
    554                &                                  * ( 2._wp * znad + rhd(ji  ,jj  ,ikt   ) + zrhdtop_oce(ji  ,jj  ) )   & 
    555                &                                  + ( ziceload(ji,jj+1) - ziceload(ji,jj) )                             )  
     625            zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w_n(ji+1,jj,iktp1i)                                    & 
     626               &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
     627               &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         & 
     628               &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     629               &                                  + ( riceload(ji+1,jj) - riceload(ji,jj))                            )  
     630            zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w_n(ji,jj+1,iktp1j)                                    & 
     631               &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
     632               &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         &  
     633               &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     634               &                                  + ( riceload(ji,jj+1) - riceload(ji,jj))                            )  
    556635            ! s-coordinate pressure gradient correction (=0 if z coordinate) 
    557             zuap = -zcoef0 * ( rhd   (ji+1,jj,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    558                &           * ( fsde3w(ji+1,jj,1) - fsde3w(ji,jj,1) ) / e1u(ji,jj) 
    559             zvap = -zcoef0 * ( rhd   (ji,jj+1,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    560                &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) 
     636            zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     637               &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
     638            zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     639               &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    561640            ! add to the general momentum trend 
    562641            ua(ji,jj,1) = ua(ji,jj,1) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
     
    565644      END DO 
    566645!==================================================================================      
    567 !===== Compute partial cell contribution for the top cell =========================  
    568 !================================================================================== 
    569       DO jj = 2, jpjm1 
    570          DO ji = fs_2, fs_jpim1   ! vector opt. 
    571             iku = miku(ji,jj) ;  
    572             zpshpi(ji,jj)=0.0_wp ; zpshpj(ji,jj)=0.0_wp 
    573             ze3wu  = (gdepw_0(ji+1,jj,iku+1) - gdept_0(ji+1,jj,iku)) - (gdepw_0(ji,jj,iku+1) - gdept_0(ji,jj,iku)) 
    574             ! u direction 
    575             IF ( iku .GT. 1 ) THEN 
    576                ! case iku 
    577                zhpi(ji,jj,iku)   =  zcoef0 / e1u(ji,jj) * ze3wu                                            & 
    578                       &                                 * ( rhd    (ji+1,jj,iku) + rhd   (ji,jj,iku)       & 
    579                       &                                   + SIGN(1._wp,ze3wu) * grui(ji,jj) + 2._wp * znad ) 
    580                ! corrective term ( = 0 if z coordinate ) 
    581                zuap              = -zcoef0 * ( arui(ji,jj) + 2._wp * znad ) * gzui(ji,jj) / e1u(ji,jj) 
    582                ! zhpi will be added in interior loop 
    583                ua(ji,jj,iku)     = ua(ji,jj,iku) + zuap 
    584                ! in case of 2 cell water column, need to save the pressure gradient to compute the bottom pressure   
    585                IF (mbku(ji,jj) == iku + 1) zpshpi(ji,jj)  = zhpi(ji,jj,iku) 
    586  
    587                ! case iku + 1 (remove the zphi term added in the interior loop and compute the one corrected for zps) 
    588                zhpiint        =  zcoef0 / e1u(ji,jj)                                                               &     
    589                   &           * (  fse3w(ji+1,jj  ,iku+1) * ( (rhd(ji+1,jj,iku+1) + znad)                          & 
    590                   &                                         + (rhd(ji+1,jj,iku  ) + znad) ) * tmask(ji+1,jj,iku)   & 
    591                   &              - fse3w(ji  ,jj  ,iku+1) * ( (rhd(ji  ,jj,iku+1) + znad)                          & 
    592                   &                                         + (rhd(ji  ,jj,iku  ) + znad) ) * tmask(ji  ,jj,iku)   ) 
    593                zhpi(ji,jj,iku+1) =  zcoef0 / e1u(ji,jj) * ge3rui(ji,jj) - zhpiint  
    594             END IF 
    595                 
    596             ! v direction 
    597             ikv = mikv(ji,jj) 
    598             ze3wv  = (gdepw_0(ji,jj+1,ikv+1) - gdept_0(ji,jj+1,ikv)) - (gdepw_0(ji,jj,ikv+1) - gdept_0(ji,jj,ikv)) 
    599             IF ( ikv .GT. 1 ) THEN 
    600                ! case ikv 
    601                zhpj(ji,jj,ikv)   =  zcoef0 / e2v(ji,jj) * ze3wv                                            & 
    602                      &                                  * ( rhd(ji,jj+1,ikv) + rhd   (ji,jj,ikv)           & 
    603                      &                                    + SIGN(1._wp,ze3wv) * grvi(ji,jj) + 2._wp * znad ) 
    604                ! corrective term ( = 0 if z coordinate ) 
    605                zvap              = -zcoef0 * ( arvi(ji,jj) + 2._wp * znad ) * gzvi(ji,jj) / e2v(ji,jj) 
    606                ! zhpi will be added in interior loop 
    607                va(ji,jj,ikv)      = va(ji,jj,ikv) + zvap 
    608                ! in case of 2 cell water column, need to save the pressure gradient to compute the bottom pressure   
    609                IF (mbkv(ji,jj) == ikv + 1)  zpshpj(ji,jj)  =  zhpj(ji,jj,ikv)  
    610                 
    611                ! case ikv + 1 (remove the zphj term added in the interior loop and compute the one corrected for zps) 
    612                zhpjint        =  zcoef0 / e2v(ji,jj)                                                              & 
    613                   &           * (  fse3w(ji  ,jj+1,ikv+1) * ( (rhd(ji,jj+1,ikv+1) + znad)                         & 
    614                   &                                       + (rhd(ji,jj+1,ikv  ) + znad) ) * tmask(ji,jj+1,ikv)    & 
    615                   &              - fse3w(ji  ,jj  ,ikv+1) * ( (rhd(ji,jj  ,ikv+1) + znad)                         & 
    616                   &                                       + (rhd(ji,jj  ,ikv  ) + znad) ) * tmask(ji,jj  ,ikv)  ) 
    617                zhpj(ji,jj,ikv+1) =  zcoef0 / e2v(ji,jj) * ge3rvi(ji,jj) - zhpjint 
    618             END IF 
    619          END DO 
    620       END DO 
    621  
    622 !==================================================================================      
    623646!===== Compute interior value =====================================================  
    624647!================================================================================== 
    625  
    626       DO jj = 2, jpjm1 
    627          DO ji = fs_2, fs_jpim1   ! vector opt. 
    628             iku=miku(ji,jj); ikv=mikv(ji,jj) 
    629             DO jk = 2, jpkm1 
     648      ! interior value (2=<jk=<jpkm1) 
     649      DO jk = 2, jpkm1 
     650         DO jj = 2, jpjm1 
     651            DO ji = fs_2, fs_jpim1   ! vector opt. 
    630652               ! hydrostatic pressure gradient along s-surfaces 
    631                ! zhpi is masked for the first wet cell  (contribution already done in the upper bloc) 
    632                zhpi(ji,jj,jk) = zhpi(ji,jj,jk) + zhpi(ji,jj,jk-1)                                                              & 
    633                   &                            + zcoef0 / e1u(ji,jj)                                                           & 
    634                   &                                     * ( fse3w(ji+1,jj  ,jk) * ( (rhd(ji+1,jj,jk  ) + znad)                 & 
    635                   &                                                     + (rhd(ji+1,jj,jk-1) + znad) ) * tmask(ji+1,jj,jk-1)   & 
    636                   &                                       - fse3w(ji  ,jj  ,jk) * ( (rhd(ji  ,jj,jk  ) + znad)                 & 
    637                   &                                                     + (rhd(ji  ,jj,jk-1) + znad) ) * tmask(ji  ,jj,jk-1)   )  
     653               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
     654                  &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
     655                  &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
     656               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
     657                  &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
     658                  &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
    638659               ! s-coordinate pressure gradient correction 
    639                ! corrective term, we mask this term for the first wet level beneath the ice shelf (contribution done in the upper bloc)  
    640                zuap = - zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )                    & 
    641                   &            * ( fsde3w(ji+1,jj  ,jk) - fsde3w(ji,jj,jk) ) / e1u(ji,jj) * umask(ji,jj,jk-1) 
    642                ua(ji,jj,jk) = ua(ji,jj,jk) + ( zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
    643  
    644                ! hydrostatic pressure gradient along s-surfaces 
    645                ! zhpi is masked for the first wet cell  (contribution already done in the upper bloc) 
    646                zhpj(ji,jj,jk) = zhpj(ji,jj,jk) + zhpj(ji,jj,jk-1)                                                              & 
    647                   &                            + zcoef0 / e2v(ji,jj)                                                           & 
    648                   &                                     * ( fse3w(ji  ,jj+1,jk) * ( (rhd(ji,jj+1,jk  ) + znad)                 & 
    649                   &                                                     + (rhd(ji,jj+1,jk-1) + znad) ) * tmask(ji,jj+1,jk-1)   & 
    650                   &                                       - fse3w(ji  ,jj  ,jk) * ( (rhd(ji,jj  ,jk  ) + znad)                 & 
    651                   &                                                     + (rhd(ji,jj  ,jk-1) + znad) ) * tmask(ji,jj  ,jk-1)   ) 
    652                ! s-coordinate pressure gradient correction 
    653                ! corrective term, we mask this term for the first wet level beneath the ice shelf (contribution done in the upper bloc) 
    654                zvap = - zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )                     & 
    655                   &            * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) / e2v(ji,jj) * vmask(ji,jj,jk-1) 
     660               zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     661                  &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) / e1u(ji,jj) 
     662               zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     663                  &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) / e2v(ji,jj) 
    656664               ! add to the general momentum trend 
    657                va(ji,jj,jk) = va(ji,jj,jk) + ( zhpj(ji,jj,jk) + zvap ) * vmask(ji,jj,jk) 
     665               ua(ji,jj,jk) = ua(ji,jj,jk) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
     666               va(ji,jj,jk) = va(ji,jj,jk) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
    658667            END DO 
    659668         END DO 
    660669      END DO 
    661  
    662 !==================================================================================      
    663 !===== Compute bottom cell contribution (partial cell) ============================  
    664 !================================================================================== 
    665  
    666       DO jj = 2, jpjm1 
    667          DO ji = 2, jpim1 
    668             iku = mbku(ji,jj) 
    669             ikv = mbkv(ji,jj) 
    670  
    671             IF (iku .GT. 1) THEN 
    672                ! remove old value (interior case) 
    673                zuap            = -zcoef0 * ( rhd   (ji+1,jj  ,iku) + rhd   (ji,jj,iku) + 2._wp * znad )   & 
    674                      &                   * ( fsde3w(ji+1,jj  ,iku) - fsde3w(ji,jj,iku) ) / e1u(ji,jj) 
    675                ua(ji,jj,iku)   = ua(ji,jj,iku) - zhpi(ji,jj,iku) - zuap 
    676                ! put new value 
    677                ! -zpshpi to avoid double contribution of the partial step in the top layer  
    678                zuap            = -zcoef0 * ( aru(ji,jj) + 2._wp * znad ) * gzu(ji,jj)  / e1u(ji,jj) 
    679                zhpi(ji,jj,iku) =  zhpi(ji,jj,iku-1) + zcoef0 / e1u(ji,jj) * ge3ru(ji,jj) - zpshpi(ji,jj)  
    680                ua(ji,jj,iku)   =  ua(ji,jj,iku) + zhpi(ji,jj,iku) + zuap 
    681             END IF 
    682             ! v direction 
    683             IF (ikv .GT. 1) THEN 
    684                ! remove old value (interior case) 
    685                zvap            = -zcoef0 * ( rhd   (ji  ,jj+1,ikv) + rhd   (ji,jj,ikv) + 2._wp * znad )   & 
    686                      &                   * ( fsde3w(ji  ,jj+1,ikv) - fsde3w(ji,jj,ikv) )   / e2v(ji,jj) 
    687                va(ji,jj,ikv)   = va(ji,jj,ikv) - zhpj(ji,jj,ikv) - zvap 
    688                ! put new value 
    689                ! -zpshpj to avoid double contribution of the partial step in the top layer  
    690                zvap            = -zcoef0 * ( arv(ji,jj) + 2._wp * znad ) * gzv(ji,jj)     / e2v(ji,jj) 
    691                zhpj(ji,jj,ikv) =  zhpj(ji,jj,ikv-1) + zcoef0 / e2v(ji,jj) * ge3rv(ji,jj) - zpshpj(ji,jj)    
    692                va(ji,jj,ikv)   =  va(ji,jj,ikv) + zhpj(ji,jj,ikv) + zvap 
    693             END IF 
    694          END DO 
    695       END DO 
    696       
    697       ! set back to original density value into the ice shelf cell (maybe useless because it is masked) 
    698       rhd = zrhd 
    699       ! 
    700       CALL wrk_dealloc( jpi,jpj,2, ztstop) 
    701       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj, zrhd) 
    702       CALL wrk_dealloc( jpi,jpj, ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj) 
     670     ! 
     671      CALL wrk_dealloc( jpi,jpj,2  , ztstop) 
     672      CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj) 
     673      CALL wrk_dealloc( jpi,jpj    , zrhdtop_oce ) 
    703674      ! 
    704675   END SUBROUTINE hpg_isf 
     
    719690      REAL(wp) ::   z1_10, cffu, cffx   !    "         " 
    720691      REAL(wp) ::   z1_12, cffv, cffy   !    "         " 
     692      LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables 
    721693      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    722694      REAL(wp), POINTER, DIMENSION(:,:,:) ::  dzx, dzy, dzz, dzu, dzv, dzw 
    723695      REAL(wp), POINTER, DIMENSION(:,:,:) ::  drhox, drhoy, drhoz, drhou, drhov, drhow 
    724696      REAL(wp), POINTER, DIMENSION(:,:,:) ::  rho_i, rho_j, rho_k 
     697      REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
    725698      !!---------------------------------------------------------------------- 
    726699      ! 
     
    728701      CALL wrk_alloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    729702      CALL wrk_alloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
    730       ! 
     703      IF(ln_wd) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
     704      ! 
     705      ! 
     706      IF(ln_wd) THEN 
     707        DO jj = 2, jpjm1 
     708           DO ji = 2, jpim1  
     709             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) & 
     710                     & .and. MAX(sshn(ji,jj) + bathy(ji,jj), sshn(ji+1,jj) + bathy(ji+1,jj)) & 
     711                     &  > rn_wdmin1 + rn_wdmin2 
     712             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) +& 
     713                                                       & rn_wdmin1 + rn_wdmin2 
     714 
     715             IF(ll_tmp1) THEN 
     716               zcpx(ji,jj) = 1.0_wp 
     717             ELSE IF(ll_tmp2) THEN 
     718               ! no worries about sshn(ji+1,jj)-sshn(ji,jj) = 0, it won't happen ! here 
     719               zcpx(ji,jj) = ABS((sshn(ji+1,jj) + bathy(ji+1,jj) - sshn(ji,jj) - bathy(ji,jj)) /& 
     720                           &     (sshn(ji+1,jj) - sshn(ji,jj))) 
     721             ELSE 
     722               zcpx(ji,jj) = 0._wp 
     723             END IF 
     724       
     725             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) & 
     726                     & .and. MAX(sshn(ji,jj) + bathy(ji,jj), sshn(ji,jj+1) + bathy(ji,jj+1)) & 
     727                     &  > rn_wdmin1 + rn_wdmin2 
     728             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) +& 
     729                                                       & rn_wdmin1 + rn_wdmin2 
     730 
     731             IF(ll_tmp1) THEN 
     732               zcpy(ji,jj) = 1.0_wp 
     733             ELSE IF(ll_tmp2) THEN 
     734               ! no worries about sshn(ji,jj+1)-sshn(ji,jj) = 0, it won't happen ! here 
     735               zcpy(ji,jj) = ABS((sshn(ji,jj+1) + bathy(ji,jj+1) - sshn(ji,jj) - bathy(ji,jj)) /& 
     736                           &     (sshn(ji,jj+1) - sshn(ji,jj))) 
     737             ELSE 
     738               zcpy(ji,jj) = 0._wp 
     739             END IF 
     740           END DO 
     741        END DO 
     742        CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     743      ENDIF 
     744 
    731745 
    732746      IF( kt == nit000 ) THEN 
     
    750764         DO jj = 2, jpjm1 
    751765            DO ji = fs_2, fs_jpim1   ! vector opt. 
    752                drhoz(ji,jj,jk) = rhd   (ji  ,jj  ,jk) - rhd   (ji,jj,jk-1) 
    753                dzz  (ji,jj,jk) = fsde3w(ji  ,jj  ,jk) - fsde3w(ji,jj,jk-1) 
    754                drhox(ji,jj,jk) = rhd   (ji+1,jj  ,jk) - rhd   (ji,jj,jk  ) 
    755                dzx  (ji,jj,jk) = fsde3w(ji+1,jj  ,jk) - fsde3w(ji,jj,jk  ) 
    756                drhoy(ji,jj,jk) = rhd   (ji  ,jj+1,jk) - rhd   (ji,jj,jk  ) 
    757                dzy  (ji,jj,jk) = fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk  ) 
     766               drhoz(ji,jj,jk) = rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
     767               dzz  (ji,jj,jk) = gde3w_n(ji  ,jj  ,jk) - gde3w_n(ji,jj,jk-1) 
     768               drhox(ji,jj,jk) = rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
     769               dzx  (ji,jj,jk) = gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk  ) 
     770               drhoy(ji,jj,jk) = rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
     771               dzy  (ji,jj,jk) = gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk  ) 
    758772            END DO 
    759773         END DO 
     
    837851      !------------------------------------------------------------- 
    838852 
    839 !!bug gm   :  e3w-de3w = 0.5*e3w  ....  and de3w(2)-de3w(1)=e3w(2) ....   to be verified 
    840 !          true if de3w is really defined as the sum of the e3w scale factors as, it seems to me, it should be 
     853!!bug gm   :  e3w-gde3w = 0.5*e3w  ....  and gde3w(2)-gde3w(1)=e3w(2) ....   to be verified 
     854!          true if gde3w is really defined as the sum of the e3w scale factors as, it seems to me, it should be 
    841855 
    842856      DO jj = 2, jpjm1 
    843857         DO ji = fs_2, fs_jpim1   ! vector opt. 
    844             rho_k(ji,jj,1) = -grav * ( fse3w(ji,jj,1) - fsde3w(ji,jj,1) )               & 
    845                &                   * (  rhd(ji,jj,1)                                    & 
    846                &                     + 0.5_wp * ( rhd(ji,jj,2) - rhd(ji,jj,1) )         & 
    847                &                              * ( fse3w (ji,jj,1) - fsde3w(ji,jj,1) )   & 
    848                &                              / ( fsde3w(ji,jj,2) - fsde3w(ji,jj,1) )  ) 
     858            rho_k(ji,jj,1) = -grav * ( e3w_n(ji,jj,1) - gde3w_n(ji,jj,1) )               & 
     859               &                   * (  rhd(ji,jj,1)                                     & 
     860               &                     + 0.5_wp * ( rhd    (ji,jj,2) - rhd    (ji,jj,1) )  & 
     861               &                              * ( e3w_n  (ji,jj,1) - gde3w_n(ji,jj,1) )  & 
     862               &                              / ( gde3w_n(ji,jj,2) - gde3w_n(ji,jj,1) )  ) 
    849863         END DO 
    850864      END DO 
     
    857871            DO ji = fs_2, fs_jpim1   ! vector opt. 
    858872 
    859                rho_k(ji,jj,jk) = zcoef0 * ( rhd   (ji,jj,jk) + rhd   (ji,jj,jk-1) )                                   & 
    860                   &                     * ( fsde3w(ji,jj,jk) - fsde3w(ji,jj,jk-1) )                                   & 
    861                   &            - grav * z1_10 * (                                                                     & 
    862                   &     ( drhow (ji,jj,jk) - drhow (ji,jj,jk-1) )                                                     & 
    863                   &   * ( fsde3w(ji,jj,jk) - fsde3w(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
    864                   &   - ( dzw   (ji,jj,jk) - dzw   (ji,jj,jk-1) )                                                     & 
    865                   &   * ( rhd   (ji,jj,jk) - rhd   (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
     873               rho_k(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
     874                  &                     * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) )                                   & 
     875                  &            - grav * z1_10 * (                                                                   & 
     876                  &     ( drhow  (ji,jj,jk) - drhow (ji,jj,jk-1) )                                                     & 
     877                  &   * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
     878                  &   - ( dzw    (ji,jj,jk) - dzw    (ji,jj,jk-1) )                                                     & 
     879                  &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
    866880                  &                             ) 
    867881 
    868                rho_i(ji,jj,jk) = zcoef0 * ( rhd   (ji+1,jj,jk) + rhd   (ji,jj,jk) )                                   & 
    869                   &                     * ( fsde3w(ji+1,jj,jk) - fsde3w(ji,jj,jk) )                                   & 
    870                   &            - grav* z1_10 * (                                                                      & 
    871                   &     ( drhou (ji+1,jj,jk) - drhou (ji,jj,jk) )                                                     & 
    872                   &   * ( fsde3w(ji+1,jj,jk) - fsde3w(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
    873                   &   - ( dzu   (ji+1,jj,jk) - dzu   (ji,jj,jk) )                                                     & 
    874                   &   * ( rhd   (ji+1,jj,jk) - rhd   (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
     882               rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                   & 
     883                  &                     * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) )                                   & 
     884                  &            - grav* z1_10 * (                                                                    & 
     885                  &     ( drhou  (ji+1,jj,jk) - drhou (ji,jj,jk) )                                                     & 
     886                  &   * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
     887                  &   - ( dzu    (ji+1,jj,jk) - dzu    (ji,jj,jk) )                                                     & 
     888                  &   * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
    875889                  &                            ) 
    876890 
    877                rho_j(ji,jj,jk) = zcoef0 * ( rhd   (ji,jj+1,jk) + rhd   (ji,jj,jk) )                                   & 
    878                   &                     * ( fsde3w(ji,jj+1,jk) - fsde3w(ji,jj,jk) )                                   & 
    879                   &            - grav* z1_10 * (                                                                      & 
    880                   &     ( drhov (ji,jj+1,jk) - drhov (ji,jj,jk) )                                                     & 
    881                   &   * ( fsde3w(ji,jj+1,jk) - fsde3w(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
    882                   &   - ( dzv   (ji,jj+1,jk) - dzv   (ji,jj,jk) )                                                     & 
    883                   &   * ( rhd   (ji,jj+1,jk) - rhd   (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
     891               rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                 & 
     892                  &                     * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) )                                   & 
     893                  &            - grav* z1_10 * (                                                                    & 
     894                  &     ( drhov  (ji,jj+1,jk) - drhov (ji,jj,jk) )                                                     & 
     895                  &   * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
     896                  &   - ( dzv    (ji,jj+1,jk) - dzv    (ji,jj,jk) )                                                     & 
     897                  &   * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
    884898                  &                            ) 
    885899 
     
    897911      DO jj = 2, jpjm1 
    898912         DO ji = fs_2, fs_jpim1   ! vector opt. 
    899             zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) / e1u(ji,jj) 
    900             zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) / e2v(ji,jj) 
     913            zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
     914            zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
     915            IF(ln_wd) THEN 
     916              zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     917              zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     918            ENDIF 
    901919            ! add to the general momentum trend 
    902920            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
     
    914932               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
    915933                  &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
    916                   &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) / e1u(ji,jj) 
     934                  &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    917935               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
    918936                  &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
    919                   &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) / e2v(ji,jj) 
     937                  &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
     938               IF(ln_wd) THEN 
     939                 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     940                 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     941               ENDIF 
    920942               ! add to the general momentum trend 
    921943               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
     
    928950      CALL wrk_dealloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    929951      CALL wrk_dealloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
     952      IF(ln_wd) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
    930953      ! 
    931954   END SUBROUTINE hpg_djc 
     
    947970      !! 
    948971      INTEGER  ::   ji, jj, jk, jkk                 ! dummy loop indices 
    949       REAL(wp) ::   zcoef0, znad                    ! temporary scalars 
    950       !! 
     972      REAL(wp) ::   zcoef0, znad                    ! local scalars 
     973      ! 
    951974      !! The local variables for the correction term 
    952975      INTEGER  :: jk1, jis, jid, jjs, jjd 
     976      LOGICAL  :: ll_tmp1, ll_tmp2                  ! local logical variables 
    953977      REAL(wp) :: zuijk, zvijk, zpwes, zpwed, zpnss, zpnsd, zdeps 
    954978      REAL(wp) :: zrhdt1 
     
    957981      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
    958982      REAL(wp), POINTER, DIMENSION(:,:)   ::   zsshu_n, zsshv_n 
    959       !!---------------------------------------------------------------------- 
    960       ! 
    961       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    962       CALL wrk_alloc( jpi,jpj,jpk, zdept, zrhh ) 
    963       CALL wrk_alloc( jpi,jpj, zsshu_n, zsshv_n ) 
     983      REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
     984      !!---------------------------------------------------------------------- 
     985      ! 
     986      CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
     987      CALL wrk_alloc( jpi,jpj,jpk,   zdept, zrhh ) 
     988      CALL wrk_alloc( jpi,jpj,       zsshu_n, zsshv_n ) 
     989      IF(ln_wd) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
    964990      ! 
    965991      IF( kt == nit000 ) THEN 
     
    969995      ENDIF 
    970996 
    971       !!---------------------------------------------------------------------- 
    972997      ! Local constant initialization 
    973998      zcoef0 = - grav 
    974       znad = 0.0_wp 
    975       IF( lk_vvl ) znad = 1._wp 
     999      znad = 1._wp 
     1000      IF( ln_linssh )   znad = 0._wp 
     1001 
     1002      IF(ln_wd) THEN 
     1003        DO jj = 2, jpjm1 
     1004           DO ji = 2, jpim1  
     1005             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) & 
     1006                     & .and. MAX(sshn(ji,jj) + bathy(ji,jj), sshn(ji+1,jj) + bathy(ji+1,jj)) & 
     1007                     &  > rn_wdmin1 + rn_wdmin2 
     1008             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) +& 
     1009                                                       & rn_wdmin1 + rn_wdmin2 
     1010 
     1011             IF(ll_tmp1) THEN 
     1012               zcpx(ji,jj) = 1.0_wp 
     1013             ELSE IF(ll_tmp2) THEN 
     1014               ! no worries about sshn(ji+1,jj)-sshn(ji,jj) = 0, it won't happen ! here 
     1015               zcpx(ji,jj) = ABS((sshn(ji+1,jj) + bathy(ji+1,jj) - sshn(ji,jj) - bathy(ji,jj)) /& 
     1016                           &     (sshn(ji+1,jj) - sshn(ji,jj))) 
     1017             ELSE 
     1018               zcpx(ji,jj) = 0._wp 
     1019             END IF 
     1020       
     1021             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) & 
     1022                     & .and. MAX(sshn(ji,jj) + bathy(ji,jj), sshn(ji,jj+1) + bathy(ji,jj+1)) & 
     1023                     &  > rn_wdmin1 + rn_wdmin2 
     1024             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) +& 
     1025                                                       & rn_wdmin1 + rn_wdmin2 
     1026 
     1027             IF(ll_tmp1.OR.ll_tmp2) THEN 
     1028               zcpy(ji,jj) = 1.0_wp 
     1029             ELSE IF(ll_tmp2) THEN 
     1030               ! no worries about sshn(ji,jj+1)-sshn(ji,jj) = 0, it won't happen ! here 
     1031               zcpy(ji,jj) = ABS((sshn(ji,jj+1) + bathy(ji,jj+1) - sshn(ji,jj) - bathy(ji,jj)) /& 
     1032                           &     (sshn(ji,jj+1) - sshn(ji,jj))) 
     1033             ELSE 
     1034               zcpy(ji,jj) = 0._wp 
     1035             END IF 
     1036           END DO 
     1037        END DO 
     1038        CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     1039      ENDIF 
    9761040 
    9771041      ! Clean 3-D work arrays 
     
    9831047        DO ji = 1, jpi 
    9841048          jk = mbathy(ji,jj) 
    985           IF( jk <= 0 ) THEN; zrhh(ji,jj,:) = 0._wp 
    986           ELSE IF(jk == 1) THEN; zrhh(ji,jj, jk+1:jpk) = rhd(ji,jj,jk) 
    987           ELSE IF(jk < jpkm1) THEN 
     1049          IF(     jk <=  0   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
     1050          ELSEIF( jk ==  1   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
     1051          ELSEIF( jk < jpkm1 ) THEN 
    9881052             DO jkk = jk+1, jpk 
    989                 zrhh(ji,jj,jkk) = interp1(fsde3w(ji,jj,jkk),   fsde3w(ji,jj,jkk-1), & 
    990                                          fsde3w(ji,jj,jkk-2), rhd(ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 
     1053                zrhh(ji,jj,jkk) = interp1(gde3w_n(ji,jj,jkk  ), gde3w_n(ji,jj,jkk-1),  & 
     1054                   &                      gde3w_n(ji,jj,jkk-2), rhd    (ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 
    9911055             END DO 
    9921056          ENDIF 
     
    9971061      DO jj = 1, jpj 
    9981062         DO ji = 1, jpi 
    999             zdept(ji,jj,1) = 0.5_wp * fse3w(ji,jj,1) - sshn(ji,jj) * znad 
     1063            zdept(ji,jj,1) = 0.5_wp * e3w_n(ji,jj,1) - sshn(ji,jj) * znad 
    10001064         END DO 
    10011065      END DO 
     
    10041068         DO jj = 1, jpj 
    10051069            DO ji = 1, jpi 
    1006                zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + fse3w(ji,jj,jk) 
     1070               zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w_n(ji,jj,jk) 
    10071071            END DO 
    10081072         END DO 
     
    10151079      ! constrained cubic spline interpolation 
    10161080      ! rho(z) = asp + bsp*z + csp*z^2 + dsp*z^3 
    1017       CALL cspline(fsp,xsp,asp,bsp,csp,dsp,polynomial_type) 
     1081      CALL cspline( fsp, xsp, asp, bsp, csp, dsp, polynomial_type ) 
    10181082 
    10191083      ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 
    10201084      DO jj = 2, jpj 
    10211085        DO ji = 2, jpi 
    1022           zrhdt1 = zrhh(ji,jj,1) - interp3(zdept(ji,jj,1),asp(ji,jj,1), & 
    1023                                          bsp(ji,jj,1),   csp(ji,jj,1), & 
    1024                                          dsp(ji,jj,1) ) * 0.25_wp * fse3w(ji,jj,1) 
     1086          zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
     1087             &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w_n(ji,jj,1) 
    10251088 
    10261089          ! assuming linear profile across the top half surface layer 
    1027           zhpi(ji,jj,1) =  0.5_wp * fse3w(ji,jj,1) * zrhdt1 
     1090          zhpi(ji,jj,1) =  0.5_wp * e3w_n(ji,jj,1) * zrhdt1 
    10281091        END DO 
    10291092      END DO 
     
    10331096        DO jj = 2, jpj 
    10341097          DO ji = 2, jpi 
    1035             zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                          & 
    1036                              integ_spline(zdept(ji,jj,jk-1), zdept(ji,jj,jk),& 
    1037                                     asp(ji,jj,jk-1),    bsp(ji,jj,jk-1), & 
    1038                                     csp(ji,jj,jk-1),    dsp(ji,jj,jk-1)) 
     1098            zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
     1099               &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
     1100               &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
     1101               &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
    10391102          END DO 
    10401103        END DO 
     
    10461109      DO jj = 2, jpjm1 
    10471110        DO ji = 2, jpim1 
    1048           zsshu_n(ji,jj) = (e12u(ji,jj) * sshn(ji,jj) + e12u(ji+1, jj) * sshn(ji+1,jj)) * & 
    1049                          & r1_e12u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1050           zsshv_n(ji,jj) = (e12v(ji,jj) * sshn(ji,jj) + e12v(ji+1, jj) * sshn(ji,jj+1)) * & 
    1051                          & r1_e12v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
     1111!!gm BUG ?    if it is ssh at u- & v-point then it should be: 
     1112!          zsshu_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji+1,jj) * sshn(ji+1,jj)) * & 
     1113!                         & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
     1114!          zsshv_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji,jj+1) * sshn(ji,jj+1)) * & 
     1115!                         & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
     1116!!gm not this: 
     1117          zsshu_n(ji,jj) = (e1e2u(ji,jj) * sshn(ji,jj) + e1e2u(ji+1, jj) * sshn(ji+1,jj)) * & 
     1118                         & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
     1119          zsshv_n(ji,jj) = (e1e2v(ji,jj) * sshn(ji,jj) + e1e2v(ji+1, jj) * sshn(ji,jj+1)) * & 
     1120                         & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    10521121        END DO 
    10531122      END DO 
     1123 
     1124      CALL lbc_lnk (zsshu_n, 'U', 1.) 
     1125      CALL lbc_lnk (zsshv_n, 'V', 1.) 
    10541126 
    10551127      DO jj = 2, jpjm1 
    10561128        DO ji = 2, jpim1 
    1057           zu(ji,jj,1) = - ( fse3u(ji,jj,1) - zsshu_n(ji,jj) * znad)  
    1058           zv(ji,jj,1) = - ( fse3v(ji,jj,1) - zsshv_n(ji,jj) * znad) 
     1129          zu(ji,jj,1) = - ( e3u_n(ji,jj,1) - zsshu_n(ji,jj) * znad)  
     1130          zv(ji,jj,1) = - ( e3v_n(ji,jj,1) - zsshv_n(ji,jj) * znad) 
    10591131        END DO 
    10601132      END DO 
     
    10631135        DO jj = 2, jpjm1 
    10641136          DO ji = 2, jpim1 
    1065             zu(ji,jj,jk) = zu(ji,jj,jk-1)- fse3u(ji,jj,jk) 
    1066             zv(ji,jj,jk) = zv(ji,jj,jk-1)- fse3v(ji,jj,jk) 
     1137            zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u_n(ji,jj,jk) 
     1138            zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v_n(ji,jj,jk) 
    10671139          END DO 
    10681140        END DO 
     
    10721144        DO jj = 2, jpjm1 
    10731145          DO ji = 2, jpim1 
    1074             zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * fse3u(ji,jj,jk) 
    1075             zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * fse3v(ji,jj,jk) 
     1146            zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u_n(ji,jj,jk) 
     1147            zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v_n(ji,jj,jk) 
    10761148          END DO 
    10771149        END DO 
     
    10811153        DO jj = 2, jpjm1 
    10821154          DO ji = 2, jpim1 
    1083             zu(ji,jj,jk) = min(zu(ji,jj,jk), max(-zdept(ji,jj,jk), -zdept(ji+1,jj,jk))) 
    1084             zu(ji,jj,jk) = max(zu(ji,jj,jk), min(-zdept(ji,jj,jk), -zdept(ji+1,jj,jk))) 
    1085             zv(ji,jj,jk) = min(zv(ji,jj,jk), max(-zdept(ji,jj,jk), -zdept(ji,jj+1,jk))) 
    1086             zv(ji,jj,jk) = max(zv(ji,jj,jk), min(-zdept(ji,jj,jk), -zdept(ji,jj+1,jk))) 
     1155            zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1156            zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1157            zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1158            zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    10871159          END DO 
    10881160        END DO 
     
    11421214               ! update the momentum trends in u direction 
    11431215 
    1144                zdpdx1 = zcoef0 / e1u(ji,jj) * (zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk)) 
    1145                IF( lk_vvl ) THEN 
    1146                  zdpdx2 = zcoef0 / e1u(ji,jj) * & 
    1147                          ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 
     1216               zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
     1217               IF( .NOT.ln_linssh ) THEN 
     1218                 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
     1219                    &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 
    11481220                ELSE 
    1149                  zdpdx2 = zcoef0 / e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
     1221                 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
    11501222               ENDIF 
    1151  
    1152                ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * & 
    1153                &           umask(ji,jj,jk) * tmask(ji,jj,jk) * tmask(ji+1,jj,jk) 
     1223               IF(ln_wd) THEN 
     1224                  zdpdx1 = zdpdx1 * zcpx(ji,jj) 
     1225                  zdpdx2 = zdpdx2 * zcpx(ji,jj) 
     1226               ENDIF 
     1227               ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
    11541228            ENDIF 
    11551229 
     
    11991273               ! update the momentum trends in v direction 
    12001274 
    1201                zdpdy1 = zcoef0 / e2v(ji,jj) * (zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk)) 
    1202                IF( lk_vvl ) THEN 
    1203                    zdpdy2 = zcoef0 / e2v(ji,jj) * & 
    1204                            ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
     1275               zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
     1276               IF( .NOT.ln_linssh ) THEN 
     1277                  zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
     1278                          ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
    12051279               ELSE 
    1206                    zdpdy2 = zcoef0 / e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
     1280                  zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
    12071281               ENDIF 
    1208  
    1209                va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2)*& 
    1210                &              vmask(ji,jj,jk)*tmask(ji,jj,jk)*tmask(ji,jj+1,jk) 
     1282               IF(ln_wd) THEN 
     1283                  zdpdy1 = zdpdy1 * zcpy(ji,jj) 
     1284                  zdpdy2 = zdpdy2 * zcpy(ji,jj) 
     1285               ENDIF 
     1286 
     1287               va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
    12111288            ENDIF 
    1212  
    1213  
    1214            END DO 
    1215         END DO 
    1216       END DO 
    1217       ! 
    1218       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    1219       CALL wrk_dealloc( jpi,jpj,jpk, zdept, zrhh ) 
    1220       CALL wrk_dealloc( jpi,jpj, zsshu_n, zsshv_n ) 
     1289               ! 
     1290            END DO 
     1291         END DO 
     1292      END DO 
     1293      ! 
     1294      CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
     1295      CALL wrk_dealloc( jpi,jpj,jpk,   zdept, zrhh ) 
     1296      CALL wrk_dealloc( jpi,jpj,       zsshu_n, zsshv_n ) 
     1297      IF(ln_wd) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
    12211298      ! 
    12221299   END SUBROUTINE hpg_prj 
    12231300 
    12241301 
    1225    SUBROUTINE cspline(fsp, xsp, asp, bsp, csp, dsp, polynomial_type) 
     1302   SUBROUTINE cspline( fsp, xsp, asp, bsp, csp, dsp, polynomial_type ) 
    12261303      !!---------------------------------------------------------------------- 
    12271304      !!                 ***  ROUTINE cspline  *** 
     
    12331310      !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 
    12341311      !!---------------------------------------------------------------------- 
    1235       IMPLICIT NONE 
    1236       REAL(wp), DIMENSION(:,:,:), INTENT(in)  :: fsp, xsp           ! value and coordinate 
    1237       REAL(wp), DIMENSION(:,:,:), INTENT(out) :: asp, bsp, csp, dsp ! coefficients of 
    1238                                                                     ! the interpoated function 
    1239       INTEGER, INTENT(in) :: polynomial_type                        ! 1: cubic spline 
    1240                                                                     ! 2: Linear 
     1312      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   fsp, xsp           ! value and coordinate 
     1313      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function 
     1314      INTEGER                   , INTENT(in   ) ::   polynomial_type    ! 1: cubic spline   ;   2: Linear 
    12411315      ! 
    12421316      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
     
    12461320      REAL(wp) ::   zdf(size(fsp,3)) 
    12471321      !!---------------------------------------------------------------------- 
    1248  
     1322      ! 
     1323!!gm  WHAT !!!!!   THIS IS VERY DANGEROUS !!!!!   
    12491324      jpi   = size(fsp,1) 
    12501325      jpj   = size(fsp,2) 
    12511326      jpkm1 = size(fsp,3) - 1 
    1252  
    1253  
     1327      ! 
    12541328      IF (polynomial_type == 1) THEN     ! Constrained Cubic Spline 
    12551329         DO ji = 1, jpi 
     
    12841358 
    12851359               zdf(1)     = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / & 
    1286                           &          ( xsp(ji,jj,2) - xsp(ji,jj,1) ) -  0.5_wp * zdf(2) 
     1360                          &          ( xsp(ji,jj,2) - xsp(ji,jj,1) )           -  0.5_wp * zdf(2) 
    12871361               zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 
    1288                           &          ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - & 
    1289                           & 0.5_wp * zdf(jpkm1 - 1) 
     1362                          &          ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - 0.5_wp * zdf(jpkm1 - 1) 
    12901363 
    12911364               DO jk = 1, jpkm1 - 1 
     
    13101383         END DO 
    13111384 
    1312       ELSE IF (polynomial_type == 2) THEN     ! Linear 
     1385      ELSEIF ( polynomial_type == 2 ) THEN     ! Linear 
    13131386         DO ji = 1, jpi 
    13141387            DO jj = 1, jpj 
     
    13411414      !!                extrapolation is also permitted (no value limit) 
    13421415      !!---------------------------------------------------------------------- 
    1343       IMPLICIT NONE 
    13441416      REAL(wp), INTENT(in) ::  x, xl, xr, fl, fr 
    13451417      REAL(wp)             ::  f ! result of the interpolation (extrapolation) 
    13461418      REAL(wp)             ::  zdeltx 
    13471419      !!---------------------------------------------------------------------- 
    1348  
     1420      ! 
    13491421      zdeltx = xr - xl 
    1350       IF(abs(zdeltx) <= 10._wp * EPSILON(x)) THEN 
    1351         f = 0.5_wp * (fl + fr) 
     1422      IF( abs(zdeltx) <= 10._wp * EPSILON(x) ) THEN 
     1423         f = 0.5_wp * (fl + fr) 
    13521424      ELSE 
    1353         f = ( (x - xl ) * fr - ( x - xr ) * fl ) / zdeltx 
     1425         f = ( (x - xl ) * fr - ( x - xr ) * fl ) / zdeltx 
    13541426      ENDIF 
    1355  
     1427      ! 
    13561428   END FUNCTION interp1 
    13571429 
    13581430 
    1359    FUNCTION interp2(x, a, b, c, d)  RESULT(f) 
     1431   FUNCTION interp2( x, a, b, c, d )  RESULT(f) 
    13601432      !!---------------------------------------------------------------------- 
    13611433      !!                 ***  ROUTINE interp1  *** 
     
    13661438      !! 
    13671439      !!---------------------------------------------------------------------- 
    1368       IMPLICIT NONE 
    13691440      REAL(wp), INTENT(in) ::  x, a, b, c, d 
    13701441      REAL(wp)             ::  f ! value from the interpolation 
    13711442      !!---------------------------------------------------------------------- 
    1372  
     1443      ! 
    13731444      f = a + x* ( b + x * ( c + d * x ) ) 
    1374  
     1445      ! 
    13751446   END FUNCTION interp2 
    13761447 
    13771448 
    1378    FUNCTION interp3(x, a, b, c, d)  RESULT(f) 
     1449   FUNCTION interp3( x, a, b, c, d )  RESULT(f) 
    13791450      !!---------------------------------------------------------------------- 
    13801451      !!                 ***  ROUTINE interp1  *** 
     
    13861457      !! 
    13871458      !!---------------------------------------------------------------------- 
    1388       IMPLICIT NONE 
    13891459      REAL(wp), INTENT(in) ::  x, a, b, c, d 
    13901460      REAL(wp)             ::  f ! value from the interpolation 
    13911461      !!---------------------------------------------------------------------- 
    1392  
     1462      ! 
    13931463      f = b + x * ( 2._wp * c + 3._wp * d * x) 
    1394  
     1464      ! 
    13951465   END FUNCTION interp3 
    13961466 
    13971467 
    1398    FUNCTION integ_spline(xl, xr, a, b, c, d)  RESULT(f) 
     1468   FUNCTION integ_spline( xl, xr, a, b, c, d )  RESULT(f) 
    13991469      !!---------------------------------------------------------------------- 
    14001470      !!                 ***  ROUTINE interp1  *** 
     
    14051475      !! 
    14061476      !!---------------------------------------------------------------------- 
    1407       IMPLICIT NONE 
    14081477      REAL(wp), INTENT(in) ::  xl, xr, a, b, c, d 
    14091478      REAL(wp)             ::  za1, za2, za3 
    14101479      REAL(wp)             ::  f                   ! integration result 
    14111480      !!---------------------------------------------------------------------- 
    1412  
     1481      ! 
    14131482      za1 = 0.5_wp * b 
    14141483      za2 = c / 3.0_wp 
    14151484      za3 = 0.25_wp * d 
    1416  
     1485      ! 
    14171486      f  = xr * ( a + xr * ( za1 + xr * ( za2 + za3 * xr ) ) ) - & 
    14181487         & xl * ( a + xl * ( za1 + xl * ( za2 + za3 * xl ) ) ) 
    1419  
     1488      ! 
    14201489   END FUNCTION integ_spline 
    14211490 
Note: See TracChangeset for help on using the changeset viewer.