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/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90 @ 5870

Last change on this file since 5870 was 5870, checked in by acc, 8 years ago

Branch 2015/dev_r5803_NOC_WAD. Merge in trunk changes from 5803 to 5869 in preparation for merge. Also tidied and reorganised some wetting and drying code. Renamed wadlmt.F90 to wetdry.F90. Wetting drying code changes restricted to domzgr.F90, domvvl.F90 nemogcm.F90 sshwzv.F90, dynspg_ts.F90, wetdry.F90 and dynhpg.F90. Code passes full SETTE tests with ln_wd=.false.. Still awaiting test case for checking with ln_wd=.false.

  • Property svn:keywords set to Id
File size: 10.4 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 wrk_nemo       ! Memory Allocation
30   USE timing         ! Timing
31
32   IMPLICIT NONE
33   PRIVATE
34
35   PUBLIC   dyn_ldf       ! called by step module
36   PUBLIC   dyn_ldf_init  ! called by opa  module
37
38   !                      ! Flag to control the type of lateral viscous operator
39   INTEGER, PARAMETER, PUBLIC ::   np_ERROR  =-10   ! error in setting the operator
40   INTEGER, PARAMETER, PUBLIC ::   np_no_ldf = 00   ! without operator (i.e. no lateral viscous trend)
41   !                          !!      laplacian     !    bilaplacian    !
42   INTEGER, PARAMETER, PUBLIC ::   np_lap    = 10   ,   np_blp    = 20  ! iso-level operator
43   INTEGER, PARAMETER, PUBLIC ::   np_lap_i  = 11                       ! iso-neutral or geopotential operator
44
45   INTEGER ::   nldf   ! type of lateral diffusion used defined from ln_dynldf_... (namlist logicals)
46
47   !! * Substitutions
48#  include "domzgr_substitute.h90"
49#  include "vectopt_loop_substitute.h90"
50   !!----------------------------------------------------------------------
51   !! NEMO/OPA 3.7 , NEMO Consortium (2015)
52   !! $Id$
53   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
54   !!----------------------------------------------------------------------
55CONTAINS
56
57   SUBROUTINE dyn_ldf( kt )
58      !!----------------------------------------------------------------------
59      !!                  ***  ROUTINE dyn_ldf  ***
60      !!
61      !! ** Purpose :   compute the lateral ocean dynamics physics.
62      !!----------------------------------------------------------------------
63      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
64      !
65      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv
66      !!----------------------------------------------------------------------
67      !
68      IF( nn_timing == 1 )  CALL timing_start('dyn_ldf')
69      !
70      IF( l_trddyn )   THEN                      ! temporary save of momentum trends
71         CALL wrk_alloc( jpi,jpj,jpk,   ztrdu, ztrdv )
72         ztrdu(:,:,:) = ua(:,:,:) 
73         ztrdv(:,:,:) = va(:,:,:) 
74      ENDIF
75
76      SELECT CASE ( nldf )                       ! compute lateral mixing trend and add it to the general trend
77      !
78      CASE ( np_lap   )    ;   CALL dyn_ldf_lap  ( kt, ub, vb, ua, va, 1 )      ! iso-level    laplacian
79      CASE ( np_lap_i )    ;   CALL dyn_ldf_iso  ( kt )                         ! rotated      laplacian
80      CASE ( np_blp   )    ;   CALL dyn_ldf_blp  ( kt, ub, vb, ua, va    )      ! iso-level bi-laplacian
81      !
82      END SELECT
83
84      IF( l_trddyn ) THEN                        ! save the horizontal diffusive trends for further diagnostics
85         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
86         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
87         CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt )
88         CALL wrk_dealloc( jpi,jpj,jpk,   ztrdu, ztrdv )
89      ENDIF
90      !                                          ! print sum trends (used for debugging)
91      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf  - Ua: ', mask1=umask,   &
92         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
93      !
94      IF( nn_timing == 1 )  CALL timing_stop('dyn_ldf')
95      !
96   END SUBROUTINE dyn_ldf
97
98
99   SUBROUTINE dyn_ldf_init
100      !!----------------------------------------------------------------------
101      !!                  ***  ROUTINE dyn_ldf_init  ***
102      !!
103      !! ** Purpose :   initializations of the horizontal ocean dynamics physics
104      !!----------------------------------------------------------------------
105      INTEGER ::   ioptio, ierr         ! temporary integers
106      !!----------------------------------------------------------------------
107      !
108      !                                   ! Namelist nam_dynldf: already read in ldfdyn module
109      !
110      IF(lwp) THEN                        ! Namelist print
111         WRITE(numout,*)
112         WRITE(numout,*) 'dyn_ldf_init : Choice of the lateral diffusive operator on dynamics'
113         WRITE(numout,*) '~~~~~~~~~~~'
114         WRITE(numout,*) '       Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)'
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,*) '          iso-level                   ln_dynldf_lev = ', ln_dynldf_lev
118         WRITE(numout,*) '          horizontal (geopotential)   ln_dynldf_hor = ', ln_dynldf_hor
119         WRITE(numout,*) '          iso-neutral                 ln_dynldf_iso = ', ln_dynldf_iso
120      ENDIF
121      !                                   ! use of lateral operator or not
122      nldf = np_ERROR
123      ioptio = 0
124      IF( ln_dynldf_lap )   ioptio = ioptio + 1
125      IF( ln_dynldf_blp )   ioptio = ioptio + 1
126      IF( ioptio >  1   )   CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' )
127      IF( ioptio == 0   )   nldf = np_no_ldf     ! No lateral mixing operator
128      !
129      IF( nldf /= np_no_ldf ) THEN        ! direction ==>> type of operator 
130         ioptio = 0
131         IF( ln_dynldf_lev )   ioptio = ioptio + 1
132         IF( ln_dynldf_hor )   ioptio = ioptio + 1
133         IF( ln_dynldf_iso )   ioptio = ioptio + 1
134         IF( ioptio >  1   )   CALL ctl_stop( '          use only ONE direction (level/hor/iso)' )
135         IF( ioptio == 0   )   CALL ctl_stop( '          use at least ONE direction (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.