18 #include <type_traits> 32 template <
typename C>
static one test(decltype(&C::hasStencil));
33 template <
typename C>
static two test(...);
36 enum {
value =
sizeof(test<T>(0)) ==
sizeof(char) };
44 template<
class NumericalFluxType>
48 std::enable_if<has_stencil<NumericalFluxType>::value, decltype(NumericalFluxType::stencil())>
::type {
49 return NumericalFluxType::stencil();
54 template<
class NumericalFluxType>
57 typename std::enable_if < !has_stencil<NumericalFluxType>::value,
62 template<
class Flux,
class Equation,
size_t direction>
65 typename Equation::ConstViews& left,
66 typename Equation::ConstViews& right,
67 typename Equation::ConservedVariables& out) {
69 const ivec3 directionVector(direction == 0, direction == 1, direction == 2);
73 auto rightIndex = indices[1];
74 auto middleIndex = indices[0];
75 typename Equation::AllVariables rightJpHf = eq.fetchAllVariables(left,
80 typename Equation::AllVariables leftJpHf = eq.fetchAllVariables(right,
86 typename Equation::ConservedVariables fluxMiddleRight;
87 real waveSpeed = Flux::template computeFlux<direction>(eq, leftJpHf, rightJpHf,
90 out = fluxMiddleRight;
96 template<
class Flux,
class Equation,
size_t direction>
99 typename Equation::ConstViews& left,
100 typename Equation::ConstViews& right,
101 typename Equation::ConservedVariables& out) {
102 const ivec3 directionVector(direction == 0, direction == 1, direction == 2);
104 typename Equation::AllVariables u0 = eq.fetchAllVariables(left, indices[0]);
105 typename Equation::AllVariables u1 = eq.fetchAllVariables(left, indices[1]);
106 typename Equation::AllVariables u2 = eq.fetchAllVariables(left, indices[2]);
107 typename Equation::AllVariables u3 = eq.fetchAllVariables(left, indices[3]);
110 typename Equation::ConservedVariables fluxMiddleRight;
111 real waveSpeed = Flux::template computeFlux<direction>(eq, u0, u1, u2, u3,
114 out = fluxMiddleRight;
120 template<
class Flux,
class Equation,
size_t direction>
123 typename Equation::ConstViews& left,
124 typename Equation::ConstViews& right,
125 typename Equation::ConservedVariables& out) {
126 const ivec3 directionVector(direction == 0, direction == 1, direction == 2);
128 typename Equation::AllVariables u0 = eq.fetchAllVariables(left, indices[0]);
129 typename Equation::AllVariables u1 = eq.fetchAllVariables(left, indices[1]);
130 typename Equation::AllVariables u2 = eq.fetchAllVariables(left, indices[2]);
131 typename Equation::AllVariables u3 = eq.fetchAllVariables(left, indices[3]);
132 typename Equation::AllVariables u4 = eq.fetchAllVariables(left, indices[4]);
133 typename Equation::AllVariables u5 = eq.fetchAllVariables(left, indices[5]);
136 typename Equation::ConservedVariables fluxMiddleRight;
137 real waveSpeed = Flux::template computeFlux<direction>(eq, u0, u1, u2, u3, u4,
138 u5, fluxMiddleRight);
140 out = fluxMiddleRight;
#define __host__
Definition: types.hpp:46
VolumeType type
Definition: VolumeFactory.cpp:85
double real
Definition: types.hpp:65
__device__ __host__ auto getStencil(NumericalFluxType) -> typename std::enable_if< has_stencil< NumericalFluxType >::value, decltype(NumericalFluxType::stencil())>::type
Gets the stencil for numerical fluxes that have a stencil defined.
Definition: numflux_util.hpp:46
SFINAE test, see http://stackoverflow.com/a/257382.
Definition: numflux_util.hpp:28
#define __device__
Definition: types.hpp:45
__device__ __host__ real computeFluxForStencil(const Equation &eq, ivec2 indices, typename Equation::ConstViews &left, typename Equation::ConstViews &right, typename Equation::ConservedVariables &out)
Definition: numflux_util.hpp:63
Various utility functions to implement the tecno flux.
Definition: types.hpp:30
Definition: numflux_util.hpp:36