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 @ 247

Last change on this file since 247 was 247, checked in by opalod, 19 years ago

CL : Add CVS Header and CeCILL licence information

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