25#ifndef ANALYTICAL_CALC_F_HH
26#define ANALYTICAL_CALC_F_HH
36template <
unsigned D,
typename T,
typename S,
template<
typename>
class F>
43 if (g->getTargetDim() != f->getTargetDim()) {
44 throw std::invalid_argument(
"Functor target dimensions must be equal");
46 std::swap(f->_ptrCalcC, this->_ptrCalcC);
47 this->
getName() =
"(" +
_f->getName() + F<T>::symbol +
_g->getName() +
")";
50template <
unsigned D,
typename T,
typename S,
template<
typename>
class F>
55 std::forward<decltype(g)>(g))
58template <
unsigned D,
typename T,
typename S,
template<
typename>
class F>
61 std::forward<decltype(f)>(f),
66template <
unsigned D,
typename T,
typename S,
template<
typename>
class F>
69 T outputTmp[this->_g->getTargetDim()];
70 this->_g(outputTmp, input);
71 this->_f(output, input);
72 for (
int i = 0; i < this->_f->getTargetDim(); ++i) {
73 output[i] = F<T>()(output[i], outputTmp[i]);
79template <
unsigned D,
typename T,
typename S>
82 return std::shared_ptr<AnalyticalF<D,T,S>>(
86template <
unsigned D,
typename T,
typename S>
89 return std::shared_ptr<AnalyticalF<D,T,S>>(
93template <
unsigned D,
typename T,
typename S>
96 return std::shared_ptr<AnalyticalF<D,T,S>>(
100template <
unsigned D,
typename T,
typename S>
103 return std::shared_ptr<AnalyticalF<D,T,S>>(
107template <
unsigned D,
typename T,
typename S>
110 return std::shared_ptr<AnalyticalF<D,T,S>>(
114template <
unsigned D,
typename T,
typename S>
117 return std::shared_ptr<AnalyticalF<D,T,S>>(
121template <
unsigned D,
typename T,
typename S>
124 return std::shared_ptr<AnalyticalF<D,T,S>>(
128template <
unsigned D,
typename T,
typename S>
131 return std::shared_ptr<AnalyticalF<D,T,S>>(
135template <
unsigned D,
typename T,
typename S>
138 return std::shared_ptr<AnalyticalF<D,T,S>>(
142template <
unsigned D,
typename T,
typename S>
145 return std::shared_ptr<AnalyticalF<D,T,S>>(
149template <
unsigned D,
typename T,
typename S>
152 return std::shared_ptr<AnalyticalF<D,T,S>>(
156template <
unsigned D,
typename T,
typename S>
159 return std::shared_ptr<AnalyticalF<D,T,S>>(
164template <
unsigned D,
typename T,
typename S>
167 auto tmp = std::make_shared< AnalyticCalcPlus<D,T,S> >(*
this,rhs);
168 this->_ptrCalcC = tmp;
172template <
unsigned D,
typename T,
typename S>
175 auto tmp = std::make_shared< AnalyticCalcMinus<D,T,S> >(*
this,rhs);
176 this->_ptrCalcC = tmp;
180template <
unsigned D,
typename T,
typename S>
183 auto tmp = std::make_shared< AnalyticCalcMultiplication<D,T,S> >(*
this,rhs);
184 this->_ptrCalcC = tmp;
188template <
unsigned D,
typename T,
typename S>
191 auto tmp = std::make_shared< AnalyticCalcDivision<D,T,S> >(*
this,rhs);
192 this->_ptrCalcC = tmp;
arithmetic helper class for analytical functors
AnalyticCalcF(FunctorPtr< AnalyticalF< D, T, S > > &&f, FunctorPtr< AnalyticalF< D, T, S > > &&g)
FunctorPtr< AnalyticalF< D, T, S > > _g
bool operator()(T output[], const S input[]) override
has to be implemented for 'every' derived class
FunctorPtr< AnalyticalF< D, T, S > > _f
AnalyticalConst: DD -> XD, where XD is defined by value.size()
AnalyticalF are applications from DD to XD, where X is set by the constructor.
AnalyticalF< D, T, S > & operator*(AnalyticalF< D, T, S > &rhs)
AnalyticalF< D, T, S > & operator/(AnalyticalF< D, T, S > &rhs)
AnalyticalF< D, T, S > & operator+(AnalyticalF< D, T, S > &rhs)
AnalyticalF< D, T, S > & operator-(AnalyticalF< D, T, S > &rhs)
Smart pointer for managing the various ways of passing functors around.
std::string & getName()
read and write access to name
Top level namespace for all of OpenLB.
AnalyticCalcF< D, T, S, util::minus > AnalyticCalcMinus
subtraction functor
Expr operator/(Expr lhs, Expr rhs)
AnalyticCalcF< D, T, S, util::multiplies > AnalyticCalcMultiplication
multiplication functor
Expr operator*(Expr lhs, Expr rhs)
AnalyticCalcF< D, T, S, util::divides > AnalyticCalcDivision
division functor
AnalyticCalcF< D, T, S, util::plus > AnalyticCalcPlus
addition functor
Expr operator+(Expr lhs, Expr rhs)
Expr operator-(Expr lhs, Expr rhs)