1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 """
20 Euler equations solver using the CESE method.
21 """
22
23 from .cese import CeseSolver
24 from .cese import CeseCase
25 from .cese import CeseBC
26 from solvcon.anchor import Anchor
27 from solvcon.hook import BlockHook
34 """
35 Inviscid aerodynamic solver for the Euler equations.
36 """
38 self.cflname = kw.pop('cflname', 'adj')
39 kw['nsca'] = 1
40 super(EulerSolver, self).__init__(blk, *args, **kw)
41 self.cflc = self.cfl.copy()
42 from solvcon.dependency import getcdll
43 __clib_euler = {
44 2: getcdll('euler2d'),
45 3: getcdll('euler3d'),
46 }
47 del getcdll
48 @property
51 _gdlen_ = 0
52 @property
56 func = getattr(self._clib_euler, 'calc_cfl_'+self.cflname)
57 self._tcall(func, 0, self.ncell)
58 mincfl = self.ocfl.min()
59 maxcfl = self.ocfl.max()
60 nadj = (self.cfl==1).sum()
61 self.marchret.setdefault('cfl', [0.0, 0.0, 0, 0])
62 self.marchret['cfl'][0] = mincfl
63 self.marchret['cfl'][1] = maxcfl
64 self.marchret['cfl'][2] = nadj
65 self.marchret['cfl'][3] += nadj
66 return self.marchret
67
95
113
115 _ghostgeom_ = 'mirror'
117 from ctypes import byref, c_int
118 svr = self.svr
119 self._clib_eulerb.bound_wall_soln(
120 byref(svr.exd),
121 c_int(self.facn.shape[0]),
122 self.facn.ctypes._as_parameter_,
123 )
125 from ctypes import byref, c_int
126 svr = self.svr
127 self._clib_eulerb.bound_wall_dsoln(
128 byref(svr.exd),
129 c_int(self.facn.shape[0]),
130 self.facn.ctypes._as_parameter_,
131 )
133 _ghostgeom_ = 'mirror'
135 from ctypes import byref, c_int
136 svr = self.svr
137 self._clib_eulerb.bound_nonslipwall_soln(
138 byref(svr.exd),
139 c_int(self.facn.shape[0]),
140 self.facn.ctypes._as_parameter_,
141 )
143 from ctypes import byref, c_int
144 svr = self.svr
145 self._clib_eulerb.bound_nonslipwall_dsoln(
146 byref(svr.exd),
147 c_int(self.facn.shape[0]),
148 self.facn.ctypes._as_parameter_,
149 )
150
152 vnames = ['rho', 'v1', 'v2', 'v3', 'p', 'gamma']
153 vdefaults = {
154 'rho': 1.0, 'p': 1.0, 'gamma': 1.4, 'v1': 0.0, 'v2': 0.0, 'v3': 0.0,
155 }
156 _ghostgeom_ = 'mirror'
158 from ctypes import byref, c_int
159 svr = self.svr
160 self._clib_eulerb.bound_inlet_soln(
161 byref(svr.exd),
162 c_int(self.facn.shape[0]),
163 self.facn.ctypes._as_parameter_,
164 c_int(self.value.shape[1]),
165 self.value.ctypes._as_parameter_,
166 )
168 from ctypes import byref, c_int
169 svr = self.svr
170 self._clib_eulerb.bound_inlet_dsoln(
171 byref(svr.exd),
172 c_int(self.facn.shape[0]),
173 self.facn.ctypes._as_parameter_,
174 )
175
177 _ghostgeom_ = 'translate'
179 from ctypes import byref, c_int
180 svr = self.svr
181 self._clib_eulerb.bound_outlet_soln(
182 byref(svr.exd),
183 c_int(self.facn.shape[0]),
184 self.facn.ctypes._as_parameter_,
185 )
187 from ctypes import byref, c_int
188 svr = self.svr
189 self._clib_eulerb.bound_outlet_dsoln(
190 byref(svr.exd),
191 c_int(self.facn.shape[0]),
192 self.facn.ctypes._as_parameter_,
193 )
194
200 """
201 Basic initializing anchor class for all Euler problems.
202 """
215
237
239 _varlist_ = ['v', 'rho', 'p', 'T', 'ke', 'a', 'M', 'sch']
241 self.schk = kw.pop('schk', 1.0)
242 self.schk0 = kw.pop('schk0', 0.0)
243 self.schk1 = kw.pop('schk1', 1.0)
244 super(EulerOAnchor, self).__init__(svr, **kw)
261 svr = self.svr
262 der = svr.der
263 svr._tcall(svr._clib_euler.calc_physics, -svr.ngstcell, svr.ncell,
264 der['v'].ctypes._as_parameter_,
265 der['rho'].ctypes._as_parameter_,
266 der['p'].ctypes._as_parameter_,
267 der['T'].ctypes._as_parameter_,
268 der['ke'].ctypes._as_parameter_,
269 der['a'].ctypes._as_parameter_,
270 der['M'].ctypes._as_parameter_,
271 )
273 from ctypes import c_double
274 svr = self.svr
275 sch = svr.der['sch']
276 svr._tcall(svr._clib_euler.calc_schlieren_rhog,
277 -svr.ngstcell, svr.ncell, sch.ctypes._as_parameter_)
278 rhogmax = sch[svr.ngstcell:].max()
279 svr._tcall(svr._clib_euler.calc_schlieren_sch,
280 -svr.ngstcell, svr.ncell,
281 c_double(self.schk), c_double(self.schk0), c_double(self.schk1),
282 c_double(rhogmax), sch.ctypes._as_parameter_,
283 )
284 - def postfull(self):
287
298 import os
299 recordfn = '%s_conservation.npy' % self.cse.io.basefn
300 self.recordpath = os.path.join(self.cse.io.basedir, recordfn)
302 clvol = self.blk.clvol
303 rho = self.cse.execution.var['rho']
304 etot = self.cse.execution.var['soln'][:,-1]
305 utot = etot - self.cse.execution.var['ke']
306 crho = (clvol*rho).sum()
307 cetot = (clvol*etot).sum()
308 cutot = (clvol*utot).sum()
309 self.records.append([self.cse.execution.time,
310 crho, cetot, cutot])
311 - def postmarch(self):
312 from numpy import array, save
313 self._calculate()
314 istep = self.cse.execution.step_current
315 if istep%self.psteps == 0:
316 info = self.info
317 d0 = array(self.records[0][1:], dtype='float64')
318 dn = array(self.records[-1][1:], dtype='float64')
319 diff = (dn-d0)/d0 * 100
320 info('density conservation difference: %7.3f%%\n' % diff[0])
321 info('energy conservation difference: %7.3f%%\n' % diff[1])
322 info('thermal conservation difference: %7.3f%%\n' % diff[2])
323 save(self.recordpath, self.records)
324 - def postloop(self):
325 from numpy import array
326 info = self.info
327 self.records = array(self.records, dtype='float64')
328 info('mass conservation: %g %g\n' % (
329 self.records[0,1], self.records[-1,1]))
330 info('energy conservation: %g %g\n' % (
331 self.records[0,2], self.records[-1,2]))
332 info('thermal conservation: %g %g\n' % (
333 self.records[0,3], self.records[-1,3]))
334 info('Conservation record saved to %s .\n' % self.recordpath)
335