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

source: trunk/NEMO/OPA_SRC/ZDF/zdfevd.F90 @ 3

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.1 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
8   !!----------------------------------------------------------------------
9   !!   zdf_evd      : update momentum and tracer Kz at the location of
10   !!                  statically unstable portion of the water column
11   !!                  (called if ln_zdfevd=T)
12   !!----------------------------------------------------------------------
13   !! * Modules used
14   USE oce             ! ocean dynamics and tracers variables
15   USE dom_oce         ! ocean space and time domain variables
16   USE zdf_oce         ! ocean vertical physics variables
17   USE in_out_manager  ! I/O manager
18   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Routine accessibility
24   PUBLIC zdf_evd      ! called by step.F90
25
26   !!----------------------------------------------------------------------
27   !!   OPA 9.0 , LODYC-IPSL  (2003)
28   !!----------------------------------------------------------------------
29
30CONTAINS
31
32   SUBROUTINE zdf_evd( kt )
33      !!----------------------------------------------------------------------
34      !!                  ***  ROUTINE zdf_evd  ***
35      !!                   
36      !! ** Purpose :   Local increased the vertical eddy viscosity and diffu-
37      !!      sivity coefficients when a static instability is encountered.
38      !!
39      !! ** Method  :   avt, and the 4 neighbouring avmu, avmv coefficients
40      !!      are set to avevd (namelist parameter) if the water column is
41      !!      statically unstable (i.e. if rn2 < -1.e-12 )
42      !!
43      !! ** Action  :   Update avt, avmu, avmv in statically instable cases
44      !!
45      !! References :
46      !!      Lazar, A., these de l'universite Paris VI, France, 1997
47      !! History :
48      !!   7.0  !  97-06  (G. Madec, A. Lazar)  Original code
49      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
50      !!----------------------------------------------------------------------
51      !! * Arguments
52      INTEGER, INTENT( in ) ::   kt         ! ocean time-step indexocean time step
53
54      !! * Local declarations
55      INTEGER ::   ji, jj, jk               ! dummy loop indices
56      !!----------------------------------------------------------------------
57
58      IF( kt == nit000 ) THEN
59         IF(lwp) WRITE(numout,*)
60         IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)'
61         IF(lwp) WRITE(numout,*) '~~~~~~~ '
62         IF(lwp) WRITE(numout,*)
63      ENDIF
64
65      SELECT CASE ( nevdm )
66 
67      CASE ( 1 )           ! enhance vertical eddy viscosity and diffusivity (if rn2<-1.e-12)
68         !                                                ! ===============
69         DO jk = 1, jpkm1                                 ! Horizontal slab
70            !                                             ! ===============
71#   if defined key_vectopt_loop   &&   ! defined key_autotasking
72!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
73            jj = 1                     ! big loop forced
74            DO ji = jpj+1, jpij   
75               IF( rn2(ji,jj,jk) <= -1.e-12 ) THEN
76                  avt (ji  ,jj  ,jk) = avevd * tmask(ji  ,jj  ,jk)
77                  avmu(ji  ,jj  ,jk) = avevd * umask(ji  ,jj  ,jk)
78                  avmu(ji-1,jj  ,jk) = avevd * umask(ji-1,jj  ,jk)
79                  avmv(ji  ,jj  ,jk) = avevd * vmask(ji  ,jj  ,jk)
80                  avmv(ji  ,jj-1,jk) = avevd * vmask(ji  ,jj-1,jk)
81               ENDIF
82            END DO
83#   else
84            DO jj = 2, jpj             ! no vector opt.
85               DO ji = 2, jpi
86                  IF( rn2(ji,jj,jk) <= -1.e-12 ) THEN
87                     avt (ji  ,jj  ,jk) = avevd * tmask(ji  ,jj  ,jk)
88                     avmu(ji  ,jj  ,jk) = avevd * umask(ji  ,jj  ,jk)
89                     avmu(ji-1,jj  ,jk) = avevd * umask(ji-1,jj  ,jk)
90                     avmv(ji  ,jj  ,jk) = avevd * vmask(ji  ,jj  ,jk)
91                     avmv(ji  ,jj-1,jk) = avevd * vmask(ji  ,jj-1,jk)
92                  ENDIF
93               END DO
94            END DO
95#   endif
96            !                                             ! ===============
97         END DO                                           !   End of slab
98         !                                                ! ===============
99
100         ! Lateral boundary conditions on ( avt, avmu, avmv )   (unchanged sign)
101         ! -------------------------------===================
102         CALL lbc_lnk( avt , 'W', 1. )
103         CALL lbc_lnk( avmu, 'U', 1. )
104         CALL lbc_lnk( avmv, 'V', 1. )
105
106      CASE DEFAULT         ! enhance vertical eddy diffusivity only (if rn2<-1.e-12)
107         !                                                ! ===============
108         DO jk = 1, jpkm1                                 ! Horizontal slab
109            !                                             ! ===============
110!!!         WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd   ! agissant sur T SEUL!
111#   if defined key_vectopt_loop   &&   ! defined key_autotasking
112            jj = 1                     ! big loop forced
113            DO ji = 1, jpij   
114               IF( rn2(ji,jj,jk) <= -1.e-12 )   avt(ji,jj,jk) = avevd * tmask(ji,jj,jk)
115            END DO
116#   else
117            DO jj = 1, jpj             ! loop over the whole domain (no lbc_lnk call)
118               DO ji = 1, jpi
119                  IF( rn2(ji,jj,jk) <= -1.e-12 )   avt(ji,jj,jk) = avevd * tmask(ji,jj,jk)
120               END DO
121            END DO
122#   endif
123            !                                             ! ===============
124         END DO                                           !   End of slab
125         !                                                ! ===============
126      END SELECT
127
128   END SUBROUTINE zdf_evd
129
130   !!======================================================================
131END MODULE zdfevd
Note: See TracBrowser for help on using the repository browser.