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.
dynldf.F90 in branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/2017/dev_r7881_ENHANCE09_RK3/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90 @ 8568

Last change on this file since 8568 was 8568, checked in by gm, 7 years ago

#1911 (ENHANCE-09): PART I.2 - _NONE option + remove zts + see associated wiki page

  • Property svn:keywords set to Id
File size: 10.5 KB
Line 
1MODULE dynldf
2   !!======================================================================
3   !!                       ***  MODULE  dynldf  ***
4   !! Ocean physics:  lateral diffusivity trends
5   !!=====================================================================
6   !! History :  2.0  ! 2005-11  (G. Madec)  Original code (new step architecture)
7   !!            3.7  ! 2014-01  (F. Lemarie, G. Madec)  restructuration/simplification of ahm specification,
8   !!                 !                                  add velocity dependent coefficient and optional read in file
9   !!----------------------------------------------------------------------
10
11   !!----------------------------------------------------------------------
12   !!   dyn_ldf      : update the dynamics trend with the lateral diffusion
13   !!   dyn_ldf_init : initialization, namelist read, and parameters control
14   !!----------------------------------------------------------------------
15   USE oce            ! ocean dynamics and tracers
16   USE dom_oce        ! ocean space and time domain
17   USE phycst         ! physical constants
18   USE ldfdyn         ! lateral diffusion: eddy viscosity coef.
19   USE ldfslp         ! lateral diffusion: slopes of mixing orientation
20   USE dynldf_lap_blp ! lateral mixing   (dyn_ldf_lap & dyn_ldf_blp routines)
21   USE dynldf_iso     ! lateral mixing                 (dyn_ldf_iso routine )
22   USE trd_oce        ! trends: ocean variables
23   USE trddyn         ! trend manager: dynamics   (trd_dyn      routine)
24   !
25   USE prtctl         ! Print control
26   USE in_out_manager ! I/O manager
27   USE lib_mpp        ! distribued memory computing library
28   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
29   USE timing         ! Timing
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC   dyn_ldf       ! called by step module
35   PUBLIC   dyn_ldf_init  ! called by opa  module
36
37   !                      ! Parameter to control the type of lateral viscous operator
38   INTEGER, PARAMETER, PUBLIC ::   np_ERROR  =-10   !: error in setting the operator
39   INTEGER, PARAMETER, PUBLIC ::   np_no_ldf = 00   !: without operator (i.e. no lateral viscous trend)
40   !                          !!      laplacian     !    bilaplacian    !
41   INTEGER, PARAMETER, PUBLIC ::   np_lap    = 10   ,   np_blp    = 20  !: iso-level operator
42   INTEGER, PARAMETER, PUBLIC ::   np_lap_i  = 11                       !: iso-neutral or geopotential operator
43
44   INTEGER, PUBLIC ::   nldf   !: type of lateral diffusion used defined from ln_dynldf_... (namlist logicals)
45
46   !! * Substitutions
47#  include "vectopt_loop_substitute.h90"
48   !!----------------------------------------------------------------------
49   !! NEMO/OPA 4.0 , NEMO Consortium (2017)
50   !! $Id$
51   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
52   !!----------------------------------------------------------------------
53CONTAINS
54
55   SUBROUTINE dyn_ldf( kt )
56      !!----------------------------------------------------------------------
57      !!                  ***  ROUTINE dyn_ldf  ***
58      !!
59      !! ** Purpose :   compute the lateral ocean dynamics physics.
60      !!----------------------------------------------------------------------
61      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
62      !
63      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv
64      !!----------------------------------------------------------------------
65      !
66      IF( ln_timing )   CALL timing_start('dyn_ldf')
67      !
68      IF( l_trddyn )   THEN                      ! temporary save of momentum trends
69         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )
70         ztrdu(:,:,:) = ua(:,:,:) 
71         ztrdv(:,:,:) = va(:,:,:) 
72      ENDIF
73
74      SELECT CASE ( nldf )                       ! compute lateral mixing trend and add it to the general trend
75      !
76      CASE ( np_lap   )    ;   CALL dyn_ldf_lap  ( kt, ub, vb, ua, va, 1 )      ! iso-level    laplacian
77      CASE ( np_lap_i )    ;   CALL dyn_ldf_iso  ( kt )                         ! rotated      laplacian
78      CASE ( np_blp   )    ;   CALL dyn_ldf_blp  ( kt, ub, vb, ua, va    )      ! iso-level bi-laplacian
79      !
80      END SELECT
81
82      IF( l_trddyn ) THEN                        ! save the horizontal diffusive trends for further diagnostics
83         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
84         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
85         CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt )
86         DEALLOCATE ( ztrdu , ztrdv )
87      ENDIF
88      !                                          ! print sum trends (used for debugging)
89      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf  - Ua: ', mask1=umask,   &
90         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
91      !
92      IF( ln_timing )   CALL timing_stop('dyn_ldf')
93      !
94   END SUBROUTINE dyn_ldf
95
96
97   SUBROUTINE dyn_ldf_init
98      !!----------------------------------------------------------------------
99      !!                  ***  ROUTINE dyn_ldf_init  ***
100      !!
101      !! ** Purpose :   initializations of the horizontal ocean dynamics physics
102      !!----------------------------------------------------------------------
103      INTEGER ::   ioptio, ierr   ! temporary integers
104      !!----------------------------------------------------------------------
105      !
106      !                                !==  Namelist nam_dynldf  ==!   already read in ldfdyn module
107      !
108      IF(lwp) THEN                     !== Namelist print  ==!
109         WRITE(numout,*)
110         WRITE(numout,*) 'dyn_ldf_init : Choice of the lateral diffusive operator on dynamics'
111         WRITE(numout,*) '~~~~~~~~~~~~'
112         WRITE(numout,*) '   Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)'
113         WRITE(numout,*) '      Type of operator'
114         WRITE(numout,*) '         no explicit diffusion       ln_dynldf_NONE = ', ln_dynldf_NONE
115         WRITE(numout,*) '         laplacian operator          ln_dynldf_lap  = ', ln_dynldf_lap
116         WRITE(numout,*) '         bilaplacian operator        ln_dynldf_blp  = ', ln_dynldf_blp
117         WRITE(numout,*) '      Direction of action'
118         WRITE(numout,*) '         iso-level                   ln_dynldf_lev  = ', ln_dynldf_lev
119         WRITE(numout,*) '         horizontal (geopotential)   ln_dynldf_hor  = ', ln_dynldf_hor
120         WRITE(numout,*) '         iso-neutral                 ln_dynldf_iso  = ', ln_dynldf_iso
121      ENDIF
122      !                                !==  use of lateral operator or not  ==!
123      nldf = np_ERROR
124      ioptio = 0
125      IF( ln_dynldf_NONE ) THEN   ;   nldf = np_no_ldf   ;   ioptio = ioptio + 1   ;   ENDIF
126      IF( ln_dynldf_lap  ) THEN   ;                          ioptio = ioptio + 1   ;   ENDIF
127      IF( ln_dynldf_blp  ) THEN   ;                          ioptio = ioptio + 1   ;   ENDIF
128      IF( ioptio /= 1    )   CALL ctl_stop( 'dyn_ldf_init: use ONE of the 3 operator options (NONE/lap/blp)' )
129      !
130      IF(.NOT.ln_dynldf_NONE ) THEN    !==  direction ==>> type of operator  ==!
131         ioptio = 0
132         IF( ln_dynldf_lev )   ioptio = ioptio + 1
133         IF( ln_dynldf_hor )   ioptio = ioptio + 1
134         IF( ln_dynldf_iso )   ioptio = ioptio + 1
135         IF( ioptio /= 1   )   CALL ctl_stop( 'dyn_ldf_init: use ONE of the 3 direction options (level/hor/iso)' )
136         !
137         !                             ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals
138         ierr = 0
139         IF( ln_dynldf_lap ) THEN         ! laplacian operator
140            IF( ln_zco ) THEN                ! z-coordinate
141               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation)
142               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level = horizontal (no rotation)
143               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation)
144            ENDIF
145            IF( ln_zps ) THEN                ! z-coordinate with partial step
146               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level              (no rotation)
147               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level              (no rotation)
148               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation)
149            ENDIF
150            IF( ln_sco ) THEN                ! s-coordinate
151               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation)
152               IF ( ln_dynldf_hor )   nldf = np_lap_i   ! horizontal             (   rotation)
153               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation)
154            ENDIF
155         ENDIF
156         !
157         IF( ln_dynldf_blp ) THEN         ! bilaplacian operator
158            IF( ln_zco ) THEN                ! z-coordinate
159               IF( ln_dynldf_lev )   nldf = np_blp     ! iso-level = horizontal (no rotation)
160               IF( ln_dynldf_hor )   nldf = np_blp     ! iso-level = horizontal (no rotation)
161               IF( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation)
162            ENDIF
163            IF( ln_zps ) THEN                ! z-coordinate with partial step
164               IF( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation)
165               IF( ln_dynldf_hor )   nldf = np_blp     ! iso-level              (no rotation)
166               IF( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation)
167            ENDIF
168            IF( ln_sco ) THEN                ! s-coordinate
169               IF( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation)
170               IF( ln_dynldf_hor )   ierr = 2          ! horizontal             (   rotation)
171               IF( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation)
172            ENDIF
173         ENDIF
174         !
175         IF( ierr == 2 )   CALL ctl_stop( 'rotated bi-laplacian operator does not exist' )
176         !
177         IF( nldf == np_lap_i )   l_ldfslp = .TRUE.      ! rotation require the computation of the slopes
178         !
179      ENDIF
180
181      IF(lwp) THEN
182         WRITE(numout,*)
183         IF( nldf == np_no_ldf )   WRITE(numout,*) '      ===>>   NO lateral viscosity'
184         IF( nldf == np_lap    )   WRITE(numout,*) '      ===>>   iso-level laplacian operator'
185         IF( nldf == np_lap_i  )   WRITE(numout,*) '      ===>>   rotated laplacian operator with iso-level background'
186         IF( nldf == np_blp    )   WRITE(numout,*) '      ===>>   iso-level bi-laplacian operator'
187      ENDIF
188      !
189   END SUBROUTINE dyn_ldf_init
190
191   !!======================================================================
192END MODULE dynldf
Note: See TracBrowser for help on using the repository browser.