18#include "libmesh/libmesh_common.h"
56 class EBSubstitutionRule;
318 template <
class Node_T>
355 mooseAssert(
_epsilon != NULL,
"Epsilon must not be an empty term in EBLogPlogSubstitution");
429#define UNARY_OP_IMPLEMENT(op, OP) \
430 EBTerm operator op() const \
432 mooseAssert(_root != NULL, "Empty term provided for unary operator " #op); \
433 return EBTerm(new EBUnaryOpTermNode(cloneRoot(), EBUnaryOpTermNode::OP)); \
456#define BINARY_OP_IMPLEMENT(op, OP) \
457 EBTerm operator op(const EBTerm & term) const \
459 mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
460 mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
461 return EBTerm(new EBBinaryOpTermNode(cloneRoot(), term.cloneRoot(), EBBinaryOpTermNode::OP)); \
463 friend EBTerm operator op(int left, const EBTerm & right) \
465 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
466 return EBTerm(new EBBinaryOpTermNode( \
467 new EBNumberNode<int>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
469 friend EBTerm operator op(Real left, const EBTerm & right) \
471 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
472 return EBTerm(new EBBinaryOpTermNode( \
473 new EBNumberNode<Real>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
475 friend EBTerm operator op(const EBFunction & left, const EBTerm & right) \
477 mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
478 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
479 return EBTerm(new EBBinaryOpTermNode( \
480 EBTerm(left).cloneRoot(), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
482 friend EBTerm operator op(const EBFunction & left, const EBFunction & right); \
483 friend EBTerm operator op(int left, const EBFunction & right); \
484 friend EBTerm operator op(Real left, const EBFunction & right);
500#define BINARYCOMP_OP_IMPLEMENT(op, OP) \
501 EBTerm & operator op(const EBTerm & term) \
503 mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
504 mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
505 if (dynamic_cast<EBTempIDNode *>(_root)) \
506 mooseError("Using compound assignment operator on anonymous term. Set it to 0 first!"); \
507 _root = new EBBinaryOpTermNode(_root, term.cloneRoot(), EBBinaryOpTermNode::OP); \
523 template <typename T>
554 return (*
this)((a1, a2, a3));
559 return (*
this)((a1, a2, a3, a4));
567 return (*
this)((a1, a2, a3, a4, a5));
576 return (*
this)((a1, a2, a3, a4, a5, a6));
586 return (*
this)((a1, a2, a3, a4, a5, a6, a7));
597 return (*
this)((a1, a2, a3, a4, a5, a6, a7, a8));
609 return (*
this)((a1, a2, a3, a4, a5, a6, a7, a8, a9));
617 operator std::string()
const;
651#define BINARYFUNC_OP_IMPLEMENT(op, OP) \
652 friend EBTerm operator op(const EBFunction & left, const EBFunction & right) \
654 mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
655 mooseAssert(EBTerm(right)._root != NULL, \
656 "Empty term provided on right side of operator " #op); \
657 return EBTerm(new EBBinaryOpTermNode( \
658 EBTerm(left).cloneRoot(), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
660 friend EBTerm operator op(int left, const EBFunction & right) \
662 mooseAssert(EBTerm(right)._root != NULL, \
663 "Empty term provided on right side of operator " #op); \
664 return EBTerm(new EBBinaryOpTermNode( \
665 new EBNumberNode<int>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
667 friend EBTerm operator op(Real left, const EBFunction & right) \
669 mooseAssert(EBTerm(right)._root != NULL, \
670 "Empty term provided on right side of operator " #op); \
671 return EBTerm(new EBBinaryOpTermNode( \
672 new EBNumberNode<Real>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
703 std::ostringstream s;
704 s << std::setprecision(12) << _value;
708template <
class Node_T>
713 const Node_T * match_node =
dynamic_cast<const Node_T *
>(node);
714 if (match_node == NULL)
void ErrorVector unsigned int
Node representing a function with two arguments.
virtual int precedence() const
enum ExpressionBuilder::EBBinaryFuncTermNode::NodeType _type
virtual std::string stringify() const
EBBinaryFuncTermNode(EBTermNode *left, EBTermNode *right, NodeType type)
virtual EBBinaryFuncTermNode * clone() const
Node representing a binary operator.
virtual int precedence() const
EBBinaryOpTermNode(EBTermNode *left, EBTermNode *right, NodeType type)
virtual EBBinaryOpTermNode * clone() const
virtual std::string stringify() const
Base class for nodes with two sub nodes (i.e. functions or operators taking two arguments)
virtual ~EBBinaryTermNode()
virtual unsigned int substitute(const EBSubstitutionRuleList &rule)
EBBinaryTermNode(EBTermNode *left, EBTermNode *right)
User facing host object for a function. This combines a term with an argument list.
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5, const EBTerm &a6, const EBTerm &a7, const EBTerm &a8, const EBTerm &a9)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5, const EBTerm &a6, const EBTerm &a7, const EBTerm &a8)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5, const EBTerm &a6)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4)
EBTermList _eval_arguments
argument list passed in when evaluating the function
EBTermList _arguments
argument list the function is declared with
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5, const EBTerm &a6, const EBTerm &a7)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3)
Substitution rule to replace all occurences of log(x) with plog(x, epsilon) with a user defined term ...
EBLogPlogSubstitution(const EBTerm &epsilon)
virtual EBTermNode * substitute(const EBUnaryFuncTermNode &) const
virtual ~EBLogPlogSubstitution()
Template class for leaf nodes holding numbers in the expression tree.
virtual int precedence() const
virtual EBNumberNode< T > * clone() const
virtual std::string stringify() const
Substitution rule base class that applies to nodes of type Node_T.
virtual EBTermNode * substitute(const Node_T &) const =0
virtual EBTermNode * apply(const EBTermNode *) const
Substitution rule functor base class to perform flexible term substitutions.
virtual EBTermNode * apply(const EBTermNode *) const =0
virtual ~EBSubstitutionRule()
Template class for leaf nodes holding symbols (i.e. variables) in the expression tree.
virtual EBSymbolNode * clone() const
virtual int precedence() const
virtual std::string stringify() const
EBSymbolNode(std::string symbol)
Template class for leaf nodes holding anonymous IDs in the expression tree.
EBTempIDNode(unsigned int id)
virtual int precedence() const
virtual EBTempIDNode * clone() const
virtual std::string stringify() const
Base class for nodes in the expression tree.
virtual int precedence() const =0
friend std::ostream & operator<<(std::ostream &os, const EBTermNode &node)
virtual std::string stringify() const =0
virtual EBTermNode * clone() const =0
virtual unsigned int substitute(const EBSubstitutionRuleList &)
Generic Substitution rule to replace all occurences of a given symbol node term with a user defined t...
virtual EBTermNode * substitute(const EBSymbolNode &) const
virtual ~EBTermSubstitution()
User facing host object for an expression tree.
__attribute__((noinline)) EBTerm()
unsigned int substitute(const EBSubstitutionRule &rule)
friend EBTerm sinh(const EBTerm &)
friend EBTerm atan2(const EBTerm &, const EBTerm &)
EBTerm(const EBTerm &term)
friend EBTerm pow(const EBTerm &, const EBTerm &)
friend EBTerm plog(const EBTerm &, const EBTerm &)
LOGICNOT friend EBTerm sin(const EBTerm &)
Unary functions.
BINARY_OP_IMPLEMENT(+, ADD) BINARY_OP_IMPLEMENT(-
friend EBTerm log2(const EBTerm &)
SUB BINARY_OP_IMPLEMENT MUL MOD BINARY_OP_IMPLEMENT(<, LESS) BINARY_OP_IMPLEMENT(>
friend EBTerm log10(const EBTerm &)
friend EBTerm cosh(const EBTerm &)
friend EBTerm abs(const EBTerm &)
friend EBTermList operator,(const ExpressionBuilder::EBTerm &larg, const ExpressionBuilder::EBTerm &rarg)
EBTerm(const char *symbol)
friend EBTerm tanh(const EBTerm &)
const EBTermNode * getRoot() const
EBTerm & operator=(const EBTerm &term)
BINARYCOMP_OP_IMPLEMENT(+=, ADD) BINARYCOMP_OP_IMPLEMENT(-
friend EBTerm hypot(const EBTerm &, const EBTerm &)
friend std::ostream & operator<<(std::ostream &os, const EBTerm &term)
friend EBTerm exp(const EBTerm &)
friend EBTerm log(const EBTerm &)
friend EBTerm tan(const EBTerm &)
EBTermNode * cloneRoot() const
friend EBTerm cos(const EBTerm &)
SUB BINARYCOMP_OP_IMPLEMENT MUL MOD friend EBTerm min(const EBTerm &, const EBTerm &)
Binary functions.
friend EBTerm max(const EBTerm &, const EBTerm &)
friend EBTerm conditional(const EBTerm &, const EBTerm &, const EBTerm &)
Ternary functions.
UNARY_OP_IMPLEMENT(-, NEG) UNARY_OP_IMPLEMENT(!
Node representing a function with three arguments.
virtual EBTernaryFuncTermNode * clone() const
virtual int precedence() const
EBTernaryFuncTermNode(EBTermNode *left, EBTermNode *middle, EBTermNode *right, NodeType type)
enum ExpressionBuilder::EBTernaryFuncTermNode::NodeType _type
virtual std::string stringify() const
Base class for nodes with two sub nodes (i.e. functions or operators taking two arguments)
virtual ~EBTernaryTermNode()
virtual unsigned int substitute(const EBSubstitutionRuleList &rule)
EBTernaryTermNode(EBTermNode *left, EBTermNode *middle, EBTermNode *right)
Node representing a function with two arguments.
virtual int precedence() const
virtual std::string stringify() const
enum ExpressionBuilder::EBUnaryFuncTermNode::NodeType _type
virtual EBUnaryFuncTermNode * clone() const
EBUnaryFuncTermNode(EBTermNode *subnode, NodeType type)
Node representing a unary operator.
virtual int precedence() const
enum ExpressionBuilder::EBUnaryOpTermNode::NodeType _type
EBUnaryOpTermNode(EBTermNode *subnode, NodeType type)
virtual std::string stringify() const
virtual EBUnaryOpTermNode * clone() const
Base class for nodes with a single sub node (i.e. functions or operators taking one argument)
EBUnaryTermNode(EBTermNode *subnode)
virtual ~EBUnaryTermNode()
const EBTermNode * getSubnode() const
virtual unsigned int substitute(const EBSubstitutionRuleList &rule)
ExpressionBuilder adds an interface to derived classes that enables convenient construction of FParse...
std::vector< const EBSubstitutionRule * > EBSubstitutionRuleList
SUB BINARYFUNC_OP_IMPLEMENT MUL MOD BINARYFUNC_OP_IMPLEMENT(<, LESS) BINARYFUNC_OP_IMPLEMENT(>
std::vector< EBTermNode * > EBTermNodeList
BINARYFUNC_OP_IMPLEMENT(+, ADD) BINARYFUNC_OP_IMPLEMENT(-
std::vector< EBTerm > EBTermList
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real