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 trunk/NEMO/OPA_SRC/DYN – NEMO

source: trunk/NEMO/OPA_SRC/DYN/dynldf.F90 @ 466

Last change on this file since 466 was 456, checked in by opalod, 18 years ago

nemo_v1_update_048:RB: reorganization of dynamics part, add dynhpg_jki.F90 dynldf.F90 dynzdf.F90 dynzdf_imp_jki.F90

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 11.0 KB
Line 
1MODULE dynldf
2   !!======================================================================
3   !!                       ***  MODULE  dynldf  ***
4   !! Ocean physics:  lateral diffusivity trends
5   !!=====================================================================
6
7   !!----------------------------------------------------------------------
8   !!   dyn_ldf     : update the dynamics trend with the lateral diffusion
9   !!   dyn_ldf_ctl : initialization, namelist read, and parameters control
10   !!----------------------------------------------------------------------
11   !! * Modules used
12   USE oce             ! ocean dynamics and tracers
13   USE dom_oce         ! ocean space and time domain
14   USE phycst          ! physical constants
15   USE ldfdyn_oce      ! ocean dynamics lateral physics
16   USE ldfslp          ! ???
17   USE dynldf_bilapg   ! lateral mixing            (dyn_ldf_bilapg routine)
18   USE dynldf_bilap    ! lateral mixing             (dyn_ldf_bilap routine)
19   USE dynldf_iso      ! lateral mixing               (dyn_ldf_iso routine)
20   USE dynldf_lap      ! lateral mixing               (dyn_ldf_lap routine)
21   USE trdmod          ! ocean dynamics and tracer trends
22   USE trdmod_oce      ! ocean variables trends
23   USE prtctl          ! Print control
24   USE in_out_manager  ! I/O manager
25   USE lib_mpp         ! distribued memory computing library
26   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
27
28   IMPLICIT NONE
29   PRIVATE
30
31   !! *  Routine accessibility
32   PUBLIC dyn_ldf      ! called by step.F90
33
34   !! * module variables
35   INTEGER ::                        & 
36      nldf = 0                         ! type of lateral diffusion used
37      !                                ! defined from ln_dynldf_... namlist logicals)
38
39   !! * Substitutions
40#  include "domzgr_substitute.h90"
41#  include "vectopt_loop_substitute.h90"
42   !!---------------------------------------------------------------------------------
43   !!   OPA 9.0 , LOCEAN-IPSL (2005)
44   !!---------------------------------------------------------------------------------
45
46CONTAINS
47
48   SUBROUTINE dyn_ldf( kt )
49      !!----------------------------------------------------------------------
50      !!                  ***  ROUTINE dyn_ldf  ***
51      !!
52      !! ** Purpose :   compute the lateral ocean dynamics physics.
53      !!
54      !!----------------------------------------------------------------------
55      !! * Arguments
56      INTEGER, INTENT( in ) ::   kt     ! ocean time-step index
57
58      !! * local declarations
59      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
60         ztrdu, ztrdv                         ! 3D temporary workspace
61      !!----------------------------------------------------------------------
62
63      IF( kt == nit000 )   CALL dyn_ldf_ctl      ! initialisation & control of options
64
65      IF( l_trddyn )   THEN                      ! temporary save of ta and sa trends
66         ztrdu(:,:,:) = ua(:,:,:) 
67         ztrdv(:,:,:) = va(:,:,:) 
68      ENDIF
69
70      SELECT CASE ( nldf )                       ! compute lateral mixing trend and add it to the general trend
71      CASE ( -1 )                                       ! esopa: test all possibility with control print
72         CALL dyn_ldf_lap    ( kt )
73         IF(ln_ctl) THEN         ! print sum trends (used for debugging)
74            CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf0 - Ua: ', mask1=umask, &
75               &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
76         ENDIF
77         CALL dyn_ldf_iso    ( kt )
78         IF(ln_ctl) THEN         ! print sum trends (used for debugging)
79            CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf1 - Ua: ', mask1=umask, &
80               &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
81         ENDIF
82         CALL dyn_ldf_bilap  ( kt )
83         IF(ln_ctl) THEN         ! print sum trends (used for debugging)
84            CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf2 - Ua: ', mask1=umask, &
85               &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
86         ENDIF
87         CALL dyn_ldf_bilapg ( kt )
88         IF(ln_ctl) THEN         ! print sum trends (used for debugging)
89            CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf3 - Ua: ', mask1=umask, &
90               &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
91         ENDIF
92
93      CASE ( 0 )                                       ! iso-level laplacian
94         CALL dyn_ldf_lap    ( kt )
95      CASE ( 1 )                                       ! rotated laplacian (except dk[ dk[.] ] part)
96         CALL dyn_ldf_iso    ( kt )
97      CASE ( 2 )                                       ! iso-level bilaplacian
98         CALL dyn_ldf_bilap  ( kt )
99      CASE ( 3 )                                       ! s-coord. horizontal bilaplacian
100         CALL dyn_ldf_bilapg ( kt )
101      END SELECT
102
103      !                                          ! save the horizontal diffusive trends for further diagnostics
104      IF( l_trddyn )   THEN
105         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
106         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
107         CALL trd_mod( ztrdu, ztrdv, jpdtdldf, 'DYN', kt )
108      ENDIF
109
110      IF(ln_ctl) THEN                            ! print mean trends (used for debugging)
111         CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf  - Ua: ', mask1=umask, &
112            &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
113      ENDIF
114
115   END SUBROUTINE dyn_ldf
116
117
118   SUBROUTINE dyn_ldf_ctl
119      !!----------------------------------------------------------------------
120      !!                  ***  ROUTINE dyn_ldf_ctl  ***
121      !!
122      !! ** Purpose :   initializations of the horizontal ocean dynamics physics
123      !!
124      !! ** Method :
125      !!
126      !! History :
127      !!   9.0  !  05-11  (G. Madec)  Original code
128      !!----------------------------------------------------------------------
129      !! * Local declarations
130      INTEGER ::   ioptio, ierr         ! temporary integers
131      !!----------------------------------------------------------------------
132
133      !  Define the lateral dynamics physics parameters
134      ! =============================================
135   
136      ! Namelist nam_dynldf already read in ldfdyn module
137
138      IF(lwp) THEN
139         WRITE(numout,*)
140         WRITE(numout,*) 'dyn:ldf_ctl : Choice of the lateral diffusive operator on dynamics'
141         WRITE(numout,*) '~~~~~~~~~~~'
142         WRITE(numout,*) '          Namelist nam_dynldf : set lateral mixing parameters (type, direction, coefficients)'
143         WRITE(numout,*) '             laplacian operator          ln_dynldf_lap   = ', ln_dynldf_lap
144         WRITE(numout,*) '             bilaplacian operator        ln_dynldf_bilap = ', ln_dynldf_bilap
145         WRITE(numout,*) '             iso-level                   ln_dynldf_level = ', ln_dynldf_level
146         WRITE(numout,*) '             horizontal (geopotential)   ln_dynldf_hor   = ', ln_dynldf_hor
147         WRITE(numout,*) '             iso-neutral                 ln_dynldf_iso   = ', ln_dynldf_iso
148      ENDIF
149
150      ! control the consistency
151      ioptio = 0
152      IF( ln_dynldf_lap   )   ioptio = ioptio + 1
153      IF( ln_dynldf_bilap )   ioptio = ioptio + 1
154      IF( ioptio /= 1 )   THEN
155          IF(lwp) WRITE(numout,cform_err)
156          IF(lwp) WRITE(numout,*) '          use ONE of the 2 lap/bilap operator type on dynamics'
157          nstop = nstop + 1
158      ENDIF
159      ioptio = 0
160      IF( ln_dynldf_level )   ioptio = ioptio + 1
161      IF( ln_dynldf_hor   )   ioptio = ioptio + 1
162      IF( ln_dynldf_iso   )   ioptio = ioptio + 1
163      IF( ioptio /= 1 ) THEN
164         IF(lwp) WRITE(numout,cform_err)
165         IF(lwp) WRITE(numout,*) '          use only ONE direction (level/hor/iso)'
166         nstop = nstop + 1
167      ENDIF
168
169      ! defined the type of lateral diffusion from ln_dynldf_... logicals
170      ierr = 0
171      IF ( ln_dynldf_lap ) THEN      ! laplacian operator
172         IF ( ln_zco ) THEN                ! z-coordinate
173            IF ( ln_dynldf_level )   nldf = 0      ! iso-level  (no rotation)
174            IF ( ln_dynldf_hor   )   nldf = 0      ! horizontal (no rotation)
175            IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation)
176         ENDIF
177         IF ( ln_zps ) THEN             ! z-coordinate
178            IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed
179            IF ( ln_dynldf_hor   )   nldf = 0      ! horizontal (no rotation)
180            IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation)
181         ENDIF
182         IF ( ln_sco ) THEN             ! z-coordinate
183            IF ( ln_dynldf_level )   nldf = 0      ! iso-level  (no rotation)
184            IF ( ln_dynldf_hor   )   nldf = 1      ! horizontal (   rotation)
185            IF ( ln_dynldf_iso   )   nldf = 1      ! isoneutral (   rotation)
186         ENDIF
187      ENDIF
188
189      IF( ln_dynldf_bilap ) THEN      ! bilaplacian operator
190         IF ( ln_zco ) THEN                ! z-coordinate
191            IF ( ln_dynldf_level )   nldf = 2      ! iso-level  (no rotation)
192            IF ( ln_dynldf_hor   )   nldf = 2      ! horizontal (no rotation)
193            IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation)
194         ENDIF
195         IF ( ln_zps ) THEN             ! z-coordinate
196            IF ( ln_dynldf_level )   ierr = 1      ! iso-level not allowed
197            IF ( ln_dynldf_hor   )   nldf = 2      ! horizontal (no rotation)
198            IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation)
199         ENDIF
200         IF ( ln_sco ) THEN             ! z-coordinate
201            IF ( ln_dynldf_level )   nldf = 2      ! iso-level  (no rotation)
202            IF ( ln_dynldf_hor   )   nldf = 3      ! horizontal (   rotation)
203            IF ( ln_dynldf_iso   )   ierr = 2      ! isoneutral (   rotation)
204         ENDIF
205      ENDIF
206
207      IF( ierr == 1 ) THEN
208         IF(lwp) WRITE(numout,cform_err)
209         IF(lwp) WRITE(numout,*) ' iso-level in z-coordinate - partial step, not allowed'
210         nstop = nstop + 1
211      ENDIF
212      IF( ierr == 2 ) THEN
213         IF(lwp) WRITE(numout,cform_err)
214         IF(lwp) WRITE(numout,*) ' isoneutral bilaplacian operator does not exist'
215         nstop = nstop + 1
216      ENDIF
217      IF( nldf == 1 .OR. nldf == 3 ) THEN      ! rotation
218         IF( .NOT.lk_ldfslp ) THEN
219            IF(lwp) WRITE(numout,cform_err)
220            IF(lwp) WRITE(numout,*) '          the rotation of the diffusive tensor require key_ldfslp'
221            nstop = nstop + 1
222         ENDIF
223      ENDIF
224
225      IF( lk_esopa ) THEN
226         IF(lwp ) WRITE(numout,*) '          esopa test: use all lateral physics options'
227         nldf = -1
228      ENDIF
229
230      IF(lwp) THEN
231         WRITE(numout,*)
232         IF( nldf == -1 )   WRITE(numout,*) '              ESOPA test All scheme used'
233         IF( nldf ==  0 )   WRITE(numout,*) '              laplacian operator'
234         IF( nldf ==  1 )   WRITE(numout,*) '              Rotated laplacian operator'
235         IF( nldf ==  2 )   WRITE(numout,*) '              bilaplacian operator'
236         IF( nldf ==  3 )   WRITE(numout,*) '              Rotated bilaplacian'
237      ENDIF
238
239   END SUBROUTINE dyn_ldf_ctl
240
241   !!======================================================================
242END MODULE dynldf
Note: See TracBrowser for help on using the repository browser.