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 13935 for NEMO/branches – NEMO

Changeset 13935 for NEMO/branches


Ignore:
Timestamp:
2020-12-01T13:21:25+01:00 (3 years ago)
Author:
ayoung
Message:

Merging changes from KERNEL08 (spg calculation changes) into KERNEL01 (new djc code). See tickets #2480 and #2506.

Location:
NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/NST/agrif_oce_update.F90

    r13286 r13935  
    886886      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
    887887      LOGICAL                         , INTENT(in   ) ::   before 
     888      !! 
     889      REAL(wp), DIMENSION(jpi,jpj) ::   zpgu   ! 2D workspace 
    888890      !!  
    889891      INTEGER  :: ji, jj, jk 
     
    905907               !     
    906908               ! Update "now" 3d velocities: 
    907                spgu(ji,jj) = 0._wp 
     909               zpgu(ji,jj) = 0._wp 
    908910               DO jk=1,jpkm1 
    909                   spgu(ji,jj) = spgu(ji,jj) + e3u(ji,jj,jk,Kmm_a) * uu(ji,jj,jk,Kmm_a) 
     911                  zpgu(ji,jj) = zpgu(ji,jj) + e3u(ji,jj,jk,Kmm_a) * uu(ji,jj,jk,Kmm_a) 
    910912               END DO 
    911913               ! 
    912                zcorr = (tabres(ji,jj) - spgu(ji,jj)) * r1_hu(ji,jj,Kmm_a) 
     914               zcorr = (tabres(ji,jj) - zpgu(ji,jj)) * r1_hu(ji,jj,Kmm_a) 
    913915               DO jk=1,jpkm1               
    914916                  uu(ji,jj,jk,Kmm_a) = uu(ji,jj,jk,Kmm_a) + zcorr * umask(ji,jj,jk)            
     
    925927               !        
    926928               ! Correct "before" velocities to hold correct bt component: 
    927                spgu(ji,jj) = 0.e0 
     929               zpgu(ji,jj) = 0.e0 
    928930               DO jk=1,jpkm1 
    929                   spgu(ji,jj) = spgu(ji,jj) + e3u(ji,jj,jk,Kbb_a) * uu(ji,jj,jk,Kbb_a) 
     931                  zpgu(ji,jj) = zpgu(ji,jj) + e3u(ji,jj,jk,Kbb_a) * uu(ji,jj,jk,Kbb_a) 
    930932               END DO 
    931933               ! 
    932                zcorr = uu_b(ji,jj,Kbb_a) - spgu(ji,jj) * r1_hu(ji,jj,Kbb_a) 
     934               zcorr = uu_b(ji,jj,Kbb_a) - zpgu(ji,jj) * r1_hu(ji,jj,Kbb_a) 
    933935               DO jk=1,jpkm1               
    934936                  uu(ji,jj,jk,Kbb_a) = uu(ji,jj,jk,Kbb_a) + zcorr * umask(ji,jj,jk)            
     
    953955      REAL(wp), DIMENSION(i1:i2,j1:j2), INTENT(inout) ::   tabres 
    954956      LOGICAL                         , INTENT(in   ) ::   before 
     957      ! 
     958      REAL(wp), DIMENSION(jpi,jpj) ::   zpgv   ! 2D workspace 
    955959      !  
    956960      INTEGER  :: ji, jj, jk 
     
    971975               !     
    972976               ! Update "now" 3d velocities: 
    973                spgv(ji,jj) = 0.e0 
     977               zpgv(ji,jj) = 0.e0 
    974978               DO jk=1,jpkm1 
    975                   spgv(ji,jj) = spgv(ji,jj) + e3v(ji,jj,jk,Kmm_a) * vv(ji,jj,jk,Kmm_a) 
     979                  zpgv(ji,jj) = zpgv(ji,jj) + e3v(ji,jj,jk,Kmm_a) * vv(ji,jj,jk,Kmm_a) 
    976980               END DO 
    977981               ! 
    978                zcorr = (tabres(ji,jj) - spgv(ji,jj)) * r1_hv(ji,jj,Kmm_a) 
     982               zcorr = (tabres(ji,jj) - zpgv(ji,jj)) * r1_hv(ji,jj,Kmm_a) 
    979983               DO jk=1,jpkm1               
    980984                  vv(ji,jj,jk,Kmm_a) = vv(ji,jj,jk,Kmm_a) + zcorr * vmask(ji,jj,jk)            
     
    991995               !        
    992996               ! Correct "before" velocities to hold correct bt component: 
    993                spgv(ji,jj) = 0.e0 
     997               zpgv(ji,jj) = 0.e0 
    994998               DO jk=1,jpkm1 
    995                   spgv(ji,jj) = spgv(ji,jj) + e3v(ji,jj,jk,Kbb_a) * vv(ji,jj,jk,Kbb_a) 
     999                  zpgv(ji,jj) = zpgv(ji,jj) + e3v(ji,jj,jk,Kbb_a) * vv(ji,jj,jk,Kbb_a) 
    9961000               END DO 
    9971001               ! 
    998                zcorr = vv_b(ji,jj,Kbb_a) - spgv(ji,jj) * r1_hv(ji,jj,Kbb_a) 
     1002               zcorr = vv_b(ji,jj,Kbb_a) - zpgv(ji,jj) * r1_hv(ji,jj,Kbb_a) 
    9991003               DO jk=1,jpkm1               
    10001004                  vv(ji,jj,jk,Kbb_a) = vv(ji,jj,jk,Kbb_a) + zcorr * vmask(ji,jj,jk)            
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/DYN/dynhpg.F90

    r13889 r13935  
    154154      !! 
    155155      INTEGER  ::   ji, jj, jk, ikt    ! dummy loop indices      ISF 
    156       REAL(wp) ::   znad 
    157156      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  zts_top, zrhd   ! hypothesys on isf density 
    158157      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::  zrhdtop_isf    ! density at bottom of ISF 
     
    265264      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    266265      REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars 
    267       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zhpi, zhpj 
     266      REAL(wp), DIMENSION(jpi,jpj) ::  zhpi, zhpj 
    268267      !!---------------------------------------------------------------------- 
    269268      ! 
     
    273272         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   z-coordinate case ' 
    274273      ENDIF 
    275  
    276       zcoef0 = - grav * 0.5_wp      ! Local constant initialization 
    277  
    278       ! Surface value 
    279       DO_2D( 0, 0, 0, 0 ) 
     274      ! 
     275      zcoef0 = - grav * 0.5_wp            ! Local constant initialization 
     276      ! 
     277      DO_2D( 0, 0, 0, 0 )                 ! Surface value 
    280278         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 
    281          ! hydrostatic pressure gradient 
    282          zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
    283          zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    284          ! add to the general momentum trend 
    285          puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
    286          pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     279         !                                   ! hydrostatic pressure gradient 
     280         zhpi(ji,jj) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     281         zhpj(ji,jj) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
     282         !                                   ! add to the general momentum trend 
     283         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj) 
     284         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj) 
    287285      END_2D 
    288  
    289       ! 
    290       ! interior value (2=<jk=<jpkm1) 
    291       DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     286      ! 
     287      DO_3D( 0, 0, 0, 0, 2, jpkm1 )        ! interior value (2=<jk=<jpkm1) 
    292288         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 
    293          ! hydrostatic pressure gradient 
    294          zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    295             &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
    296             &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    297  
    298          zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    299             &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
    300             &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    301          ! add to the general momentum trend 
    302          puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
    303          pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     289         !                                   ! hydrostatic pressure gradient 
     290         zhpi(ji,jj) = zhpi(ji,jj) + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )  & 
     291            &                                  - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     292 
     293         zhpj(ji,jj) = zhpj(ji,jj) + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )  & 
     294            &                                  - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
     295         !                                   ! add to the general momentum trend 
     296         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj) 
     297         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj) 
    304298      END_3D 
    305299      ! 
     
    410404      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    411405      !! 
    412       INTEGER  ::   ji, jj, jk, jii, jjj                 ! dummy loop indices 
    413       REAL(wp) ::   zcoef0, zuap, zvap, znad, ztmp       ! temporary scalars 
    414       LOGICAL  ::   ll_tmp1, ll_tmp2                     ! local logical variables 
     406      INTEGER  ::   ji, jj, jk, jii, jjj           ! dummy loop indices 
     407      REAL(wp) ::   zcoef0, zuap, zvap, ztmp       ! local scalars 
     408      LOGICAL  ::   ll_tmp1, ll_tmp2               ! local logical variables 
    415409      REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   zhpi, zhpj 
    416410      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
     
    426420      ! 
    427421      zcoef0 = - grav * 0.5_wp 
    428       IF ( ln_linssh ) THEN   ;   znad = 0._wp         ! Fixed    volume: density anomaly 
    429       ELSE                    ;   znad = 1._wp         ! Variable volume: density 
    430       ENDIF 
    431422      ! 
    432423      IF( ln_wd_il ) THEN 
     
    470461        CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    471462      END IF 
    472  
    473       ! Surface value 
    474       DO_2D( 0, 0, 0, 0 ) 
    475          ! hydrostatic pressure gradient along s-surfaces 
    476          zhpi(ji,jj,1) =   & 
    477             &  zcoef0 * (  e3w(ji+1,jj  ,1,Kmm) * ( znad + rhd(ji+1,jj  ,1) )    & 
    478             &            - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) & 
    479             &           * r1_e1u(ji,jj) 
    480          zhpj(ji,jj,1) =   & 
    481             &  zcoef0 * (  e3w(ji  ,jj+1,1,Kmm) * ( znad + rhd(ji  ,jj+1,1) )    & 
    482             &            - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) & 
    483             &           * r1_e2v(ji,jj) 
    484          ! s-coordinate pressure gradient correction 
    485          zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     463      ! 
     464      DO_2D( 0, 0, 0, 0 )              ! Surface value 
     465         !                                   ! hydrostatic pressure gradient along s-surfaces 
     466         zhpi(ji,jj,1) = zcoef0 * r1_e1u(ji,jj)                      & 
     467            &          * (  e3w(ji+1,jj  ,1,Kmm) * rhd(ji+1,jj  ,1)  & 
     468            &             - e3w(ji  ,jj  ,1,Kmm) * rhd(ji  ,jj  ,1)  ) 
     469         zhpj(ji,jj,1) = zcoef0 * r1_e2v(ji,jj)                      & 
     470            &          * (  e3w(ji  ,jj+1,1,Kmm) * rhd(ji  ,jj+1,1)  & 
     471            &             - e3w(ji  ,jj  ,1,Kmm) * rhd(ji  ,jj  ,1)  ) 
     472         !                                   ! s-coordinate pressure gradient correction 
     473         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) )   & 
    486474            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
    487          zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     475         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) )   & 
    488476            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
    489477         ! 
     
    494482            zvap = zvap * zcpy(ji,jj) 
    495483         ENDIF 
    496          ! 
    497          ! add to the general momentum trend 
     484         !                                   ! add to the general momentum trend 
    498485         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) + zuap 
    499486         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) + zvap 
    500487      END_2D 
    501  
    502       ! interior value (2=<jk=<jpkm1) 
    503       DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    504          ! hydrostatic pressure gradient along s-surfaces 
    505          zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
    506             &           * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
    507             &              - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
    508          zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
    509             &           * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
    510             &              - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
    511          ! s-coordinate pressure gradient correction 
    512          zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     488      ! 
     489      DO_3D( 0, 0, 0, 0, 2, jpkm1 )    ! interior value (2=<jk=<jpkm1) 
     490         !                                   ! hydrostatic pressure gradient along s-surfaces 
     491         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)                         & 
     492            &           * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )  & 
     493            &              - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) 
     494         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)                         & 
     495            &           * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )  & 
     496            &              - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) 
     497         !                                   ! s-coordinate pressure gradient correction 
     498         zuap = -zcoef0 * ( rhd  (ji+1,jj  ,jk) + rhd  (ji,jj,jk) ) & 
    513499            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) * r1_e1u(ji,jj) 
    514          zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )  & 
     500         zvap = -zcoef0 * ( rhd  (ji  ,jj+1,jk) + rhd  (ji,jj,jk) ) & 
    515501            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) * r1_e2v(ji,jj) 
    516502         ! 
     
    555541      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    556542      !! 
    557       INTEGER  ::   ji, jj, jk, ikt, iktp1i, iktp1j   ! dummy loop indices 
    558       REAL(wp) ::   zcoef0, zuap, zvap, znad          ! temporary scalars 
     543      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
     544      INTEGER  ::   ikt ,  ikti1,  iktj1   ! local integer 
     545      REAL(wp) ::   ze3w, ze3wi1, ze3wj1   ! local scalars 
     546      REAL(wp) ::   zcoef0, zuap, zvap     !   -      - 
    559547      REAL(wp), DIMENSION(jpi,jpj,jpk ) ::  zhpi, zhpj 
    560548      REAL(wp), DIMENSION(jpi,jpj,jpts) ::  zts_top 
     
    563551      ! 
    564552      zcoef0 = - grav * 0.5_wp   ! Local constant initialization 
    565       ! 
    566       znad=1._wp                 ! To use density and not density anomaly 
    567553      ! 
    568554      !                          ! iniitialised to 0. zhpi zhpi  
     
    580566      CALL eos( zts_top, risfdep, zrhdtop_oce ) 
    581567 
    582 !==================================================================================      
    583 !===== Compute surface value =====================================================  
    584 !================================================================================== 
     568      !                     !===========================! 
     569      !                     !=====  surface value  =====! 
     570      !                     !===========================! 
    585571      DO_2D( 0, 0, 0, 0 ) 
    586          ikt    = mikt(ji,jj) 
    587          iktp1i = mikt(ji+1,jj) 
    588          iktp1j = mikt(ji,jj+1) 
    589          ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
    590          ! we assume ISF is in isostatic equilibrium 
    591          zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w(ji+1,jj,iktp1i,Kmm)                                    & 
    592             &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
    593             &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         & 
    594             &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    595             &                                  + ( risfload(ji+1,jj) - risfload(ji,jj))                            )  
    596          zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w(ji,jj+1,iktp1j,Kmm)                                    & 
    597             &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
    598             &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         &  
    599             &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    600             &                                  + ( risfload(ji,jj+1) - risfload(ji,jj))                            )  
    601          ! s-coordinate pressure gradient correction (=0 if z coordinate) 
    602          zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     572         ikt   = mikt(ji  ,jj  )   ;   ze3w   = e3w(ji  ,jj  ,ikt  ,Kmm) 
     573         ikti1 = mikt(ji+1,jj  )   ;   ze3wi1 = e3w(ji+1,jj  ,ikti1,Kmm) 
     574         iktj1 = mikt(ji  ,jj+1)   ;   ze3wj1 = e3w(ji  ,jj+1,iktj1,Kmm) 
     575         !                          ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
     576         !                          ! we assume ISF is in isostatic equilibrium 
     577         zhpi(ji,jj,1) = zcoef0 * r1_e1u(ji,jj) * (   risfload(ji+1,jj) - risfload(ji,jj)  & 
     578            &                                       + 0.5_wp * ( ze3wi1 * ( rhd(ji+1,jj,ikti1) + zrhdtop_oce(ji+1,jj) )     & 
     579            &                                                  - ze3w   * ( rhd(ji  ,jj,ikt  ) + zrhdtop_oce(ji  ,jj) ) )   ) 
     580         zhpj(ji,jj,1) = zcoef0 * r1_e2v(ji,jj) * (   risfload(ji,jj+1) - risfload(ji,jj)  & 
     581            &                                       + 0.5_wp * ( ze3wj1 * ( rhd(ji,jj+1,iktj1) + zrhdtop_oce(ji,jj+1) )      & 
     582            &                                                  - ze3w   * ( rhd(ji,jj  ,ikt  ) + zrhdtop_oce(ji,jj  ) ) )   )  
     583         !                          ! s-coordinate pressure gradient correction (=0 if z coordinate) 
     584         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) )   & 
    603585            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
    604          zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     586         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) )   & 
    605587            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
    606          ! add to the general momentum trend 
     588         !                          ! add to the general momentum trend 
    607589         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
    608590         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
    609591      END_2D 
    610 !==================================================================================      
    611 !===== Compute interior value =====================================================  
    612 !================================================================================== 
    613       ! interior value (2=<jk=<jpkm1) 
     592      !    
     593      !                     !=============================! 
     594      !                     !=====  interior values  =====! 
     595      !                     !=============================! 
    614596      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    615          ! hydrostatic pressure gradient along s-surfaces 
     597         ze3w   = e3w(ji  ,jj  ,jk,Kmm) 
     598         ze3wi1 = e3w(ji+1,jj  ,jk,Kmm) 
     599         ze3wj1 = e3w(ji  ,jj+1,jk,Kmm) 
     600         !                          ! hydrostatic pressure gradient along s-surfaces 
    616601         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
    617             &           * (  e3w(ji+1,jj,jk,Kmm)                   & 
    618             &                  * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
    619             &              - e3w(ji  ,jj,jk,Kmm)                   & 
    620             &                  * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
     602            &           * (  ze3wi1 * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) ) * wmask(ji+1,jj,jk)   & 
     603            &              - ze3w   * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) ) * wmask(ji  ,jj,jk)   ) 
    621604         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
    622             &           * (  e3w(ji,jj+1,jk,Kmm)                   & 
    623             &                  * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
    624             &              - e3w(ji,jj  ,jk,Kmm)                   & 
    625             &                  * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
    626          ! s-coordinate pressure gradient correction 
    627          zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     605            &           * (  ze3wj1 * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) ) * wmask(ji,jj+1,jk)   & 
     606            &              - ze3w   * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) ) * wmask(ji,jj  ,jk)   ) 
     607         !                          ! s-coordinate pressure gradient correction 
     608         zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) )   & 
    628609            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) / e1u(ji,jj) 
    629          zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     610         zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) )   & 
    630611            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) / e2v(ji,jj) 
    631          ! add to the general momentum trend 
     612         !                          ! add to the general momentum trend 
    632613         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
    633614         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
     
    657638      LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables 
    658639      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zhpj 
    659       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   rhd_opt 
    660640  
    661641      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdzx, zdzy, zdzz                          ! Primitive grid differences ('delta_xyz') 
     
    720700      z1_12  = 1.0_wp / 12._wp 
    721701 
    722  
    723 !! To be removed once combined with KERNEL08.  KERNEL08 action removes znad from the hpg module, spg is calculated in spg moduel instead.  The final code will just have rhd(:,:,:), no rhd_opt(:,:,:) 
    724       IF( .NOT. ln_linssh ) THEN 
    725          rhd_opt(:,:,:) = rhd(:,:,:) + 1.0_wp ! for vvl option 
    726       ELSE 
    727          rhd_opt(:,:,:) = rhd(:,:,:) 
    728       END IF 
    729  
    730702      !---------------------------------------------------------------------------------------- 
    731703      !  1. compute and store elementary vertical differences in provisional arrays  
     
    735707 
    736708      DO_3D( 1, 1, 1, 1, 2, jpkm1 )   
    737          zdrhoz(ji,jj,jk) =   rhd_opt    (ji  ,jj  ,jk) - rhd_opt    (ji,jj,jk-1) 
     709         zdrhoz(ji,jj,jk) =   rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
    738710         zdzz  (ji,jj,jk) = - gde3w(ji  ,jj  ,jk) + gde3w(ji,jj,jk-1) 
    739711      END_3D 
     
    762734 
    763735! mb for sea-ice shelves we will need to re-write this upper boundary condition in the same form as the lower boundary condition 
    764       zdrho_k(:,:,1) = aco_bc_vrt * ( rhd_opt    (:,:,2) - rhd_opt    (:,:,1) ) - bco_bc_vrt * zdrho_k(:,:,2) 
     736      zdrho_k(:,:,1) = aco_bc_vrt * ( rhd    (:,:,2) - rhd    (:,:,1) ) - bco_bc_vrt * zdrho_k(:,:,2) 
    765737      zdz_k  (:,:,1) = aco_bc_vrt * (-gde3w(:,:,2) + gde3w(:,:,1) ) - bco_bc_vrt * zdz_k  (:,:,2) 
    766738 
     
    768740         IF ( mbkt(ji,jj)>1 ) THEN 
    769741            iktb = mbkt(ji,jj) 
    770             zdrho_k(ji,jj,iktb) = aco_bc_vrt * (     rhd_opt(ji,jj,iktb) -     rhd_opt(ji,jj,iktb-1) ) - bco_bc_vrt * zdrho_k(ji,jj,iktb-1) 
     742            zdrho_k(ji,jj,iktb) = aco_bc_vrt * (     rhd(ji,jj,iktb) -     rhd(ji,jj,iktb-1) ) - bco_bc_vrt * zdrho_k(ji,jj,iktb-1) 
    771743            zdz_k  (ji,jj,iktb) = aco_bc_vrt * (-gde3w(ji,jj,iktb) + gde3w(ji,jj,iktb-1) ) - bco_bc_vrt * zdz_k  (ji,jj,iktb-1)  
    772744         END IF 
     
    786758      DO_2D( 0, 1, 0, 1) 
    787759         z_rho_k(ji,jj,1) =  grav * ( ssh(ji,jj,Kmm) + gde3w(ji,jj,1) )                        &  
    788             &                     * (  rhd_opt(ji,jj,1)                                        & 
    789             &                     + 0.5_wp * (   rhd_opt    (ji,jj,2) - rhd_opt    (ji,jj,1) ) & 
     760            &                     * (  rhd(ji,jj,1)                                        & 
     761            &                     + 0.5_wp * (   rhd    (ji,jj,2) - rhd    (ji,jj,1) ) & 
    790762            &                              * (   ssh   (ji,jj,Kmm) + gde3w(ji,jj,1) )          & 
    791763            &                              / ( - gde3w(ji,jj,2) + gde3w(ji,jj,1) )  ) 
     
    797769 
    798770      DO_3D( 0, 1, 0, 1, 2, jpkm1 ) 
    799          z_rho_k(ji,jj,jk) = zcoef0 * (   rhd_opt    (ji,jj,jk) + rhd_opt    (ji,jj,jk-1) )                                   & 
     771         z_rho_k(ji,jj,jk) = zcoef0 * (   rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
    800772            &                       * ( - gde3w(ji,jj,jk) + gde3w(ji,jj,jk-1) )                                               & 
    801773            &                       + z_grav_10 * (                                                                           & 
     
    803775            &   * ( - gde3w(ji,jj,jk) + gde3w(ji,jj,jk-1) - z1_12 * ( zdz_k  (ji,jj,jk) + zdz_k  (ji,jj,jk-1) ) )             & 
    804776            &   - ( zdz_k    (ji,jj,jk) - zdz_k    (ji,jj,jk-1) )                                                             & 
    805             &   * ( rhd_opt    (ji,jj,jk) - rhd_opt    (ji,jj,jk-1) - z1_12 * ( zdrho_k(ji,jj,jk) + zdrho_k(ji,jj,jk-1) ) )   & 
     777            &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( zdrho_k(ji,jj,jk) + zdrho_k(ji,jj,jk-1) ) )   & 
    806778            &                             ) 
    807779      END_3D 
     
    812784 
    813785      DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    814          zdrhox(ji,jj,jk) =   rhd_opt    (ji+1,jj  ,jk) - rhd_opt    (ji,jj,jk  ) 
     786         zdrhox(ji,jj,jk) =   rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
    815787         zdzx  (ji,jj,jk) = - gde3w(ji+1,jj  ,jk) + gde3w(ji,jj,jk  ) 
    816          zdrhoy(ji,jj,jk) =   rhd_opt    (ji  ,jj+1,jk) - rhd_opt    (ji,jj,jk  ) 
     788         zdrhoy(ji,jj,jk) =   rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
    817789         zdzy  (ji,jj,jk) = - gde3w(ji  ,jj+1,jk) + gde3w(ji,jj,jk  ) 
    818790      END_3D 
     
    869841            IF (ji < jpi) THEN 
    870842               IF ( umask(ji,jj,jk) > 0.5_wp .AND. umask(ji-1,jj,jk) < 0.5_wp .AND. umask(ji+1,jj,jk) > 0.5_wp)  THEN   
    871                   zz_drho_i(ji,jj) = aco_bc_hor * ( rhd_opt    (ji+1,jj,jk) - rhd_opt    (ji,jj,jk) ) - bco_bc_hor * zdrho_i(ji+1,jj,jk)  
     843                  zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_i(ji+1,jj,jk)  
    872844                  zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_i  (ji+1,jj,jk) 
    873845               END IF 
     
    876848            IF (ji > 2) THEN 
    877849               IF ( umask(ji,jj,jk) < 0.5_wp .AND. umask(ji-1,jj,jk) > 0.5_wp .AND. umask(ji-2,jj,jk) > 0.5_wp) THEN 
    878                   zz_drho_i(ji,jj) = aco_bc_hor * ( rhd_opt    (ji,jj,jk) - rhd_opt    (ji-1,jj,jk) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk)   
     850                  zz_drho_i(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji-1,jj,jk) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk)   
    879851                  zz_dz_i  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji-1,jj,jk) ) - bco_bc_hor * zdz_i  (ji-1,jj,jk) 
    880852               END IF 
     
    883855            IF (jj < jpj) THEN 
    884856               IF ( vmask(ji,jj,jk) > 0.5_wp .AND. vmask(ji,jj-1,jk) < 0.5_wp .AND. vmask(ji,jj+1,jk) > 0.5_wp)  THEN 
    885                   zz_drho_j(ji,jj) = aco_bc_hor * ( rhd_opt    (ji,jj+1,jk) - rhd_opt    (ji,jj,jk) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk) 
     857                  zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk) 
    886858                  zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_j  (ji,jj+1,jk) 
    887859               END IF 
     
    890862            IF (jj > 2) THEN 
    891863               IF ( vmask(ji,jj,jk) < 0.5_wp .AND. vmask(ji,jj-1,jk) > 0.5_wp .AND. vmask(ji,jj-2,jk) > 0.5_wp) THEN  
    892                   zz_drho_j(ji,jj) = aco_bc_hor * ( rhd_opt    (ji,jj,jk) - rhd_opt    (ji,jj-1,jk) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk)  
     864                  zz_drho_j(ji,jj) = aco_bc_hor * ( rhd    (ji,jj,jk) - rhd    (ji,jj-1,jk) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk)  
    893865                  zz_dz_j  (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji,jj-1,jk) ) - bco_bc_hor * zdz_j  (ji,jj-1,jk) 
    894866               END IF 
     
    907879      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    908880! two -ve signs cancel in next two lines (within zcoef0 and because gde3w is a depth not a height) 
    909          z_rho_i(ji,jj,jk) = zcoef0 * ( rhd_opt    (ji+1,jj,jk) + rhd_opt    (ji,jj,jk) )                                       & 
     881         z_rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                       & 
    910882             &                    * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) )                                     
    911883         IF ( umask(ji-1, jj, jk) > 0.5 .OR. umask(ji+1, jj, jk) > 0.5 ) THEN 
     
    914886             &   * ( - gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) - z1_12 * ( zdz_i  (ji+1,jj,jk) + zdz_i  (ji,jj,jk) ) )              & 
    915887             &   - (   zdz_i    (ji+1,jj,jk) - zdz_i    (ji,jj,jk) )                                                            & 
    916              &   * (   rhd_opt    (ji+1,jj,jk) - rhd_opt    (ji,jj,jk) - z1_12 * ( zdrho_i(ji+1,jj,jk) + zdrho_i(ji,jj,jk) ) )  & 
     888             &   * (   rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( zdrho_i(ji+1,jj,jk) + zdrho_i(ji,jj,jk) ) )  & 
    917889             &                                               ) 
    918890         END IF 
    919891   
    920          z_rho_j(ji,jj,jk) = zcoef0 * ( rhd_opt    (ji,jj+1,jk) + rhd_opt    (ji,jj,jk) )                                       & 
     892         z_rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                       & 
    921893             &                    * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) )                                   
    922894         IF ( vmask(ji, jj-1, jk) > 0.5 .OR. vmask(ji, jj+1, jk) > 0.5 ) THEN 
     
    925897             &   * ( - gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) - z1_12 * ( zdz_j  (ji,jj+1,jk) + zdz_j  (ji,jj,jk) ) )              & 
    926898             &   - (   zdz_j    (ji,jj+1,jk) - zdz_j    (ji,jj,jk) )                                                            & 
    927              &   * (   rhd_opt    (ji,jj+1,jk) - rhd_opt    (ji,jj,jk) - z1_12 * ( zdrho_j(ji,jj+1,jk) + zdrho_j(ji,jj,jk) ) )  & 
     899             &   * (   rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( zdrho_j(ji,jj+1,jk) + zdrho_j(ji,jj,jk) ) )  & 
    928900             &                                                 ) 
    929901         END IF 
     
    999971      REAL(wp) :: zrhdt1 
    1000972      REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 
     973      REAL(wp), DIMENSION(jpi,jpj)     ::   zpgu, zpgv   ! 2D workspace 
     974      REAL(wp), DIMENSION(jpi,jpj)     ::   zsshu_n, zsshv_n 
    1001975      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdept, zrhh 
    1002976      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
    1003       REAL(wp), DIMENSION(jpi,jpj)   ::   zsshu_n, zsshv_n 
    1004977      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
    1005978      !!---------------------------------------------------------------------- 
     
    1014987      zcoef0 = - grav 
    1015988      znad = 1._wp 
    1016       IF( ln_linssh )   znad = 0._wp 
    1017  
     989      IF( ln_linssh )   znad = 1._wp 
     990      ! 
     991      ! --------------- 
     992      !  Surface pressure gradient to be removed 
     993      ! --------------- 
     994      DO_2D( 0, 0, 0, 0 ) 
     995         zpgu(ji,jj) = - grav * ( ssh(ji+1,jj,Kmm) - ssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 
     996         zpgv(ji,jj) = - grav * ( ssh(ji,jj+1,Kmm) - ssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 
     997      END_2D 
     998      ! 
    1018999      IF( ln_wd_il ) THEN 
    10191000         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
     
    10811062      ! Transfer the depth of "T(:,:,:)" to vertical coordinate "zdept(:,:,:)" 
    10821063      DO_2D( 1, 1, 1, 1 ) 
    1083          zdept(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) - ssh(ji,jj,Kmm) * znad 
     1064         zdept(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) - ssh(ji,jj,Kmm) 
    10841065      END_2D 
    10851066 
     
    11321113 
    11331114      DO_2D( 0, 0, 0, 0 ) 
    1134        zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) * znad)  
    1135        zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) * znad) 
     1115       zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) )  
     1116       zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) ) 
    11361117      END_2D 
    11371118 
     
    12151196            zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
    12161197         ENDIF 
    1217          puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
     1198         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2 - zpgu(ji,jj)) * umask(ji,jj,jk)  
    12181199      ENDIF 
    12191200 
     
    12751256         ENDIF 
    12761257 
    1277          pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
     1258         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2 - zpgv(ji,jj)) * vmask(ji,jj,jk) 
    12781259      ENDIF 
    12791260         ! 
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/DYN/dynspg.F90

    r13497 r13935  
    7979      INTEGER  ::   ji, jj, jk                   ! dummy loop indices 
    8080      REAL(wp) ::   z2dt, zg_2, zintp, zgrho0r, zld   ! local scalars 
    81       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zpice 
    82       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
     81      REAL(wp)             , DIMENSION(jpi,jpj) ::   zpgu, zpgv   ! 2D workspace 
     82      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zpice 
     83      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   ztrdu, ztrdv 
    8384      !!---------------------------------------------------------------------- 
    8485      ! 
     
    9697         ! 
    9798         DO_2D( 0, 0, 0, 0 ) 
    98             spgu(ji,jj) = 0._wp 
    99             spgv(ji,jj) = 0._wp 
     99            zpgu(ji,jj) = 0._wp 
     100            zpgv(ji,jj) = 0._wp 
    100101         END_2D 
    101102         ! 
     
    103104            zg_2 = grav * 0.5 
    104105            DO_2D( 0, 0, 0, 0 )                       ! gradient of Patm using inverse barometer ssh 
    105                spgu(ji,jj) = spgu(ji,jj) + zg_2 * (  ssh_ib (ji+1,jj) - ssh_ib (ji,jj)    & 
     106               zpgu(ji,jj) = zpgu(ji,jj) + zg_2 * (  ssh_ib (ji+1,jj) - ssh_ib (ji,jj)    & 
    106107                  &                                + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
    107                spgv(ji,jj) = spgv(ji,jj) + zg_2 * (  ssh_ib (ji,jj+1) - ssh_ib (ji,jj)    & 
     108               zpgv(ji,jj) = zpgv(ji,jj) + zg_2 * (  ssh_ib (ji,jj+1) - ssh_ib (ji,jj)    & 
    108109                  &                                + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
    109110            END_2D 
     
    118119            ! 
    119120            DO_2D( 0, 0, 0, 0 )                      ! add tide potential forcing 
    120                spgu(ji,jj) = spgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
    121                spgv(ji,jj) = spgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
     121               zpgu(ji,jj) = zpgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
     122               zpgv(ji,jj) = zpgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
    122123            END_2D 
    123124            ! 
     
    125126               zld = rn_scal_load * grav 
    126127               DO_2D( 0, 0, 0, 0 )                   ! add scalar approximation for load potential 
    127                   spgu(ji,jj) = spgu(ji,jj) + zld * ( pssh(ji+1,jj,Kmm) - pssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 
    128                   spgv(ji,jj) = spgv(ji,jj) + zld * ( pssh(ji,jj+1,Kmm) - pssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 
     128                  zpgu(ji,jj) = zpgu(ji,jj) + zld * ( pssh(ji+1,jj,Kmm) - pssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 
     129                  zpgv(ji,jj) = zpgv(ji,jj) + zld * ( pssh(ji,jj+1,Kmm) - pssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 
    129130               END_2D 
    130131            ENDIF 
     
    137138            zpice(:,:) = (  zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:)  ) * zgrho0r 
    138139            DO_2D( 0, 0, 0, 0 ) 
    139                spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 
    140                spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 
     140               zpgu(ji,jj) = zpgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 
     141               zpgv(ji,jj) = zpgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 
    141142            END_2D 
    142143            DEALLOCATE( zpice )          
     
    144145         ! 
    145146         DO_3D( 0, 0, 0, 0, 1, jpkm1 )       !== Add all terms to the general trend 
    146             puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + spgu(ji,jj) 
    147             pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + spgv(ji,jj) 
     147            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zpgu(ji,jj) 
     148            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zpgv(ji,jj) 
    148149         END_3D 
    149150         ! 
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/DYN/dynspg_exp.F90

    r13497 r13935  
    6060      !! 
    6161      INTEGER ::   ji, jj, jk   ! dummy loop indices 
     62      REAL(wp), DIMENSION(jpi,jpj) ::   zpgu, zpgv   ! 2D workspace 
    6263      !!---------------------------------------------------------------------- 
    6364      ! 
     
    6768         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   (explicit free surface)' 
    6869         ! 
    69          spgu(:,:) = 0._wp   ;   spgv(:,:) = 0._wp 
     70         zpgu(:,:) = 0._wp   ;   zpgv(:,:) = 0._wp 
    7071         ! 
    7172         IF( .NOT.ln_linssh .AND. lwp ) WRITE(numout,*) '      non linear free surface: spg is included in dynhpg' 
    7273      ENDIF 
    73  
    74       IF( ln_linssh ) THEN          !* linear free surface : add the surface pressure gradient trend 
    75          ! 
    76          DO_2D( 0, 0, 0, 0 )                 ! now surface pressure gradient 
    77             spgu(ji,jj) = - grav * ( ssh(ji+1,jj,Kmm) - ssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 
    78             spgv(ji,jj) = - grav * ( ssh(ji,jj+1,Kmm) - ssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 
    79          END_2D 
    80          ! 
    81          DO_3D( 0, 0, 0, 0, 1, jpkm1 )       ! Add it to the general trend 
    82             puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + spgu(ji,jj) 
    83             pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + spgv(ji,jj) 
    84          END_3D 
    85          ! 
    86       ENDIF 
     74      ! 
     75      DO_2D( 0, 0, 0, 0 ) 
     76         zpgu(ji,jj) = - grav * ( ssh(ji+1,jj,Kmm) - ssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 
     77         zpgv(ji,jj) = - grav * ( ssh(ji,jj+1,Kmm) - ssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 
     78      END_2D 
     79      ! 
     80      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     81         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zpgu(ji,jj) 
     82         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zpgv(ji,jj) 
     83      END_3D 
    8784      ! 
    8885   END SUBROUTINE dyn_spg_exp 
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/DYN/dynspg_ts.F90

    r13546 r13935  
    162162      REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v   ! top/bottom stress at u- & v-points 
    163163      REAL(wp), DIMENSION(jpi,jpj) :: zhU, zhV         ! fluxes 
     164#if defined key_qco  
    164165      REAL(wp), DIMENSION(jpi, jpj, jpk) :: ze3u, ze3v 
     166#endif 
    165167      ! 
    166168      REAL(wp) ::   zwdramp                     ! local scalar - only used if ln_wd_dl = .True.  
     
    229231      !                                   !=  zu_frc =  1/H e3*d/dt(Ua)  =!  (Vertical mean of Ua, the 3D trends) 
    230232      !                                   !  ---------------------------  ! 
     233#if defined key_qco  
    231234      DO jk = 1 , jpk 
    232235         ze3u(:,:,jk) = e3u(:,:,jk,Kmm) 
     
    236239      zu_frc(:,:) = SUM( ze3u(:,:,:) * uu(:,:,:,Krhs) * umask(:,:,:) , DIM=3 ) * r1_hu(:,:,Kmm) 
    237240      zv_frc(:,:) = SUM( ze3v(:,:,:) * vv(:,:,:,Krhs) * vmask(:,:,:) , DIM=3 ) * r1_hv(:,:,Kmm) 
     241#else 
     242      zu_frc(:,:) = SUM( e3u(:,:,:,Kmm) * uu(:,:,:,Krhs) * umask(:,:,:) , DIM=3 ) * r1_hu(:,:,Kmm) 
     243      zv_frc(:,:) = SUM( e3v(:,:,:,Kmm) * vv(:,:,:,Krhs) * vmask(:,:,:) , DIM=3 ) * r1_hv(:,:,Kmm) 
     244#endif  
    238245      ! 
    239246      ! 
     
    247254!!gm  Is it correct to do so ?   I think so... 
    248255       
    249       !                                   !=  remove 2D Coriolis and pressure gradient trends  =! 
    250       !                                   !  -------------------------------------------------  ! 
     256      !                                   !=  remove 2D Coriolis trend  =! 
     257      !                                   !  --------------------------  ! 
    251258      ! 
    252259      IF( kt == nit000 .OR. .NOT. ln_linssh )   CALL dyn_cor_2D_init( Kmm )   ! Set zwz, the barotropic Coriolis force coefficient 
    253       !       ! recompute zwz = f/depth  at every time step for (.NOT.ln_linssh) as the water colomn height changes 
     260      !                      ! recompute zwz = f/depth  at every time step for (.NOT.ln_linssh) as the water colomn height changes 
    254261      ! 
    255262      !                                         !* 2D Coriolis trends 
     
    258265      ! 
    259266      CALL dyn_cor_2d( ht(:,:), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in 
    260          &                                                                     zu_trd, zv_trd   )   ! ==>> out 
    261       ! 
    262       IF( .NOT.ln_linssh ) THEN                 !* surface pressure gradient   (variable volume only) 
    263          ! 
    264          IF( ln_wd_il ) THEN                       ! W/D : limiter applied to spgspg 
    265             CALL wad_spg( pssh(:,:,Kmm), zcpx, zcpy )          ! Calculating W/D gravity filters, zcpx and zcpy 
    266             DO_2D( 0, 0, 0, 0 )                                ! SPG with the application of W/D gravity filters 
    267                zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( pssh(ji+1,jj  ,Kmm) - pssh(ji  ,jj ,Kmm) )   & 
    268                   &                          * r1_e1u(ji,jj) * zcpx(ji,jj)  * wdrampu(ji,jj)  !jth 
    269                zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( pssh(ji  ,jj+1,Kmm) - pssh(ji  ,jj ,Kmm) )   & 
    270                   &                          * r1_e2v(ji,jj) * zcpy(ji,jj)  * wdrampv(ji,jj)  !jth 
    271             END_2D 
    272          ELSE                                      ! now suface pressure gradient 
    273             DO_2D( 0, 0, 0, 0 ) 
    274                zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  pssh(ji+1,jj  ,Kmm) - pssh(ji  ,jj  ,Kmm)  ) * r1_e1u(ji,jj) 
    275                zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  pssh(ji  ,jj+1,Kmm) - pssh(ji  ,jj  ,Kmm)  ) * r1_e2v(ji,jj)  
    276             END_2D 
    277          ENDIF 
    278          ! 
    279       ENDIF 
     267         &                                                                          zu_trd, zv_trd   )   ! ==>> out 
    280268      ! 
    281269      DO_2D( 0, 0, 0, 0 )                          ! Remove coriolis term (and possibly spg) from barotropic trend 
     
    287275      !                                   !  -----------------------------------------------------------  ! 
    288276      CALL dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, zu_frc, zv_frc,  zCdU_u, zCdU_v )      ! also provide the barotropic drag coefficients 
     277      ! 
    289278      !                                   !=  Add atmospheric pressure forcing  =! 
    290279      !                                   !  ----------------------------------  ! 
     
    330319      ELSE                                        ! CENTRED integration: use kt-1/2 + kt+1/2 fluxes (NOW) 
    331320         zztmp = r1_rho0 * r1_2 
    332          zssh_frc(:,:) = zztmp * (  emp(:,:)        + emp_b(:,:)                    & 
    333                 &                 - rnf(:,:)        - rnf_b(:,:)                    & 
    334                 &                 + fwfisf_cav(:,:) + fwfisf_cav_b(:,:)             & 
    335                 &                 + fwfisf_par(:,:) + fwfisf_par_b(:,:)             ) 
     321         zssh_frc(:,:) = zztmp * (   emp(:,:)        + emp_b(:,:)          & 
     322            &                      - rnf(:,:)        - rnf_b(:,:)          & 
     323            &                      + fwfisf_cav(:,:) + fwfisf_cav_b(:,:)   & 
     324            &                      + fwfisf_par(:,:) + fwfisf_par_b(:,:)   ) 
    336325      ENDIF 
    337326      !                                   !=  Add Stokes drift divergence  =!   (if exist) 
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/ISF/isf_oce.F90

    r13558 r13935  
    11MODULE isf_oce 
    22   !!====================================================================== 
    3    !!                       ***  MODULE  sbcisf  *** 
    4    !! Surface module :  compute iceshelf melt and heat flux 
     3   !!                       ***  MODULE  isf_oce  *** 
     4   !! Ice shelves :  ice shelves variables defined in memory 
    55   !!====================================================================== 
    66   !! History :  3.2  !  2011-02  (C.Harris  ) Original code isf cav 
     
    146146   END SUBROUTINE isf_alloc_par 
    147147 
     148    
    148149   SUBROUTINE isf_alloc_cav() 
    149150      !!--------------------------------------------------------------------- 
     
    173174   END SUBROUTINE isf_alloc_cav 
    174175 
     176    
    175177   SUBROUTINE isf_alloc_cpl() 
    176178      !!--------------------------------------------------------------------- 
     
    184186      ierr = 0 
    185187      ! 
    186       ALLOCATE( risfcpl_ssh(jpi,jpj), risfcpl_tsc(jpi,jpj,jpk,jpts), risfcpl_vol(jpi,jpj,jpk), STAT=ialloc ) 
    187       ierr = ierr + ialloc 
    188       ! 
    189       risfcpl_tsc(:,:,:,:) = 0.0 ; risfcpl_vol(:,:,:) = 0.0 ; risfcpl_ssh(:,:) = 0.0 
    190  
    191       IF ( ln_isfcpl_cons) THEN 
    192          ALLOCATE( risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) ,risfcpl_cons_ssh(jpi,jpj), STAT=ialloc ) 
     188      ALLOCATE( risfcpl_ssh(jpi,jpj) , risfcpl_tsc(jpi,jpj,jpk,jpts) , risfcpl_vol(jpi,jpj,jpk) , STAT=ialloc ) 
     189      ierr = ierr + ialloc 
     190      ! 
     191      risfcpl_tsc(:,:,:,:) = 0._wp ; risfcpl_vol(:,:,:) = 0._wp ; risfcpl_ssh(:,:) = 0._wp 
     192 
     193      IF ( ln_isfcpl_cons ) THEN 
     194         ALLOCATE( risfcpl_cons_tsc(jpi,jpj,jpk,jpts) , risfcpl_cons_vol(jpi,jpj,jpk) , risfcpl_cons_ssh(jpi,jpj) , STAT=ialloc ) 
    193195         ierr = ierr + ialloc 
    194196         ! 
    195          risfcpl_cons_tsc(:,:,:,:) = 0.0 ; risfcpl_cons_vol(:,:,:) = 0.0 ; risfcpl_cons_ssh(:,:) = 0.0 
     197         risfcpl_cons_tsc(:,:,:,:) = 0._wp ; risfcpl_cons_vol(:,:,:) = 0._wp ; risfcpl_cons_ssh(:,:) = 0._wp 
    196198         ! 
    197199      END IF 
     
    202204   END SUBROUTINE isf_alloc_cpl 
    203205 
     206    
    204207   SUBROUTINE isf_dealloc_cpl() 
    205208      !!--------------------------------------------------------------------- 
     
    213216      ierr = 0 
    214217      ! 
    215       DEALLOCATE( risfcpl_ssh, risfcpl_tsc, risfcpl_vol, STAT=ialloc ) 
     218      DEALLOCATE( risfcpl_ssh , risfcpl_tsc , risfcpl_vol , STAT=ialloc ) 
    216219      ierr = ierr + ialloc 
    217220      ! 
     
    221224   END SUBROUTINE isf_dealloc_cpl 
    222225 
     226    
    223227   SUBROUTINE isf_alloc() 
    224228      !!--------------------------------------------------------------------- 
     
    233237      ierr = 0       ! set to zero if no array to be allocated 
    234238      ! 
    235       ALLOCATE(fwfisf_par(jpi,jpj)  , fwfisf_par_b(jpi,jpj), & 
    236          &     fwfisf_cav(jpi,jpj)  , fwfisf_cav_b(jpi,jpj), & 
    237          &     fwfisf_oasis(jpi,jpj),            STAT=ialloc ) 
    238       ierr = ierr + ialloc 
    239       ! 
    240       ALLOCATE(risf_par_tsc(jpi,jpj,jpts), risf_par_tsc_b(jpi,jpj,jpts), STAT=ialloc ) 
    241       ierr = ierr + ialloc 
    242       ! 
    243       ALLOCATE(risf_cav_tsc(jpi,jpj,jpts), risf_cav_tsc_b(jpi,jpj,jpts), STAT=ialloc ) 
    244       ierr = ierr + ialloc 
    245       ! 
    246       ALLOCATE(risfload(jpi,jpj), STAT=ialloc) 
    247       ierr = ierr + ialloc 
    248       ! 
    249       ALLOCATE( mskisf_cav(jpi,jpj), STAT=ialloc) 
     239      ALLOCATE( fwfisf_par  (jpi,jpj) , fwfisf_par_b(jpi,jpj) ,    & 
     240         &      fwfisf_cav  (jpi,jpj) , fwfisf_cav_b(jpi,jpj) ,    & 
     241         &      fwfisf_oasis(jpi,jpj)                         , STAT=ialloc ) 
     242      ierr = ierr + ialloc 
     243      ! 
     244      ALLOCATE( risf_par_tsc(jpi,jpj,jpts) , risf_par_tsc_b(jpi,jpj,jpts) , STAT=ialloc ) 
     245      ierr = ierr + ialloc 
     246      ! 
     247      ALLOCATE( risf_cav_tsc(jpi,jpj,jpts) , risf_cav_tsc_b(jpi,jpj,jpts) , STAT=ialloc ) 
     248      ierr = ierr + ialloc 
     249      ! 
     250      ALLOCATE( risfload(jpi,jpj) , STAT=ialloc ) 
     251      ierr = ierr + ialloc 
     252      ! 
     253      ALLOCATE( mskisf_cav(jpi,jpj) , STAT=ialloc ) 
    250254      ierr = ierr + ialloc 
    251255      ! 
     
    254258      ! 
    255259      ! initalisation of fwf and tsc array to 0 
    256       risfload(:,:)       = 0.0_wp 
    257       fwfisf_oasis(:,:)   = 0.0_wp 
    258       fwfisf_par(:,:)     = 0.0_wp    ; fwfisf_par_b(:,:)     = 0.0_wp 
    259       fwfisf_cav(:,:)     = 0.0_wp    ; fwfisf_cav_b(:,:)     = 0.0_wp 
    260       risf_cav_tsc(:,:,:) = 0.0_wp    ; risf_cav_tsc_b(:,:,:) = 0.0_wp 
    261       risf_par_tsc(:,:,:) = 0.0_wp    ; risf_par_tsc_b(:,:,:) = 0.0_wp 
    262       ! 
    263  
     260      risfload    (:,:)   = 0._wp 
     261      fwfisf_oasis(:,:)   = 0._wp 
     262      fwfisf_par  (:,:)   = 0._wp   ;   fwfisf_par_b  (:,:)   = 0._wp 
     263      fwfisf_cav  (:,:)   = 0._wp   ;   fwfisf_cav_b  (:,:)   = 0._wp 
     264      risf_cav_tsc(:,:,:) = 0._wp   ;   risf_cav_tsc_b(:,:,:) = 0._wp 
     265      risf_par_tsc(:,:,:) = 0._wp   ;   risf_par_tsc_b(:,:,:) = 0._wp 
     266      ! 
    264267   END SUBROUTINE isf_alloc 
    265  
     268    
     269   !!====================================================================== 
    266270END MODULE isf_oce 
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/ISF/isfload.F90

    r13295 r13935  
    22   !!====================================================================== 
    33   !!                       ***  MODULE  isfload  *** 
    4    !! isfload module :  compute ice shelf load (needed for the hpg) 
     4   !! Ice Shelves :   compute ice shelf load (needed for the hpg) 
    55   !!====================================================================== 
    66   !! History :  4.1  !  2019-09  (P. Mathiot) original code 
     
    88 
    99   !!---------------------------------------------------------------------- 
    10    !!   isfload      : compute ice shelf load 
     10   !!   isf_load      : compute ice shelf load 
    1111   !!---------------------------------------------------------------------- 
    1212 
     
    2323   PRIVATE 
    2424 
    25    PUBLIC isf_load 
     25   PUBLIC   isf_load   ! called by isfstp.F90 
     26   ! 
    2627   !! * Substitutions 
    2728#  include "do_loop_substitute.h90" 
    2829#  include "domzgr_substitute.h90" 
    29  
     30   !!---------------------------------------------------------------------- 
     31   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     32   !! $Id: sbcisf.F90 10536 2019-01-16 19:21:09Z mathiot $ 
     33   !! Software governed by the CeCILL license (see ./LICENSE) 
     34   !!---------------------------------------------------------------------- 
    3035CONTAINS 
    3136 
     
    3742      !! 
    3843      !!-------------------------------------------------------------------- 
    39       !!-------------------------- OUT ------------------------------------- 
    40       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pisfload 
    41       !!-------------------------- IN  ------------------------------------- 
    42       INTEGER,                      INTENT(in)    :: Kmm           ! ocean time level index 
     44      INTEGER,                      INTENT(in   ) ::   Kmm        ! ocean time level index       
     45      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pisfload   ! ice shelf load 
    4346      !!---------------------------------------------------------------------- 
    4447      ! 
     
    4649      !               the smaller the residual flow is, the better it is. 
    4750      ! 
    48       ! ice shelf cavity 
     51      ! type of ice shelf cavity 
    4952      SELECT CASE ( cn_isfload ) 
    5053      CASE ( 'uniform' ) 
     
    5659   END SUBROUTINE isf_load 
    5760 
    58    SUBROUTINE isf_load_uniform( Kmm, pisfload ) 
     61    
     62   SUBROUTINE isf_load_uniform( Kmm, pload ) 
    5963      !!-------------------------------------------------------------------- 
    6064      !!                  ***  SUBROUTINE isf_load  *** 
     
    6771      !! 
    6872      !!-------------------------------------------------------------------- 
    69       !!-------------------------- OUT ------------------------------------- 
    70       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pisfload 
    71       !!-------------------------- IN  ------------------------------------- 
    72       INTEGER,                      INTENT(in)    :: Kmm           ! ocean time level index 
    73       !!-------------------------------------------------------------------- 
     73      INTEGER,                      INTENT(in   ) ::   Kmm     ! ocean time level index       
     74      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   pload   ! ice shelf load 
     75      ! 
    7476      INTEGER  :: ji, jj, jk 
    7577      INTEGER  :: ikt 
    76       REAL(wp)                          :: znad        !  
    7778      REAL(wp), DIMENSION(jpi,jpj)      :: zrhdtop_isf ! water density    displaced by the ice shelf (at the interface) 
    7879      REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts_top     ! water properties displaced by the ice shelf    
    7980      REAL(wp), DIMENSION(jpi,jpj,jpk)  :: zrhd        ! water density    displaced by the ice shelf 
    8081      !!---------------------------------------------------------------------- 
    81       ! 
    82       znad = 1._wp                     !- To use density and not density anomaly 
    8382      ! 
    8483      !                                !- assume water displaced by the ice shelf is at T=rn_isfload_T and S=rn_isfload_S (rude) 
     
    8786      DO jk = 1, jpk                   !- compute density of the water displaced by the ice shelf  
    8887         CALL eos( zts_top(:,:,:), gdept(:,:,jk,Kmm), zrhd(:,:,jk) ) 
     88!!st ==>> CALL eos( zts_top(:,:,:), gdept_0(:,:,jk), zrhd(:,:,jk) ) 
    8989      END DO 
    9090      ! 
     
    9393      ! 
    9494      !                                !- Surface value + ice shelf gradient 
    95       pisfload(:,:) = 0._wp                       ! compute pressure due to ice shelf load  
     95      pload(:,:) = 0._wp                      ! compute pressure due to ice shelf load  
    9696      DO_2D( 1, 1, 1, 1 ) 
    9797         ikt = mikt(ji,jj) 
    9898         ! 
    9999         IF ( ikt > 1 ) THEN 
     100            !                                 ! top layer of the ice shelf 
     101            pload(ji,jj) = pload(ji,jj)   & 
     102               &         + zrhd (ji,jj,1) * e3w(ji,jj,1,Kmm) 
    100103            ! 
    101             ! top layer of the ice shelf 
    102             pisfload(ji,jj) = pisfload(ji,jj) + (znad + zrhd(ji,jj,1) )   & 
    103                &                                * e3w(ji,jj,1,Kmm) 
    104             ! 
    105             ! core layers of the ice shelf 
    106             DO jk = 2, ikt-1 
    107                pisfload(ji,jj) = pisfload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk))   & 
    108                   &                                * e3w(ji,jj,jk,Kmm) 
     104            DO jk = 2, ikt-1                  ! core layers of the ice shelf 
     105               pload(ji,jj) = pload(ji,jj) + (zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk))   & 
     106                  &                        *   e3w(ji,jj,jk,Kmm) 
    109107            END DO 
    110             ! 
    111             ! deepest part of the ice shelf (between deepest T point and ice/ocean interface 
    112             pisfload(ji,jj) = pisfload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) & 
    113                &                                              * ( risfdep(ji,jj) - gdept(ji,jj,ikt-1,Kmm) ) 
     108            !                                 ! deepest part of the ice shelf (between deepest T point and ice/ocean interface 
     109            pload(ji,jj) = pload(ji,jj) + ( zrhdtop_isf(ji,jj) +  zrhd(ji,jj,ikt-1)     )   & 
     110               &                        * (     risfdep(ji,jj) - gdept(ji,jj,ikt-1,Kmm) ) 
     111!!st ==>>     &                        * (     risfdep(ji,jj) - gdept_0(ji,jj,ikt-1) ) 
    114112            ! 
    115113         END IF 
     
    117115      ! 
    118116   END SUBROUTINE isf_load_uniform 
    119  
     117    
     118   !!====================================================================== 
    120119END MODULE isfload 
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/ISF/isfstp.F90

    r13237 r13935  
    22   !!====================================================================== 
    33   !!                       ***  MODULE  isfstp  *** 
    4    !! Surface module :  compute iceshelf load, melt and heat flux 
     4   !! Ice Shelves :  compute iceshelf load, melt and heat flux 
    55   !!====================================================================== 
    66   !! History :  3.2  !  2011-02  (C.Harris  ) Original code isf cav 
     
    4242   !! Software governed by the CeCILL license (see ./LICENSE) 
    4343   !!---------------------------------------------------------------------- 
    44  
    4544CONTAINS 
    4645  
    47   SUBROUTINE isf_stp( kt, Kmm ) 
     46   SUBROUTINE isf_stp( kt, Kmm ) 
    4847      !!--------------------------------------------------------------------- 
    4948      !!                  ***  ROUTINE isf_stp  *** 
     
    5857      !!              - compute fluxes 
    5958      !!              - write restart variables 
    60       !! 
    61       !!---------------------------------------------------------------------- 
    62       INTEGER, INTENT(in) ::   kt   ! ocean time step 
    63       INTEGER, INTENT(in) ::   Kmm  ! ocean time level index 
    64       !!---------------------------------------------------------------------- 
    65       INTEGER :: jk                               ! loop index 
    66       REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t    ! e3t  
     59      !!---------------------------------------------------------------------- 
     60      INTEGER, INTENT(in) ::   kt    ! ocean time step 
     61      INTEGER, INTENT(in) ::   Kmm   ! ocean time level index 
     62      ! 
     63      INTEGER :: jk                              ! loop index 
     64#if defined key_qco 
     65      REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t   ! 3D workspace 
     66#endif 
    6767      !!--------------------------------------------------------------------- 
    6868      ! 
     
    8383         ! 1.2: compute misfkb, rhisf_tbl, rfrac (deepest level, thickness, fraction of deepest cell affected by tbl) 
    8484         rhisf_tbl_cav(:,:) = rn_htbl * mskisf_cav(:,:) 
     85#if defined key_qco 
    8586         DO jk = 1, jpk 
    8687            ze3t(:,:,jk) = e3t(:,:,jk,Kmm) 
    8788         END DO  
    88          CALL isf_tbl_lvl(ht(:,:), ze3t, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav) 
     89         CALL isf_tbl_lvl( ht(:,:), ze3t, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav ) 
     90#else 
     91         CALL isf_tbl_lvl( ht(:,:),  e3t, misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav ) 
     92#endif 
    8993         ! 
    9094         ! 1.3: compute ice shelf melt 
    91          CALL isf_cav( kt, Kmm, risf_cav_tsc, fwfisf_cav) 
     95         CALL isf_cav( kt, Kmm, risf_cav_tsc, fwfisf_cav ) 
    9296         ! 
    9397      END IF 
     
    108112         ! by simplicity, we assume the top level where param applied do not change with time (done in init part) 
    109113         rhisf_tbl_par(:,:) = rhisf0_tbl_par(:,:) 
     114#if defined key_qco 
    110115         DO jk = 1, jpk 
    111116            ze3t(:,:,jk) = e3t(:,:,jk,Kmm) 
    112117         END DO 
    113          CALL isf_tbl_lvl(ht(:,:), ze3t, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par) 
     118         CALL isf_tbl_lvl( ht(:,:), ze3t, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par ) 
     119#else 
     120         CALL isf_tbl_lvl( ht(:,:),  e3t, misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par ) 
     121#endif 
    114122         ! 
    115123         ! 2.3: compute ice shelf melt 
    116          CALL isf_par( kt, Kmm, risf_par_tsc, fwfisf_par) 
     124         CALL isf_par( kt, Kmm, risf_par_tsc, fwfisf_par ) 
    117125         ! 
    118126      END IF 
     
    128136   END SUBROUTINE isf_stp 
    129137 
    130    SUBROUTINE isf_init(Kbb, Kmm, Kaa) 
     138    
     139   SUBROUTINE isf_init( Kbb, Kmm, Kaa ) 
    131140      !!--------------------------------------------------------------------- 
    132141      !!                  ***  ROUTINE isfstp_init  *** 
     
    142151      !!              - call cav/param/isfcpl init routine 
    143152      !!---------------------------------------------------------------------- 
    144       INTEGER, INTENT(in) :: Kbb, Kmm, Kaa      ! ocean time level indices 
     153      INTEGER, INTENT(in) ::   Kbb, Kmm, Kaa   ! ocean time level indices 
     154      !!---------------------------------------------------------------------- 
    145155      ! 
    146156      ! constrain: l_isfoasis need to be known 
    147157      ! 
    148       ! Read namelist 
    149       CALL isf_nam() 
    150       ! 
    151       ! Allocate public array 
    152       CALL isf_alloc() 
    153       ! 
    154       ! check option compatibility 
    155       CALL isf_ctl() 
    156       ! 
    157       ! compute ice shelf load 
    158       IF ( ln_isfcav ) CALL isf_load( Kmm, risfload ) 
     158      CALL isf_nam()                                              ! Read namelist 
     159      ! 
     160      CALL isf_alloc()                                            ! Allocate public array 
     161      ! 
     162      CALL isf_ctl()                                              ! check option compatibility 
     163      ! 
     164      IF( ln_isfcav ) CALL isf_load( Kmm, risfload )              ! compute ice shelf load 
    159165      ! 
    160166      ! terminate routine now if no ice shelf melt formulation specify 
    161       IF ( ln_isf ) THEN 
    162          ! 
    163          !--------------------------------------------------------------------------------------------------------------------- 
    164          ! initialisation melt in the cavity 
    165          IF ( ln_isfcav_mlt ) CALL isf_cav_init() 
    166          ! 
    167          !--------------------------------------------------------------------------------------------------------------------- 
    168          ! initialisation parametrised melt 
    169          IF ( ln_isfpar_mlt ) CALL isf_par_init() 
    170          ! 
    171          !--------------------------------------------------------------------------------------------------------------------- 
    172          ! initialisation ice sheet coupling 
    173          IF( ln_isfcpl ) CALL isfcpl_init(Kbb, Kmm, Kaa) 
     167      IF( ln_isf ) THEN 
     168         ! 
     169         IF( ln_isfcav_mlt )   CALL isf_cav_init()                ! initialisation melt in the cavity 
     170         ! 
     171         IF( ln_isfpar_mlt )   CALL isf_par_init()                ! initialisation parametrised melt 
     172         ! 
     173         IF( ln_isfcpl     )   CALL isfcpl_init( Kbb, Kmm, Kaa )  ! initialisation ice sheet coupling 
    174174         ! 
    175175      END IF 
     
    177177  END SUBROUTINE isf_init 
    178178 
     179   
    179180  SUBROUTINE isf_ctl() 
    180181      !!--------------------------------------------------------------------- 
     
    283284      END IF 
    284285   END SUBROUTINE isf_ctl 
    285    ! 
     286 
     287    
    286288   SUBROUTINE isf_nam 
    287289      !!--------------------------------------------------------------------- 
  • NEMO/branches/2020/dev_r13723_KERNEL-01_Amy_Mike_newHPGschemes_KERNEL-08_merge/src/OCE/oce.F90

    r13237 r13935  
    4949   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ub2_i_b, vb2_i_b         !: Half step time integrated fluxes  
    5050#endif 
    51    ! 
    52    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   spgu, spgv               !: horizontal surface pressure gradient 
    5351 
    5452   !! interpolated gradient (only used in zps case) 
     
    8381      ! 
    8482      ierr(:) = 0  
    85       ALLOCATE( uu   (jpi,jpj,jpk,jpt)  , vv   (jpi,jpj,jpk,jpt) ,                              &           
    86          &      ww   (jpi,jpj,jpk)      , hdiv(jpi,jpj,jpk)      ,                              & 
    87          &      ts   (jpi,jpj,jpk,jpts,jpt),                                                    & 
    88          &      rab_b(jpi,jpj,jpk,jpts) , rab_n(jpi,jpj,jpk,jpts) ,                             & 
    89          &      rn2b (jpi,jpj,jpk)      , rn2  (jpi,jpj,jpk)      ,                             & 
    90          &      rhd  (jpi,jpj,jpk)      , rhop (jpi,jpj,jpk)                              , STAT=ierr(1) ) 
     83      ALLOCATE( uu   (jpi,jpj,jpk,jpt)  , vv   (jpi,jpj,jpk,jpt)           ,     &           
     84         &      ww   (jpi,jpj,jpk)      , hdiv(jpi,jpj,jpk)                ,     & 
     85         &      ts   (jpi,jpj,jpk,jpts,jpt)                                ,     & 
     86         &      rab_b(jpi,jpj,jpk,jpts) , rab_n(jpi,jpj,jpk,jpts)          ,     & 
     87         &      rn2b (jpi,jpj,jpk)      , rn2  (jpi,jpj,jpk)               ,     & 
     88         &      rhd  (jpi,jpj,jpk)      , rhop (jpi,jpj,jpk)               , STAT=ierr(1) ) 
    9189         ! 
    92       ALLOCATE( ssh(jpi,jpj,jpt)  , uu_b(jpi,jpj,jpt) , vv_b(jpi,jpj,jpt) , & 
    93          &      spgu  (jpi,jpj)   , spgv(jpi,jpj)                     ,     & 
    94          &      gtsu(jpi,jpj,jpts), gtsv(jpi,jpj,jpts)                ,     & 
    95          &      gru(jpi,jpj)      , grv(jpi,jpj)                      ,     & 
    96          &      gtui(jpi,jpj,jpts), gtvi(jpi,jpj,jpts)                ,     & 
    97          &      grui(jpi,jpj)     , grvi(jpi,jpj)                     ,     & 
    98          &      riceload(jpi,jpj)                                     , STAT=ierr(2) ) 
     90      ALLOCATE( ssh (jpi,jpj,jpt)  , uu_b(jpi,jpj,jpt) , vv_b(jpi,jpj,jpt) ,     & 
     91         &      gtsu(jpi,jpj,jpts) , gtsv(jpi,jpj,jpts)                    ,     & 
     92         &      gru (jpi,jpj)      , grv (jpi,jpj)                         ,     & 
     93         &      gtui(jpi,jpj,jpts) , gtvi(jpi,jpj,jpts)                    ,     & 
     94         &      grui(jpi,jpj)      , grvi(jpi,jpj)                         ,     & 
     95         &      riceload(jpi,jpj)                                          , STAT=ierr(2) ) 
    9996         ! 
    10097      ALLOCATE( fraqsr_1lev(jpi,jpj) , STAT=ierr(3) ) 
Note: See TracChangeset for help on using the changeset viewer.