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 NEMO/trunk/src/OCE/ZDF – NEMO

source: NEMO/trunk/src/OCE/ZDF/zdfevd.F90 @ 15062

Last change on this file since 15062 was 14834, checked in by hadcv, 3 years ago

#2600: Merge in dev_r14273_HPC-02_Daley_Tiling

  • Property svn:keywords set to Id
File size: 6.8 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   !!            3.2  !  2009-03  (M. Leclair, G. Madec, R. Benshila) test on both before & after
[9019]10   !!            4.0  !  2017-04  (G. Madec)  evd applied on avm (at t-point)
[1438]11   !!----------------------------------------------------------------------
[3]12
13   !!----------------------------------------------------------------------
[5836]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
[7646]20   USE trd_oce         ! trends: ocean variables
21   USE trdtra          ! trends manager: tracers
[5836]22   !
[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
[3]27
28   IMPLICIT NONE
29   PRIVATE
30
[1438]31   PUBLIC   zdf_evd    ! called by step.F90
[3]32
[12377]33   !! * Substitutions
34#  include "do_loop_substitute.h90"
[3]35   !!----------------------------------------------------------------------
[9598]36   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[1438]37   !! $Id$
[10068]38   !! Software governed by the CeCILL license (see ./LICENSE)
[3]39   !!----------------------------------------------------------------------
40CONTAINS
41
[12377]42   SUBROUTINE zdf_evd( kt, Kmm, Krhs, p_avm, p_avt )
[3]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      !!
[9019]49      !! ** Method  :   tracer (and momentum if nn_evdm=1) vertical mixing
50      !!              coefficients are set to rn_evd (namelist parameter)
51      !!              if the water column is statically unstable.
52      !!                The test of static instability is performed using
53      !!              Brunt-Vaisala frequency (rn2 < -1.e-12) of to successive
54      !!              time-step (Leap-Frog environnement): before and
55      !!              now time-step.
[3]56      !!
[9019]57      !! ** Action  :   avt, avm   enhanced where static instability occurs
[3]58      !!----------------------------------------------------------------------
[9019]59      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time-step indexocean time step
[12377]60      INTEGER                    , INTENT(in   ) ::   Kmm, Krhs      ! time level indices
[9019]61      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points)
[2715]62      !
63      INTEGER ::   ji, jj, jk   ! dummy loop indices
[14834]64      ! NOTE: [tiling] use a SAVE array to store diagnostics, then send after all tiles are finished. This is necessary because p_avt/p_avm are modified on adjacent tiles when using nn_hls > 1. zavt_evd/zavm_evd are then zero on some points when subsequently calculated for these tiles.
65      REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   zavt_evd, zavm_evd
[3]66      !!----------------------------------------------------------------------
[3294]67      !
[14834]68      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
69         IF( kt == nit000 ) THEN
70            IF(lwp) WRITE(numout,*)
71            IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)'
72            IF(lwp) WRITE(numout,*) '~~~~~~~ '
73            IF(lwp) WRITE(numout,*)
74         ENDIF
75
76         ALLOCATE( zavt_evd(jpi,jpj,jpk) )
77         IF( nn_evdm == 1 ) ALLOCATE( zavm_evd(jpi,jpj,jpk) )
[3]78      ENDIF
[5836]79      !
80      !
[14834]81      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
82         zavt_evd(ji,jj,jk) = p_avt(ji,jj,jk)         ! set avt prior to evd application
83      END_3D
[5836]84      !
[1537]85      SELECT CASE ( nn_evdm )
[2715]86      !
[9019]87      CASE ( 1 )           !==  enhance tracer & momentum Kz  ==!   (if rn2<-1.e-12)
[2715]88         !
[14834]89         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
90            zavm_evd(ji,jj,jk) = p_avm(ji,jj,jk)      ! set avm prior to evd application
91         END_3D
[1681]92         !
[9019]93!! change last digits results
94!         WHERE( MAX( rn2(2:jpi,2:jpj,2:jpkm1), rn2b(2:jpi,2:jpj,2:jpkm1) )  <= -1.e-12 ) THEN
95!            p_avt(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)
96!            p_avm(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)
97!         END WHERE
98         !
[14834]99         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
[12377]100            IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
101               p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)
102               p_avm(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)
103            ENDIF
104         END_3D
[1546]105         !
[14834]106         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
107            zavm_evd(ji,jj,jk) = p_avm(ji,jj,jk) - zavm_evd(ji,jj,jk)   ! change in avm due to evd
108         END_3D
109         IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
110            CALL iom_put( "avm_evd", zavm_evd )                ! output this change
111            DEALLOCATE( zavm_evd )
112         ENDIF
[1681]113         !
[9019]114      CASE DEFAULT         !==  enhance tracer Kz  ==!   (if rn2<-1.e-12)
115!! change last digits results
116!         WHERE( MAX( rn2(2:jpi,2:jpj,2:jpkm1), rn2b(2:jpi,2:jpj,2:jpkm1) )  <= -1.e-12 )
117!            p_avt(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)
118!         END WHERE
119
[14834]120         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
[12377]121            IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   &
122               p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)
123         END_3D
[1546]124         !
[3]125      END SELECT 
[9019]126      !
[14834]127      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )
128         zavt_evd(ji,jj,jk) = p_avt(ji,jj,jk) - zavt_evd(ji,jj,jk)   ! change in avt due to evd
129      END_3D
130      IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
131         CALL iom_put( "avt_evd", zavt_evd )              ! output this change
132         DEALLOCATE( zavt_evd )
133      ENDIF
[12377]134      IF( l_trdtra ) CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_evd, zavt_evd )
[1546]135      !
[3]136   END SUBROUTINE zdf_evd
137
138   !!======================================================================
139END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.