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 6004 for branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90 – NEMO

Ignore:
Timestamp:
2015-12-04T17:05:58+01:00 (9 years ago)
Author:
gm
Message:

#1613: vvl by default, step III: Merge with the trunk (free surface simplification) (see wiki)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r5866 r6004  
    3636   USE trd_oce         ! trends: ocean variables 
    3737   USE trddyn          ! trend manager: dynamics 
     38!jc   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
    3839   ! 
    3940   USE in_out_manager  ! I/O manager 
     
    5152   PUBLIC   dyn_hpg_init   ! routine called by opa module 
    5253 
    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 
     54   !                                 !!* Namelist namdyn_hpg : hydrostatic pressure gradient 
     55   LOGICAL , PUBLIC ::   ln_hpg_zco   !: z-coordinate - full steps 
     56   LOGICAL , PUBLIC ::   ln_hpg_zps   !: z-coordinate - partial steps (interpolation) 
     57   LOGICAL , PUBLIC ::   ln_hpg_sco   !: s-coordinate (standard jacobian formulation) 
     58   LOGICAL , PUBLIC ::   ln_hpg_djc   !: s-coordinate (Density Jacobian with Cubic polynomial) 
     59   LOGICAL , PUBLIC ::   ln_hpg_prj   !: s-coordinate (Pressure Jacobian scheme) 
     60   LOGICAL , PUBLIC ::   ln_hpg_isf   !: s-coordinate similar to sco modify for isf 
    6161 
    6262   INTEGER , PUBLIC ::   nhpg  =  0   ! = 0 to 7, type of pressure gradient scheme used ! (deduced from ln_hpg_... flags) (PUBLIC for TAM) 
     
    131131      !! 
    132132      NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco,     & 
    133          &                 ln_hpg_djc, ln_hpg_prj, ln_hpg_isf, ln_dynhpg_imp 
     133         &                 ln_hpg_djc, ln_hpg_prj, ln_hpg_isf 
    134134      !!---------------------------------------------------------------------- 
    135135      ! 
    136136      REWIND( numnam_ref )              ! Namelist namdyn_hpg in reference namelist : Hydrostatic pressure gradient 
    137137      READ  ( numnam_ref, namdyn_hpg, IOSTAT = ios, ERR = 901) 
    138 901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist', lwp ) 
    139  
     138901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist', lwp ) 
     139      ! 
    140140      REWIND( numnam_cfg )              ! Namelist namdyn_hpg in configuration namelist : Hydrostatic pressure gradient 
    141141      READ  ( numnam_cfg, namdyn_hpg, IOSTAT = ios, ERR = 902 ) 
    142 902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist', lwp ) 
     142902   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist', lwp ) 
    143143      IF(lwm) WRITE ( numond, namdyn_hpg ) 
    144144      ! 
     
    154154         WRITE(numout,*) '      s-coord. (Density Jacobian: Cubic polynomial)     ln_hpg_djc    = ', ln_hpg_djc 
    155155         WRITE(numout,*) '      s-coord. (Pressure Jacobian: Cubic polynomial)    ln_hpg_prj    = ', ln_hpg_prj 
    156          WRITE(numout,*) '      time stepping: centered (F) or semi-implicit (T)  ln_dynhpg_imp = ', ln_dynhpg_imp 
    157156      ENDIF 
    158157      ! 
     
    162161                           & either  ln_hpg_sco or  ln_hpg_prj instead') 
    163162      ! 
    164       IF( .NOT.ln_linssh .AND. .NOT. (ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )       & 
     163      IF( .NOT.ln_linssh .AND. .NOT.(ln_hpg_sco.OR.ln_hpg_prj.OR.ln_hpg_isf) )        & 
    165164         &   CALL ctl_stop('dyn_hpg_init : non-linear free surface requires either ', & 
    166165         &                 '   the standard jacobian formulation hpg_sco    or '    , & 
     
    219218      !!---------------------------------------------------------------------- 
    220219      ! 
    221       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
     220      CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    222221      ! 
    223222      IF( kt == nit000 ) THEN 
     
    250249               ! hydrostatic pressure gradient 
    251250               zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    252                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )   & 
     251                  &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
    253252                  &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    254253 
    255254               zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    256                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )   & 
     255                  &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
    257256                  &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    258257               ! add to the general momentum trend 
     
    263262      END DO 
    264263      ! 
    265       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
     264      CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    266265      ! 
    267266   END SUBROUTINE hpg_zco 
     
    284283      !!---------------------------------------------------------------------- 
    285284      ! 
    286       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
     285      CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    287286      ! 
    288287      IF( kt == nit000 ) THEN 
     
    292291      ENDIF 
    293292 
     293      ! Partial steps: bottom before horizontal gradient of t, s, rd at the last ocean level 
     294!jc      CALL zps_hde    ( kt, jpts, tsn, gtsu, gtsv, rhd, gru , grv ) 
    294295 
    295296      ! Local constant initialization 
     
    309310      END DO 
    310311 
    311  
    312312      ! interior value (2=<jk=<jpkm1) 
    313313      DO jk = 2, jpkm1 
     
    329329         END DO 
    330330      END DO 
    331  
    332331 
    333332      ! partial steps correction at the last level  (use gru & grv computed in zpshde.F90) 
     
    353352      END DO 
    354353      ! 
    355       CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
     354      CALL wrk_dealloc( jpi,jpj,jpk,   zhpi, zhpj ) 
    356355      ! 
    357356   END SUBROUTINE hpg_zps 
     357 
    358358 
    359359   SUBROUTINE hpg_sco( kt ) 
     
    389389         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, OPA original scheme used' 
    390390      ENDIF 
    391  
    392       ! Local constant initialization 
     391      ! 
    393392      zcoef0 = - grav * 0.5_wp 
    394       ! To use density and not density anomaly 
    395       IF ( .NOT.ln_linssh ) THEN   ;     znad = 1._wp          ! Variable volume 
    396       ELSE                         ;     znad = 0._wp         ! Fixed volume 
     393      IF ( ln_linssh ) THEN   ;   znad = 0._wp         ! Fixed    volume: density anomaly 
     394      ELSE                    ;   znad = 1._wp         ! Variable volume: density 
    397395      ENDIF 
    398  
     396      ! 
    399397      ! Surface value 
    400398      DO jj = 2, jpjm1 
    401399         DO ji = fs_2, fs_jpim1   ! vector opt. 
    402400            ! hydrostatic pressure gradient along s-surfaces 
    403             zhpi(ji,jj,1) = zcoef0 * r1_e1u(ji,jj) * (  e3w_n(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )  & 
    404                &                                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) 
    405             zhpj(ji,jj,1) = zcoef0 * r1_e2v(ji,jj) * (  e3w_n(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )  & 
    406                &                                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) 
     401            zhpi(ji,jj,1) = zcoef0 * (  e3w_n(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )    & 
     402               &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e1u(ji,jj) 
     403            zhpj(ji,jj,1) = zcoef0 * (  e3w_n(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )    & 
     404               &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e2v(ji,jj) 
    407405            ! s-coordinate pressure gradient correction 
    408406            zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     
    443441   END SUBROUTINE hpg_sco 
    444442 
     443 
    445444   SUBROUTINE hpg_isf( kt ) 
    446445      !!--------------------------------------------------------------------- 
     
    471470      !!---------------------------------------------------------------------- 
    472471      ! 
    473       CALL wrk_alloc( jpi,jpj, 2, ztstop)  
    474       CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj, zrhd) 
    475       CALL wrk_alloc( jpi,jpj, ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj)  
    476       ! 
    477      IF( kt == nit000 ) THEN 
     472      CALL wrk_alloc( jpi,jpj,  2,   ztstop )  
     473      CALL wrk_alloc( jpi,jpj,jpk,   zhpi, zhpj, zrhd) 
     474      CALL wrk_alloc( jpi,jpj,       ze3w, zp, zrhdtop_isf, zrhdtop_oce, ziceload, zdept, zpshpi, zpshpj )  
     475      ! 
     476      IF( kt == nit000 ) THEN 
    478477         IF(lwp) WRITE(numout,*) 
    479478         IF(lwp) WRITE(numout,*) 'dyn:hpg_isf : hydrostatic pressure gradient trend for ice shelf' 
    480479         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, OPA original scheme used' 
    481480      ENDIF 
    482  
    483       ! Local constant initialization 
     481      ! 
    484482      zcoef0 = - grav * 0.5_wp 
    485       ! To use density and not density anomaly 
    486 !      IF ( .NOT.ln_linssh ) THEN   ;     znad = 1._wp          ! Variable volume 
    487 !      ELSE                         ;     znad = 0._wp         ! Fixed volume 
    488 !      ENDIF 
    489       znad=1._wp 
    490       ! iniitialised to 0. zhpi zhpi  
    491       zhpi(:,:,:)=0._wp ; zhpj(:,:,:)=0._wp 
     483      IF( ln_linssh ) THEN   ;   znad = 0._wp      ! Fixed    volume: density anomaly 
     484      ELSE                   ;   znad = 1._wp      ! Variable volume: density 
     485      ENDIF 
     486      zhpi(:,:,:) = 0._wp 
     487      zhpj(:,:,:) = 0._wp 
    492488 
    493489!==================================================================================      
     
    496492 
    497493      ! assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
    498       ztstop(:,:,1)=-1.9_wp ; ztstop(:,:,2)=34.4_wp 
     494      ztstop(:,:,jp_tem) = -1.9_wp 
     495      ztstop(:,:,jp_sal) = 34.4_wp 
     496 
     497!!gm I have the feeling that a much simplier and faster computation can be performed... 
     498!!gm     ====>>>>   We have to discuss ! 
     499 
     500!!gm below, faster to compute the ISF density in zrhd and remplace rhd value where tmask=0 
     501!!gm        furthermore, this calculation does not depends on time :  do it at the first time-step only.... 
    499502 
    500503      ! compute density of the water displaced by the ice shelf  
    501       zrhd = rhd ! save rhd 
     504      zrhd(:,:,:) = rhd(:,:,:)    ! save rhd 
    502505      DO jk = 1, jpk 
    503            zdept(:,:)=gdept_1d(jk) 
    504            CALL eos(ztstop(:,:,:),zdept(:,:),rhd(:,:,jk)) 
    505       END DO 
    506       WHERE ( tmask(:,:,:) == 1._wp) 
     506         zdept(:,:) = gdept_1d(jk) 
     507         CALL eos( ztstop(:,:,:), zdept(:,:), rhd(:,:,jk) ) 
     508      END DO 
     509      WHERE( tmask(:,:,:) == 1._wp ) 
    507510        rhd(:,:,:) = zrhd(:,:,:) ! replace wet cell by the saved rhd 
    508511      END WHERE 
    509512       
    510513      ! compute rhd at the ice/oce interface (ice shelf side) 
    511       CALL eos(ztstop,risfdep,zrhdtop_isf) 
     514      CALL eos( ztstop, risfdep, zrhdtop_isf ) 
    512515 
    513516      ! compute rhd at the ice/oce interface (ocean side) 
    514       DO ji=1,jpi 
    515         DO jj=1,jpj 
    516           ikt=mikt(ji,jj) 
    517           ztstop(ji,jj,1)=tsn(ji,jj,ikt,1) 
    518           ztstop(ji,jj,2)=tsn(ji,jj,ikt,2) 
     517      DO ji = 1, jpi 
     518        DO jj = 1, jpj 
     519          ikt = mikt(ji,jj) 
     520          ztstop(ji,jj,jp_tem) = tsn(ji,jj,ikt,jp_tem) 
     521          ztstop(ji,jj,jp_sal) = tsn(ji,jj,ikt,jp_sal) 
    519522        END DO 
    520523      END DO 
    521       CALL eos(ztstop,risfdep,zrhdtop_oce) 
     524      CALL eos( ztstop, risfdep, zrhdtop_oce ) 
    522525      ! 
    523526      ! Surface value + ice shelf gradient 
     
    526529      DO jj = 1, jpj 
    527530         DO ji = 1, jpi   ! vector opt. 
    528             ikt=mikt(ji,jj) 
     531            ikt = mikt(ji,jj) 
    529532            ziceload(ji,jj) = ziceload(ji,jj) + (znad + rhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
    530             DO jk=2,ikt-1 
     533            DO jk = 2, ikt-1 
    531534               ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + rhd(ji,jj,jk-1) + rhd(ji,jj,jk)) * e3w_n(ji,jj,jk) & 
    532535                  &                              * (1._wp - tmask(ji,jj,jk)) 
    533536            END DO 
    534             IF (ikt .GE. 2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + rhd(ji,jj,ikt-1)) & 
    535                                &                              * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
    536          END DO 
    537       END DO 
    538       riceload(:,:) = 0.0_wp ; riceload(:,:)=ziceload(:,:)  ! need to be saved for diaar5 
     537            IF( ikt >= 2 )  ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + rhd(ji,jj,ikt-1)) & 
     538               &                                               * ( risfdep(ji,jj) - gdept_1d(ikt-1) ) 
     539         END DO 
     540      END DO 
     541      riceload(:,:) = 0._wp   ;   riceload(:,:) = ziceload(:,:)   ! need to be saved for diaar5 
    539542      ! compute zp from z=0 to first T wet point (correction due to zps not yet applied) 
    540543      DO jj = 2, jpjm1 
    541544         DO ji = fs_2, fs_jpim1   ! vector opt. 
    542             ikt=mikt(ji,jj) ; iktp1i=mikt(ji+1,jj); iktp1j=mikt(ji,jj+1) 
     545            ikt    = mikt(ji,jj) 
     546            iktp1i = mikt(ji+1,jj) 
     547            iktp1j = mikt(ji,jj+1) 
    543548            ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
    544549            ! we assume ISF is in isostatic equilibrium 
    545             zhpi(ji,jj,1) = zcoef0 * r1_e1u(ji,jj) * ( 0.5_wp * e3w_n(ji+1,jj  ,iktp1i)                                  & 
    546                &                                   * ( 2._wp * znad + rhd(ji+1,jj  ,iktp1i) + zrhdtop_oce(ji+1,jj  ) )   & 
    547                &                                   - 0.5_wp * e3w_n(ji  ,jj  ,ikt   )                                    & 
    548                &                                   * ( 2._wp * znad + rhd(ji  ,jj  ,ikt   ) + zrhdtop_oce(ji  ,jj  ) )   & 
    549                &                                   + ( ziceload(ji+1,jj) - ziceload(ji,jj) )                             )  
    550             zhpj(ji,jj,1) = zcoef0 * r1_e2v(ji,jj) * ( 0.5_wp * e3w_n(ji  ,jj+1,iktp1j)                                  & 
    551                &                                   * ( 2._wp * znad + rhd(ji  ,jj+1,iktp1j) + zrhdtop_oce(ji  ,jj+1) )   & 
    552                &                                   - 0.5_wp * e3w_n(ji  ,jj  ,ikt   )                                    &  
    553                &                                   * ( 2._wp * znad + rhd(ji  ,jj  ,ikt   ) + zrhdtop_oce(ji  ,jj  ) )   & 
    554                &                                   + ( ziceload(ji,jj+1) - ziceload(ji,jj) )                             )  
     550            zhpi(ji,jj,1) = zcoef0 * (                                    & 
     551               &            0.5_wp * e3w_n(ji+1,jj,iktp1i) * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
     552               &          - 0.5_wp * e3w_n(ji  ,jj,ikt   ) * ( 2._wp * znad + rhd(ji  ,jj,ikt   ) + zrhdtop_oce(ji  ,jj) )   & 
     553               &          + ( ziceload(ji+1,jj) - ziceload(ji,jj) )       ) * r1_e1u(ji,jj) 
     554            zhpj(ji,jj,1) = zcoef0 * (                                    & 
     555               &            0.5_wp * e3w_n(ji,jj+1,iktp1j) * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
     556               &          - 0.5_wp * e3w_n(ji,jj  ,ikt   ) * ( 2._wp * znad + rhd(ji,jj  ,ikt   ) + zrhdtop_oce(ji,jj  ) )   & 
     557               &          + ( ziceload(ji,jj+1) - ziceload(ji,jj) )       ) * r1_e2v(ji,jj) 
    555558            ! s-coordinate pressure gradient correction (=0 if z coordinate) 
    556559            zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     
    569572         DO ji = fs_2, fs_jpim1   ! vector opt. 
    570573            iku = miku(ji,jj) 
    571             zpshpi(ji,jj) = 0._wp   ;   zpshpj(ji,jj) = 0._wp 
     574            zpshpi(ji,jj) = 0._wp 
     575            zpshpj(ji,jj) = 0._wp 
    572576            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)) 
    573577            ! u direction 
    574             IF ( iku .GT. 1 ) THEN 
     578            IF( iku > 1 ) THEN 
    575579               ! case iku 
    576                zhpi(ji,jj,iku)   =  zcoef0 * r1_e1u(ji,jj) * ze3wu                                         & 
    577                       &                                 * ( rhd    (ji+1,jj,iku) + rhd   (ji,jj,iku)       & 
    578                       &                                   + SIGN(1._wp,ze3wu) * grui(ji,jj) + 2._wp * znad ) 
     580               zhpi(ji,jj,iku) = zcoef0 * r1_e1u(ji,jj) * ze3wu                             & 
     581                  &                     * ( rhd(ji+1,jj,iku) + rhd(ji,jj,iku)               & 
     582                  &                        + SIGN(1._wp,ze3wu) * grui(ji,jj) + 2._wp * znad ) 
    579583               ! corrective term ( = 0 if z coordinate ) 
    580                zuap              = -zcoef0 * ( arui(ji,jj) + 2._wp * znad ) * gzui(ji,jj) * r1_e1u(ji,jj) 
     584               zuap = -zcoef0 * ( arui(ji,jj) + 2._wp * znad ) * gzui(ji,jj) * r1_e1u(ji,jj) 
    581585               ! zhpi will be added in interior loop 
    582                ua(ji,jj,iku)     = ua(ji,jj,iku) + zuap 
     586               ua(ji,jj,iku) = ua(ji,jj,iku) + zuap 
    583587               ! in case of 2 cell water column, need to save the pressure gradient to compute the bottom pressure   
    584                IF (mbku(ji,jj) == iku + 1) zpshpi(ji,jj) = zhpi(ji,jj,iku) 
     588               IF( mbku(ji,jj) == iku + 1 )   zpshpi(ji,jj) = zhpi(ji,jj,iku) 
    585589 
    586590               ! case iku + 1 (remove the zphi term added in the interior loop and compute the one corrected for zps) 
    587                zhpiint        =  zcoef0 * r1_e1u(ji,jj)                                                               &     
    588                   &           * (  e3w_n(ji+1,jj  ,iku+1) * ( (rhd(ji+1,jj,iku+1) + znad)                          & 
    589                   &                                         + (rhd(ji+1,jj,iku  ) + znad) ) * tmask(ji+1,jj,iku)   & 
    590                   &              - e3w_n(ji  ,jj  ,iku+1) * ( (rhd(ji  ,jj,iku+1) + znad)                          & 
    591                   &                                         + (rhd(ji  ,jj,iku  ) + znad) ) * tmask(ji  ,jj,iku)   ) 
    592                zhpi(ji,jj,iku+1) =  zcoef0 * r1_e1u(ji,jj) * ge3rui(ji,jj) - zhpiint  
     591               zhpiint = zcoef0 * r1_e1u(ji,jj)                                                              &     
     592                  &    * (  e3w_n(ji+1,jj  ,iku+1) * ( (rhd(ji+1,jj,iku+1) + znad)                          & 
     593                  &                                   + (rhd(ji+1,jj,iku  ) + znad) ) * tmask(ji+1,jj,iku)   & 
     594                  &       - e3w_n(ji  ,jj  ,iku+1) * ( (rhd(ji  ,jj,iku+1) + znad)                          & 
     595                  &                                   + (rhd(ji  ,jj,iku  ) + znad) ) * tmask(ji  ,jj,iku)   ) 
     596               zhpi(ji,jj,iku+1) = zcoef0 * r1_e1u(ji,jj) * ge3rui(ji,jj) - zhpiint  
    593597            END IF 
    594598                
     
    596600            ikv = mikv(ji,jj) 
    597601            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)) 
    598             IF ( ikv .GT. 1 ) THEN 
     602            IF( ikv > 1 ) THEN 
    599603               ! case ikv 
    600                zhpj(ji,jj,ikv)   =  zcoef0 * r1_e2v(ji,jj) * ze3wv                                            & 
    601                      &                                     * ( rhd(ji,jj+1,ikv) + rhd   (ji,jj,ikv)           & 
    602                      &                                       + SIGN(1._wp,ze3wv) * grvi(ji,jj) + 2._wp * znad ) 
     604               zhpj(ji,jj,ikv) =  zcoef0 * r1_e2v(ji,jj) * ze3wv                             & 
     605                  &                      * ( rhd(ji,jj+1,ikv) + rhd(ji,jj,ikv)               & 
     606                  &                         + SIGN(1._wp,ze3wv) * grvi(ji,jj) + 2._wp * znad ) 
    603607               ! corrective term ( = 0 if z coordinate ) 
    604                zvap              = -zcoef0 * ( arvi(ji,jj) + 2._wp * znad ) * gzvi(ji,jj) * r1_e2v(ji,jj) 
     608               zvap = -zcoef0 * ( arvi(ji,jj) + 2._wp * znad ) * gzvi(ji,jj) * r1_e2v(ji,jj) 
    605609               ! zhpi will be added in interior loop 
    606                va(ji,jj,ikv)      = va(ji,jj,ikv) + zvap 
     610               va(ji,jj,ikv) = va(ji,jj,ikv) + zvap 
    607611               ! in case of 2 cell water column, need to save the pressure gradient to compute the bottom pressure   
    608                IF (mbkv(ji,jj) == ikv + 1)  zpshpj(ji,jj)  = zhpj(ji,jj,ikv)  
     612               IF( mbkv(ji,jj) == ikv + 1 )   zpshpj(ji,jj) = zhpj(ji,jj,ikv)  
    609613                
    610614               ! case ikv + 1 (remove the zphj term added in the interior loop and compute the one corrected for zps) 
    611                zhpjint        =  zcoef0 * r1_e2v(ji,jj)                                                           & 
    612                   &           * (  e3w_n(ji  ,jj+1,ikv+1) * ( (rhd(ji,jj+1,ikv+1) + znad)                         & 
    613                   &                                       + (rhd(ji,jj+1,ikv  ) + znad) ) * tmask(ji,jj+1,ikv)    & 
    614                   &              - e3w_n(ji  ,jj  ,ikv+1) * ( (rhd(ji,jj  ,ikv+1) + znad)                         & 
    615                   &                                       + (rhd(ji,jj  ,ikv  ) + znad) ) * tmask(ji,jj  ,ikv)  ) 
     615               zhpjint =  zcoef0 * r1_e2v(ji,jj)                                                            & 
     616                  &    * (  e3w_n(ji  ,jj+1,ikv+1) * ( (rhd(ji,jj+1,ikv+1) + znad)                         & 
     617                  &                                   + (rhd(ji,jj+1,ikv  ) + znad) ) * tmask(ji,jj+1,ikv)  & 
     618                  &       - e3w_n(ji  ,jj  ,ikv+1) * ( (rhd(ji,jj  ,ikv+1) + znad)                         & 
     619                  &                                   + (rhd(ji,jj  ,ikv  ) + znad) ) * tmask(ji,jj  ,ikv)  ) 
    616620               zhpj(ji,jj,ikv+1) =  zcoef0 * r1_e2v(ji,jj) * ge3rvi(ji,jj) - zhpjint 
    617             END IF 
     621            ENDIF 
    618622         END DO 
    619623      END DO 
     
    969973      ! Local constant initialization 
    970974      zcoef0 = - grav 
    971       znad = 0.0_wp 
    972       IF( .NOT.ln_linssh )   znad = 1._wp 
     975      znad = 1._wp 
     976      IF( ln_linssh )   znad = 0._wp 
    973977 
    974978      ! Clean 3-D work arrays 
     
    12031207               zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
    12041208               IF( .NOT.ln_linssh ) THEN 
    1205                    zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
    1206                            ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
     1209                  zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
     1210                          ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
    12071211               ELSE 
    1208                    zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
     1212                  zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
    12091213               ENDIF 
    12101214!!gm  Since vmask(:,jj,:) = tmask(:,jj,:) * tmask(:,jj+1,:)  by definition 
     
    12341238      !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 
    12351239      !!---------------------------------------------------------------------- 
    1236       IMPLICIT NONE 
    1237       REAL(wp), DIMENSION(:,:,:), INTENT(in)  :: fsp, xsp           ! value and coordinate 
    1238       REAL(wp), DIMENSION(:,:,:), INTENT(out) :: asp, bsp, csp, dsp ! coefficients of 
    1239                                                                     ! the interpoated function 
    1240       INTEGER, INTENT(in) :: polynomial_type                        ! 1: cubic spline 
    1241                                                                     ! 2: Linear 
     1240      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   fsp, xsp           ! value and coordinate 
     1241      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function 
     1242      INTEGER                   , INTENT(in   ) ::   polynomial_type    ! 1: cubic spline   ;   2: Linear 
    12421243      ! 
    12431244      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
Note: See TracChangeset for help on using the changeset viewer.