source: branches/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf.F90 @ 7910

Last change on this file since 7910 was 7910, checked in by timgraham, 4 years ago

All wrk_alloc removed

  • Property svn:keywords set to Id
File size: 10.2 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 ::   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 3.7 , NEMO Consortium (2015)
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), DIMENSION(jpi,jpj,jpk) ::  ztrdu, ztrdv
64      !!----------------------------------------------------------------------
65      !
66      IF( nn_timing == 1 )  CALL timing_start('dyn_ldf')
67      !
68      IF( l_trddyn )   THEN                      ! temporary save of momentum trends
69         ztrdu(:,:,:) = ua(:,:,:) 
70         ztrdv(:,:,:) = va(:,:,:) 
71      ENDIF
72
73      SELECT CASE ( nldf )                       ! compute lateral mixing trend and add it to the general trend
74      !
75      CASE ( np_lap   )    ;   CALL dyn_ldf_lap  ( kt, ub, vb, ua, va, 1 )      ! iso-level    laplacian
76      CASE ( np_lap_i )    ;   CALL dyn_ldf_iso  ( kt )                         ! rotated      laplacian
77      CASE ( np_blp   )    ;   CALL dyn_ldf_blp  ( kt, ub, vb, ua, va    )      ! iso-level bi-laplacian
78      !
79      END SELECT
80
81      IF( l_trddyn ) THEN                        ! save the horizontal diffusive trends for further diagnostics
82         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
83         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
84         CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt )
85      ENDIF
86      !                                          ! print sum trends (used for debugging)
87      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf  - Ua: ', mask1=umask,   &
88         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
89      !
90      IF( nn_timing == 1 )  CALL timing_stop('dyn_ldf')
91      !
92   END SUBROUTINE dyn_ldf
93
94
95   SUBROUTINE dyn_ldf_init
96      !!----------------------------------------------------------------------
97      !!                  ***  ROUTINE dyn_ldf_init  ***
98      !!
99      !! ** Purpose :   initializations of the horizontal ocean dynamics physics
100      !!----------------------------------------------------------------------
101      INTEGER ::   ioptio, ierr         ! temporary integers
102      !!----------------------------------------------------------------------
103      !
104      !                                   ! Namelist nam_dynldf: already read in ldfdyn module
105      !
106      IF(lwp) THEN                        ! Namelist print
107         WRITE(numout,*)
108         WRITE(numout,*) 'dyn_ldf_init : Choice of the lateral diffusive operator on dynamics'
109         WRITE(numout,*) '~~~~~~~~~~~~'
110         WRITE(numout,*) '   Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)'
111         WRITE(numout,*) '      laplacian operator          ln_dynldf_lap = ', ln_dynldf_lap
112         WRITE(numout,*) '      bilaplacian operator        ln_dynldf_blp = ', ln_dynldf_blp
113         WRITE(numout,*) '      iso-level                   ln_dynldf_lev = ', ln_dynldf_lev
114         WRITE(numout,*) '      horizontal (geopotential)   ln_dynldf_hor = ', ln_dynldf_hor
115         WRITE(numout,*) '      iso-neutral                 ln_dynldf_iso = ', ln_dynldf_iso
116      ENDIF
117      !                                   ! use of lateral operator or not
118      nldf = np_ERROR
119      ioptio = 0
120      IF( ln_dynldf_lap )   ioptio = ioptio + 1
121      IF( ln_dynldf_blp )   ioptio = ioptio + 1
122      IF( ioptio >  1   )   CALL ctl_stop( 'dyn_ldf_init: use ONE or NONE of the 2 lap/bilap operator type on momentum' )
123      IF( ioptio == 0   )   nldf = np_no_ldf     ! No lateral mixing operator
124      !
125      IF( nldf /= np_no_ldf ) THEN        ! direction ==>> type of operator 
126         ioptio = 0
127         IF( ln_dynldf_lev )   ioptio = ioptio + 1
128         IF( ln_dynldf_hor )   ioptio = ioptio + 1
129         IF( ln_dynldf_iso )   ioptio = ioptio + 1
130         IF( ioptio >  1   )   CALL ctl_stop( '          use only ONE direction (level/hor/iso)' )
131         IF( ioptio == 0   )   CALL ctl_stop( '          use at least ONE direction (level/hor/iso)' )
132         !
133         !                                   ! Set nldf, the type of lateral diffusion, from ln_dynldf_... logicals
134         ierr = 0
135         IF ( ln_dynldf_lap ) THEN      ! laplacian operator
136            IF ( ln_zco ) THEN                ! z-coordinate
137               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation)
138               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level = horizontal (no rotation)
139               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation)
140            ENDIF
141            IF ( ln_zps ) THEN             ! z-coordinate with partial step
142               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level              (no rotation)
143               IF ( ln_dynldf_hor )   nldf = np_lap     ! iso-level              (no rotation)
144               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation)
145            ENDIF
146            IF ( ln_sco ) THEN             ! s-coordinate
147               IF ( ln_dynldf_lev )   nldf = np_lap     ! iso-level = horizontal (no rotation)
148               IF ( ln_dynldf_hor )   nldf = np_lap_i   ! horizontal             (   rotation)
149               IF ( ln_dynldf_iso )   nldf = np_lap_i   ! iso-neutral            (   rotation)
150            ENDIF
151         ENDIF
152         !
153         IF( ln_dynldf_blp ) THEN          ! bilaplacian operator
154            IF ( ln_zco ) THEN                ! z-coordinate
155               IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level = horizontal (no rotation)
156               IF ( ln_dynldf_hor )   nldf = np_blp     ! iso-level = horizontal (no rotation)
157               IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation)
158            ENDIF
159            IF ( ln_zps ) THEN             ! z-coordinate with partial step
160               IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation)
161               IF ( ln_dynldf_hor )   nldf = np_blp     ! iso-level              (no rotation)
162               IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation)
163            ENDIF
164            IF ( ln_sco ) THEN             ! s-coordinate
165               IF ( ln_dynldf_lev )   nldf = np_blp     ! iso-level              (no rotation)
166               IF ( ln_dynldf_hor )   ierr = 2          ! horizontal             (   rotation)
167               IF ( ln_dynldf_iso )   ierr = 2          ! iso-neutral            (   rotation)
168            ENDIF
169         ENDIF
170         !
171         IF( ierr == 2 )   CALL ctl_stop( 'rotated bi-laplacian operator does not exist' )
172         !
173         IF( nldf == np_lap_i )   l_ldfslp = .TRUE.      ! rotation require the computation of the slopes
174         !
175      ENDIF
176
177      IF(lwp) THEN
178         WRITE(numout,*)
179         IF( nldf == np_no_ldf )   WRITE(numout,*) '      ===>>   NO lateral viscosity'
180         IF( nldf == np_lap    )   WRITE(numout,*) '      ===>>   iso-level laplacian operator'
181         IF( nldf == np_lap_i  )   WRITE(numout,*) '      ===>>   rotated laplacian operator with iso-level background'
182         IF( nldf == np_blp    )   WRITE(numout,*) '      ===>>   iso-level bi-laplacian operator'
183      ENDIF
184      !
185   END SUBROUTINE dyn_ldf_init
186
187   !!======================================================================
188END MODULE dynldf
Note: See TracBrowser for help on using the repository browser.