79 template<
class WrappedExpr>
87 return static_cast<WrappedExpr&
>(*this);
91 return static_cast<const WrappedExpr&
>(*this);
239 #ifdef IPPL_SGI_PRAGMAS
247 template<
class T,
class C>
256 template<
class T,
class C>
283 template<
class Value_t,
class Child_t>
327 template<
class Value_t,
class Left_t,
class Right_t>
329 public PETE_Expr< PETE_TBTree<Value_t, Left_t, Right_t> >
375 template<
class Value_t,
class Left_t,
class M
iddle_t,
class Right_t >
377 :
public PETE_Expr< PETE_TTTree< Value_t, Left_t, Middle_t, Right_t > >
383 typename Middle_t::PETE_Return_t,
401 const Middle_t& m,
const Right_t& r)
417 template<
class Op,
class T1,
class Functor,
class Combiner>
419 typename Functor::PETE_Return_t
422 #ifdef IPPL_SGI_PRAGMAS
428 template<
class Op,
class T1,
class T2,
class Functor,
class Combiner>
430 typename Functor::PETE_Return_t
433 #ifdef IPPL_SGI_PRAGMAS
439 template<
class Op,
class T1,
class T2,
class T3,
class Functor,
class Combiner>
441 typename Functor::PETE_Return_t
444 #ifdef IPPL_SGI_PRAGMAS
455 template<
class T,
class Op>
482 if ( (l>=0) && (r>=0) ) {
483 PInsist(l==r,
"Arguments not equal in AssertEquals()!!");
486 if ( r>=0 )
return ret = r;
493 if ( (l>=0) && (m>=0) && (r>=0) ) {
494 PInsist(m==l && m==r,
"Arguments not equal in AssertEquals()!!");
540 template<
class Op,
class T1,
class Functor>
545 #ifdef IPPL_SGI_PRAGMAS
553 template<
class Op,
class T1,
class T2,
class Functor>
557 typename T2::PETE_Return_t,Op>
::type
592 template<
class T1,
class T2,
class Functor>
595 typedef typename T2::PETE_Return_t
T3;
608 template<
class Op,
class T1,
class T2,
class Functor>
613 #ifdef IPPL_SGI_PRAGMAS
651 template<
class Op,
class Sub>
658 template<
class Op,
class Left,
class Right>
665 template<
class Op,
class Left,
class M
iddle,
class Right>
672 template<
class Left,
class Right>
681 template<
int Safe,
class T1,
class T2,
class T3,
class Op,
class Functor>
686 typename T1::PETE_Return_t,
687 typename T2::PETE_Return_t,
688 typename T3::PETE_Return_t,
699 template<
class T1,
class T2,
class T3,
class Functor>
705 typename T1::PETE_Return_t,
706 typename T2::PETE_Return_t,
707 typename T3::PETE_Return_t,
717 template<
class T1,
class T2,
class T3,
class Functor,
class Op>
720 typename T2::PETE_Return_t,
721 typename T3::PETE_Return_t,Op>
::type
726 ,T1,T2,T3,Op,Functor>::apply(node,f);
735 #if !defined(PETE_USER_REDUCTION_CODE)
737 #define PETE_USER_REDUCTION_CODE
741 template<
class R,
class T,
class InitOp,
class AccOp>
744 InitOp init_op, AccOp acc_op )
748 typename T::PETE_Expr_t expr(const_expr.
PETE_unwrap().MakeExpression());
763 for (
int i = 1; i <
n; ++i)
787 #define PETE_DefineUnary(Fun,Expr,Op) \
789 inline typename PETEUnaryReturn<T, Op>::type \
790 PETE_apply(Op, const T& a) \
795 inline PETE_TUTree<Op, typename T::PETE_Expr_t> \
796 Fun(const PETE_Expr<T>& l) \
798 return PETE_TUTree<Op, typename T::PETE_Expr_t> \
799 (l.PETE_unwrap().MakeExpression()); \
831 template<class T1, class T2>
838 template<
class T1,
class Expr>
853 #define PETE_DefineBinary(Fun,Expr,Op) \
854 template<class T1, class T2> \
855 inline typename PETEBinaryReturn<T1, T2, Op>::type \
856 PETE_apply(Op, const T1& a, const T2& b) \
860 template<class T1, class T2> \
861 inline PETE_TBTree<Op, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t> \
862 Fun(const PETE_Expr<T1>& l, const PETE_Expr<T2>& r) \
864 typedef PETE_TBTree<Op,typename T1::PETE_Expr_t, \
865 typename T2::PETE_Expr_t> ret; \
866 return ret(l.PETE_unwrap().MakeExpression(), \
867 r.PETE_unwrap().MakeExpression()); \
870 #define PETE_DefineBinarySynonym(Fun,Op) \
871 template<class T1, class T2> \
872 inline PETE_TBTree<Op, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t> \
873 Fun(const PETE_Expr<T1>& l, const PETE_Expr<T2>& r) \
875 typedef PETE_TBTree<Op,typename T1::PETE_Expr_t,typename T2::PETE_Expr_t> \
877 return ret(l.PETE_unwrap().MakeExpression(), \
878 r.PETE_unwrap().MakeExpression()); \
906 #define PETE_DefineBinaryWithScalars(Fun,Op,Sca) \
908 inline PETE_TBTree<Op, PETE_Scalar<Sca>, typename T::PETE_Expr_t> \
909 Fun(const Sca l, const PETE_Expr<T>& r) \
911 typedef PETE_TBTree<Op, PETE_Scalar<Sca>, typename T::PETE_Expr_t> ret; \
912 return ret(PETE_Scalar<Sca>(l), r.PETE_unwrap().MakeExpression()); \
915 inline PETE_TBTree<Op, typename T::PETE_Expr_t, PETE_Scalar<Sca> > \
916 Fun(const PETE_Expr<T>& l, const Sca r) \
918 typedef PETE_TBTree<Op, typename T::PETE_Expr_t, PETE_Scalar<Sca> > ret; \
919 return ret(l.PETE_unwrap().MakeExpression(), PETE_Scalar<Sca>(r)); \
929 #define PETE_DefineTrinary(Fun,Expr,Op) \
930 template<class T1, class T2, class T3> \
931 inline typename PETETrinaryReturn<T1,T2,T3,Op>::type \
932 PETE_apply(Op, const T1& a, const T2& b, const T3& c) \
936 template<class Cond_t, class True_t, class False_t> \
937 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
938 typename True_t::PETE_Expr_t, typename False_t::PETE_Expr_t> \
939 Fun(const PETE_Expr<Cond_t>& c, const PETE_Expr<True_t>& t, \
940 const PETE_Expr<False_t>& f) \
942 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
943 typename True_t::PETE_Expr_t, typename False_t::PETE_Expr_t> ret; \
944 return ret(c.PETE_unwrap().MakeExpression(), \
945 t.PETE_unwrap().MakeExpression(), \
946 f.PETE_unwrap().MakeExpression()); \
949 template<
class T1,
class T2,
class T3>
956 template<
class Cond_t,
class True_t,
class False_t>
958 typename True_t::PETE_Expr_t,
959 typename False_t::PETE_Expr_t>
963 typedef PETE_TTTree<OpWhere,
typename Cond_t::PETE_Expr_t,
964 typename True_t::PETE_Expr_t,
965 typename False_t::PETE_Expr_t> ret;
972 #define PETE_DefineTrinaryWithScalars(Fun, Op, Sca) \
973 template<class Cond_t, class True_t> \
974 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
975 typename True_t::PETE_Expr_t, PETE_Scalar<Sca> > \
976 Fun(const PETE_Expr<Cond_t>& c, const PETE_Expr<True_t>& t,Sca f) \
978 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
979 typename True_t::PETE_Expr_t, PETE_Scalar<Sca> > ret; \
980 return ret(c.PETE_unwrap().MakeExpression(), \
981 t.PETE_unwrap().MakeExpression(), PETE_Scalar<Sca>(f)); \
983 template<class Cond_t, class False_t> \
984 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
985 typename False_t::PETE_Expr_t > \
986 Fun(const PETE_Expr<Cond_t>& c, Sca t, const PETE_Expr<False_t>& f) \
988 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
989 typename False_t::PETE_Expr_t > ret; \
990 return ret(c.PETE_unwrap().MakeExpression(), \
991 PETE_Scalar<Sca>(t), f.PETE_unwrap().MakeExpression()); \
993 template<class Cond_t> \
994 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
996 Fun(const PETE_Expr<Cond_t>& c, Sca t, Sca f) \
998 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
999 PETE_Scalar<Sca> > ret; \
1000 return ret(c.PETE_unwrap().MakeExpression(), \
1001 PETE_Scalar<Sca>(t), PETE_Scalar<Sca>(f)); \
1069 #define PETE_DefineScalar(Sca) \
1070 PETE_DefineBinaryWithScalars(operator+, OpAdd, Sca) \
1071 PETE_DefineBinaryWithScalars(operator-, OpSubtract, Sca) \
1072 PETE_DefineBinaryWithScalars(operator*, OpMultipply, Sca) \
1073 PETE_DefineBinaryWithScalars(operator/, OpDivide, Sca) \
1074 PETE_DefineBinaryWithScalars(operator%, OpMod, Sca) \
1075 PETE_DefineBinaryWithScalars(operator<, OpLT, Sca) \
1076 PETE_DefineBinaryWithScalars(operator<=, OpLE, Sca) \
1077 PETE_DefineBinaryWithScalars(operator>, OpGT, Sca) \
1078 PETE_DefineBinaryWithScalars(operator>=, OpGE, Sca) \
1079 PETE_DefineBinaryWithScalars(operator==, OpEQ, Sca) \
1080 PETE_DefineBinaryWithScalars(operator!=, OpNE, Sca) \
1081 PETE_DefineBinaryWithScalars(operator&&, OpAnd, Sca) \
1082 PETE_DefineBinaryWithScalars(operator||, OpOr, Sca) \
1083 PETE_DefineBinaryWithScalars(operator&, OpBitwiseAnd, Sca) \
1084 PETE_DefineBinaryWithScalars(operator|, OpBitwiseOr, Sca) \
1085 PETE_DefineBinaryWithScalars(operator^, OpBitwiseXor, Sca) \
1086 PETE_DefineBinaryWithScalars(where, OpWhere, Sca) \
1087 PETE_DefineBinaryWithScalars(copysign, FnCopysign, Sca) \
1088 PETE_DefineBinaryWithScalars(ldexp, FnLdexp, Sca) \
1089 PETE_DefineBinaryWithScalars(pow, FnPow, Sca) \
1090 PETE_DefineBinaryWithScalars(fmod, FnFmod, Sca) \
1091 PETE_DefineBinaryWithScalars(atan2, FnArcTan2, Sca) \
1092 PETE_DefineTrinaryWithScalars(where, OpWhere, Sca)
1114 #define PETE_DefineAssign(Expr,Cond,Op) \
1115 template<class T1, class T2> \
1116 struct PETE_StructApply<Op,T1,T2> \
1118 static void apply(T1& a,const T2& b) { Expr; } \
1121 template<class T1, class T2> \
1122 struct PETE_StructApply<Op,T1,ConditionalAssign<T2> > \
1124 static void apply(T1& a, const ConditionalAssign<T2>& b) \
1131 template<class T1, class T2> \
1133 PETE_apply(Op, T1 &a, const T2& b) \
1135 PETE_StructApply<Op,T1,T2>::apply(a,b); \
1182 static inline const type&
1196 typedef typename T::PETE_Expr_t::PETE_Return_t type_t;
1206 inline typename Sum<T>::type_t
1208 return Sum<T>::apply(expr);
1212 inline typename T::PETE_Expr_t::PETE_Return_t
1215 typename T::PETE_Expr_t::PETE_Return_t val ;
1220 #endif // __MWERKS__
1226 typedef typename T::PETE_Expr_t::PETE_Return_t type_t;
1236 inline typename Prod<T>::type_t
1238 return Prod<T>::apply(expr);
1242 inline typename T::PETE_Expr_t::PETE_Return_t
1245 typename T::PETE_Expr_t::PETE_Return_t val ;
1250 #endif // __MWERKS__
1258 #define UNARY_FUNCTION(RET,FUNC,ARG) \
1259 struct FnUnary_ ## FUNC { \
1260 enum { tag = PETE_UnaryPassThruTag }; \
1262 PETE_DefineUnary(FUNC,FUNC(a),FnUnary_ ## FUNC) \
1264 struct PETEUnaryReturn<ARG, FnUnary_ ## FUNC> { \
1268 #define BINARY_FUNCTION(RET,FUNC,ARG1,ARG2) \
1269 struct FnBinary_ ## FUNC { \
1270 enum { tag = PETE_BinaryPromoteTag }; \
1272 PETE_DefineBinary(FUNC,(FUNC(a,b)),FnBinary_ ## FUNC) \
1274 struct PETEBinaryReturn<ARG1,ARG2,FnBinary_ ## FUNC> { \
T::PETE_Return_t Reduction(const PETE_Expr< T > &const_expr, CompOp comp_op, AccOp acc_op, NDIndex< D > &loc)
#define PETE_DefineUnary(Fun, Expr, Op)
static type apply(const T &t)
void PETE_apply(const OpPeriodic< T > &e, T &a, const T &b)
#define PETE_DefineAssign(Expr, Cond, Op)
PETE_TUTree< FnArcCos, typename T::PETE_Expr_t > acos(const PETE_Expr< T > &l)
#define PETE_DefineScalar(Sca)
static Return_t apply(PETE_TBTree< OpWhere, T1, T2 > &node, Functor f)
static Return_t apply(PETE_TBTree< Op, T1, T2 > &node, Functor f)
FTps< T, N > erf(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Error function.
static const type & apply(const PETE_Expr< T > &t)
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
Tps< T > sin(const Tps< T > &x)
Sine.
PETE_TBTree< FnCopysign, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > copysign(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
PETE_TUTree< FnCeil, typename T::PETE_Expr_t > ceil(const PETE_Expr< T > &l)
Tps< T > exp(const Tps< T > &x)
Exponential.
const PETE_Expr_t & MakeExpression() const
PETEBinaryReturn< typename Left_t::PETE_Return_t, typename Right_t::PETE_Return_t, Value_t >::type PETE_Return_t
WrappedExpr & PETE_unwrap()
PETE_ComputeUnaryType< PETE_Type2Index< T >::val, Op::tag >::type type
Tps< T > tan(const Tps< T > &x)
Tangent.
int operator()(int, int, int)
PETE_TUTree(const Child_t &c)
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
PETE_TUTree< OpCast< T1 >, typename Expr::PETE_Expr_t > pete_cast(const T1 &, const PETE_Expr< Expr > &l)
Tps< T > log(const Tps< T > &x)
Natural logarithm.
static PETETrinaryReturn< typename T1::PETE_Return_t, typename T2::PETE_Return_t, typename T3::PETE_Return_t, OpWhere >::type apply(PETE_TTTree< OpWhere, T1, T2, T3 > &node, Functor f)
double Sub(double a, double b)
PETEUnaryReturn< typename Child_t::PETE_Return_t, Value_t >::type PETE_Return_t
PETE_TTTree(const Left_t &l, const Middle_t &m, const Right_t &r)
ConditionalAssign< T3 > Return_t
Tps< T > cosh(const Tps< T > &x)
Hyperbolic cosine.
const PETE_Expr_t & MakeExpression() const
PETE_TTTree< Value_t, Left_t, Middle_t, Right_t > PETE_Expr_t
const PETE_Expr_t & MakeExpression() const
static PETETrinaryReturn< typename T1::PETE_Return_t, typename T2::PETE_Return_t, typename T3::PETE_Return_t, Op >::type apply(PETE_TTTree< Op, T1, T2, T3 > &node, Functor f)
PETE_TUTree< OpIdentity, T > type
const WrappedExpr & PETE_unwrap() const
PETE_TUTree< FnArcTan, typename T::PETE_Expr_t > atan(const PETE_Expr< T > &l)
constexpr double c
The velocity of light in m/s.
PETE_ComputeBinaryType< PETE_Type2Index< T2 >::val, PETE_Type2Index< T3 >::val, Op::tag >::type type
PETE_TTTree< OpWhere, typename Cond_t::PETE_Expr_t, typename True_t::PETE_Expr_t, PETE_Scalar< Vektor< T, Dim > > > where(const PETE_Expr< Cond_t > &c, const PETE_Expr< True_t > &t, const Vektor< T, Dim > &f)
PETE_TBTree< FnArcTan2, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > atan2(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
PETE_TBTree< FnLdexp, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > ldexp(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
PETE_Scalar< T > PETE_Expr_t
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
int operator()(int l, int m, int r)
PETE_TBTree< FnFmod, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > fmod(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
PETE_TUTree< Value_t, Child_t > PETE_Expr_t
Tps< T > sqrt(const Tps< T > &x)
Square root.
#define PETE_DefineBinarySynonym(Fun, Op)
ConditionalAssign(bool q, const T &v)
PETE_Combiner< bool, OpAnd > PETE_AndCombiner
T operator()(T x, T y, T z)
#define PETE_USER_REDUCTION_CODE
Tps< T > cos(const Tps< T > &x)
Cosine.
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
PETE_Combiner< bool, OpOr > PETE_OrCombiner
PETE_TBTree< Value_t, Left_t, Right_t > PETE_Expr_t
PETE_Expr_t MakeExpression() const
#define PETE_DefineBinary(Fun, Expr, Op)
PETE_TUTree< FnArcSin, typename T::PETE_Expr_t > asin(const PETE_Expr< T > &l)
PETE_TTTree(const Value_t &v, const Left_t &l, const Middle_t &m, const Right_t &r)
PETEBinaryReturn< typename T1::PETE_Return_t, typename T2::PETE_Return_t, Op >::type Return_t
PETE_TUTree(const Value_t &v, const Child_t &c)
bool for_each(const BareFieldIterator< T, D > &p, SameFieldID s, C)
int operator()(int l, int r)
PETE_TBTree(const Value_t &v, const Left_t &l, const Right_t &r)
Tps< T > tanh(const Tps< T > &x)
Hyperbolic tangent.
PETE_TUTree< OpIdentity, typename T::PETE_Expr_t > PETE_identity(const PETE_Expr< T > &l)
Tps< T > sinh(const Tps< T > &x)
Hyperbolic sine.
PETE_TBTree(const Left_t &l, const Right_t &r)
PETE_TUTree< FnLog10, typename T::PETE_Expr_t > log10(const PETE_Expr< T > &l)
PETETrinaryReturn< typename Left_t::PETE_Return_t, typename Middle_t::PETE_Return_t, typename Right_t::PETE_Return_t, Value_t >::type PETE_Return_t
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
PETE_Combiner< int, OpAdd > PETE_SumCombiner