user/gm/Misc.Items: zdf_oce.F90

File zdf_oce.F90, 8.0 KB (added by gm, 11 years ago)

merge zdfini.F90 with zdf_oce.F90

Line 
1MODULE zdf_oce
2   !!======================================================================
3   !!              ***  MODULE  zdf_oce  ***
4   !! Ocean physics : define vertical mixing variables
5   !!=====================================================================
6
7   !!----------------------------------------------------------------------
8   !!   zdf_init    : initialization, namelist read, and parameters control
9   !!----------------------------------------------------------------------
10   USE par_oce         ! mesh and scale factors
11   USE par_oce         ! mesh and scale factors
12   USE ldftra_oce      ! ocean active tracers: lateral physics
13   USE ldfdyn_oce      ! ocean dynamics lateral physics
14   USE zdf_oce         ! TKE vertical mixing         
15   USE lib_mpp         ! distribued memory computing
16   USE zdftke          ! TKE  vertical mixing 
17   USE zdftke2         ! TKE2 vertical mixing
18   USE zdfkpp          ! KPP vertical mixing         
19   USE zdfddm          ! double diffusion mixing     
20   USE zdfevd          ! enhanced vertical diffusion 
21   USE zdfric          ! Richardson vertical mixing   
22   USE tranpc          ! convection: non penetrative adjustment
23   USE ldfslp          ! iso-neutral slopes
24
25   USE in_out_manager  ! I/O manager
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   zdf_init   ! routine called by opa.F90
31
32   IMPLICIT NONE
33   PRIVATE
34
35   !! * Share Module variables
36   LOGICAL, PARAMETER, PUBLIC ::    &   !:
37#if defined key_zdfcst   ||   defined key_esopa
38      lk_zdfcst        = .TRUE.         !: constant vertical mixing flag
39#else
40      lk_zdfcst        = .FALSE.        !: constant vertical mixing flag
41#endif
42   LOGICAL, PUBLIC ::                & !!! namzdf: vertical diffusion
43      ln_zdfexp        = .FALSE. ,   &  !: explicit vertical diffusion scheme flag
44      ln_zdfevd        = .TRUE.  ,   &  !: convection: enhanced vertical diffusion flag
45      ln_zdfnpc        = .FALSE.        !: convection: non-penetrative convection flag
46
47   INTEGER, PUBLIC ::    & !!: namzdf:  vertical diffusion
48      n_zdfexp = 3    ,  &  !: number of sub-time step (explicit time stepping)
49      n_evdm   = 1          !: =0/1 flag to apply enhanced avm or not
50 
51   REAL(wp), PUBLIC ::   & !!: namzdf   vertical diffusion
52      avm0  = 1.e-4_wp,  &  !: vertical eddy viscosity (m2/s)
53      avt0  = 1.e-5_wp,  &  !: vertical eddy diffusivity (m2/s)
54      avevd = 1._wp         !: vertical eddy coeff. for enhanced vert. diff. (m2/s)
55
56   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   &   !:
57      avmu,              &  !: vertical viscosity coeff. at uw-, vw-points
58      avmv,              &  !: vertical viscosity coeff. at uw-, vw-points
59      avt ,              &  !: vertical diffusivity coeff. at w-point
60      avt_evd,           &  !: convection: enhanced vertical diffusivity coeff. at w-point
61      avmu_evd              !: convection: enhanced vertical viscosity   coeff. at w-point
62#if defined key_zdftmx
63   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   av_tide, av_tide_itf   !: Tidal mixing
64#endif
65 
66   REAL(wp), PUBLIC, DIMENSION(jpk) ::   &   !:
67      avmb, avtb            !: background profile of avm and avt
68 
69   !!----------------------------------------------------------------------
70   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)
71   !! $Id$
72   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
73   !!----------------------------------------------------------------------
74   
75CONTAINS
76
77   SUBROUTINE zdf_init
78      !!----------------------------------------------------------------------
79      !!                  ***  ROUTINE zdf_init  ***
80      !!
81      !! ** Purpose :   initializations of the vertical ocean physics
82      !!
83      !! ** Method  :   Read namelist namzdf, control logicals
84      !!
85      !! History :
86      !!        !  97-06  (G. Madec)  Original code from inimix
87      !!   8.5  !  02-08  (G. Madec)  F90 : free form
88      !!   9.0  !  05-06  (C. Ethe) KPP parameterization
89      !!----------------------------------------------------------------------
90      !! * Local declarations
91      INTEGER ::   ioptio       ! temporary scalar
92
93      !! * Namelist
94      NAMELIST/namzdf/ ln_zdfexp, n_zdfexp, ln_zdfevd, ln_zdfnpc,   &
95         &             avm0     , avt0    , avevd    , n_evdm
96      !!----------------------------------------------------------------------
97      !!  OPA 9.0, LODYC-IPSL (2003)
98      !!
99      !!----------------------------------------------------------------------
100
101      ! Read namzdf namelist : vertical mixing parameters
102      ! --------------------
103      REWIND( numnam )
104      READ  ( numnam, namzdf )
105
106      ! Parameter print
107      ! ---------------
108      IF(lwp) THEN
109         WRITE(numout,*)
110         WRITE(numout,*) 'zdf_init: vertical physics'
111         WRITE(numout,*) '~~~~~~~~'
112         WRITE(numout,*) '   Namelist namzdf : set vertical mixing mixing parameters'
113         WRITE(numout,*) '      time splitting / backward scheme    ln_zdfexp = ', ln_zdfexp
114         WRITE(numout,*) '      number of time step                  n_zdfexp = ', n_zdfexp
115         WRITE(numout,*) '      enhanced vertical diffusion         ln_zdfevd = ', ln_zdfevd
116         WRITE(numout,*) '      non-penetrative convection          ln_zdfnpc = ', ln_zdfnpc
117         WRITE(numout,*) '      vertical eddy viscosity             avm0      = ', avm0
118         WRITE(numout,*) '      vertical eddy diffusivity           avt0      = ', avt0
119         WRITE(numout,*) '      vertical coefficient for evd        avevd     = ', avevd
120         WRITE(numout,*) '         applied on momentum (=1/0)       n_evdm    = ', n_evdm
121      ENDIF
122
123      ! Parameter & logicals controls
124      ! -----------------------------
125      ! ... check of vertical mixing scheme on tracers
126      !           ==> will be done in trazdf module
127
128      ! ... check of mixing coefficient
129      IF(lwp) WRITE(numout,*)
130      IF(lwp) WRITE(numout,*) '          vertical mixing option :'
131      ioptio = 0
132      IF( lk_zdfcst ) THEN
133         IF(lwp) WRITE(numout,*) '             constant eddy diffusion coefficients'
134         ioptio = ioptio+1
135      ENDIF
136      IF( lk_zdfric ) THEN
137         IF(lwp) WRITE(numout,*) '             Richardson dependent eddy coefficients'
138         ioptio = ioptio+1
139      ENDIF
140      IF( lk_zdftke ) THEN
141         IF(lwp) WRITE(numout,*) '             TKE dependent eddy coefficients'
142         ioptio = ioptio+1
143      ENDIF
144      IF( lk_zdftke2 ) THEN
145         IF(lwp) WRITE(numout,*) '             TKE2 dependent eddy coefficients'
146         ioptio = ioptio+1
147      ENDIF
148      IF( lk_zdfkpp ) THEN
149         IF(lwp) WRITE(numout,*) '             KPP dependent eddy coefficients'
150         ioptio = ioptio+1
151      ENDIF
152      IF( ioptio == 0 .OR. ioptio > 1 .AND. .NOT. lk_esopa ) &
153         CALL ctl_stop( ' one and only one vertical diffusion option has to be defined ' )
154
155      ! ... Convection
156      IF(lwp) WRITE(numout,*)
157      IF(lwp) WRITE(numout,*) '          convection :'
158      ioptio = 0
159      IF( ln_zdfnpc ) THEN
160         IF(lwp) WRITE(numout,*) '             use non penetrative convective scheme'
161         ioptio = ioptio+1
162      ENDIF
163      IF( ln_zdfevd ) THEN
164         IF(lwp) WRITE(numout,*) '             use enhanced vertical dif. scheme'
165         ioptio = ioptio+1
166      ENDIF
167      IF( lk_zdftke .OR. lk_zdftke2 ) THEN
168         IF(lwp) WRITE(numout,*) '             use the 1.5 turbulent closure'
169      ENDIF
170      IF( lk_zdfkpp ) THEN
171         IF(lwp) WRITE(numout,*) '             use the KPP closure scheme'
172         IF(lk_mpp) THEN
173            IF(lwp) WRITE(numout,cform_err)
174            IF(lwp) WRITE(numout,*) '             The KPP scheme is not ready to run in MPI'
175         ENDIF
176      ENDIF
177      IF ( ioptio > 1 .AND. .NOT. lk_esopa ) &
178           CALL ctl_stop( ' chose between ln_zdfnpc', '           and ln_zdfevd' )
179      IF( ioptio == 0 .AND. .NOT.( lk_zdftke .OR. lk_zdftke2 .OR. lk_zdfkpp ) ) &
180         CALL ctl_stop( ' except for TKE sor KPP physics, a convection scheme is', &
181         &              ' required: ln_zdfevd or ln_zdfnpc logicals' )
182
183   END SUBROUTINE zdf_init
184
185   !!======================================================================
186END MODULE zdf_oce