8 #ifndef OPENFPM_NUMERICS_SRC_OPERATORS_VECTOR_VECTOR_DIST_OPERATORS_HPP_
9 #define OPENFPM_NUMERICS_SRC_OPERATORS_VECTOR_VECTOR_DIST_OPERATORS_HPP_
11 #include "Vector/vector_dist.hpp"
13 #define PROP_POS (unsigned int)-1
14 #define PROP_CUSTOM (unsigned int)-2
21 #define VECT_APPLYKER_IN 7
22 #define VECT_APPLYKER_OUT 8
23 #define VECT_APPLYKER_REDUCE 9
24 #define VECT_APPLYKER_IN_GEN 10
25 #define VECT_APPLYKER_OUT_GEN 11
26 #define VECT_APPLYKER_REDUCE_GEN 12
27 #define VECT_APPLYKER_IN_SIM 13
28 #define VECT_APPLYKER_OUT_SIM 14
29 #define VECT_APPLYKER_REDUCE_SIM 15
57 #define VECT_TGAMMA 83
58 #define VECT_LGAMMA 84
63 #define VECT_NEARBYINT 89
66 #define VECT_SUB_UNI 92
68 #define VECT_SUM_REDUCE 93
80 template<
typename ObjType,
typename Sfinae =
void>
83 template<
typename ObjType>
92 template <typename T, bool has_init = has_init<T>::value >
96 static inline void call(T & r_exp)
107 template <
typename T>
111 static inline void call(T & r_exp)
124 template <
typename exp1,
typename exp2,
unsigned int op>
136 template <
typename exp1,
typename exp2>
173 return o1.value(key) + o2.value(key);
184 template <
typename exp1,
typename exp2>
220 return o1.value(key) - o2.value(key);
230 template <
typename exp1,
typename exp2>
266 return o1.value(key) * o2.value(key);
276 template <
typename exp1,
typename exp2>
312 return o1.value(key) / o2.value(key);
323 template <
typename vector,
unsigned int prp>
329 return v.template getProp<prp>(k);
340 template <
typename vector,
unsigned int prp>
346 return v.template getProp<prp>(k);
357 template <
typename vector>
363 static inline auto value(vector & v,
const vect_dist_key_dx & k) -> decltype(getExprL(v.getPos(k).getReference()))
365 return getExprL(v.getPos(k).getReference());
373 return getExprL(v.getPos(k));
386 template <
typename vector>
392 return getExprR(v.getPos(k));
400 template <
typename exp1>
422 return -(o1.value(key));
432 template<
unsigned int prp,
typename vector>
444 static const unsigned int prop = prp;
494 auto it = v.getDomainIterator();
519 auto it = v.getDomainIterator();
542 auto it = v.getDomainIterator();
575 template<
unsigned int prp>
616 template<
unsigned int prp>
663 template<
unsigned int p1,
unsigned int p2,
typename v1,
typename v2>
667 vector_dist_expression_op<vector_dist_expression<p1,v1>,vector_dist_expression<p2,v2>,VECT_SUM> exp_sum(va,vb);
680 template<
typename exp1 ,
typename exp2,
unsigned int op1,
unsigned int prp1,
typename v1>
684 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<prp1,v1>,VECT_SUM> exp_sum(va,vb);
697 template<
typename exp1 ,
typename exp2,
unsigned int op1,
unsigned int prp1,
typename v1>
699 operator+(
const vector_dist_expression<prp1,v1> & va,
const vector_dist_expression_op<exp1,exp2,op1> & vb)
701 vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression_op<exp1,exp2,op1>,VECT_SUM> exp_sum(va,vb);
714 template<
typename exp1 ,
typename exp2,
unsigned int op1,
typename exp3 ,
typename exp4,
unsigned int op2>
716 operator+(
const vector_dist_expression_op<exp1,exp2,op1> & va,
const vector_dist_expression_op<exp3,exp4,op2> & vb)
718 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression_op<exp3,exp4,op2>,VECT_SUM> exp_sum(va,vb);
731 template<
unsigned int prp1 ,
typename v1>
733 operator+(
const vector_dist_expression<prp1,v1> & va,
double d)
735 vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression<0,double>,VECT_SUM> exp_sum(va,vector_dist_expression<0,double>(d));
748 template<
unsigned int prp1 ,
typename v1>
750 operator+(
double d,
const vector_dist_expression<prp1,v1> & vb)
752 vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression<prp1,v1>,VECT_SUM> exp_sum(vector_dist_expression<0,double>(d),vb);
765 template<
typename exp1 ,
typename exp2,
unsigned int op1>
766 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_SUM>
767 operator+(
const vector_dist_expression_op<exp1,exp2,op1> & va,
double d)
769 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_SUM> exp_sum(va,vector_dist_expression<0,double>(d));
783 template<
unsigned int p1,
unsigned int p2,
typename v1,
typename v2>
784 inline vector_dist_expression_op<vector_dist_expression<p1,v1>,vector_dist_expression<p2,v2>,VECT_SUB>
787 vector_dist_expression_op<vector_dist_expression<p1,v1>,vector_dist_expression<p2,v2>,VECT_SUB> exp_sum(va,vb);
801 template<
typename exp1,
typename exp2,
unsigned int op1,
unsigned int p2,
typename v2>
802 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<p2,v2>,VECT_SUB>
803 operator-(
const vector_dist_expression_op<exp1,exp2,op1> & va,
const vector_dist_expression<p2,v2> & vb)
805 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<p2,v2>,VECT_SUB> exp_sum(va,vb);
817 template<
typename exp1,
typename exp2_,
unsigned int op1>
821 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2_,op1>,void,VECT_SUB_UNI> exp_sum(va);
833 template<
unsigned int p1,
typename v1>
834 inline vector_dist_expression_op<vector_dist_expression<p1,v1>,void,VECT_SUB_UNI>
837 vector_dist_expression_op<vector_dist_expression<p1,v1>,void,VECT_SUB_UNI> exp_sum(va);
851 template<
typename exp1,
typename exp2,
unsigned int op1,
unsigned int p2,
typename v2>
853 operator-(
const vector_dist_expression<p2,v2> & va,
const vector_dist_expression_op<exp1,exp2,op1> & vb)
855 vector_dist_expression_op<vector_dist_expression<p2,v2>, vector_dist_expression_op<exp1,exp2,op1>,VECT_SUB> exp_sum(va,vb);
868 template<
typename exp1,
typename exp2,
unsigned int op1,
typename exp3,
typename exp4,
unsigned int op2>
869 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression_op<exp3,exp4,op2>,VECT_SUB>
870 operator-(
const vector_dist_expression_op<exp1,exp2,op1> & va,
const vector_dist_expression_op<exp3,exp4,op2> & vb)
872 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression_op<exp3,exp4,op2>,VECT_SUB> exp_sum(va,vb);
885 template<
unsigned int prp1,
typename v1>
886 inline vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression<0,double>,VECT_SUB>
887 operator-(
const vector_dist_expression<prp1,v1> & va,
double d)
889 vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression<0,double>,VECT_SUB> exp_sum(va,vector_dist_expression<0,double>(d));
902 template<
unsigned int prp1,
typename v1>
903 inline vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression<prp1,v1>,VECT_SUB>
904 operator-(
double d,
const vector_dist_expression<prp1,v1> & vb)
906 vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression<prp1,v1>,VECT_SUB> exp_sum(vector_dist_expression<0,double>(d),vb);
919 template<
unsigned int p2,
typename v2>
920 inline vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression<p2,v2>,VECT_MUL>
921 operator*(
double d,
const vector_dist_expression<p2,v2> & vb)
923 vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression<p2,v2>,VECT_MUL> exp_sum(vector_dist_expression<0,double>(d),vb);
936 template<
unsigned int p2,
typename v2>
937 inline vector_dist_expression_op<vector_dist_expression<p2,v2>,vector_dist_expression<0,double>,VECT_MUL>
938 operator*(
const vector_dist_expression<p2,v2> & va,
double d)
940 vector_dist_expression_op<vector_dist_expression<p2,v2>,vector_dist_expression<0,double>,VECT_MUL> exp_sum(va,vector_dist_expression<0,double>(d));
953 template<
unsigned int p1,
typename v1,
unsigned int p2,
typename v2>
954 inline vector_dist_expression_op<vector_dist_expression<p1,v1>,vector_dist_expression<p2,v2>,VECT_MUL>
957 vector_dist_expression_op<vector_dist_expression<p1,v1>,vector_dist_expression<p2,v2>,VECT_MUL> exp_sum(va,vb);
970 template<
unsigned int p1,
typename v1,
typename exp1,
typename exp2,
unsigned int op1>
971 inline vector_dist_expression_op<vector_dist_expression<p1,v1>,vector_dist_expression_op<exp1,exp2,op1>,VECT_MUL>
974 vector_dist_expression_op<vector_dist_expression<p1,v1>,vector_dist_expression_op<exp1,exp2,op1>,VECT_MUL> exp_sum(va,vb);
987 template<
unsigned int p1,
typename v1,
typename exp1,
typename exp2,
unsigned int op1>
989 operator*(
const vector_dist_expression_op<exp1,exp2,op1> & va,
const vector_dist_expression<p1,v1> & vb)
991 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<p1,v1>,VECT_MUL> exp_sum(va,vb);
1004 template<
typename exp1,
typename exp2,
unsigned int op1,
typename exp3 ,
typename exp4,
unsigned int op2>
1005 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression_op<exp3,exp4,op2>,VECT_MUL>
1006 operator*(
const vector_dist_expression_op<exp1,exp2,op1> & va,
const vector_dist_expression_op<exp3,exp4,op2> & vb)
1008 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression_op<exp3,exp4,op2>,VECT_MUL> exp_sum(va,vb);
1021 template<
typename exp1 ,
typename exp2,
unsigned int op1>
1022 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_MUL>
1023 operator*(
const vector_dist_expression_op<exp1,exp2,op1> & va,
double d)
1025 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_MUL> exp_sum(va,vector_dist_expression<0,double>(d));
1038 template<
typename exp1 ,
typename exp2,
unsigned int op1>
1039 inline vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression_op<exp1,exp2,op1>,VECT_MUL>
1040 operator*(
double d,
const vector_dist_expression_op<exp1,exp2,op1> & vb)
1042 vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression_op<exp1,exp2,op1>,VECT_MUL> exp_sum(vector_dist_expression<0,double>(d),vb);
1055 template<
typename exp1,
typename exp2,
unsigned int op1>
1056 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_DIV>
1057 operator/(
const vector_dist_expression_op<exp1,exp2,op1> & va,
double d)
1059 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_DIV> exp_sum(va,vector_dist_expression<0,double>(d));
1073 template<
typename exp1,
typename exp2,
unsigned int op1>
1074 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_DIV>
1075 operator/(
double d,
const vector_dist_expression_op<exp1,exp2,op1> & va)
1077 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<0,double>,VECT_DIV> exp_sum(vector_dist_expression<0,double>(d),va);
1090 template<
unsigned int prp1,
typename v1>
1091 inline vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression<0,double>,VECT_DIV>
1092 operator/(
const vector_dist_expression<prp1,v1> & va,
double d)
1094 vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression<0,double>,VECT_DIV> exp_sum(va,vector_dist_expression<0,double>(d));
1107 template<
unsigned int prp1,
typename v1>
1108 inline vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression<prp1,v1>,VECT_DIV>
1109 operator/(
double d,
const vector_dist_expression<prp1,v1> & va)
1111 vector_dist_expression_op<vector_dist_expression<0,double>,vector_dist_expression<prp1,v1>,VECT_DIV> exp_sum(vector_dist_expression<0,double>(d),va);
1124 template<
unsigned int prp1,
typename v1,
unsigned int prp2,
typename v2>
1126 operator/(
const vector_dist_expression<prp1,v1> & va,
const vector_dist_expression<prp2,v2> & vb)
1128 vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression<prp2,v2>,VECT_DIV> exp_sum(va,vb);
1141 template<
unsigned int prp1,
typename v1,
typename exp1,
typename exp2,
unsigned int op1>
1142 inline vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression_op<exp1,exp2,op1>,VECT_DIV>
1143 operator/(
const vector_dist_expression<prp1,v1> & va,
const vector_dist_expression_op<exp1,exp2,op1> & vb)
1145 vector_dist_expression_op<vector_dist_expression<prp1,v1>,vector_dist_expression_op<exp1,exp2,op1>,VECT_DIV> exp_sum(va,vb);
1158 template<
unsigned int prp1,
typename v1,
typename exp1,
typename exp2,
unsigned int op1>
1159 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<prp1,v1>,VECT_DIV>
1160 operator/(
const vector_dist_expression_op<exp1,exp2,op1> & va,
const vector_dist_expression<prp1,v1> & vb)
1162 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression<prp1,v1>,VECT_DIV> exp_sum(va,vb);
1175 template<
typename exp1,
typename exp2,
unsigned int op1,
typename exp3,
typename exp4,
unsigned int op2>
1176 inline vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression_op<exp3,exp4,op2>,VECT_DIV>
1177 operator/(
const vector_dist_expression_op<exp1,exp2,op1> & va,
const vector_dist_expression_op<exp3,exp4,op2> & vb)
1179 vector_dist_expression_op<vector_dist_expression_op<exp1,exp2,op1>,vector_dist_expression_op<exp3,exp4,op2>,VECT_DIV> exp_sum(va,vb);
1184 #include "vector_dist_operators_apply_kernel.hpp"
1185 #include "vector_dist_operators_functions.hpp"
1186 #include "vector_dist_operators_extensions.hpp"
1187 #include "Operators/Vector/vector_dist_operator_assign.hpp"
selector for position or properties right side
void init() const
This function must be called before value.
float vtype
type of object the structure return then evaluated
vector_dist_expression_op(const exp1 &o1, const exp2 &o2)
constructor from two expressions
r_type value(const vect_dist_key_dx &key) const
Evaluate the expression.
vector_dist_expression(const double &d)
constructor from a constant expression
vector & operator=(const vector_dist_expression_op< exp1, exp2, op > &v_exp)
Fill the vector property with the evaluated expression.
float value(const vect_dist_key_dx &k) const
Evaluate the expression.
void init() const
This function must be called before value.
static auto value(vector &v, const vect_dist_key_dx &k) -> decltype(v.template getProp< prp >(k))
return the value (position or property) of the particle k in the vector v
vector_dist_expression_op(const exp1 &o1, const exp2 &o2)
constructor of the expression to sum two expression
static auto value(vector &v, const vect_dist_key_dx &k) -> decltype(getExprR(v.getPos(k)))
return the value (position or property) of the particle k in the vector v
void init() const
initialize the expression tree
selector for position or properties left side expression
r_type value(const vect_dist_key_dx &key) const
Evaluate the expression.
has_init check if a type has defined a method called init
selector for position or properties left side
static auto value(vector &v, const vect_dist_key_dx &k) -> decltype(getExprL(v.getPos(k)))
return the value (position or property) of the particle k in the vector v
Multiplication operation.
double d
constant parameter
vector vtype
The type of the internal vector.
Grid key for a distributed grid.
const exp1 o1
expression 1
r_type value(const vect_dist_key_dx &key) const
Evaluate the expression.
static void call(T &r_exp)
it call the function init for r_exp if T has the function init
selector for position or properties right side position
void init() const
This function must be called before value.
const exp1 o1
expression 1
Unknown operation specialization.
vector & getVector()
Return the vector on which is acting.
vector_dist_expression(const float &d)
constrictor from constant value
r_type value(const vect_dist_key_dx &key) const
return the result of the expression
auto value(const vect_dist_key_dx &k) const -> decltype(pos_or_propR< vector, prp >::value(v, k))
Evaluate the expression.
void init() const
This function must be called before value.
vector_dist_expression_op(const exp1 &o1, const exp2 &o2)
Costruct a subtraction expression out of two expressions.
const exp1 o1
expression 1
vector & operator=(const vector_dist_expression< prp2, vector > &v_exp)
Fill the vector property with the evaluated expression.
Main class that encapsulate a vector properties operand to be used for expressions construction...
const exp2 o2
expression 2
vector & operator=(double d)
Fill the vector property with the double.
This class is a trick to indicate the compiler a specific specialization pattern. ...
vector_dist_expression_op(const exp1 &o1, const exp2 &o2)
constructor from two expressions
Call the init function if a type T has the function init.
const exp2 o2
expression 2
r_type value(const vect_dist_key_dx &key) const
Evaluate the expression.
it take an expression and create the negatove of this expression
const exp2 o2
expression 2
void init() const
This function must be called before value.
const exp2 o2
expression 2
static const unsigned int prop
Property id of the point.
double value(const vect_dist_key_dx &k) const
Evaluate the expression.
const exp1 o1
expression 1
static auto value(vector &v, const vect_dist_key_dx &k) -> decltype(v.template getProp< prp >(k))
return the value (position or property) of the particle k in the vector v
vector_dist_expression(vector &v)
constructor for an external vector
void init() const
This function must be called before value.
void init() const
This function must be called before value.
const exp1 o1
expression 1
vector_dist_expression_op(const exp1 &o1)
constructor from an expresssion
static void call(T &r_exp)
it call the function init for r_exp if T has the function init