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.
trctrp_ctl.F90 in trunk/NEMO/TOP_SRC/TRP – NEMO

source: trunk/NEMO/TOP_SRC/TRP/trctrp_ctl.F90 @ 197

Last change on this file since 197 was 186, checked in by opalod, 20 years ago

CL + CE : NEMO TRC_SRC start

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 15.4 KB
Line 
1MODULE trctrp_ctl
2   !!==============================================================================
3   !!                       ***  MODULE  trctrp_ctl  ***
4   !! Ocean passive tracers:  transport option control
5   !!==============================================================================
6#if defined key_passivetrc
7   !!----------------------------------------------------------------------
8   !!   trc_trp_ctl  : control the different options of transport
9   !!----------------------------------------------------------------------
10   !! * Modules used
11   USE oce_trc             ! ocean dynamics and active tracers
12   USE trc                 ! ocean space and time domain
13   USE trctrp_lec 
14
15   IMPLICIT NONE
16   PRIVATE
17
18   !! * Accessibility
19   PUBLIC trc_trp_ctl   
20
21   !! * Module variable
22#if defined key_trcldf_eiv
23      LOGICAL, PARAMETER ::   lk_trcldf_eiv   = .TRUE.   !: eddy induced velocity flag
24#else   
25      LOGICAL, PARAMETER ::   lk_trcldf_eiv   = .FALSE.   !: eddy induced velocity flag
26#endif
27
28   !!----------------------------------------------------------------------
29   !!   OPA 9.0 , LODYC-IPSL (2003)
30   !!----------------------------------------------------------------------
31
32CONTAINS
33
34   SUBROUTINE trc_trp_ctl
35      !!---------------------------------------------------------------------
36      !!                  ***  ROUTINE trc_trp_ctl  ***
37      !!               
38      !! ** Purpose :   Control the consistency between cpp options for
39      !!      tracer transport
40      !!
41      !! History :
42      !!
43      !!   9.0  !  04-0.  (C. Ethe)
44      !!----------------------------------------------------------------------
45
46      !!----------------------------------------------------------------------
47      !!  OPA 9.0, LODYC-IPSL (2003)
48      !!----------------------------------------------------------------------
49
50      !! Control of Advection scheme options
51      CALL trc_adv_ctl
52
53      !! Control of Lateral diffusion scheme options
54      CALL trc_ldf_ctl
55
56      !! Control of Vertival diffusion scheme options
57      CALL trc_zdf_ctl
58
59      !! Control of Newtonian damping  options
60      IF(lwp) THEN
61         WRITE(numout,*) ' *** Tracer damping option'
62         WRITE(numout,*)
63      ENDIF
64
65#if defined key_trcdmp
66      IF(lwp) THEN
67         WRITE(numout,*)' key_trcdmp is defined'
68         WRITE(numout,*)' Check trcdmp ROUTINE '
69         WRITE(numout,*)'  '
70      ENDIF
71      CALL trc_dmp_ctl
72#else
73      IF (lwp) WRITE(numout,*) ' No tracer damping'
74#endif
75
76
77   END SUBROUTINE trc_trp_ctl
78
79   SUBROUTINE trc_adv_ctl
80      !!---------------------------------------------------------------------
81      !!                  ***  ROUTINE trc_adv_ctl  ***
82      !!               
83      !! ** Purpose :   Control the consistency between cpp options for
84      !!      tracer advection schemes
85      !!
86      !! History :
87      !!   8.5  !  02-11  (G. Madec)  Original code
88      !!   9.0  !  04-0.  (C. Ethe)  adapted for passive tracers
89      !!----------------------------------------------------------------------
90
91      !! * Local declarations
92      INTEGER ::   ioptio
93
94
95      !!----------------------------------------------------------------------
96      !!  OPA 9.0, LODYC-IPSL (2003)
97      !!----------------------------------------------------------------------
98
99      ! Control of Advection scheme options
100      ! -----------------------------------
101      ioptio = 0
102      IF( ln_trcadv_cen2   )   ioptio = ioptio + 1
103      IF( ln_trcadv_tvd    )   ioptio = ioptio + 1
104      IF( ln_trcadv_muscl  )   ioptio = ioptio + 1
105      IF( ln_trcadv_muscl2 )   ioptio = ioptio + 1
106      IF( ln_trcadv_smolar )   ioptio = ioptio + 1
107
108      IF( lk_esopa ) THEN
109         IF(lwp) WRITE(numout,*) ' esopa control : the use of all scheme is forced'
110         ln_trcadv_cen2   = .TRUE.
111         ln_trcadv_tvd    = .TRUE.
112         ln_trcadv_muscl  = .TRUE.
113         ln_trcadv_muscl2 = .TRUE.
114         ln_trcadv_smolar = .TRUE.
115      ELSEIF( ioptio > 1 .OR. ioptio == 0 ) THEN
116         IF(lwp) WRITE(numout,cform_err)
117         IF(lwp) WRITE(numout,*) ' Choose one advection scheme in namelist nam_trcadv'
118         IF(lwp) WRITE(numout,*) '        ***                              ***********'
119         nstop = nstop + 1
120      ENDIF
121
122      IF( n_cla == 1 .AND. .NOT. ln_trcadv_cen2 ) THEN
123         IF(lwp) WRITE(numout,cform_err)
124         IF(lwp) WRITE(numout,*) '     cross-land advection only with 2nd order advection scheme'
125         nstop = nstop + 1
126      ENDIF
127
128   END SUBROUTINE trc_adv_ctl
129
130   SUBROUTINE trc_ldf_ctl
131      !!----------------------------------------------------------------------
132      !!                  ***  ROUTINE trc_ldf_ctl  ***
133      !!
134      !! ** Purpose :   Control the consistency between cpp options for
135      !!      tracer lateral diffusion
136      !!
137      !! History :
138      !!   9.0  !  03-04  (C. Ethe)
139      !!----------------------------------------------------------------------
140      !! * Local declarations
141      INTEGER ::   ioptio               ! ???
142      LOGICAL ::   ll_print = .FALSE.   ! =T print eddy coef. in numout     
143
144      !!----------------------------------------------------------------------
145      !!  OPA 9.0, LODYC-IPSL (2003)
146      !!----------------------------------------------------------------------
147
148      ! Parameter control
149
150      ! control the input
151      ioptio = 0
152      IF( ln_trcldf_lap   )   ioptio = ioptio + 1
153      IF( ln_trcldf_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 tracer'
157          nstop = nstop + 1
158      ENDIF
159      ioptio = 0
160      IF( ln_trcldf_level )   ioptio = ioptio + 1
161      IF( ln_trcldf_hor   )   ioptio = ioptio + 1
162      IF( ln_trcldf_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      ! ... Choice of the lateral scheme used
170      IF( lk_trcldf_eiv ) THEN
171         IF(lwp) WRITE(numout,*) '          eddy induced velocity on tracers'
172            IF( .NOT.ln_trcldf_iso .OR. ln_trcldf_bilap ) THEN
173            IF(lwp) WRITE(numout,cform_err)
174            IF(lwp) WRITE(numout,*) ' the eddy induced velocity on tracers requires isopycnal laplacian diffusion'
175            nstop = nstop + 1
176         ENDIF
177      ENDIF
178
179      IF( lk_sco ) THEN          ! s-coordinates: rotation required for horizontal or isopycnal mixing
180         IF( ( ln_trcldf_iso .OR. ln_trcldf_hor ) .AND. .NOT.lk_ldfslp ) THEN
181            IF(lwp) WRITE(numout,cform_err)
182            IF(lwp) WRITE(numout,*) '          the rotation of the diffusive tensor require key_ldfslp'
183            IF( .NOT.lk_esopa )   nstop = nstop + 1
184         ENDIF
185      ELSE                       ! z-coordinates with/without partial step:
186         ln_trcldf_level = ln_trcldf_level .OR. ln_trcldf_hor      ! level diffusion = horizontal diffusion
187         ln_trcldf_hor   = .FALSE.
188         IF(lwp) WRITE(numout,*) '          horizontal mixing in z-coord or partial steps: force ln_trcldf_level = T'
189         IF(lwp) WRITE(numout,*) '                                                  and    force ln_trcldf_hor   = F'
190         IF( ln_trcldf_iso .AND. .NOT.lk_ldfslp ) THEN             ! rotation required for isopycnal mixing
191            IF(lwp) WRITE(numout,cform_err)
192            IF(lwp) WRITE(numout,*) '          the rotation of the diffusive tensor require key_ldfslp'
193            IF( .NOT.lk_esopa )   nstop = nstop + 1
194         ENDIF
195      ENDIF
196
197      l_trcldf_lap     =  ln_trcldf_lap   .AND. ln_trcldf_level     ! iso-level   laplacian operator
198      l_trcldf_bilap   =  ln_trcldf_bilap .AND. ln_trcldf_level     ! iso-level bilaplacian operator
199      l_trcldf_bilapg  =  ln_trcldf_bilap .AND. ln_trcldf_hor       ! geopotential bilap. (s-coord)
200      l_trcldf_iso     =  ln_trcldf_lap   .AND.                  &  ! laplacian operator
201         &                   ( ln_trcldf_iso   .OR.  ln_trcldf_hor )  &  ! iso-neutral (z-coord) or horizontal (s-coord)
202         &                                     .AND. .NOT.lk_zps
203      l_trcldf_iso_zps =       ln_trcldf_lap   .AND.                  &  ! laplacian operator
204         &                   ( ln_trcldf_iso   .OR.  ln_trcldf_hor )  &  ! iso-neutral (partial steps)
205         &                                     .AND. lk_zps              ! or geopotential in mixed partial steps/s-coord
206      l_trczdf_iso    = .FALSE.
207      l_trczdf_iso_vo = .FALSE.
208      IF( l_trcldf_iso     )   l_trczdf_iso = .TRUE.
209      IF( l_trcldf_iso_zps )   l_trczdf_iso = .TRUE.
210#if defined key_vectopt_memory
211      IF( l_trczdf_iso ) THEN
212         l_trczdf_iso    = .FALSE.
213         l_trczdf_iso_vo = .TRUE.
214      ENDIF
215#endif
216
217 
218      ioptio = 0
219      IF( l_trcldf_lap     )   ioptio = ioptio + 1
220      IF( l_trcldf_bilap   )   ioptio = ioptio + 1
221      IF( l_trcldf_bilapg  )   ioptio = ioptio + 1
222      IF( l_trcldf_iso     )   ioptio = ioptio + 1
223      IF( l_trcldf_iso_zps )   ioptio = ioptio + 1
224      IF( ioptio /= 1 ) THEN
225         IF(lwp) WRITE(numout,cform_err)
226         IF(lwp) WRITE(numout,*) '          this combination of operator and direction has not been implemented'
227         nstop = nstop + 1
228      ENDIF
229
230      IF( lk_esopa ) THEN
231         l_trcldf_lap = .TRUE.   ;   l_trcldf_bilap   = .TRUE.   ;   l_trcldf_bilapg  = .TRUE.
232         l_trcldf_iso = .TRUE.   ;   l_trcldf_iso_zps = .TRUE.
233         l_trczdf_iso = .TRUE.   ;   l_trczdf_iso_vo  = .TRUE.
234         IF(lwp ) WRITE(numout,*) '          esopa test: use all lateral physics options'
235      ENDIF
236
237      IF( .NOT. ln_trcldf_diff ) THEN
238         l_trcldf_lap = .FALSE.   ;   l_trcldf_bilap   = .FALSE.   ;   l_trcldf_bilapg  = .FALSE.
239         l_trcldf_iso = .FALSE.   ;   l_trcldf_iso_zps = .FALSE.
240         l_trczdf_iso = .FALSE.   ;   l_trczdf_iso_vo  = .FALSE.
241         IF(lwp ) WRITE(numout,*) '          No lateral physics on passive tracers'
242      ELSE
243         ! ... Space variation of eddy coefficients
244         ioptio = 0
245#if defined key_traldf_c3d
246         IF(lwp) WRITE(numout,*) 'tracer mixing coef. = F( latitude, longitude, depth)'
247         ioptio = ioptio + 1
248#endif
249#if defined key_traldf_c2d
250         IF(lwp) WRITE(numout,*) 'tracer mixing coef. = F( latitude, longitude)'
251         ioptio = ioptio + 1
252#endif
253#if defined key_traldf_c1d
254         IF(lwp) WRITE(numout,*) 'tracer mixing coef. = F( depth )'
255         ioptio = ioptio + 1
256         IF( lk_sco ) THEN
257            IF(lwp) WRITE(numout,cform_err)
258            IF(lwp) WRITE(numout,*) '          key_traldf_c1d cannot be used in s-coordinate (key_s_coord)'
259            nstop = nstop + 1
260         ENDIF
261#endif
262         IF( ioptio == 0 ) THEN
263            IF(lwp) WRITE(numout,*) ' tracer mixing coef. = constant (default option)'
264         ELSEIF( ioptio > 1 ) THEN
265            IF(lwp) WRITE(numout,cform_err)
266            IF(lwp) WRITE(numout,*) ' use only one of the following keys:',   &
267               &                    ' key_traldf_c3d, key_traldf_c2d, key_traldf_c1d'
268            nstop = nstop + 1
269         ENDIF
270         
271         IF( l_trcldf_bilap .OR. l_trcldf_bilapg ) THEN
272            IF(lwp) WRITE(numout,*) '  biharmonic tracer diffusion'
273            IF( ahtrc0 > 0 .AND. .NOT. lk_esopa ) THEN
274               IF(lwp) WRITE(numout,cform_err)
275               IF(lwp) WRITE(numout,*) ' The horizontal diffusivity coef. aht0 must be negative'
276               nstop = nstop + 1
277            ENDIF
278         ELSE
279            IF(lwp) WRITE(numout,*) ' harmonic tracer diffusion (default)'
280            IF( ahtrc0 < 0 .AND. .NOT. lk_esopa ) THEN
281               IF(lwp) WRITE(numout,cform_err)
282               IF(lwp) WRITE(numout,*) 'The horizontal diffusivity coef. aht0 must be positive'
283               nstop = nstop + 1
284            ENDIF
285         ENDIF
286      ENDIF
287
288   END SUBROUTINE trc_ldf_ctl
289
290   SUBROUTINE trc_zdf_ctl
291      !!----------------------------------------------------------------------
292      !!                  ***  ROUTINE trc_zdf_ctl  ***
293      !!
294      !! ** Purpose :     Control the consistency between cpp options for
295      !!      tracer vertical diffusion
296      !!
297      !!   9.0  !  04-03  (C. Ethe) 
298      !!----------------------------------------------------------------------
299      !! * Local declarations
300
301      !!----------------------------------------------------------------------
302      !!  OPA 9.0, LODYC-IPSL (2003)
303      !!----------------------------------------------------------------------
304
305      ! Parameter & key controls
306      ! ------------------------
307      ! ... vertical mixing
308      ! time stepping scheme (N.B. TKE scheme => force the use of implicit scheme)
309#if defined key_zdftke
310      l_trczdf_exp = .FALSE.          ! use implicit scheme
311      l_trczdf_imp = .TRUE. 
312#else
313      IF( ln_zdfexp  ) THEN 
314         l_trczdf_exp = .TRUE.           ! use explicit scheme
315         l_trczdf_imp = .FALSE.
316      ELSE
317         l_trczdf_exp = .FALSE.          ! use implicit scheme
318         l_trczdf_imp = .TRUE. 
319      ENDIF
320#endif
321
322      IF( l_trczdf_iso .OR. l_trczdf_iso_vo ) THEN 
323         l_trczdf_exp = .FALSE.          ! iso-neutral diffusion :
324         l_trczdf_imp = .FALSE.          ! implicit scheme included in iso-neutral routine
325      ENDIF
326
327#if defined key_esopa
328      l_trczdf_exp = .TRUE.           ! esopa: use all options
329      l_trczdf_imp = .TRUE.
330#endif
331
332
333   END SUBROUTINE trc_zdf_ctl
334
335   SUBROUTINE trc_dmp_ctl
336      !!----------------------------------------------------------------------
337      !!                  ***  ROUTINE trc_dmp_ctl  ***
338      !!
339      !! ** Purpose :    Control the consistency between cpp options for
340      !!      tracer newtonian damping
341      !!
342      !!
343      !! History :
344      !!   9.0  !  04-03  (C. Ethe)
345      !!----------------------------------------------------------------------
346#if defined key_trcdmp
347
348      SELECT CASE ( ndmptr )
349
350      CASE ( -1 )               ! ORCA: damping in Red & Med Seas only
351         IF(lwp) WRITE(numout,*) '          tracer damping in the Med & Red seas only'
352
353      CASE ( 1:90 )             ! Damping poleward of 'ndmptr' degrees
354         IF(lwp) WRITE(numout,*) '          tracer damping poleward of', ndmptr, ' degrees'
355
356      CASE DEFAULT
357         IF(lwp) WRITE(numout,cform_err)
358         IF(lwp) WRITE(numout,*) '          bad flag value for ndmptr = ', ndmptr
359         nstop = nstop + 1
360
361      END SELECT
362
363
364      SELECT CASE ( nmldmptr )
365
366      CASE ( 0 )                ! newtonian damping throughout the water column
367         IF(lwp) WRITE(numout,*) '          tracer damping throughout the water column'
368
369      CASE ( 1 )                ! no damping in the turbocline (avt > 5 cm2/s)
370         IF(lwp) WRITE(numout,*) '          no tracer damping in the turbocline'
371
372      CASE ( 2 )                ! no damping in the mixed layer
373         IF(lwp) WRITE(numout,*) '          no tracer damping in the mixed layer'
374
375      CASE DEFAULT
376         IF(lwp) WRITE(numout,cform_err)
377         IF(lwp) WRITE(numout,*) '          bad flag value for nmldmptr = ', nmldmptr
378         nstop = nstop + 1
379
380      END SELECT
381#endif
382 
383   END SUBROUTINE trc_dmp_ctl
384
385#else
386   !!----------------------------------------------------------------------
387   !!   Dummy module :                      Rigid-lid case
388   !!----------------------------------------------------------------------
389CONTAINS
390   SUBROUTINE trc_trp_ctl             ! Empty routine
391   END SUBROUTINE trc_trp_ctl
392#endif
393   
394  !!======================================================================
395END MODULE trctrp_ctl
Note: See TracBrowser for help on using the repository browser.