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/2016/dev_r6519_HPC_4/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/2016/dev_r6519_HPC_4/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90 @ 6748

Last change on this file since 6748 was 6748, checked in by mocavero, 8 years ago

GYRE hybrid parallelization

  • Property svn:keywords set to Id
File size: 5.6 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   !!            3.2  !  2009-03  (M. Leclair, G. Madec, R. Benshila) test on both before & after
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   zdf_evd       : increase the momentum and tracer Kz at the location of
14   !!                   statically unstable portion of the water column (ln_zdfevd=T)
15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and tracers variables
17   USE dom_oce         ! ocean space and time domain variables
18   USE zdf_oce         ! ocean vertical physics variables
19   !
20   USE in_out_manager  ! I/O manager
21   USE iom             ! for iom_put
22   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
23   USE wrk_nemo        ! work arrays
24   USE timing          ! Timing
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   zdf_evd    ! called by step.F90
30
31   !!----------------------------------------------------------------------
32   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
33   !! $Id$
34   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
35   !!----------------------------------------------------------------------
36CONTAINS
37
38   SUBROUTINE zdf_evd( kt )
39      !!----------------------------------------------------------------------
40      !!                  ***  ROUTINE zdf_evd  ***
41      !!                   
42      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
43      !!      sivity coefficients when a static instability is encountered.
44      !!
45      !! ** Method  :   avt, avm, and the 4 neighbouring avmu, avmv coefficients
46      !!      are set to avevd (namelist parameter) if the water column is
47      !!      statically unstable (i.e. if rn2 < -1.e-12 )
48      !!
49      !! ** Action  :   avt, avm, avmu, avmv updted in static instability cases
50      !!
51      !! References :   Lazar, A., these de l'universite Paris VI, France, 1997
52      !!----------------------------------------------------------------------
53      INTEGER, INTENT( in ) ::   kt   ! ocean time-step indexocean time step
54      !
55      INTEGER ::   ji, jj, jk   ! dummy loop indices
56      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zavt_evd, zavm_evd
57      !!----------------------------------------------------------------------
58      !
59      IF( nn_timing == 1 )  CALL timing_start('zdf_evd')
60      !
61      IF( kt == nit000 ) THEN
62         IF(lwp) WRITE(numout,*)
63         IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)'
64         IF(lwp) WRITE(numout,*) '~~~~~~~ '
65         IF(lwp) WRITE(numout,*)
66      ENDIF
67      !
68      CALL wrk_alloc( jpi,jpj,jpk,   zavt_evd, zavm_evd ) 
69      !
70      zavt_evd(:,:,:) = avt(:,:,:)           ! set avt prior to evd application
71      !
72      SELECT CASE ( nn_evdm )
73      !
74      CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
75         !
76         zavm_evd(:,:,:) = avm(:,:,:)           ! set avm prior to evd application
77         !
78!$OMP PARALLEL DO schedule(static) private(jk, jj, ji)
79         DO jk = 1, jpkm1 
80            DO jj = 2, jpj             ! no vector opt.
81               DO ji = 2, jpi
82                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN
83                     avt (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
84                     avm (ji  ,jj  ,jk) = rn_avevd * tmask(ji  ,jj  ,jk)
85                     avmu(ji  ,jj  ,jk) = rn_avevd * umask(ji  ,jj  ,jk)
86                     avmu(ji-1,jj  ,jk) = rn_avevd * umask(ji-1,jj  ,jk)
87                     avmv(ji  ,jj  ,jk) = rn_avevd * vmask(ji  ,jj  ,jk)
88                     avmv(ji  ,jj-1,jk) = rn_avevd * vmask(ji  ,jj-1,jk)
89                  ENDIF
90               END DO
91            END DO
92         END DO
93         CALL lbc_lnk( avt , 'W', 1. )   ;   CALL lbc_lnk( avm , 'W', 1. )   ! Lateral boundary conditions
94         CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )
95         !
96         zavm_evd(:,:,:) = avm(:,:,:) - zavm_evd(:,:,:)   ! change in avm due to evd
97         CALL iom_put( "avm_evd", zavm_evd )              ! output this change
98         !
99      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
100!$OMP PARALLEL DO schedule(static) private(jk, jj, ji)
101         DO jk = 1, jpkm1
102!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
103            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call)
104               DO ji = 1, jpi
105                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 )   &
106                     avt(ji,jj,jk) = rn_avevd * tmask(ji,jj,jk)
107               END DO
108            END DO
109         END DO
110         !
111      END SELECT
112
113      zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:)   ! change in avt due to evd
114      CALL iom_put( "avt_evd", zavt_evd )              ! output this change
115      !
116      CALL wrk_dealloc( jpi,jpj,jpk,   zavt_evd, zavm_evd ) 
117      !
118      IF( nn_timing == 1 )  CALL timing_stop('zdf_evd')
119      !
120   END SUBROUTINE zdf_evd
121
122   !!======================================================================
123END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.