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_crs.F90 in branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd_crs.F90 @ 6101

Last change on this file since 6101 was 6101, checked in by cbricaud, 8 years ago

correction of bugs from last update and improvments for CRS

File size: 5.9 KB
Line 
1MODULE zdfevd_crs
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 in_out_manager  ! I/O manager
22   USE iom             ! for iom_put
23   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
24   USE timing          ! Timing
25   USE wrk_nemo       ! work arrays
26   USE crs
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   zdf_evd_crs    ! called by step.F90
32
33   !! * Substitutions
34#  include "domzgr_substitute.h90"
35   !!----------------------------------------------------------------------
36   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
37   !! $Id: zdfevd.F90 4990 2014-12-15 16:42:49Z timgraham $
38   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
39   !!----------------------------------------------------------------------
40CONTAINS
41
42   SUBROUTINE zdf_evd_crs( kt )
43      !!----------------------------------------------------------------------
44      !!                  ***  ROUTINE zdf_evd  ***
45      !!                   
46      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
47      !!      sivity coefficients when a static instability is encountered.
48      !!
49      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients
50      !!      are set to avevd (namelist parameter) if the water column is
51      !!      statically unstable (i.e. if rn2 < -1.e-12 )
52      !!
53      !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases
54      !!
55      !! References :   Lazar, A., these de l'universite Paris VI, France, 1997
56      !!----------------------------------------------------------------------
57      !USE oce,   zavt_evd => ua , zavm_evd => va  ! (ua,va) used ua workspace
58      !
59      INTEGER, INTENT( in ) ::   kt   ! ocean time-step indexocean time step
60      !
61      INTEGER ::   ji, jj, jk   ! dummy loop indices
62      REAL(wp), POINTER, DIMENSION(:,:,:) :: zavt_evd_crs,zavm_evd_crs
63      !!----------------------------------------------------------------------
64      !
65      IF( nn_timing == 1 )  CALL timing_start('zdf_evd_crs')
66      !
67      IF( kt == nit000 ) THEN
68         IF(lwp) WRITE(numout,*)
69         IF(lwp) WRITE(numout,*) 'zdf_evd_crs : Enhanced Vertical Diffusion (evd)'
70         IF(lwp) WRITE(numout,*) '~~~~~~~ '
71         IF(lwp) WRITE(numout,*)
72      ENDIF
73
74      CALL wrk_alloc( jpi_crs,jpj_crs,jpk, zavt_evd_crs, zavm_evd_crs )
75
76      zavt_evd_crs(:,:,:) = avt_crs(:,:,:)           ! set avt prior to evd application
77
78      SELECT CASE ( nn_evdm )
79      !
80      !CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
81      !   !
82      !   zavm_evd(:,:,:) = avm_crs(:,:,:)           ! set avm prior to evd application
83      !   !
84      !   DO jk = 1, jpkm1
85      !      DO jj = 2, jpj_crs             ! no vector opt.
86      !         DO ji = 2, jpi_crs
87      !            IF(  MIN( rn2_crs(ji,jj,jk), rb2_crs(ji,jj,jk) ) <= -1.e-12 ) THEN
88      !               avt_crs (ji  ,jj  ,jk) = rn_avevd * tmask_crs(ji  ,jj  ,jk)
89      !               avm_crs (ji  ,jj  ,jk) = rn_avevd * tmask_crs(ji  ,jj  ,jk)
90      !               avmu_crs(ji  ,jj  ,jk) = rn_avevd * umask_crs(ji  ,jj  ,jk)
91      !               avmu_crs(ji-1,jj  ,jk) = rn_avevd * umask_crs(ji-1,jj  ,jk)
92      !               avmv_crs(ji  ,jj  ,jk) = rn_avevd * vmask_crs(ji  ,jj  ,jk)
93      !               avmv_crs(ji  ,jj-1,jk) = rn_avevd * vmask_crs(ji  ,jj-1,jk)
94      !            ENDIF
95      !         END DO
96      !      END DO
97      !   END DO
98      !   CALL crs_lbc_lnk( avt_crs , 'W', 1. )   ;   CALL crs_lbc_lnk( avm_crs , 'W', 1. )   ! Lateral boundary conditions
99      !   CALL crs_lbc_lnk( avmu_crs, 'U', 1. )   ;   CALL crs_lbc_lnk( avmv_crs, 'V', 1. )
100      !   !
101      !   zavm_evd_crs(:,:,:) = avm_crs(:,:,:) - zavm_evd_crs(:,:,:)   ! change in avm due to evd
102      !   CALL iom_put( "avm_evd", zavm_evd_crs )              ! output this change
103      !   !
104      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
105         DO jk = 1, jpkm1
106            DO jj = 1, jpj_crs             ! loop over the whole domain (no lbc_lnk call)
107               DO ji = 1, jpi_crs
108                  IF(  MIN( rn2_crs(ji,jj,jk), rb2_crs(ji,jj,jk) ) <= -1.e-12 )   &
109                     avt_crs(ji,jj,jk) = rn_avevd * tmask_crs(ji,jj,jk)
110               END DO
111            END DO
112         END DO
113         !
114      END SELECT
115
116      zavt_evd_crs(:,:,:) = avt_crs(:,:,:) - zavt_evd_crs(:,:,:)   ! change in avt due to evd
117      CALL iom_put( "avt_evd_crs", zavt_evd_crs )              ! output this change
118      !
119      CALL wrk_dealloc( jpi_crs,jpj_crs,jpk, zavt_evd_crs, zavm_evd_crs )
120      !
121      IF( nn_timing == 1 )  CALL timing_stop('zdf_evd_crs')
122      !
123   END SUBROUTINE zdf_evd_crs
124
125   !!======================================================================
126END MODULE zdfevd_crs
Note: See TracBrowser for help on using the repository browser.