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 13696 for NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DYN/dynvor.F90 – NEMO

Ignore:
Timestamp:
2020-10-28T19:09:27+01:00 (3 years ago)
Author:
techene
Message:

#2555 use same e3f definition as in EEN in ENS and ENE instead of previous ugly fix and change time splitting accordingly change namelist vorticity scheme param nn_een_e3f into nn_e3f_typ

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DYN/dynvor.F90

    r13644 r13696  
    6060   LOGICAL, PUBLIC ::   ln_dynvor_eeT   !: t-point energy conserving scheme     (EET) 
    6161   LOGICAL, PUBLIC ::   ln_dynvor_een   !: energy & enstrophy conserving scheme (EEN) 
    62    INTEGER, PUBLIC ::      nn_een_e3f      !: e3f=masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1) 
    6362   LOGICAL, PUBLIC ::   ln_dynvor_mix   !: mixed scheme                         (MIX) 
    6463   LOGICAL, PUBLIC ::   ln_dynvor_msk   !: vorticity multiplied by fmask (=T) or not (=F) (all vorticity schemes) 
     64   INTEGER, PUBLIC ::   nn_e3f_typ      !: e3f=masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1) 
    6565 
    6666   INTEGER, PUBLIC ::   nvor_scheme     !: choice of the type of advection scheme 
     
    8484   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   dj_e1v_2        ! = dj(e1v)/2           -        -      -       -  
    8585   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   di_e2v_2e1e2f   ! = di(e2u)/(2*e1e2f)  used in F-point metric term calculation 
    86    REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   dj_e1u_2e1e2f   ! = dj(e1v)/(2*e1e2f)   -        -      -       -  
     86   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   dj_e1u_2e1e2f   ! = dj(e1v)/(2*e1e2f)   -        -      -       - 
     87   ! 
     88   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   e3f_0vor   ! e3f used in EEN, ENE and ENS cases (key_qco only) 
    8789    
    8890   REAL(wp) ::   r1_4  = 0.250_wp         ! =1/4 
     
    335337      ! 
    336338      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    337       REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars 
     339      REAL(wp) ::   zx1, zy1, zx2, zy2, ze3f, zmsk   ! local scalars 
    338340      REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz   ! 2D workspace 
    339341      !!---------------------------------------------------------------------- 
     
    387389         ! 
    388390#if defined key_qco 
    389          !                                   !==  horizontal fluxes and potential vorticity  ==! 
     391         DO_2D( 1, 0, 1, 0 )                 !==  potential vorticity  ==!   (key_qco) 
     392            zwz(ji,jj) = zwz(ji,jj) / e3f_vor(ji,jj,jk) 
     393         END_2D 
     394#else 
     395         SELECT CASE( nn_e3f_typ  )           !==  potential vorticity  ==! 
     396         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
     397            DO_2D( 1, 0, 1, 0 ) 
     398               ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
     399                  &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
     400                  &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
     401                  &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  ) 
     402               IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * 4._wp / ze3f 
     403               ELSE                       ;   zwz(ji,jj) = 0._wp 
     404               ENDIF 
     405            END_2D 
     406         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
     407            DO_2D( 1, 0, 1, 0 ) 
     408               ze3f = (   e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
     409                  &     + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
     410                  &     + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
     411                  &     + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)   ) 
     412               zmsk = (   tmask(ji,jj+1,jk)   + tmask(ji+1,jj+1,jk)   & 
     413                  &     + tmask(ji,jj  ,jk)   + tmask(ji+1,jj  ,jk)   ) 
     414               IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * zmsk / ze3f 
     415               ELSE                       ;   zwz(ji,jj) = 0._wp 
     416               ENDIF 
     417            END_2D 
     418         END SELECT 
     419#endif 
     420         !                                   !==  horizontal fluxes  ==! 
    390421         zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    391422         zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    392          zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 
    393 #else 
    394          !                                   !==  horizontal fluxes and potential vorticity  ==! 
    395          IF( ln_sco ) THEN                        ! weighted by e3 
    396             zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 
    397             zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    398             zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    399          ELSE                                     ! ugly fix: unweighted by e3 
    400             zwx(:,:) = e2u(:,:) * pu(:,:,jk) 
    401             zwy(:,:) = e1v(:,:) * pv(:,:,jk) 
    402          ENDIF 
    403 #endif 
    404423         ! 
    405424         !                                   !==  compute and add the vorticity term trend  =! 
     
    445464      ! 
    446465      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    447       REAL(wp) ::   zuav, zvau   ! local scalars 
     466      REAL(wp) ::   zuav, zvau, ze3f, zmsk   ! local scalars 
    448467      REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz, zww   ! 2D workspace 
    449468      !!---------------------------------------------------------------------- 
     
    497516         ! 
    498517#if defined key_qco 
    499          !                                   !==  horizontal fluxes and potential vorticity  ==! 
     518         DO_2D( 1, 0, 1, 0 )                 !==  potential vorticity  ==!   (key_qco) 
     519            zwz(ji,jj) = zwz(ji,jj) / e3f_vor(ji,jj,jk) 
     520         END_2D 
     521#else 
     522         SELECT CASE( nn_e3f_typ )           !==  potential vorticity  ==! 
     523         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
     524            DO_2D( 1, 0, 1, 0 ) 
     525               ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
     526                  &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
     527                  &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
     528                  &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  ) 
     529               IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * 4._wp / ze3f 
     530               ELSE                       ;   zwz(ji,jj) = 0._wp 
     531               ENDIF 
     532            END_2D 
     533         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
     534            DO_2D( 1, 0, 1, 0 ) 
     535               ze3f = (   e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
     536                  &     + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
     537                  &     + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
     538                  &     + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)   ) 
     539               zmsk = (   tmask(ji,jj+1,jk)   + tmask(ji+1,jj+1,jk)   & 
     540                  &     + tmask(ji,jj  ,jk)   + tmask(ji+1,jj  ,jk)   ) 
     541               IF( ze3f /= 0._wp ) THEN   ;   zwz(ji,jj) = zwz(ji,jj) * zmsk / ze3f 
     542               ELSE                       ;   zwz(ji,jj) = 0._wp 
     543               ENDIF 
     544            END_2D 
     545         END SELECT 
     546#endif 
     547         !                                   !==  horizontal fluxes  ==! 
    500548         zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    501549         zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    502          zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 
    503 #else 
    504          !                                   !==  horizontal fluxes and potential vorticity  ==! 
    505          IF( ln_sco ) THEN                        ! weighted by e3 
    506             zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 
    507             zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    508             zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    509          ELSE                                     ! ugly fix: unweighted by e3 
    510             zwx(:,:) = e2u(:,:) * pu(:,:,jk) 
    511             zwy(:,:) = e1v(:,:) * pv(:,:,jk) 
    512          ENDIF 
    513 #endif 
    514550         ! 
    515551         !                                   !==  compute and add the vorticity term trend  =! 
     
    570606         !                                             ! =============== 
    571607         ! 
    572          SELECT CASE( nn_een_e3f )           ! == reciprocal of e3 at F-point 
     608#if defined key_qco 
     609         DO_2D( 1, 0, 1, 0 )                 ! == reciprocal of e3 at F-point (key_qco) 
     610            z1_e3f(ji,jj) = 1._wp / e3f_vor(ji,jj,jk) 
     611         END_2D 
     612#else 
     613         SELECT CASE( nn_e3f_typ )           ! == reciprocal of e3 at F-point 
    573614         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
    574615            DO_2D( 1, 0, 1, 0 ) 
     
    594635            END_2D 
    595636         END SELECT 
     637#endif 
    596638         ! 
    597639         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
     
    801843      INTEGER ::   ji, jj, jk    ! dummy loop indices 
    802844      INTEGER ::   ioptio, ios   ! local integer 
     845      REAL(wp) ::   zmsk    ! local scalars 
    803846      !! 
    804847      NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_enT, ln_dynvor_eeT,   & 
    805          &                 ln_dynvor_een, nn_een_e3f   , ln_dynvor_mix, ln_dynvor_msk 
     848         &                 ln_dynvor_een, nn_e3f_typ   , ln_dynvor_mix, ln_dynvor_msk 
    806849      !!---------------------------------------------------------------------- 
    807850      ! 
     
    825868         WRITE(numout,*) '      energy conserving scheme  (een using e3t)      ln_dynvor_eeT = ', ln_dynvor_eeT 
    826869         WRITE(numout,*) '      enstrophy and energy conserving scheme         ln_dynvor_een = ', ln_dynvor_een 
    827          WRITE(numout,*) '         e3f = averaging /4 (=0) or /sum(tmask) (=1)    nn_een_e3f = ', nn_een_e3f 
     870         WRITE(numout,*) '         e3f = averaging /4 (=0) or /sum(tmask) (=1)    nn_e3f_typ = ', nn_e3f_typ 
    828871         WRITE(numout,*) '      mixed enstrophy/energy conserving scheme       ln_dynvor_mix = ', ln_dynvor_mix 
    829872         WRITE(numout,*) '      masked (=T) or unmasked(=F) vorticity          ln_dynvor_msk = ', ln_dynvor_msk 
     
    891934         ! 
    892935      END SELECT 
    893        
     936!!st ADD !! pense a recalculer le hf_0 
     937#if defined key_qco 
     938      SELECT CASE( nvor_scheme )    ! qco case: pre-computed a specific e3f_0 for some vorticity schemes 
     939      CASE( np_ENS , np_ENE , np_EEN , np_MIX ) 
     940         ! 
     941         ALLOCATE( e3f_0vor(jpi,jpj,jpk) ) 
     942         ! 
     943         SELECT CASE( nn_e3f_typ ) 
     944         CASE ( 0 )                        ! original formulation  (masked averaging of e3t divided by 4) 
     945            DO_3D( 0, 0, 0, 0, 1, jpk ) 
     946               e3f_0vor(ji,jj,jk) = (   e3t_0(ji  ,jj+1,jk)*tmask(ji  ,jj+1,jk)   & 
     947                  &                   + e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
     948                  &                   + e3t_0(ji  ,jj  ,jk)*tmask(ji  ,jj  ,jk)   & 
     949                  &                   + e3t_0(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk)   ) * 0.25_wp 
     950            END_3D 
     951         CASE ( 1 )                        ! new formulation  (masked averaging of e3t divided by the sum of mask) 
     952            DO_3D( 0, 0, 0, 0, 1, jpk ) 
     953               zmsk = (tmask(ji,jj+1,jk) +tmask(ji+1,jj+1,jk)   & 
     954                  &  + tmask(ji,jj  ,jk) +tmask(ji+1,jj  ,jk)  ) 
     955               ! 
     956               IF( zmsk /= 0._wp ) THEN  
     957                  e3f_0vor(ji,jj,jk) = (   e3t_0(ji  ,jj+1,jk)*tmask(ji  ,jj+1,jk)   & 
     958                     &                   + e3t_0(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
     959                     &                   + e3t_0(ji  ,jj  ,jk)*tmask(ji  ,jj  ,jk)   & 
     960                     &                   + e3t_0(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk)   ) / zmsk 
     961               ENDIF 
     962            END_3D 
     963         END SELECT 
     964         ! 
     965         CALL lbc_lnk( 'dynvor', e3f_0vor, 'F', 1._wp ) 
     966         !                                 ! insure e3f_0vor /= 0 
     967         WHERE( e3f_0vor(:,:,:) == 0._wp )   e3f_0vor(:,:,:) = e3f_0(:,:,:) 
     968         ! 
     969      END SELECT 
     970      ! 
     971#endif 
     972!!st END       
    894973      IF(lwp) THEN                   ! Print the choice 
    895974         WRITE(numout,*) 
Note: See TracChangeset for help on using the changeset viewer.