/[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.11 - (show annotations) (download)
Sun Mar 13 01:44:02 2016 UTC (8 years, 1 month ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65v, checkpoint65w, checkpoint65u, HEAD
Changes since 1.10: +7 -1 lines
- from Darren: add PPM and PQM advection schemes (number 40-42 and 50-52)
  with 2 types of limiter (see: Engwirda & Kelley, submit. to JCP);
  Note (from Darren): unlimited PPM/PQM scheme (40 & 50) are just for
  testing and not for actual use.

1 C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_init_fixed.F,v 1.10 2014/08/18 14:29:29 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 :: My Thread Id. number
25 INTEGER myThid
26 CEOP
27
28 C !FUNCTIONS
29 INTEGER GAD_ADVSCHEME_GET
30 EXTERNAL GAD_ADVSCHEME_GET
31
32 C !LOCAL VARIABLES:
33 C === Local variables ===
34 C msgBuf :: Informational/error message buffer
35 CHARACTER*(MAX_LEN_MBUF) msgBuf
36 INTEGER errCode, n, minSize
37
38 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
39
40 _BEGIN_MASTER(myThid)
41
42 C-- Initialise advection scheme parameter
43 CALL GAD_ADVSCHEME_INIT( myThid )
44
45 C- Set advection scheme parameter (overlap minimum size) for each scheme:
46 errCode = 0
47 CALL GAD_ADVSCHEME_SET( ENUM_UPWIND_1RST , 1, errCode, myThid )
48 CALL GAD_ADVSCHEME_SET( ENUM_CENTERED_2ND , 1, errCode, myThid )
49 CALL GAD_ADVSCHEME_SET( ENUM_UPWIND_3RD , 2, errCode, myThid )
50 CALL GAD_ADVSCHEME_SET( ENUM_CENTERED_4TH , 2, errCode, myThid )
51 CALL GAD_ADVSCHEME_SET( ENUM_DST2 , 1, errCode, myThid )
52 CALL GAD_ADVSCHEME_SET( ENUM_FLUX_LIMIT , 2, errCode, myThid )
53 CALL GAD_ADVSCHEME_SET( ENUM_DST3 , 2, errCode, myThid )
54 CALL GAD_ADVSCHEME_SET( ENUM_DST3_FLUX_LIMIT,2, errCode, myThid )
55 CALL GAD_ADVSCHEME_SET( ENUM_OS7MP , 4, errCode, myThid )
56 CALL GAD_ADVSCHEME_SET( ENUM_SOM_PRATHER , 1, errCode, myThid )
57 CALL GAD_ADVSCHEME_SET( ENUM_SOM_LIMITER , 1, errCode, myThid )
58 CALL GAD_ADVSCHEME_SET( ENUM_PPM_NULL_LIMIT, 3, errCode, myThid )
59 CALL GAD_ADVSCHEME_SET( ENUM_PPM_MONO_LIMIT, 3, errCode, myThid )
60 CALL GAD_ADVSCHEME_SET( ENUM_PPM_WENO_LIMIT, 3, errCode, myThid )
61 CALL GAD_ADVSCHEME_SET( ENUM_PQM_NULL_LIMIT, 4, errCode, myThid )
62 CALL GAD_ADVSCHEME_SET( ENUM_PQM_MONO_LIMIT, 4, errCode, myThid )
63 CALL GAD_ADVSCHEME_SET( ENUM_PQM_WENO_LIMIT, 4, errCode, myThid )
64 IF ( errCode.GT.0 ) THEN
65 WRITE(msgBuf,'(A)')
66 & 'GAD_INIT_FIXED: Invalid Advection-Scheme Number setting'
67 CALL PRINT_ERROR( msgBuf, myThid )
68 STOP 'ABNORMAL END: S/R GAD_INIT_FIXED'
69 ENDIF
70
71 C- Initialise overlap minimum size for GAD pkg:
72 GAD_OlMinSize(1) = 0
73 GAD_OlMinSize(2) = 0
74 GAD_OlMinSize(3) = 1
75
76 C- Set SOM I/O suffix (used for pickup, diagnostics ...)
77 DO n=1,nSOM
78 somSfx(n) = ' '
79 IF (n.EQ.1) somSfx(n) = '_x'
80 IF (n.EQ.2) somSfx(n) = '_y'
81 IF (n.EQ.3) somSfx(n) = '_z'
82 IF (n.EQ.4) somSfx(n) = 'xx'
83 IF (n.EQ.5) somSfx(n) = 'yy'
84 IF (n.EQ.6) somSfx(n) = 'zz'
85 IF (n.EQ.7) somSfx(n) = 'xy'
86 IF (n.EQ.8) somSfx(n) = 'xz'
87 IF (n.EQ.9) somSfx(n) = 'yz'
88 ENDDO
89
90 C-- Check that Temp & Salt have valid advection scheme number:
91 n = GAD_ADVSCHEME_GET( tempAdvScheme )
92 IF ( n.LT.0 ) THEN
93 WRITE(msgBuf,'(2A,I6)') 'GAD_INIT_FIXED: ',
94 & 'invalid Temp. advection scheme number=', tempAdvScheme
95 CALL PRINT_ERROR( msgBuf, myThid )
96 STOP 'ABNORMAL END: S/R GAD_INIT_FIXED'
97 ENDIF
98 n = GAD_ADVSCHEME_GET( tempVertAdvScheme )
99 IF ( n.LT.0 ) THEN
100 WRITE(msgBuf,'(2A,I6)') 'GAD_INIT_FIXED: ',
101 & 'invalid Temp. Vert. Adv.scheme number=', tempVertAdvScheme
102 CALL PRINT_ERROR( msgBuf, myThid )
103 STOP 'ABNORMAL END: S/R GAD_INIT_FIXED'
104 ENDIF
105 n = GAD_ADVSCHEME_GET( saltAdvScheme )
106 IF ( n.LT.0 ) THEN
107 WRITE(msgBuf,'(2A,I6)') 'GAD_INIT_FIXED: ',
108 & 'invalid Salt. advection scheme number=', saltAdvScheme
109 CALL PRINT_ERROR( msgBuf, myThid )
110 STOP 'ABNORMAL END: S/R GAD_INIT_FIXED'
111 ENDIF
112 n = GAD_ADVSCHEME_GET( saltVertAdvScheme )
113 IF ( n.LT.0 ) THEN
114 WRITE(msgBuf,'(2A,I6)') 'GAD_INIT_FIXED: ',
115 & 'invalid Salt. Vert. Adv.scheme number=', saltVertAdvScheme
116 CALL PRINT_ERROR( msgBuf, myThid )
117 STOP 'ABNORMAL END: S/R GAD_INIT_FIXED'
118 ENDIF
119
120 C-- Set Temp & Salt 2nd-Order Moment Advec. flag according to advection scheme
121 tempSOM_Advection = tempAdvScheme.GE.ENUM_SOM_PRATHER
122 & .AND. tempAdvScheme.LE.ENUM_SOM_LIMITER
123 tempSOM_Advection = tempSOM_Advection .AND. tempAdvection
124 saltSOM_Advection = saltAdvScheme.GE.ENUM_SOM_PRATHER
125 & .AND. saltAdvScheme.LE.ENUM_SOM_LIMITER
126 saltSOM_Advection = saltSOM_Advection .AND. saltAdvection
127
128 C-- Set Temp & Salt multi-Dim Advec. flag according to advection scheme used
129 tempMultiDimAdvec = multiDimAdvection .AND. tempAdvection
130 saltMultiDimAdvec = multiDimAdvection .AND. saltAdvection
131 IF ( tempAdvScheme.EQ.ENUM_CENTERED_2ND
132 & .OR.tempAdvScheme.EQ.ENUM_UPWIND_3RD
133 & .OR.tempAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
134 tempMultiDimAdvec = .FALSE.
135 ENDIF
136 IF ( saltAdvScheme.EQ.ENUM_CENTERED_2ND
137 & .OR.saltAdvScheme.EQ.ENUM_UPWIND_3RD
138 & .OR.saltAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
139 saltMultiDimAdvec = .FALSE.
140 ENDIF
141
142 C-- Set general multi-Dim Advec. flag when at least 1 tracer use multi-Dim Advec.
143 useMultiDimAdvec = useMultiDimAdvec.OR.tempMultiDimAdvec
144 useMultiDimAdvec = useMultiDimAdvec.OR.saltMultiDimAdvec
145
146 C-- Set Temp & Salt Adams-Bashforth flag according to advection scheme used
147 AdamsBashforthGt = .FALSE.
148 AdamsBashforthGs = .FALSE.
149 AdamsBashforth_T = .FALSE.
150 AdamsBashforth_S = .FALSE.
151 IF ( tempAdvScheme.EQ.ENUM_CENTERED_2ND
152 & .OR.tempAdvScheme.EQ.ENUM_UPWIND_3RD
153 & .OR.tempAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
154 AdamsBashforthGt = tempStepping
155 ENDIF
156 IF ( saltAdvScheme.EQ.ENUM_CENTERED_2ND
157 & .OR.saltAdvScheme.EQ.ENUM_UPWIND_3RD
158 & .OR.saltAdvScheme.EQ.ENUM_CENTERED_4TH ) THEN
159 AdamsBashforthGs = saltStepping
160 ENDIF
161 IF ( .NOT.doAB_onGtGs ) THEN
162 AdamsBashforth_T = AdamsBashforthGt
163 AdamsBashforth_S = AdamsBashforthGs
164 AdamsBashforthGt = .FALSE.
165 AdamsBashforthGs = .FALSE.
166 ENDIF
167
168 #ifdef GAD_SMOLARKIEWICZ_HACK
169 SmolarkiewiczMaxFrac = 1. _d 0
170 #endif
171
172 C-- Set Overlap minimum size according to Temp & Salt advection
173 IF ( tempAdvection ) THEN
174 minSize = GAD_ADVSCHEME_GET( tempAdvScheme )
175 GAD_OlMinSize(1) = MAX( GAD_OlMinSize(1), minSize )
176 ENDIF
177 IF ( saltAdvection ) THEN
178 minSize = GAD_ADVSCHEME_GET( saltAdvScheme )
179 GAD_OlMinSize(1) = MAX( GAD_OlMinSize(1), minSize )
180 ENDIF
181 IF ( useCubedSphereExchange .AND. useMultiDimAdvec ) THEN
182 C- multi-dim-advection on CS-grid requires to double the size of OLx,OLy
183 GAD_OlMinSize(3) = MAX( GAD_OlMinSize(3), 2 )
184 ENDIF
185 WRITE(msgBuf,'(A,9I3)')
186 & 'GAD_INIT_FIXED: GAD_OlMinSize=', GAD_OlMinSize
187 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
188
189 _END_MASTER(myThid)
190
191 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
192
193 #ifdef ALLOW_DIAGNOSTICS
194 IF ( useDiagnostics ) THEN
195 C-- Add diagnostics of Temp & Salt fluxes to the (long) list of diagnostics:
196 CALL GAD_DIAGNOSTICS_INIT( myThid )
197 ENDIF
198 #endif /* ALLOW_DIAGNOSTICS */
199
200 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
201
202 C-- Print out GAD parameters :
203 _BEGIN_MASTER(myThid)
204
205 WRITE(msgBuf,'(A)') ' '
206 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
207 WRITE(msgBuf,'(A)') '// ==================================='
208 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
209 WRITE(msgBuf,'(A)')'// GAD parameters :'
210 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
211 WRITE(msgBuf,'(A)') '// ==================================='
212 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
213
214 CALL WRITE_0D_I( tempAdvScheme, INDEX_NONE,
215 & 'tempAdvScheme =',
216 & ' /* Temp. Horiz.Advection scheme selector */')
217 CALL WRITE_0D_I( tempVertAdvScheme, INDEX_NONE,
218 & 'tempVertAdvScheme =',
219 & ' /* Temp. Vert. Advection scheme selector */')
220 CALL WRITE_0D_L( tempMultiDimAdvec, INDEX_NONE,
221 & 'tempMultiDimAdvec =',
222 & ' /* use Muti-Dim Advec method for Temp */')
223 CALL WRITE_0D_L( tempSOM_Advection, INDEX_NONE,
224 & 'tempSOM_Advection =',
225 & ' /* use 2nd Order Moment Advection for Temp */')
226 CALL WRITE_0D_L( AdamsBashforthGt, INDEX_NONE,
227 & 'AdamsBashforthGt =',
228 & ' /* apply Adams-Bashforth extrapolation on Gt */')
229 CALL WRITE_0D_L( AdamsBashforth_T, INDEX_NONE,
230 & 'AdamsBashforth_T =',
231 & ' /* apply Adams-Bashforth extrapolation on Temp */')
232
233 CALL WRITE_0D_I( saltAdvScheme, INDEX_NONE,
234 & 'saltAdvScheme =',
235 & ' /* Salt. Horiz.advection scheme selector */')
236 CALL WRITE_0D_I( saltVertAdvScheme, INDEX_NONE,
237 & 'saltVertAdvScheme =',
238 & ' /* Salt. Vert. Advection scheme selector */')
239 CALL WRITE_0D_L( saltMultiDimAdvec, INDEX_NONE,
240 & 'saltMultiDimAdvec =',
241 & ' /* use Muti-Dim Advec method for Salt */')
242 CALL WRITE_0D_L( saltSOM_Advection, INDEX_NONE,
243 & 'saltSOM_Advection =',
244 & ' /* use 2nd Order Moment Advection for Salt */')
245 CALL WRITE_0D_L( AdamsBashforthGs, INDEX_NONE,
246 & 'AdamsBashforthGs =',
247 & ' /* apply Adams-Bashforth extrapolation on Gs */')
248 CALL WRITE_0D_L( AdamsBashforth_S, INDEX_NONE,
249 & 'AdamsBashforth_S =',
250 & ' /* apply Adams-Bashforth extrapolation on Salt */')
251 #ifdef GAD_SMOLARKIEWICZ_HACK
252 CALL WRITE_0D_RL( SmolarkiewiczMaxFrac, INDEX_NONE,
253 & 'SmolarkiewiczMaxFrac =',
254 & ' /* maximal fraction of tracer to flow out of a cell */')
255 #endif
256
257 WRITE(msgBuf,'(A)') '// ==================================='
258 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
259
260 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
261
262 _END_MASTER(myThid)
263 _BARRIER
264
265 RETURN
266 END

  ViewVC Help
Powered by ViewVC 1.1.22