source: trunk/NEMO/OPA_SRC/LDF/ldfdyn.F90 @ 1601

Last change on this file since 1601 was 1601, checked in by ctlod, 11 years ago

Doctor naming of OPA namelist variables , see ticket: #526

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 12.5 KB
Line 
1MODULE ldfdyn
2   !!======================================================================
3   !!                       ***  MODULE  ldfdyn  ***
4   !! Ocean physics:  lateral viscosity coefficient
5   !!=====================================================================
6   !! History :  OPA  ! 1997-07  (G. Madec)  multi dimensional coefficients
7   !!   NEMO     1.0  ! 2002-09  (G. Madec)  F90: Free form and module
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   ldf_dyn_init : initialization, namelist read, and parameters control
12   !!   ldf_dyn_c3d   : 3D eddy viscosity coefficient initialization
13   !!   ldf_dyn_c2d   : 2D eddy viscosity coefficient initialization
14   !!   ldf_dyn_c1d   : 1D eddy viscosity coefficient initialization
15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and tracers   
17   USE dom_oce         ! ocean space and time domain
18   USE ldfdyn_oce      ! ocean dynamics lateral physics
19   USE phycst          ! physical constants
20   USE ldfslp          ! ???
21   USE ioipsl
22   USE in_out_manager  ! I/O manager
23   USE lib_mpp         ! distribued memory computing library
24   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   ldf_dyn_init   ! called by opa.F90
30
31  INTERFACE ldf_zpf
32     MODULE PROCEDURE ldf_zpf_1d, ldf_zpf_1d_3d, ldf_zpf_3d
33  END INTERFACE
34
35   !! * Substitutions
36#  include "domzgr_substitute.h90"
37   !!----------------------------------------------------------------------
38   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)
39   !! $Id$
40   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
41   !!----------------------------------------------------------------------
42
43CONTAINS
44
45   SUBROUTINE ldf_dyn_init
46      !!----------------------------------------------------------------------
47      !!                  ***  ROUTINE ldf_dyn_init  ***
48      !!                   
49      !! ** Purpose :   set the horizontal ocean dynamics physics
50      !!
51      !! ** Method  : 
52      !!      -  default option : ahm = constant coef. = rn_ahm_0 (namelist)
53      !!      - 'key_dynldf_c1d': ahm = F(depth)                     see ldf_dyn_c1d.h90
54      !!      - 'key_dynldf_c2d': ahm = F(latitude,longitude)        see ldf_dyn_c2d.h90
55      !!      - 'key_dynldf_c3d': ahm = F(latitude,longitude,depth)  see ldf_dyn_c3d.h90
56      !!
57      !!      N.B. User defined include files.  By default, 3d and 2d coef.
58      !!      are set to a constant value given in the namelist and the 1d
59      !!      coefficients are initialized to a hyperbolic tangent vertical
60      !!      profile.
61      !!
62      !! Reference :   Madec, G. and M. Imbard, 1996: Climate Dynamics, 12, 381-388.
63      !!----------------------------------------------------------------------
64      INTEGER ::   ioptio         ! ???
65      LOGICAL :: ll_print = .FALSE.    ! Logical flag for printing viscosity coef.
66      !!
67      NAMELIST/namdyn_ldf/ ln_dynldf_lap  , ln_dynldf_bilap,                  &
68         &                 ln_dynldf_level, ln_dynldf_hor  , ln_dynldf_iso,   &
69         &                 rn_ahm_0       , rn_ahmb_0
70      !!----------------------------------------------------------------------
71
72      REWIND( numnam )                  ! Read Namelist namdyn_ldf : Lateral physics
73      READ  ( numnam, namdyn_ldf )
74
75      IF(lwp) THEN                      ! Parameter print
76         WRITE(numout,*)
77         WRITE(numout,*) 'ldf_dyn : lateral momentum physics'
78         WRITE(numout,*) '~~~~~~~'
79         WRITE(numout,*) '   Namelist nam_dynldf : set lateral mixing parameters'
80         WRITE(numout,*) '      laplacian operator          ln_dynldf_lap   = ', ln_dynldf_lap
81         WRITE(numout,*) '      bilaplacian operator        ln_dynldf_bilap = ', ln_dynldf_bilap
82         WRITE(numout,*) '      iso-level                   ln_dynldf_level = ', ln_dynldf_level
83         WRITE(numout,*) '      horizontal (geopotential)   ln_dynldf_hor   = ', ln_dynldf_hor
84         WRITE(numout,*) '      iso-neutral                 ln_dynldf_iso   = ', ln_dynldf_iso
85         WRITE(numout,*) '      horizontal eddy viscosity   rn_ahm_0        = ', rn_ahm_0
86         WRITE(numout,*) '      background viscosity        rn_ahmb_0       = ', rn_ahmb_0
87      ENDIF
88
89      ahm0  = rn_ahm_0                  ! OLD namelist variables defined from DOCTOR namelist variables
90      ahmb0 = rn_ahmb_0
91
92      ! ... check of lateral diffusive operator on tracers
93      !           ==> will be done in trazdf module
94
95      ! ... Space variation of eddy coefficients
96      ioptio = 0
97#if defined key_dynldf_c3d
98      IF(lwp) WRITE(numout,*) '   momentum mixing coef. = F( latitude, longitude, depth)'
99      ioptio = ioptio+1
100#endif
101#if defined key_dynldf_c2d
102      IF(lwp) WRITE(numout,*) '   momentum mixing coef. = F( latitude, longitude)'
103      ioptio = ioptio+1
104#endif
105#if defined key_dynldf_c1d
106      IF(lwp) WRITE(numout,*) '   momentum mixing coef. = F( depth )'
107      ioptio = ioptio+1
108      IF( ln_sco ) CALL ctl_stop( 'key_dynldf_c1d cannot be used in s-coordinate (ln_sco)' )
109#endif
110      IF( ioptio == 0 ) THEN
111          IF(lwp) WRITE(numout,*) '   momentum mixing coef. = constant  (default option)'
112        ELSEIF( ioptio > 1 ) THEN
113           CALL ctl_stop( 'use only one of the following keys: key_dynldf_c3d, key_dynldf_c2d, key_dynldf_c1d' )
114      ENDIF
115
116
117      IF( ln_dynldf_bilap ) THEN
118         IF(lwp) WRITE(numout,*) '   biharmonic momentum diffusion'
119         IF( ahm0 > 0 .AND. .NOT. lk_esopa )   CALL ctl_stop( 'The horizontal viscosity coef. ahm0 must be negative' )
120      ELSE
121         IF(lwp) WRITE(numout,*) '   harmonic momentum diff. (default)'
122         IF( ahm0 < 0 .AND. .NOT. lk_esopa )   CALL ctl_stop( 'The horizontal viscosity coef. ahm0 must be positive' )
123      ENDIF
124
125
126      ! Lateral eddy viscosity
127      ! ======================
128#if defined key_dynldf_c3d
129      CALL ldf_dyn_c3d( ll_print )   ! ahm = 3D coef. = F( longitude, latitude, depth )
130#elif defined key_dynldf_c2d
131      CALL ldf_dyn_c2d( ll_print )   ! ahm = 1D coef. = F( longitude, latitude )
132#elif defined key_dynldf_c1d
133      CALL ldf_dyn_c1d( ll_print )   ! ahm = 1D coef. = F( depth )
134#else
135                                     ! Constant coefficients
136      IF(lwp) WRITE(numout,*)
137      IF(lwp) WRITE(numout,*) 'inildf: constant eddy viscosity coef. '
138      IF(lwp) WRITE(numout,*) '~~~~~~'
139      IF(lwp) WRITE(numout,*) '        ahm1 = ahm2 = ahm0 =  ',ahm0
140#endif
141      !
142   END SUBROUTINE ldf_dyn_init
143
144#if defined key_dynldf_c3d
145#   include "ldfdyn_c3d.h90"
146#elif defined key_dynldf_c2d
147#   include "ldfdyn_c2d.h90"
148#elif defined key_dynldf_c1d
149#   include "ldfdyn_c1d.h90"
150#endif
151
152
153   SUBROUTINE ldf_zpf_1d( ld_print, pdam, pwam, pbot, pdep, pah )
154      !!----------------------------------------------------------------------
155      !!                  ***  ROUTINE ldf_zpf  ***
156      !!                   
157      !! ** Purpose :   vertical adimensional profile for eddy coefficient
158      !!
159      !! ** Method  :   1D eddy viscosity coefficients ( depth )
160      !!----------------------------------------------------------------------
161      LOGICAL , INTENT(in   )                 ::   ld_print   ! If true, output arrays on numout
162      REAL(wp), INTENT(in   )                 ::   pdam       ! depth of the inflection point
163      REAL(wp), INTENT(in   )                 ::   pwam       ! width of inflection
164      REAL(wp), INTENT(in   )                 ::   pbot       ! bottom value (0<pbot<= 1)
165      REAL(wp), INTENT(in   ), DIMENSION(jpk) ::   pdep       ! depth of the gridpoint (T, U, V, F)
166      REAL(wp), INTENT(inout), DIMENSION(jpk) ::   pah        ! adimensional vertical profile
167      !!
168      INTEGER  ::   jk           ! dummy loop indices
169      REAL(wp) ::   zm00, zm01, zmhb, zmhs       ! temporary scalars
170      !!----------------------------------------------------------------------
171
172      zm00 = TANH( ( pdam - gdept_0(1    ) ) / pwam )
173      zm01 = TANH( ( pdam - gdept_0(jpkm1) ) / pwam )
174      zmhs = zm00 / zm01
175      zmhb = ( 1.e0 - pbot ) / ( 1.e0 - zmhs ) / zm01
176
177      DO jk = 1, jpk
178         pah(jk) = 1.e0 + zmhb * ( zm00 - TANH( ( pdam - pdep(jk) ) / pwam )  )
179      END DO
180
181      IF(lwp .AND. ld_print ) THEN      ! Control print
182         WRITE(numout,*)
183         WRITE(numout,*) '         ahm profile : '
184         WRITE(numout,*)
185         WRITE(numout,'("  jk      ahm       ","  depth t-level " )')
186         DO jk = 1, jpk
187            WRITE(numout,'(i6,2f12.4,3x,2f12.4)') jk, pah(jk), pdep(jk)
188         END DO
189      ENDIF
190      !
191   END SUBROUTINE ldf_zpf_1d
192
193
194   SUBROUTINE ldf_zpf_1d_3d( ld_print, pdam, pwam, pbot, pdep, pah )
195      !!----------------------------------------------------------------------
196      !!                  ***  ROUTINE ldf_zpf  ***
197      !!
198      !! ** Purpose :   vertical adimensional profile for eddy coefficient
199      !!
200      !! ** Method  :   1D eddy viscosity coefficients ( depth )
201      !!----------------------------------------------------------------------
202      LOGICAL , INTENT(in   )                         ::   ld_print   ! If true, output arrays on numout
203      REAL(wp), INTENT(in   )                         ::   pdam       ! depth of the inflection point
204      REAL(wp), INTENT(in   )                         ::   pwam       ! width of inflection
205      REAL(wp), INTENT(in   )                         ::   pbot       ! bottom value (0<pbot<= 1)
206      REAL(wp), INTENT(in   ), DIMENSION        (jpk) ::   pdep       ! depth of the gridpoint (T, U, V, F)
207      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pah        ! adimensional vertical profile
208      !!
209      INTEGER  ::   jk           ! dummy loop indices
210      REAL(wp) ::   zm00, zm01, zmhb, zmhs, zcf  ! temporary scalars
211      !!----------------------------------------------------------------------
212
213      zm00 = TANH( ( pdam - gdept_0(1    ) ) / pwam )
214      zm01 = TANH( ( pdam - gdept_0(jpkm1) ) / pwam )
215      zmhs = zm00 / zm01
216      zmhb = ( 1.e0 - pbot ) / ( 1.e0 - zmhs ) / zm01
217
218      DO jk = 1, jpk
219         zcf = 1.e0 + zmhb * ( zm00 - TANH( ( pdam - pdep(jk) ) / pwam )  )
220         pah(:,:,jk) = zcf
221      END DO
222
223      IF(lwp .AND. ld_print ) THEN      ! Control print
224         WRITE(numout,*)
225         WRITE(numout,*) '         ahm profile : '
226         WRITE(numout,*)
227         WRITE(numout,'("  jk      ahm       ","  depth t-level " )')
228         DO jk = 1, jpk
229            WRITE(numout,'(i6,2f12.4,3x,2f12.4)') jk, pah(1,1,jk), pdep(jk)
230         END DO
231      ENDIF
232      !
233   END SUBROUTINE ldf_zpf_1d_3d
234
235
236   SUBROUTINE ldf_zpf_3d( ld_print, pdam, pwam, pbot, pdep, pah )
237      !!----------------------------------------------------------------------
238      !!                  ***  ROUTINE ldf_zpf  ***
239      !!
240      !! ** Purpose :   vertical adimensional profile for eddy coefficient
241      !!
242      !! ** Method  :   3D for partial step or s-coordinate
243      !!----------------------------------------------------------------------
244      LOGICAL , INTENT(in   )                         ::   ld_print   ! If true, output arrays on numout
245      REAL(wp), INTENT(in   )                         ::   pdam       ! depth of the inflection point
246      REAL(wp), INTENT(in   )                         ::   pwam       ! width of inflection
247      REAL(wp), INTENT(in   )                         ::   pbot       ! bottom value (0<pbot<= 1)
248      REAL(wp), INTENT(in   ), DIMENSION(jpi,jpj,jpk) ::   pdep       ! dep of the gridpoint (T, U, V, F)
249      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pah        ! adimensional vertical profile
250      !!
251      INTEGER  ::   jk           ! dummy loop indices
252      REAL(wp) ::   zm00, zm01, zmhb, zmhs       ! temporary scalars
253      !!----------------------------------------------------------------------
254
255      zm00 = TANH( ( pdam - gdept_0(1    ) ) / pwam )   
256      zm01 = TANH( ( pdam - gdept_0(jpkm1) ) / pwam )
257      zmhs = zm00 / zm01
258      zmhb = ( 1.e0 - pbot ) / ( 1.e0 - zmhs ) / zm01
259
260      DO jk = 1, jpk
261         pah(:,:,jk) = 1.e0 + zmhb * ( zm00 - TANH( ( pdam - pdep(:,:,jk) ) / pwam )  )
262      END DO
263
264      IF(lwp .AND. ld_print ) THEN      ! Control print
265         WRITE(numout,*)
266         WRITE(numout,*) '         ahm profile : '
267         WRITE(numout,*)
268         WRITE(numout,'("  jk      ahm       ","  depth t-level " )')
269         DO jk = 1, jpk
270            WRITE(numout,'(i6,2f12.4,3x,2f12.4)') jk, pah(1,1,jk), pdep(1,1,jk)
271         END DO
272      ENDIF
273      !
274   END SUBROUTINE ldf_zpf_3d
275
276   !!======================================================================
277END MODULE ldfdyn
Note: See TracBrowser for help on using the repository browser.