/[MITgcm]/MITgcm/pkg/generic_advdiff/gad_init_fixed.F
ViewVC logotype

Annotation of /MITgcm/pkg/generic_advdiff/gad_init_fixed.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (hide annotations) (download)
Tue Jan 16 04:38:34 2007 UTC (17 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58w_post, checkpoint58x_post, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b, checkpoint59h, checkpoint59, checkpoint58y_post, checkpoint58v_post
Changes since 1.1: +19 -5 lines
2nd-Order Moment Advection Scheme (Prather, 1986): first check-in
 - enable by setting #define GAD_ALLOW_SOM_ADVECT (in GAD_OPTIONS.h)
 - used without limiter (AdvScheme=80) or with Prather limiter (AdvScheme=81)
 - still needs work (not working with some options ; efficiency to improve)
   and serious testing.

1 jmc 1.2 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_init_fixed.F,v 1.1 2007/01/10 23:51:36 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "GAD_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: GAD_INIT_FIXED
8     C !INTERFACE:
9     SUBROUTINE GAD_INIT_FIXED( myThid )
10     C !DESCRIPTION:
11     C Routine to initialize Generic Advection/Diffusion variables and
12     C constants.
13    
14     C !USES:
15     IMPLICIT NONE
16     C === Global variables ===
17     #include "SIZE.h"
18     #include "EEPARAMS.h"
19     #include "PARAMS.h"
20     #include "GAD.h"
21    
22     C !INPUT/OUTPUT PARAMETERS:
23     C === Routine arguments ===
24     C myThid - Number of this instance of GAD_INIT_FIXED
25     INTEGER myThid
26     CEOP
27    
28     C === Local variables ===
29     C msgBuf - Informational/error meesage buffer
30     CHARACTER*(MAX_LEN_MBUF) msgBuf
31     INTEGER minOlSize
32    
33     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
34    
35     _BEGIN_MASTER(myThid)
36    
37 jmc 1.2 C-- Set Temp & Salt 2nd-Order Moment Advec. flag according to advection scheme
38     tempSOM_Advection = tempAdvScheme.GE.ENUM_SOM_PRATHER
39     & .AND. tempAdvScheme.LE.ENUM_SOM_LIMITER
40     tempSOM_Advection = tempSOM_Advection .AND. tempAdvection
41     saltSOM_Advection = saltAdvScheme.GE.ENUM_SOM_PRATHER
42     & .AND. saltAdvScheme.LE.ENUM_SOM_LIMITER
43     saltSOM_Advection = saltSOM_Advection .AND. saltAdvection
44    
45 jmc 1.1 C-- Set Temp & Salt multi-Dim Advec. flag according to advection scheme used
46     tempMultiDimAdvec = multiDimAdvection .AND. tempAdvection
47     saltMultiDimAdvec = multiDimAdvection .AND. saltAdvection
48     IF ( tempAdvScheme.EQ.ENUM_CENTERED_2ND
49     & .OR.tempAdvScheme.EQ.ENUM_UPWIND_3RD
50     & .OR.tempAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
51     tempMultiDimAdvec = .FALSE.
52     ENDIF
53     IF ( saltAdvScheme.EQ.ENUM_CENTERED_2ND
54     & .OR.saltAdvScheme.EQ.ENUM_UPWIND_3RD
55     & .OR.saltAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
56     saltMultiDimAdvec = .FALSE.
57     ENDIF
58    
59     C-- Set general multi-Dim Advec. flag when at least 1 tracer use multi-Dim Advec.
60     useMultiDimAdvec = useMultiDimAdvec.OR.tempMultiDimAdvec
61     useMultiDimAdvec = useMultiDimAdvec.OR.saltMultiDimAdvec
62    
63     C-- Set Temp & Salt Adams-Bashforth flag according to advection scheme used
64     AdamsBashforthGt = .FALSE.
65     AdamsBashforthGs = .FALSE.
66     AdamsBashforth_T = .FALSE.
67     AdamsBashforth_S = .FALSE.
68     IF ( tempAdvScheme.EQ.ENUM_CENTERED_2ND
69     & .OR.tempAdvScheme.EQ.ENUM_UPWIND_3RD
70     & .OR.tempAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
71     AdamsBashforthGt = tempStepping
72     ENDIF
73     IF ( saltAdvScheme.EQ.ENUM_CENTERED_2ND
74     & .OR.saltAdvScheme.EQ.ENUM_UPWIND_3RD
75     & .OR.saltAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
76     AdamsBashforthGs = saltStepping
77     ENDIF
78     #ifdef ALLOW_ADAMSBASHFORTH_3
79     C- For now, A-B on T,S is only implemented in AB-3 code, and not working
80     C with synchronous time-step, which would require to do also AB(u,v,w)
81     IF ( .NOT.doAB_onGtGs .AND.
82     & (staggerTimeStep .OR. implicitIntGravWave) ) THEN
83     AdamsBashforth_T = AdamsBashforthGt
84     AdamsBashforth_S = AdamsBashforthGs
85     AdamsBashforthGt = .FALSE.
86     AdamsBashforthGs = .FALSE.
87     ENDIF
88     #endif /* ALLOW_ADAMSBASHFORTH_3 */
89    
90     C- Initialize AB starting flags for T & S:
91     C notes: those could be modified when reading a pickup that does
92     C correspond to what is actually needed.
93     tempStartAB = nIter0.EQ.0
94     saltStartAB = nIter0.EQ.0
95    
96     _END_MASTER(myThid)
97    
98     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
99    
100     #ifdef ALLOW_DIAGNOSTICS
101     IF ( useDiagnostics ) THEN
102     C-- Add diagnostics of Temp & Salt fluxes to the (long) list of diagnostics:
103     CALL GAD_DIAGNOSTICS_INIT( myThid )
104     ENDIF
105     #endif /* ALLOW_DIAGNOSTICS */
106    
107     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
108    
109     C-- Print out GAD parameters :
110     _BEGIN_MASTER(myThid)
111    
112     WRITE(msgBuf,'(A)') ' '
113     CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
114     WRITE(msgBuf,'(A)') '// ==================================='
115     CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
116     WRITE(msgBuf,'(A)')'// GAD parameters :'
117     CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
118     WRITE(msgBuf,'(A)') '// ==================================='
119     CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
120    
121     CALL WRITE_0D_I( tempAdvScheme, INDEX_NONE,
122     & 'tempAdvScheme =',
123     & ' /* Temp. Horiz.Advection scheme selector */')
124     CALL WRITE_0D_I( tempVertAdvScheme, INDEX_NONE,
125     & 'tempVertAdvScheme =',
126     & ' /* Temp. Vert. Advection scheme selector */')
127     CALL WRITE_0D_L( tempMultiDimAdvec, INDEX_NONE,
128     & 'tempMultiDimAdvec =',
129     & ' /* use Muti-Dim Advec method for Temp */')
130 jmc 1.2 CALL WRITE_0D_L( tempSOM_Advection, INDEX_NONE,
131     & 'tempSOM_Advection =',
132     & ' /* use 2nd Order Moment Advection for Temp */')
133 jmc 1.1 CALL WRITE_0D_L( AdamsBashforthGt, INDEX_NONE,
134     & 'AdamsBashforthGt =',
135 jmc 1.2 & ' /* apply Adams-Bashforth extrapolation on Gt */')
136 jmc 1.1 CALL WRITE_0D_L( AdamsBashforth_T, INDEX_NONE,
137     & 'AdamsBashforth_T =',
138 jmc 1.2 & ' /* apply Adams-Bashforth extrapolation on Temp */')
139 jmc 1.1
140     CALL WRITE_0D_I( saltAdvScheme, INDEX_NONE,
141     & 'saltAdvScheme =',
142     & ' /* Salt. Horiz.advection scheme selector */')
143     CALL WRITE_0D_I( saltVertAdvScheme, INDEX_NONE,
144     & 'saltVertAdvScheme =',
145     & ' /* Salt. Vert. Advection scheme selector */')
146     CALL WRITE_0D_L( saltMultiDimAdvec, INDEX_NONE,
147     & 'saltMultiDimAdvec =',
148     & ' /* use Muti-Dim Advec method for Salt */')
149 jmc 1.2 CALL WRITE_0D_L( saltSOM_Advection, INDEX_NONE,
150     & 'saltSOM_Advection =',
151     & ' /* use 2nd Order Moment Advection for Salt */')
152 jmc 1.1 CALL WRITE_0D_L( AdamsBashforthGs, INDEX_NONE,
153     & 'AdamsBashforthGs =',
154 jmc 1.2 & ' /* apply Adams-Bashforth extrapolation on Gs */')
155 jmc 1.1 CALL WRITE_0D_L( AdamsBashforth_S, INDEX_NONE,
156     & 'AdamsBashforth_S =',
157 jmc 1.2 & ' /* apply Adams-Bashforth extrapolation on Salt */')
158 jmc 1.1
159     WRITE(msgBuf,'(A)') '// ==================================='
160     CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
161    
162     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
163    
164     C-- Check size of the overlap :
165     IF ( useCubedSphereExchange .AND. useMultiDimAdvec ) THEN
166     C- multi-dim-advection on CS-grid requires to double the size of Olx,Oly
167     minOlSize = 2
168     IF ( tempMultiDimAdvec ) THEN
169     IF ( tempAdvScheme.EQ.ENUM_FLUX_LIMIT .OR.
170     & tempAdvScheme.EQ.ENUM_DST3_FLUX_LIMIT .OR.
171     & tempAdvScheme.EQ.ENUM_DST3 ) minOlSize = 4
172     ENDIF
173     IF ( saltMultiDimAdvec ) THEN
174     IF ( saltAdvScheme.EQ.ENUM_FLUX_LIMIT .OR.
175     & saltAdvScheme.EQ.ENUM_DST3_FLUX_LIMIT .OR.
176     & saltAdvScheme.EQ.ENUM_DST3 ) minOlSize = 4
177     ENDIF
178     IF ( Olx.LT.minOlSize .OR. Oly.LT.minOlSize ) THEN
179     WRITE(msgBuf,'(A)')
180     & 'GAD_INIT_FIXED: Multi-Dim Advection with 5-points stencil'
181     CALL PRINT_ERROR( msgBuf , myThid)
182     WRITE(msgBuf,'(A,I2)')
183     & 'GAD_INIT_FIXED: advection scheme needs at least Olx,Oly=',
184     & minOlSize
185     CALL PRINT_ERROR( msgBuf , myThid)
186     STOP 'ABNORMAL END: S/R GAD_INIT_FIXED'
187     ENDIF
188     ENDIF
189    
190     _END_MASTER(myThid)
191     _BARRIER
192    
193     RETURN
194     END

  ViewVC Help
Powered by ViewVC 1.1.22