30#include "../basic_types/datatype_structure.hpp"
31#include "../code_config.hpp"
57template <
class Derived,
class Scalar>
74template <
class Scalar>
89using decay_t =
typename std::decay<T>::type;
96template <
class T,
bool>
113#if defined(CODI_REVERSE_TYPE) || defined(CODI_FORWARD_TYPE)
114namespace math = ::codi;
116namespace math = ::std;
122#define RETURNS(...) \
123 ->decltype(__VA_ARGS__) { return __VA_ARGS__; }
128#define MAKE_UNARY_FUN(FUN, EXPR, IMPL) \
130 template <class U, class Scalar> \
131 class EXPR : public CVecExpr<EXPR<U, Scalar>, Scalar> { \
132 store_t<const U> u; \
135 static constexpr bool StoreAsRef = false; \
136 FORCEINLINE EXPR(const U& u_) : u(u_) {} \
137 SU2_CUDA_HOST_DEVICE FORCEINLINE auto operator[](size_t i) const RETURNS(IMPL(u[i])) \
140 template <class U, class S> \
141 FORCEINLINE auto FUN(const CVecExpr<U, S>& u) RETURNS(EXPR<U, S>(u.derived()))
143#define sign_impl(x) Scalar(1 - 2 * (x < 0))
156#define MAKE_BINARY_FUN(FUN, EXPR, IMPL) \
158 template <class U, class V, class Scalar> \
159 class EXPR : public CVecExpr<EXPR<U, V, Scalar>, Scalar> { \
160 store_t<const U> u; \
161 store_t<const V> v; \
164 static constexpr bool StoreAsRef = false; \
165 FORCEINLINE EXPR(const U& u_, const V& v_) : u(u_), v(v_) {} \
166 SU2_CUDA_HOST_DEVICE FORCEINLINE auto operator[](size_t i) const RETURNS(IMPL(u[i], v[i])) \
169 template <class U, class V, class S> \
170 FORCEINLINE auto FUN(const CVecExpr<U, S>& u, const CVecExpr<V, S>& v) \
171 RETURNS(EXPR<U, V, S>(u.derived(), v.derived())) \
173 template <class U, class S> \
174 FORCEINLINE auto FUN(const CVecExpr<U, S>& u, decay_t<S> v) RETURNS(EXPR<U, Bcast<S>, S>(u.derived(), Bcast<S>(v))) \
176 template <class S, class V> \
177 FORCEINLINE auto FUN(decay_t<S> u, const CVecExpr<V, S>& v) RETURNS(EXPR<Bcast<S>, V, S>(Bcast<S>(u), v.derived()))
186#define MAKE_FMINMAX_OVERLOADS(TYPE) \
187 FORCEINLINE TYPE fmax(TYPE a, TYPE b) { return a < b ? b : a; } \
188 FORCEINLINE TYPE fmin(TYPE a, TYPE b) { return a < b ? a : b; }
197#undef MAKE_FMINMAX_OVERLOADS
207#define add_impl(a, b) a + b
208#define sub_impl(a, b) a - b
209#define mul_impl(a, b) a* b
210#define div_impl(a, b) a / b
225#define TO_PASSIVE(IMPL) SU2_TYPE::Passive<Scalar>::Value(IMPL)
226#define le_impl(a, b) TO_PASSIVE(a <= b)
227#define ge_impl(a, b) TO_PASSIVE(a >= b)
228#define eq_impl(a, b) TO_PASSIVE(a == b)
229#define ne_impl(a, b) TO_PASSIVE(a != b)
230#define lt_impl(a, b) TO_PASSIVE(a < b)
231#define gt_impl(a, b) TO_PASSIVE(a > b)
246#undef MAKE_BINARY_FUN
CNewtonIntegration::Scalar Scalar
Definition CNewtonIntegration.cpp:31
Expression class to broadcast a scalar value. Allows implementing "vector-scalar" operations re-using...
Definition vector_expressions.hpp:75
Bcast(const Scalar &x_)
Definition vector_expressions.hpp:80
const Scalar & operator[](size_t) const
Definition vector_expressions.hpp:81
static constexpr bool StoreAsRef
Definition vector_expressions.hpp:79
Base vector expression class.
Definition vector_expressions.hpp:58
const Derived & derived() const
Cast the expression to Derived, usually to allow evaluation via operator[].
Definition vector_expressions.hpp:63
Definition vector_expressions.hpp:145
Definition vector_expressions.hpp:211
Definition vector_expressions.hpp:214
Definition vector_expressions.hpp:234
Definition vector_expressions.hpp:146
Definition vector_expressions.hpp:233
Definition vector_expressions.hpp:237
Definition vector_expressions.hpp:232
Definition vector_expressions.hpp:236
Definition vector_expressions.hpp:199
Definition vector_expressions.hpp:200
Definition vector_expressions.hpp:144
Definition vector_expressions.hpp:213
Definition vector_expressions.hpp:235
Definition vector_expressions.hpp:201
Definition vector_expressions.hpp:148
Definition vector_expressions.hpp:147
Definition vector_expressions.hpp:212
#define SU2_CUDA_HOST_DEVICE
Definition code_config.hpp:57
#define FORCEINLINE
Definition code_config.hpp:44
#define eq_impl(a, b)
Definition vector_expressions.hpp:228
auto sqrt(const CVecExpr< U, S > &u) -> decltype(sqrt_< U, S >(u.derived()))
Definition vector_expressions.hpp:147
typename std::decay< T >::type decay_t
std::decay_t from C++14, used to allow implicit conversions between scalar types, e....
Definition vector_expressions.hpp:89
#define mul_impl(a, b)
Definition vector_expressions.hpp:209
#define ne_impl(a, b)
Definition vector_expressions.hpp:229
#define gt_impl(a, b)
Definition vector_expressions.hpp:231
#define lt_impl(a, b)
Definition vector_expressions.hpp:230
#define MAKE_BINARY_FUN(FUN, EXPR, IMPL)
Definition vector_expressions.hpp:156
typename std::remove_reference< T >::type remove_reference_t
std::remove_reference_t from C++14, removes references from some type.
Definition vector_expressions.hpp:93
auto exp(const CVecExpr< U, S > &u) -> decltype(exp_< U, S >(u.derived()))
Definition vector_expressions.hpp:146
#define div_impl(a, b)
Definition vector_expressions.hpp:210
auto sign(const CVecExpr< U, S > &u) -> decltype(sign_< U, S >(u.derived()))
Definition vector_expressions.hpp:148
#define le_impl(a, b)
Definition vector_expressions.hpp:226
#define sub_impl(a, b)
Definition vector_expressions.hpp:208
auto pow(const CVecExpr< U, S > &u, const CVecExpr< V, S > &v) -> decltype(pow_< U, V, S >(u.derived(), v.derived()))
Definition vector_expressions.hpp:201
typename store_type< T >::type store_t
Definition vector_expressions.hpp:109
#define add_impl(a, b)
Definition vector_expressions.hpp:207
#define ge_impl(a, b)
Definition vector_expressions.hpp:227
auto abs(const CVecExpr< U, S > &u) -> decltype(abs_< U, S >(u.derived()))
Definition vector_expressions.hpp:145
#define MAKE_FMINMAX_OVERLOADS(TYPE)
Definition vector_expressions.hpp:186
#define sign_impl(x)
Definition vector_expressions.hpp:143
#define MAKE_UNARY_FUN(FUN, EXPR, IMPL)
Definition vector_expressions.hpp:128
Definition CSysVector.hpp:104
remove_reference_t< T > & type
Definition vector_expressions.hpp:102
Mechanism to conditionally (based on "StoreAsRef") add lvalue reference to a type.
Definition vector_expressions.hpp:97
remove_reference_t< T > type
Definition vector_expressions.hpp:98
Definition vector_expressions.hpp:105
typename add_lref_if< T, T::StoreAsRef >::type type
Definition vector_expressions.hpp:106