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 13883 for NEMO/branches/UKMO/NEMO_4.0.3_GM_rossby_radius_ramp/src/OCE/LDF/ldftra.F90 – NEMO

Ignore:
Timestamp:
2020-11-26T11:27:11+01:00 (4 years ago)
Author:
davestorkey
Message:

UKMO/NEMO_4.0.3_GM_rossby_radius_ramp: code changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/UKMO/NEMO_4.0.3_GM_rossby_radius_ramp/src/OCE/LDF/ldftra.F90

    r13587 r13883  
    7272   REAL(wp), PUBLIC ::      rn_Ue               !: lateral diffusive velocity  [m/s] 
    7373   REAL(wp), PUBLIC ::      rn_Le               !: lateral diffusive length    [m] 
     74   INTEGER,  PUBLIC ::   nn_ldfeiv_shape     !: shape of bounding coefficient (Treguier et al formulation only) 
    7475    
    7576   !                                  ! Flag to control the type of lateral diffusive operator 
     
    409410      !!---------------------------------------------------------------------- 
    410411      ! 
    411       IF( ln_ldfeiv .AND. nn_aei_ijk_t == 21 ) THEN       ! eddy induced velocity coefficients 
     412      IF( ln_ldfeiv .AND. ( nn_aei_ijk_t == 21 ) ) THEN        
     413         !                                ! eddy induced velocity coefficients 
    412414         !                                ! =F(growth rate of baroclinic instability) 
    413415         !                                ! max value aeiv_0 ; decreased to 0 within 20N-20S 
     
    502504      !! 
    503505      NAMELIST/namtra_eiv/ ln_ldfeiv   , ln_ldfeiv_dia,   &   ! eddy induced velocity (eiv) 
    504          &                 nn_aei_ijk_t, rn_Ue, rn_Le         ! eiv  coefficient 
     506         &                 nn_aei_ijk_t, rn_Ue, rn_Le,    &   ! eiv  coefficient 
     507         &                 nn_ldfeiv_shape 
    505508      !!---------------------------------------------------------------------- 
    506509      ! 
     
    525528         WRITE(numout,*) '      eiv streamfunction & velocity diag.        ln_ldfeiv_dia = ', ln_ldfeiv_dia 
    526529         WRITE(numout,*) '      coefficients :' 
    527          WRITE(numout,*) '         type of time-space variation            nn_aei_ijk_t  = ', nn_aht_ijk_t 
     530         WRITE(numout,*) '         type of time-space variation            nn_aei_ijk_t  = ', nn_aei_ijk_t 
    528531         WRITE(numout,*) '         lateral diffusive velocity (if cst)     rn_Ue         = ', rn_Ue, ' m/s' 
    529532         WRITE(numout,*) '         lateral diffusive length   (if cst)     rn_Le         = ', rn_Le, ' m' 
     
    595598            IF(lwp) WRITE(numout,*) '                                       = F( growth rate of baroclinic instability )' 
    596599            IF(lwp) WRITE(numout,*) '           maximum allowed value: aei0 = ', aei0, ' m2/s' 
     600            IF(lwp) WRITE(numout,*) '           shape of bounding coefficient : ',nn_ldfeiv_shape 
    597601            ! 
    598602            l_ldfeiv_time = .TRUE.     ! will be calculated by call to ldf_tra routine in step.F90 
     
    638642      !!---------------------------------------------------------------------- 
    639643      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time-step index 
    640       REAL(wp)                        , INTENT(inout) ::   paei0          ! max value            [m2/s] 
     644      REAL(wp)                        , INTENT(in   ) ::   paei0          ! max value            [m2/s] 
    641645      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   paeiu, paeiv   ! eiv coefficient      [m2/s] 
    642646      ! 
    643647      INTEGER  ::   ji, jj, jk    ! dummy loop indices 
    644       REAL(wp) ::   zfw, ze3w, zn2, z1_f20, zaht, zaht_min, zzaei    ! local scalars 
    645       REAL(wp), DIMENSION(jpi,jpj) ::   zn, zah, zhw, zRo, zaeiw   ! 2D workspace 
     648      REAL(wp) ::   zfw, ze3w, zn2, z1_f20, zaht, zaht_min, zzaei, z2_3    ! local scalars 
     649      REAL(wp), DIMENSION(jpi,jpj) ::   zn, zah, zhw, zRo, zRo_lim, zTclinic_recip, zaeiw, zratio   ! 2D workspace 
     650      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmodslp ! 3D workspace 
    646651      !!---------------------------------------------------------------------- 
    647652      ! 
    648653      zn (:,:) = 0._wp        ! Local initialization 
     654      zmodslp(:,:,:) = 0._wp 
    649655      zhw(:,:) = 5._wp 
    650656      zah(:,:) = 0._wp 
    651657      zRo(:,:) = 0._wp 
     658      zRo_lim(:,:) = 0._wp 
     659      zTclinic_recip(:,:) = 0._wp 
     660      zratio(:,:) = 0._wp  
     661      zaeiw(:,:) = 0._wp     
    652662      !                       ! Compute lateral diffusive coefficient at T-point 
    653663      IF( ln_traldf_triad ) THEN 
     
    682692                  ! T^-1 = sqrt(m_jpk(N^2*(r1^2+r2^2)*e3w)) 
    683693                  ze3w = e3w_n(ji,jj,jk) * wmask(ji,jj,jk) 
    684                   zah(ji,jj) = zah(ji,jj) + zn2 * ( wslpi(ji,jj,jk) * wslpi(ji,jj,jk)   & 
    685                      &                            + wslpj(ji,jj,jk) * wslpj(ji,jj,jk) ) * ze3w 
     694                  zmodslp(ji,jj,jk) =  wslpi(ji,jj,jk) * wslpi(ji,jj,jk)   & 
     695                     &               + wslpj(ji,jj,jk) * wslpj(ji,jj,jk) 
     696                  zah(ji,jj) = zah(ji,jj) + zn2 * zmodslp(ji,jj,jk) * ze3w 
    686697                  zhw(ji,jj) = zhw(ji,jj) + ze3w 
    687698               END DO 
     
    693704         DO ji = fs_2, fs_jpim1   ! vector opt. 
    694705            zfw = MAX( ABS( 2. * omega * SIN( rad * gphit(ji,jj) ) ) , 1.e-10 ) 
    695             ! Rossby radius at w-point taken betwenn 2 km and  40km 
    696             zRo(ji,jj) = MAX(  2.e3 , MIN( .4 * zn(ji,jj) / zfw, 40.e3 )  ) 
     706            ! Rossby radius at w-point taken between 2 km and  40km 
     707            zRo(ji,jj) = .4 * zn(ji,jj) / zfw 
     708            zRo_lim(ji,jj) = MAX(  2.e3 , MIN( zRo(ji,jj), 40.e3 )  ) 
    697709            ! Compute aeiw by multiplying Ro^2 and T^-1 
    698             zaeiw(ji,jj) = zRo(ji,jj) * zRo(ji,jj) * SQRT( zah(ji,jj) / zhw(ji,jj) ) * tmask(ji,jj,1) 
     710            zTclinic_recip(ji,jj) = SQRT( MAX(zah(ji,jj),0._wp) / zhw(ji,jj) ) * tmask(ji,jj,1) 
     711            zaeiw(ji,jj) = zRo_lim(ji,jj) * zRo_lim(ji,jj) * zTclinic_recip(ji,jj)  
    699712         END DO 
    700713      END DO 
    701  
     714      IF( iom_use('N_2d') ) CALL iom_put('N_2d',zn(:,:)/zhw(:,:)) 
     715      IF( iom_use('modslp') ) CALL iom_put('modslp',SQRT(zmodslp(:,:,:)) ) 
     716      CALL iom_put('RossRad',zRo) 
     717      CALL iom_put('RossRadlim',zRo_lim) 
     718      CALL iom_put('Tclinic_recip',zTclinic_recip) 
    702719      !                                         !==  Bound on eiv coeff.  ==! 
    703720      z1_f20 = 1._wp / (  2._wp * omega * sin( rad * 20._wp )  ) 
    704       DO jj = 2, jpjm1 
    705          DO ji = fs_2, fs_jpim1   ! vector opt. 
    706             zzaei = MIN( 1._wp, ABS( ff_t(ji,jj) * z1_f20 ) ) * zaeiw(ji,jj)     ! tropical decrease 
    707             zaeiw(ji,jj) = MIN( zzaei , paei0 )                                  ! Max value = paei0 
    708          END DO 
    709       END DO 
     721      z2_3 = 2._wp/3._wp 
     722 
     723      SELECT CASE(nn_ldfeiv_shape) 
     724         CASE(0) !! Standard shape applied - decrease in tropics and cap.  
     725            DO jj = 2, jpjm1 
     726               DO ji = fs_2, fs_jpim1   ! vector opt. 
     727                  zzaei = MIN( 1._wp, ABS( ff_t(ji,jj) * z1_f20 ) ) * zaeiw(ji,jj)     ! tropical decrease 
     728                  zaeiw(ji,jj) = MIN( zzaei, paei0 ) 
     729               END DO 
     730            END DO 
     731 
     732         CASE(1) !! Abrupt cut-off on Rossby radius: 
     733! JD : modifications here to introduce scaling by local rossby radius of deformation vs local grid scale 
     734! arbitrary decision that GM is de-activated if local rossy radius larger than 2 times local grid scale 
     735! based on Hallberg (2013) 
     736            DO jj = 2, jpjm1 
     737               DO ji = fs_2, fs_jpim1   ! vector opt. 
     738                  IF ( zRo(ji,jj) >= ( 2._wp * MIN( e1t(ji,jj), e2t(ji,jj) ) ) ) THEN 
     739! TODO : use a version of zRo that integrates over a few time steps ? 
     740                      zaeiw(ji,jj) = 0._wp 
     741                  ELSE 
     742                      zaeiw(ji,jj) = MIN( zaeiw(ji,jj), paei0 ) 
     743                  ENDIF 
     744               END DO 
     745            END DO 
     746 
     747         CASE(2) !! Rossby radius ramp type 1: 
     748            DO jj = 2, jpjm1 
     749               DO ji = fs_2, fs_jpim1   ! vector opt. 
     750                  zratio(ji,jj) = zRo(ji,jj)/MIN(e1t(ji,jj),e2t(ji,jj)) 
     751                  zaeiw(ji,jj) = MIN( zaeiw(ji,jj), MAX( 0._wp, MIN( 1._wp, z2_3*(2._wp - zratio(ji,jj)) ) ) * paei0 ) 
     752               END DO 
     753            END DO 
     754            CALL iom_put('RR_GS',zratio) 
     755 
     756         CASE(3) !! Rossby radius ramp type 2: 
     757            DO jj = 2, jpjm1 
     758               DO ji = fs_2, fs_jpim1   ! vector opt. 
     759                  zratio(ji,jj) = MIN(e1t(ji,jj),e2t(ji,jj))/zRo(ji,jj) 
     760                  zaeiw(ji,jj) = MIN( zaeiw(ji,jj), MAX( 0._wp, MIN( 1._wp, z2_3*( zratio(ji,jj) - 0.5_wp ) ) ) * paei0 ) 
     761               END DO 
     762            END DO 
     763 
     764         CASE(4) !! bathymetry ramp: 
     765            DO jj = 2, jpjm1 
     766               DO ji = fs_2, fs_jpim1   ! vector opt. 
     767                  zaeiw(ji,jj) = MIN( zaeiw(ji,jj), MAX( 0._wp, MIN( 1._wp, 0.001*(ht_0(ji,jj) - 2000._wp) ) ) * paei0 ) 
     768               END DO 
     769            END DO 
     770 
     771         CASE(5) !! Rossby radius ramp type 1 applied to Treguier et al coefficient rather than cap: 
     772                 !! Note the ramp is RR/GS=[2.0,1.0] (not [2.0,0.5] as for cases 2,3) and we ramp up  
     773                 !! to 5% of the Treguier et al coefficient, aiming for peak values of around 100m2/s 
     774                 !! at high latitudes rather than 2000m2/s which is what you get in eORCA025 with an  
     775                 !! uncapped coefficient. 
     776            DO jj = 2, jpjm1 
     777               DO ji = fs_2, fs_jpim1   ! vector opt. 
     778                  zratio(ji,jj) = zRo(ji,jj)/MIN(e1t(ji,jj),e2t(ji,jj)) 
     779                  zaeiw(ji,jj) = MAX( 0._wp, MIN( 1._wp, 2._wp - zratio(ji,jj) ) ) * 0.05 * zaeiw(ji,jj) 
     780                  zaeiw(ji,jj) = MIN( zaeiw(ji,jj), paei0 ) 
     781               END DO 
     782            END DO 
     783            CALL iom_put('RR_GS',zratio) 
     784 
     785         CASE DEFAULT 
     786               CALL ctl_stop('ldf_eiv: Unrecognised option for nn_ldfeiv_shape.')          
     787 
     788      END SELECT 
     789 
    710790      CALL lbc_lnk( 'ldftra', zaeiw(:,:), 'W', 1. )       ! lateral boundary condition 
    711791      !                
     
    722802         paeiv(:,:,jk) = paeiv(:,:,1) * vmask(:,:,jk) 
    723803      END DO 
    724       !   
     804      ! 
    725805   END SUBROUTINE ldf_eiv 
    726806 
Note: See TracChangeset for help on using the changeset viewer.