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

Contents 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 - (show 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 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_init_fixed.F,v 1.1 2007/01/10 23:51:36 jmc Exp $
2 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 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 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 CALL WRITE_0D_L( tempSOM_Advection, INDEX_NONE,
131 & 'tempSOM_Advection =',
132 & ' /* use 2nd Order Moment Advection for Temp */')
133 CALL WRITE_0D_L( AdamsBashforthGt, INDEX_NONE,
134 & 'AdamsBashforthGt =',
135 & ' /* apply Adams-Bashforth extrapolation on Gt */')
136 CALL WRITE_0D_L( AdamsBashforth_T, INDEX_NONE,
137 & 'AdamsBashforth_T =',
138 & ' /* apply Adams-Bashforth extrapolation on Temp */')
139
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 CALL WRITE_0D_L( saltSOM_Advection, INDEX_NONE,
150 & 'saltSOM_Advection =',
151 & ' /* use 2nd Order Moment Advection for Salt */')
152 CALL WRITE_0D_L( AdamsBashforthGs, INDEX_NONE,
153 & 'AdamsBashforthGs =',
154 & ' /* apply Adams-Bashforth extrapolation on Gs */')
155 CALL WRITE_0D_L( AdamsBashforth_S, INDEX_NONE,
156 & 'AdamsBashforth_S =',
157 & ' /* apply Adams-Bashforth extrapolation on Salt */')
158
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