26 #ifndef IPPL_EXPRESSIONS_H
27 #define IPPL_EXPRESSIONS_H
32 #define PETE_USER_REDUCTION_CODE \
34 reduce_masked(ret, global_ret, acc_op, 0 < n ); \
87 #define PETE_DefineScalarMinMax(Sca) \
89 Min(const Sca& a, const Sca& b) \
91 return (a<b ? a : b); \
94 Max(const Sca& a, const Sca& b) \
96 return (b<a ? a : b); \
121 #define PETE_DefineIPPLScalar(Sca) \
122 PETE_DefineBinaryWithScalars(Min, FnMin, Sca) \
123 PETE_DefineBinaryWithScalars(Max, FnMax, Sca) \
124 PETE_DefineBinaryWithScalars(dot, FnDot, Sca) \
125 PETE_DefineBinaryWithScalars(dotdot, FnDotDot, Sca) \
126 PETE_DefineBinaryWithScalars(outerProduct, FnOuterProduct, Sca) \
127 PETE_DefineBinaryWithScalars(cross, FnDot, Sca) \
128 PETE_DefineBinaryWithScalars(lt, OpLT, Sca) \
129 PETE_DefineBinaryWithScalars(le, OpLE, Sca) \
130 PETE_DefineBinaryWithScalars(gt, OpGT, Sca) \
131 PETE_DefineBinaryWithScalars(ge, OpGE, Sca) \
132 PETE_DefineBinaryWithScalars(eq, OpEQ, Sca) \
133 PETE_DefineBinaryWithScalars(ne, OpNE, Sca)
145 #undef PETE_DefineIPPLScalar
150 #define PETE_DefineBinaryWithVSTScalars(Fun,Op,Sca) \
151 template<class T1, unsigned Dim, class T2> \
152 inline PETE_TBTree<Op, PETE_Scalar< Sca<T1, Dim> >, \
153 typename T2::PETE_Expr_t> \
154 Fun(const Sca<T1, Dim> &l, const PETE_Expr<T2>& r) \
156 typedef PETE_TBTree<Op, PETE_Scalar< Sca<T1, Dim> >, \
157 typename T2::PETE_Expr_t> ret; \
158 return ret(PETE_Scalar< Sca<T1, Dim> >(l), \
159 r.PETE_unwrap().MakeExpression()); \
161 template<class T1, class T2, unsigned Dim> \
162 inline PETE_TBTree<Op, typename T1::PETE_Expr_t, \
163 PETE_Scalar< Sca<T2, Dim> > > \
164 Fun(const PETE_Expr<T1>& l, const Sca<T2, Dim> &r) \
166 typedef PETE_TBTree<Op, typename T1::PETE_Expr_t, \
167 PETE_Scalar< Sca<T2, Dim> > > ret; \
168 return ret(l.PETE_unwrap().MakeExpression(), \
169 PETE_Scalar< Sca<T2, Dim> >(r)); \
172 #define PETE_DefineTrinaryWithVSTScalars(Fun, Op, Sca) \
173 template<class Cond_t, class True_t, class T, unsigned Dim> \
174 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
175 typename True_t::PETE_Expr_t, PETE_Scalar< Sca<T, Dim> > > \
176 Fun(const PETE_Expr<Cond_t>& c, const PETE_Expr<True_t>& t, \
177 const Sca<T, Dim> &f) \
179 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
180 typename True_t::PETE_Expr_t, PETE_Scalar< Sca<T, Dim> > > ret; \
181 return ret(c.PETE_unwrap().MakeExpression(), \
182 t.PETE_unwrap().MakeExpression(), PETE_Scalar< Sca<T, Dim> >(f)); \
184 template<class Cond_t, class T, unsigned Dim, class False_t> \
185 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
186 PETE_Scalar< Sca<T, Dim> >, typename False_t::PETE_Expr_t > \
187 Fun(const PETE_Expr<Cond_t>& c, const Sca<T, Dim> &t, \
188 const PETE_Expr<False_t>& f) \
190 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar< Sca<T, Dim> >, \
191 typename False_t::PETE_Expr_t > ret; \
192 return ret(c.PETE_unwrap().MakeExpression(), \
193 PETE_Scalar< Sca<T, Dim> >(t), f.PETE_unwrap().MakeExpression()); \
195 template<class Cond_t, class T, unsigned Dim> \
196 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
197 PETE_Scalar< Sca<T, Dim> >, PETE_Scalar< Sca<T, Dim> > > \
198 Fun(const PETE_Expr<Cond_t>& c, const Sca<T, Dim> &t, const Sca<T, Dim> &f) \
200 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
201 PETE_Scalar< Sca<T, Dim> >, PETE_Scalar< Sca<T, Dim> > > ret; \
202 return ret(c.PETE_unwrap().MakeExpression(), \
203 PETE_Scalar< Sca<T, Dim> >(t), PETE_Scalar< Sca<T, Dim> >(f)); \
208 #define PETE_DefineVSTScalar(Sca) \
209 PETE_DefineBinaryWithVSTScalars(operator+, OpAdd, Sca) \
210 PETE_DefineBinaryWithVSTScalars(operator-, OpSubtract, Sca) \
211 PETE_DefineBinaryWithVSTScalars(operator*, OpMultipply, Sca) \
212 PETE_DefineBinaryWithVSTScalars(operator/, OpDivide, Sca) \
213 PETE_DefineBinaryWithVSTScalars(operator%, OpMod, Sca) \
214 PETE_DefineBinaryWithVSTScalars(operator<, OpLT, Sca) \
215 PETE_DefineBinaryWithVSTScalars(operator<=, OpLE, Sca) \
216 PETE_DefineBinaryWithVSTScalars(operator>, OpGT, Sca) \
217 PETE_DefineBinaryWithVSTScalars(operator>=, OpGE, Sca) \
218 PETE_DefineBinaryWithVSTScalars(operator==, OpEQ, Sca) \
219 PETE_DefineBinaryWithVSTScalars(operator!=, OpNE, Sca) \
220 PETE_DefineBinaryWithVSTScalars(operator&&, OpAnd, Sca) \
221 PETE_DefineBinaryWithVSTScalars(operator||, OpOr, Sca) \
222 PETE_DefineBinaryWithVSTScalars(operator&, OpBitwiseAnd, Sca) \
223 PETE_DefineBinaryWithVSTScalars(operator|, OpBitwiseOr, Sca) \
224 PETE_DefineBinaryWithVSTScalars(operator^, OpBitwiseXor, Sca) \
225 PETE_DefineBinaryWithVSTScalars(copysign, FnCopysign, Sca) \
226 PETE_DefineBinaryWithVSTScalars(ldexp, FnLdexp, Sca) \
227 PETE_DefineBinaryWithVSTScalars(pow, FnPow, Sca) \
228 PETE_DefineBinaryWithVSTScalars(fmod, FnFmod, Sca) \
229 PETE_DefineBinaryWithVSTScalars(atan2, FnArcTan2, Sca) \
230 PETE_DefineTrinaryWithVSTScalars(where, OpWhere, Sca) \
231 PETE_DefineBinaryWithVSTScalars(Min, FnMin, Sca) \
232 PETE_DefineBinaryWithVSTScalars(Max, FnMax, Sca) \
233 PETE_DefineBinaryWithVSTScalars(dot, FnDot, Sca) \
234 PETE_DefineBinaryWithVSTScalars(dotdot, FnDotDot, Sca) \
235 PETE_DefineBinaryWithVSTScalars(outerProduct, FnOuterProduct, Sca) \
236 PETE_DefineBinaryWithVSTScalars(cross, FnCross, Sca) \
237 PETE_DefineBinaryWithVSTScalars(lt, OpLT, Sca) \
238 PETE_DefineBinaryWithVSTScalars(le, OpLE, Sca) \
239 PETE_DefineBinaryWithVSTScalars(gt, OpGT, Sca) \
240 PETE_DefineBinaryWithVSTScalars(ge, OpGE, Sca) \
241 PETE_DefineBinaryWithVSTScalars(eq, OpEQ, Sca) \
242 PETE_DefineBinaryWithVSTScalars(ne, OpNE, Sca)
248 #undef PETE_DefineVSTScalar
273 typename T::PETE_Expr_t::PETE_Return_t val ;
282 inline typename T::PETE_Expr_t::PETE_Return_t
285 typename T::PETE_Expr_t::PETE_Return_t val ;
300 struct MinMaxHolder {
304 MinMaxHolder(
const MinMaxHolder<T>& rhs) : a(rhs.a), b(rhs.b) { }
305 const MinMaxHolder<T>& operator=(
const MinMaxHolder<T>& rhs) {
310 const MinMaxHolder<T>& operator=(
const T& rhs) {
316 const MinMaxHolder<T>&
operator*=(
const MinMaxHolder<T>& rhs) {
317 a = (a < rhs.a ? a : rhs.a);
318 b = (rhs.b < b ? b : rhs.b);
339 template<
class T1,
class T2>
343 typedef typename T1::PETE_Expr_t::PETE_Return_t val_t;
344 MinMaxHolder<val_t> ret;
349 minval =
static_cast<T2
>(ret.a);
350 maxval =
static_cast<T2
>(ret.b);
361 template<
class T,
class OP>
407 template<
class T1,
class T2>
419 template<
class T1,
class T2,
class Op>
440 template<
class T,
unsigned int D>
464 for (
unsigned int d=0; d < D; ++d) {
465 a[d] = (a[d] < rhs.
a[d] ? a[d] : rhs.
a[d]);
466 b[d] = (rhs.
b[d] < b[d] ? b[d] : rhs.
b[d]);
472 for (
unsigned int d=0; d < D; ++d) {
473 a[d] = (a[d] < c[d] ? a[d] : c[d]);
474 b[d] = (c[d] < b[d] ? b[d] : c[d]);
480 for (
unsigned int d=0; d < D; ++d) {
481 a[d] = (a[d] < c[d] ? a[d] : c[d]);
482 b[d] = (c[d] < b[d] ? b[d] : c[d]);
498 template<
class T1,
class T2,
unsigned int D>
518 template<
class T,
class TP>
548 #endif // IPPL_EXPRESSIONS_H
const BoundsHolder< T, D > & operator=(const Vektor< T, D > &rhs)
PETE_DefineAssign((a=Min(a, b)),(a=Min(a, b.value)), OpMinAssign) PETE_DefineAssign((a
constexpr double c
The velocity of light in m/s.
Message & put(const T &val)
#define PETE_DefineUnary(Fun, Expr, Op)
void getMessage(Message &m, T &t)
T det(const AntiSymTenzor< T, 3 > &)
const AnyHolder< T, OP > & operator=(const AnyHolder< T, OP > &rhs)
double Min(double a, double b)
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
const BoundsHolder< T, D > & operator=(const T &rhs)
they could even be mouse clicks or menu items whatever suits your program You should also get your if any
Message & getMessage(Message &m)
AnyHolder(const T &t, OP op)
FLieGenerator< T, N > imag(const FLieGenerator< std::complex< T >, N > &)
Take imaginary part of a complex generator.
T::PETE_Return_t Reduction(const PETE_Expr< T > &const_expr, CompOp comp_op, AccOp acc_op, NDIndex< D > &loc)
BOOST_UBLAS_INLINE V trace(ublas::matrix< V > &e)
Computes the trace of a square matrix.
const BoundsHolder< T, D > & operator*=(const Vektor< T, D > &rhs)
Tenzor< T, D > cofactors(const AntiSymTenzor< T, D > &)
AntiSymTenzor< T, D > transpose(const AntiSymTenzor< T, D > &rhs)
Message & get(const T &cval)
void bounds(const PETE_Expr< T1 > &expr, Vektor< T2, D > &minval, Vektor< T2, D > &maxval)
#define PETE_DefineIPPLScalar(Sca)
Message & getMessage(Message &m)
PETEBinaryReturn< T1, T2, OpMultipply >::type dotdot(const AntiSymTenzor< T1, D > &lhs, const AntiSymTenzor< T2, D > &rhs)
const AnyHolder< T, OP > & operator=(const T &rhs)
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
MMatrix< double > & operator*=(MMatrix< double > &m1, MMatrix< double > m2)
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
m_complex conj(const m_complex &c)
#define PETE_DefineBinary(Fun, Expr, Op)
bool lt(double x, double y)
#define PETE_DefineBinarySynonym(Fun, Op)
Tenzor< typename PETEBinaryReturn< T1, T2, OpMultipply >::type, D > outerProduct(const Vektor< T1, D > &v1, const Vektor< T2, D > &v2)
bool gt(double x, double y)
void minmax(const PETE_Expr< T1 > &expr, T2 &minval, T2 &maxval)
double Max(double a, double b)
void PETE_apply(const OpPeriodic< T > &, T &a, const T &b)
Vector3D cross(const Vector3D &lhs, const Vector3D &rhs)
Vector cross product.
#define PETE_DefineBinaryWithScalars(Fun, Op, Sca)
BoundsHolder(const BoundsHolder< T, D > &rhs)
const BoundsHolder< T, D > & operator*=(const BoundsHolder< T, D > &rhs)
bool ge(double x, double y)
const AnyHolder< T, OP > & operator*=(const T &rhs)
#define PETE_DefineScalar(Sca)
AnyHolder(const AnyHolder< T, OP > &rhs)
Message & putMessage(Message &m)
const AnyHolder< T, OP > & operator*=(const AnyHolder< T, OP > &rhs)
#define PETE_DefineVSTScalar(Sca)
const BoundsHolder< T, D > & operator*=(const T &rhs)
const BoundsHolder< T, D > & operator=(const BoundsHolder< T, D > &rhs)
bool eq(double x, double y)
PETE_TBTree< OpNE, Index::PETE_Expr_t, PETE_Scalar< double > > ne(const Index &idx, double x)
bool le(double x, double y)
ParticleAttribConstIterator< T > PETE_Expr_t
WrappedExpr & PETE_unwrap()
void putMessage(Message &m, const T &t)
#define PETE_DefineScalarMinMax(Sca)
MMatrix< m_complex > complex(MMatrix< double > real)
FLieGenerator< T, N > real(const FLieGenerator< std::complex< T >, N > &)
Take real part of a complex generator.
Message & putMessage(Message &m)
double dot(const Vector3D &lhs, const Vector3D &rhs)
Vector dot product.