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 15603 for branches/UKMO/dev_r5518_GO6_starthour_obsoper/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90 – NEMO

Ignore:
Timestamp:
2021-12-16T10:39:55+01:00 (3 years ago)
Author:
mattmartin
Message:

Updated NEMO branch for coupled NWP at GO6 to include stochastic model perturbations.
For more info see ticket: https://code.metoffice.gov.uk/trac/nwpscience/ticket/1125.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_starthour_obsoper/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90

    r12555 r15603  
    2020   USE zdfkpp          ! KPP vertical mixing 
    2121   USE trd_oce         ! trends: ocean variables 
    22    USE trdtra          ! trends manager: tracers  
     22   USE trdtra          ! trends manager: tracers 
    2323   USE in_out_manager  ! I/O manager 
    2424   USE iom             ! for iom_put 
    2525   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2626   USE timing          ! Timing 
     27   USE stopack 
    2728 
    2829   IMPLICIT NONE 
     
    3031 
    3132   PUBLIC   zdf_evd    ! called by step.F90 
     33   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) :: rn_avevd0 
    3234 
    3335   !! * Substitutions 
     
    4345      !!---------------------------------------------------------------------- 
    4446      !!                  ***  ROUTINE zdf_evd  *** 
    45       !!                    
     47      !! 
    4648      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu- 
    4749      !!      sivity coefficients when a static instability is encountered. 
    4850      !! 
    4951      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients 
    50       !!      are set to avevd (namelist parameter) if the water column is  
     52      !!      are set to avevd (namelist parameter) if the water column is 
    5153      !!      statically unstable (i.e. if rn2 < -1.e-12 ) 
    5254      !! 
     
    7072         IF(lwp) WRITE(numout,*) 
    7173         IF(lwp .AND. lflush) CALL flush(numout) 
     74         ALLOCATE ( rn_avevd0(jpi,jpj) ) 
     75         rn_avevd0(:,:) = rn_avevd 
    7276      ENDIF 
    7377 
    7478      zavt_evd(:,:,:) = avt(:,:,:)           ! set avt prior to evd application 
     79 
     80#if defined key_traldf_c2d || key_traldf_c3d 
     81      IF( ln_stopack .AND. ( nn_spp_aevd > 0 ) ) THEN 
     82         rn_avevd0(:,:) = rn_avevd 
     83         CALL spp_gen(kt, rn_avevd0, nn_spp_aevd, rn_aevd_sd, jk_spp_aevd) 
     84      ENDIF 
     85#else 
     86      IF ( ln_stopack .AND. ( nn_spp_aevd > 0 ) ) & 
     87         & CALL ctl_stop( 'zdf_evd: parameter perturbation will only work with '// & 
     88                          'key_traldf_c2d or key_traldf_c3d') 
     89#endif 
    7590 
    7691      SELECT CASE ( nn_evdm ) 
     
    8095         zavm_evd(:,:,:) = avm(:,:,:)           ! set avm prior to evd application 
    8196         ! 
    82          DO jk = 1, jpkm1  
     97         DO jk = 1, jpkm1 
    8398            DO jj = 2, jpj             ! no vector opt. 
    8499               DO ji = 2, jpi 
     
    89104                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN 
    90105#endif 
    91                      avt (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk) 
    92                      avm (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk) 
    93                      avmu(ji  ,jj  ,jk) = rn_avevd * umask(ji  ,jj  ,jk) 
    94                      avmu(ji-1,jj  ,jk) = rn_avevd * umask(ji-1,jj  ,jk) 
    95                      avmv(ji  ,jj  ,jk) = rn_avevd * vmask(ji  ,jj  ,jk) 
    96                      avmv(ji  ,jj-1,jk) = rn_avevd * vmask(ji  ,jj-1,jk) 
     106                     avt (ji  ,jj  ,jk) = rn_avevd0(ji,jj) * tmask(ji  ,jj  ,jk) 
     107                     avm (ji  ,jj  ,jk) = rn_avevd0(ji,jj) * tmask(ji  ,jj  ,jk) 
     108                     avmu(ji  ,jj  ,jk) = rn_avevd0(ji,jj) * umask(ji  ,jj  ,jk) 
     109                     avmu(ji-1,jj  ,jk) = rn_avevd0(ji,jj) * umask(ji-1,jj  ,jk) 
     110                     avmv(ji  ,jj  ,jk) = rn_avevd0(ji,jj) * vmask(ji  ,jj  ,jk) 
     111                     avmv(ji  ,jj-1,jk) = rn_avevd0(ji,jj) * vmask(ji  ,jj-1,jk) 
    97112                  ENDIF 
    98113               END DO 
    99114            END DO 
    100          END DO  
     115         END DO 
    101116         CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions 
    102117         CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. ) 
     
    105120         CALL iom_put( "avm_evd", zavm_evd )              ! output this change 
    106121         ! 
    107       CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)  
     122      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12) 
    108123         DO jk = 1, jpkm1 
    109 !!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!  
     124!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL! 
    110125            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call) 
    111126               DO ji = 1, jpi 
    112127#if defined key_zdfkpp 
    113128                  ! no evd mixing in the boundary layer with KPP 
    114                   IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  )   &           
     129                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  )   & 
    115130#else 
    116131                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   & 
    117132#endif 
    118                      avt(ji,jj,jk) = rn_avevd * tmask(ji,jj,jk) 
     133                     avt(ji,jj,jk) = rn_avevd0(ji,jj) * tmask(ji,jj,jk) 
    119134               END DO 
    120135            END DO 
    121136         END DO 
    122137         ! 
    123       END SELECT  
     138      END SELECT 
    124139 
    125140      zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:)   ! change in avt due to evd 
Note: See TracChangeset for help on using the changeset viewer.