source: branches/UKMO/dev_r5518_GO6_package_FOAMv14/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90 @ 11442

Last change on this file since 11442 was 11442, checked in by mattmartin, 17 months ago

Introduction of stochastic physics in NEMO, based on Andrea Storto's code.
For details, see ticket https://code.metoffice.gov.uk/trac/utils/ticket/251.

File size: 6.5 KB
Line 
1MODULE zdfevd
2   !!======================================================================
3   !!                       ***  MODULE  zdfevd  ***
4   !! Ocean physics: parameterization of convection through an enhancement
5   !!                of vertical eddy mixing coefficient
6   !!======================================================================
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   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   zdf_evd      : increase the momentum and tracer Kz at the location of
15   !!                  statically unstable portion of the water column (ln_zdfevd=T)
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
20   USE zdfkpp          ! KPP vertical mixing
21   USE trd_oce         ! trends: ocean variables
22   USE trdtra          ! trends manager: tracers
23   USE in_out_manager  ! I/O manager
24   USE iom             ! for iom_put
25   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
26   USE timing          ! Timing
27   USE stopack         
28
29   IMPLICIT NONE
30   PRIVATE
31
32   PUBLIC   zdf_evd    ! called by step.F90
33   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) :: rn_avevd0
34
35   !! * Substitutions
36#  include "domzgr_substitute.h90"
37   !!----------------------------------------------------------------------
38   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
39   !! $Id$
40   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
41   !!----------------------------------------------------------------------
42CONTAINS
43
44   SUBROUTINE zdf_evd( kt )
45      !!----------------------------------------------------------------------
46      !!                  ***  ROUTINE zdf_evd  ***
47      !!                   
48      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
49      !!      sivity coefficients when a static instability is encountered.
50      !!
51      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients
52      !!      are set to avevd (namelist parameter) if the water column is
53      !!      statically unstable (i.e. if rn2 < -1.e-12 )
54      !!
55      !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases
56      !!
57      !! References :   Lazar, A., these de l'universite Paris VI, France, 1997
58      !!----------------------------------------------------------------------
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
64      !!----------------------------------------------------------------------
65      !
66      IF( nn_timing == 1 )  CALL timing_start('zdf_evd')
67      !
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,*)
73         ALLOCATE ( rn_avevd0(jpi,jpj) )
74         rn_avevd0(:,:) = rn_avevd
75      ENDIF
76
77      zavt_evd(:,:,:) = avt(:,:,:)           ! set avt prior to evd application
78
79      IF( ln_stopack .AND. ( nn_spp_aevd > 0 ) ) THEN
80         rn_avevd0(:,:) = rn_avevd
81         CALL spp_gen(kt, rn_avevd0, nn_spp_aevd, rn_aevd_sd, jk_spp_aevd)
82      ENDIF
83
84      SELECT CASE ( nn_evdm )
85      !
86      CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
87         !
88         zavm_evd(:,:,:) = avm(:,:,:)           ! set avm prior to evd application
89         !
90         DO jk = 1, jpkm1 
91            DO jj = 2, jpj             ! no vector opt.
92               DO ji = 2, jpi
93#if defined key_zdfkpp
94                  ! no evd mixing in the boundary layer with KPP
95                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  ) THEN
96#else
97                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
98#endif
99                     avt (ji  ,jj  ,jk) = rn_avevd0(ji,jj) * tmask(ji  ,jj  ,jk)
100                     avm (ji  ,jj  ,jk) = rn_avevd0(ji,jj) * tmask(ji  ,jj  ,jk)
101                     avmu(ji  ,jj  ,jk) = rn_avevd0(ji,jj) * umask(ji  ,jj  ,jk)
102                     avmu(ji-1,jj  ,jk) = rn_avevd0(ji,jj) * umask(ji-1,jj  ,jk)
103                     avmv(ji  ,jj  ,jk) = rn_avevd0(ji,jj) * vmask(ji  ,jj  ,jk)
104                     avmv(ji  ,jj-1,jk) = rn_avevd0(ji,jj) * vmask(ji  ,jj-1,jk)
105                  ENDIF
106               END DO
107            END DO
108         END DO
109         CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions
110         CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )
111         !
112         zavm_evd(:,:,:) = avm(:,:,:) - zavm_evd(:,:,:)   ! change in avm due to evd
113         CALL iom_put( "avm_evd", zavm_evd )              ! output this change
114         !
115      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
116         DO jk = 1, jpkm1
117!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
118            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call)
119               DO ji = 1, jpi
120#if defined key_zdfkpp
121                  ! no evd mixing in the boundary layer with KPP
122                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12  .AND.  fsdepw(ji,jj,jk) > hkpp(ji,jj)  )   &         
123#else
124                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   &
125#endif
126                     avt(ji,jj,jk) = rn_avevd0(ji,jj) * tmask(ji,jj,jk)
127               END DO
128            END DO
129         END DO
130         !
131      END SELECT
132
133      zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:)   ! change in avt due to evd
134      CALL iom_put( "avt_evd", zavt_evd )              ! output this change
135      IF( l_trdtra ) CALL trd_tra( kt, 'TRA', jp_tem, jptra_evd, zavt_evd )
136      !
137      IF( nn_timing == 1 )  CALL timing_stop('zdf_evd')
138      !
139   END SUBROUTINE zdf_evd
140
141   !!======================================================================
142END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.