from pyfr.solvers.baseadvec import BaseAdvectionElements
class BaseACFluidElements:
privarmap = {2: ['p', 'u', 'v'],
3: ['p', 'u', 'v', 'w']}
convarmap = {2: ['p', 'u', 'v'],
3: ['p', 'u', 'v', 'w']}
dualcoeffs = {2: ['u', 'v'],
3: ['u', 'v', 'w']}
visvarmap = {
2: [('velocity', ['u', 'v']),
('pressure', ['p'])],
3: [('velocity', ['u', 'v', 'w']),
('pressure', ['p'])]
}
@staticmethod
def pri_to_con(pris, cfg):
return pris
@staticmethod
def con_to_pri(convs, cfg):
return convs
@staticmethod
def diff_con_to_pri(cons, diff_cons, cfg):
return diff_cons
@staticmethod
def validate_formulation(controller):
if controller.formulation != 'dual':
raise ValueError('System not compatible with time stepping '
'formulation.')
[docs]
class ACEulerElements(BaseACFluidElements, BaseAdvectionElements):
[docs]
def set_backend(self, *args, **kwargs):
super().set_backend(*args, **kwargs)
# Can elide interior flux calculations at p = 0
if self.basis.order == 0:
return
# Register our flux kernels
self._be.pointwise.register('pyfr.solvers.aceuler.kernels.tflux')
# Template parameters for the flux kernels
tplargs = {
'ndims': self.ndims,
'nvars': self.nvars,
'nverts': len(self.basis.linspts),
'c': self.cfg.items_as('constants', float),
'jac_exprs': self.basis.jac_exprs
}
# Helpers
tdisf = []
c, l = 'curved', 'linear'
r, s = self._mesh_regions, self._slice_mat
slicedk = self._make_sliced_kernel
if c in r and 'flux' not in self.antialias:
tdisf.append(lambda uin: self._be.kernel(
'tflux', tplargs=tplargs | {'ktype': 'curved'},
dims=[self.nupts, r[c]], u=s(self.scal_upts[uin], c),
f=s(self._vect_upts, c), smats=self.curved_smat_at('upts')
))
elif c in r:
tdisf.append(lambda: self._be.kernel(
'tflux', tplargs=tplargs | {'ktype': 'curved'},
dims=[self.nqpts, r[c]],
u=s(self._scal_qpts, c), f=s(self._vect_qpts, c),
smats=self.curved_smat_at('qpts')
))
if l in r and 'flux' not in self.antialias:
tdisf.append(lambda uin: self._be.kernel(
'tflux', tplargs=tplargs | {'ktype': 'linear'},
dims=[self.nupts, r[l]], u=s(self.scal_upts[uin], l),
f=s(self._vect_upts, l), verts=self.ploc_at('linspts', l),
upts=self.upts
))
elif l in r:
tdisf.append(lambda: self._be.kernel(
'tflux', tplargs=tplargs | {'ktype': 'linear'},
dims=[self.nqpts, r[l]], u=s(self._scal_qpts, l),
f=s(self._vect_qpts, l), verts=self.ploc_at('linspts', l),
upts=self.qpts
))
self.kernels['tdisf'] = lambda: slicedk(k() for k in tdisf)