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 10371 – NEMO

Changeset 10371


Ignore:
Timestamp:
2018-12-04T15:58:53+01:00 (5 years ago)
Author:
davestorkey
Message:

UKMO/dev_r10037_dynvor_EEUV branch : add option to average only sea points.

Location:
NEMO/branches/UKMO/dev_r10037_dynvor_EEUV
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/dev_r10037_dynvor_EEUV/cfgs/SHARED/namelist_ref

    r10094 r10371  
    874874   ln_dynvor_msk = .false. !  vorticity multiplied by fmask (=T)        ==>>> PLEASE DO NOT ACTIVATE 
    875875      !                    !  (f-point vorticity schemes only) 
     876   ln_dynvor_ocnavg = .false. ! T => only average ocean points for V->U point or U->V point conversion  
    876877/ 
    877878!----------------------------------------------------------------------- 
  • NEMO/branches/UKMO/dev_r10037_dynvor_EEUV/src/OCE/DYN/dynvor.F90

    r10094 r10371  
    4444   USE lib_mpp        ! MPP library 
    4545   USE timing         ! Timing 
     46   USE phycst         ! for rsmall 
    4647 
    4748   IMPLICIT NONE 
     
    6162   LOGICAL, PUBLIC ::   ln_dynvor_mix   !: mixed scheme                         (MIX) 
    6263   LOGICAL, PUBLIC ::   ln_dynvor_msk   !: vorticity multiplied by fmask (=T) or not (=F) (all vorticity schemes) 
     64   LOGICAL, PUBLIC ::   ln_dynvor_ocnavg   !: T => only average ocean points when transforming V->U or U->V. 
    6365 
    6466   INTEGER, PUBLIC ::   nvor_scheme     !: choice of the type of advection scheme 
     
    8486   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   di_e2v_2e1e2f   ! = di(e2u)/(2*e1e2f)  used in F-point metric term calculation 
    8587   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   dj_e1u_2e1e2f   ! = dj(e1v)/(2*e1e2f)   -        -      -       -  
     88 
     89   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   v2upt_avg_denom   !  if ln_dynvor_ocnavg = T then use these denominators 
     90   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   u2vpt_avg_denom   !  in calculation of averages V->U points and U->V points. 
    8691    
     92   REAL(wp) ::   r2_3  = 2._wp / 3._wp    ! =2/3 
     93   REAL(wp) ::   r1_2  = 0.5_wp           ! =1/2 
     94   REAL(wp) ::   r1_3  = 1._wp / 3._wp    ! =1/3 
    8795   REAL(wp) ::   r1_4  = 0.250_wp         ! =1/4 
    8896   REAL(wp) ::   r1_6  = 1._wp / 6._wp    ! =1/6 
     
    301309         DO jj = 2, jpjm1 
    302310            DO ji = 2, jpim1   ! vector opt. 
    303                pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk)                    & 
     311               pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk)                    & 
    304312                  &                                * (  zwt(ji+1,jj) * ( pv(ji+1,jj,jk) + pv(ji+1,jj-1,jk) )   & 
    305                   &                                   + zwt(ji  ,jj) * ( pv(ji  ,jj,jk) + pv(ji  ,jj-1,jk) )   ) 
     313                  &                                   + zwt(ji  ,jj) * ( pv(ji  ,jj,jk) + pv(ji  ,jj-1,jk) )   ) / v2upt_avg_denom(ji,jj,jk) 
    306314                  ! 
    307                pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk)                    & 
     315               pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk)                    & 
    308316                  &                                * (  zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) )   &  
    309                   &                                   + zwt(ji,jj  ) * ( pu(ji,jj  ,jk) + pu(ji-1,jj  ,jk) )   )  
     317                  &                                   + zwt(ji,jj  ) * ( pu(ji,jj  ,jk) + pu(ji-1,jj  ,jk) )   ) / u2vpt_avg_denom(ji,jj,jk) 
    310318            END DO   
    311319         END DO   
     
    414422               zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 
    415423               zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1) 
    416                pua(ji,jj,jk) = pua(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    417                pva(ji,jj,jk) = pva(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )  
     424               pua(ji,jj,jk) = pua(ji,jj,jk) + r1_e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) / v2upt_avg_denom(ji,jj,jk) 
     425               pva(ji,jj,jk) = pva(ji,jj,jk) - r1_e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) / u2vpt_avg_denom(ji,jj,jk) 
    418426            END DO   
    419427         END DO   
     
    517525         DO jj = 2, jpjm1 
    518526            DO ji = fs_2, fs_jpim1   ! vector opt. 
    519                zuav = r1_8 * r1_e1u(ji,jj) * (  zwy(ji  ,jj-1) + zwy(ji+1,jj-1)  & 
     527               zuav = r1_2 * r1_e1u(ji,jj) * (  zwy(ji  ,jj-1) + zwy(ji+1,jj-1)  & 
    520528                  &                           + zwy(ji  ,jj  ) + zwy(ji+1,jj  )  ) 
    521                zvau =-r1_8 * r1_e2v(ji,jj) * (  zwx(ji-1,jj  ) + zwx(ji-1,jj+1)  & 
     529               zvau =-r1_2 * r1_e2v(ji,jj) * (  zwx(ji-1,jj  ) + zwx(ji-1,jj+1)  & 
    522530                  &                           + zwx(ji  ,jj  ) + zwx(ji  ,jj+1)  ) 
    523                pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    524                pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
     531               pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) / v2upt_avg_denom(ji,jj,jk) 
     532               pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) / u2vpt_avg_denom(ji,jj,jk) 
    525533            END DO   
    526534         END DO   
     
    669677         DO jj = 2, jpjm1 
    670678            DO ji = fs_2, fs_jpim1   ! vector opt. 
    671                zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    672                   &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    673                zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    674                   &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     679               zua = + r1_3 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     680                  &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) / v2upt_avg_denom(ji,jj,jk) 
     681               zva = - r1_3 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     682                  &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) / u2vpt_avg_denom(ji,jj,jk) 
    675683               pua(ji,jj,jk) = pua(ji,jj,jk) + zua 
    676684               pva(ji,jj,jk) = pva(ji,jj,jk) + zva 
     
    801809         DO jj = 2, jpjm1 
    802810            DO ji = fs_2, fs_jpim1   ! vector opt. 
    803                zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    804                   &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    805                zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    806                   &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     811               zua = + r1_3 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     812                  &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) / v2upt_avg_denom(ji,jj,jk) 
     813               zva = - r1_3 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     814                  &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) / u2vpt_avg_denom(ji,jj,jk) 
    807815               pua(ji,jj,jk) = pua(ji,jj,jk) + zua 
    808816               pva(ji,jj,jk) = pva(ji,jj,jk) + zva 
     
    931939         DO jj = 2, jpjm1 
    932940            DO ji = fs_2, fs_jpim1   ! vector opt. 
    933                zua = + r1_6 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    934                   &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    935                zva = - r1_6 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    936                   &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     941               zua = + r2_3 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     942                  &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) / v2upt_avg_denom(ji,jj,jk) 
     943               zva = - r2_3 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     944                  &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) / u2vpt_avg_denom(ji,jj,jk) 
    937945               pua(ji,jj,jk) = pua(ji,jj,jk) + zua 
    938946               pva(ji,jj,jk) = pva(ji,jj,jk) + zva 
     
    956964      !! 
    957965      NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_enT, ln_dynvor_eeT,   & 
    958          &                 ln_dynvor_eeUV, ln_dynvor_een, nn_een_e3f   , ln_dynvor_mix, ln_dynvor_msk 
     966         &                 ln_dynvor_eeUV, ln_dynvor_een, nn_een_e3f   , ln_dynvor_mix, ln_dynvor_msk, ln_dynvor_ocnavg 
    959967      !!---------------------------------------------------------------------- 
    960968      ! 
     
    984992         WRITE(numout,*) '      mixed enstrophy/energy conserving scheme       ln_dynvor_mix = ', ln_dynvor_mix 
    985993         WRITE(numout,*) '      masked (=T) or unmasked(=F) vorticity          ln_dynvor_msk = ', ln_dynvor_msk 
     994         WRITE(numout,*) '      average only ocean points?                     ln_dynvor_ocnavg = ', ln_dynvor_ocnavg 
    986995      ENDIF 
    987996 
     
    10071016      ENDIF 
    10081017!!gm end 
     1018 
     1019      !! Precalculate denominators for V->Upoint or U->Vpoint conversion. 
     1020      ALLOCATE( v2upt_avg_denom(jpi,jpj,jpk), u2vpt_avg_denom(jpi,jpj,jpk) ) 
     1021      IF( ln_dynvor_ocnavg ) THEN  
     1022         v2upt_avg_denom(:,:,:) = rsmall 
     1023         u2vpt_avg_denom(:,:,:) = rsmall 
     1024         DO jk = 1, jpk 
     1025            DO jj = 1, jpjm1 
     1026               DO ji = 1, jpim1 
     1027                  v2upt_avg_denom(ji,jj,jk) = max( rsmall, vmask(ji,jj,jk) + vmask(ji+1,jj,jk) + vmask(ji,jj-1,jk) + vmask(ji+1,jj-1,jk) ) 
     1028                  u2vpt_avg_denom(ji,jj,jk) = max( rsmall, umask(ji,jj,jk) + umask(ji-1,jj,jk) + umask(ji,jj+1,jk) + umask(ji-1,jj+1,jk) ) 
     1029               ENDDO 
     1030            ENDDO 
     1031         ENDDO 
     1032      ELSE 
     1033         v2upt_avg_denom(:,:,:) = 4._wp 
     1034         u2vpt_avg_denom(:,:,:) = 4._wp 
     1035      ENDIF 
    10091036 
    10101037      ioptio = 0                     ! type of scheme for vorticity (set nvor_scheme) 
Note: See TracChangeset for help on using the changeset viewer.