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

source: branches/UKMO/dev_r5518_GO6_starthour_obsoper/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90 @ 15603

Last change on this file since 15603 was 15603, checked in by mattmartin, 2 years ago

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 size: 6.7 KB
RevLine 
[3]1MODULE zdfevd
2   !!======================================================================
3   !!                       ***  MODULE  zdfevd  ***
4   !! Ocean physics: parameterization of convection through an enhancement
5   !!                of vertical eddy mixing coefficient
6   !!======================================================================
[1438]7   !! History :  OPA  !  1997-06  (G. Madec, A. Lazar)  Original code
8   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module
9   !!             -   !  2005-06  (C. Ethe) KPP parameterization
10   !!            3.2  !  2009-03  (M. Leclair, G. Madec, R. Benshila) test on both before & after
11   !!----------------------------------------------------------------------
[3]12
13   !!----------------------------------------------------------------------
[1438]14   !!   zdf_evd      : increase the momentum and tracer Kz at the location of
15   !!                  statically unstable portion of the water column (ln_zdfevd=T)
[3]16   !!----------------------------------------------------------------------
17   USE oce             ! ocean dynamics and tracers variables
18   USE dom_oce         ! ocean space and time domain variables
19   USE zdf_oce         ! ocean vertical physics variables
[255]20   USE zdfkpp          ! KPP vertical mixing
[7061]21   USE trd_oce         ! trends: ocean variables
[15603]22   USE trdtra          ! trends manager: tracers
[3]23   USE in_out_manager  ! I/O manager
[1482]24   USE iom             ! for iom_put
[3]25   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
[3294]26   USE timing          ! Timing
[15603]27   USE stopack
[3]28
29   IMPLICIT NONE
30   PRIVATE
31
[1438]32   PUBLIC   zdf_evd    ! called by step.F90
[15603]33   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) :: rn_avevd0
[3]34
[255]35   !! * Substitutions
36#  include "domzgr_substitute.h90"
[3]37   !!----------------------------------------------------------------------
[2715]38   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
[1438]39   !! $Id$
[2715]40   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]41   !!----------------------------------------------------------------------
42CONTAINS
43
44   SUBROUTINE zdf_evd( kt )
45      !!----------------------------------------------------------------------
46      !!                  ***  ROUTINE zdf_evd  ***
[15603]47      !!
[3]48      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
49      !!      sivity coefficients when a static instability is encountered.
50      !!
[1546]51      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients
[15603]52      !!      are set to avevd (namelist parameter) if the water column is
[3]53      !!      statically unstable (i.e. if rn2 < -1.e-12 )
54      !!
[1546]55      !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases
56      !!
[1438]57      !! References :   Lazar, A., these de l'universite Paris VI, France, 1997
[3]58      !!----------------------------------------------------------------------
[2715]59      USE oce,   zavt_evd => ua , zavm_evd => va  ! (ua,va) used ua workspace
60      !
61      INTEGER, INTENT( in ) ::   kt   ! ocean time-step indexocean time step
62      !
63      INTEGER ::   ji, jj, jk   ! dummy loop indices
[3]64      !!----------------------------------------------------------------------
[3294]65      !
66      IF( nn_timing == 1 )  CALL timing_start('zdf_evd')
67      !
[3]68      IF( kt == nit000 ) THEN
69         IF(lwp) WRITE(numout,*)
70         IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)'
71         IF(lwp) WRITE(numout,*) '~~~~~~~ '
72         IF(lwp) WRITE(numout,*)
[12555]73         IF(lwp .AND. lflush) CALL flush(numout)
[15603]74         ALLOCATE ( rn_avevd0(jpi,jpj) )
75         rn_avevd0(:,:) = rn_avevd
[3]76      ENDIF
77
[1681]78      zavt_evd(:,:,:) = avt(:,:,:)           ! set avt prior to evd application
[255]79
[15603]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
90
[1537]91      SELECT CASE ( nn_evdm )
[2715]92      !
[3]93      CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
[2715]94         !
[1681]95         zavm_evd(:,:,:) = avm(:,:,:)           ! set avm prior to evd application
96         !
[15603]97         DO jk = 1, jpkm1
[3]98            DO jj = 2, jpj             ! no vector opt.
99               DO ji = 2, jpi
[1438]100#if defined key_zdfkpp
[1546]101                  ! no evd mixing in the boundary layer with KPP
[2715]102                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  ) THEN
[1438]103#else
[2715]104                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
[1438]105#endif
[15603]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)
[3]112                  ENDIF
113               END DO
114            END DO
[15603]115         END DO
[2715]116         CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions
[1546]117         CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )
118         !
[1681]119         zavm_evd(:,:,:) = avm(:,:,:) - zavm_evd(:,:,:)   ! change in avm due to evd
120         CALL iom_put( "avm_evd", zavm_evd )              ! output this change
121         !
[15603]122      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
[1546]123         DO jk = 1, jpkm1
[15603]124!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
[3]125            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call)
126               DO ji = 1, jpi
[1438]127#if defined key_zdfkpp
[1546]128                  ! no evd mixing in the boundary layer with KPP
[15603]129                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  )   &
[1438]130#else
[2715]131                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   &
[1438]132#endif
[15603]133                     avt(ji,jj,jk) = rn_avevd0(ji,jj) * tmask(ji,jj,jk)
[3]134               END DO
135            END DO
[1546]136         END DO
137         !
[15603]138      END SELECT
[3]139
[1681]140      zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:)   ! change in avt due to evd
141      CALL iom_put( "avt_evd", zavt_evd )              ! output this change
[7061]142      IF( l_trdtra ) CALL trd_tra( kt, 'TRA', jp_tem, jptra_evd, zavt_evd )
[1546]143      !
[3294]144      IF( nn_timing == 1 )  CALL timing_stop('zdf_evd')
145      !
[3]146   END SUBROUTINE zdf_evd
147
148   !!======================================================================
149END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.