18#include "libmesh/libmesh_common.h"
54 class EBSubstitutionRule;
316 template <
class Node_T>
353 mooseAssert(
_epsilon != NULL,
"Epsilon must not be an empty term in EBLogPlogSubstitution");
427#define UNARY_OP_IMPLEMENT(op, OP) \
428 EBTerm operator op() const \
430 mooseAssert(_root != NULL, "Empty term provided for unary operator " #op); \
431 return EBTerm(new EBUnaryOpTermNode(cloneRoot(), EBUnaryOpTermNode::OP)); \
454#define BINARY_OP_IMPLEMENT(op, OP) \
455 EBTerm operator op(const EBTerm & term) const \
457 mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
458 mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
459 return EBTerm(new EBBinaryOpTermNode(cloneRoot(), term.cloneRoot(), EBBinaryOpTermNode::OP)); \
461 friend EBTerm operator op(int left, const EBTerm & right) \
463 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
464 return EBTerm(new EBBinaryOpTermNode( \
465 new EBNumberNode<int>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
467 friend EBTerm operator op(Real left, const EBTerm & right) \
469 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
470 return EBTerm(new EBBinaryOpTermNode( \
471 new EBNumberNode<Real>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
473 friend EBTerm operator op(const EBFunction & left, const EBTerm & right) \
475 mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
476 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
477 return EBTerm(new EBBinaryOpTermNode( \
478 EBTerm(left).cloneRoot(), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
480 friend EBTerm operator op(const EBFunction & left, const EBFunction & right); \
481 friend EBTerm operator op(int left, const EBFunction & right); \
482 friend EBTerm operator op(Real left, const EBFunction & right);
498#define BINARYCOMP_OP_IMPLEMENT(op, OP) \
499 EBTerm & operator op(const EBTerm & term) \
501 mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
502 mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
503 if (dynamic_cast<EBTempIDNode *>(_root)) \
504 mooseError("Using compound assignment operator on anonymous term. Set it to 0 first!"); \
505 _root = new EBBinaryOpTermNode(_root, term.cloneRoot(), EBBinaryOpTermNode::OP); \
521 template <typename
T>
552 return (*
this)((a1, a2, a3));
557 return (*
this)((a1, a2, a3, a4));
565 return (*
this)((a1, a2, a3, a4, a5));
574 return (*
this)((a1, a2, a3, a4, a5, a6));
584 return (*
this)((a1, a2, a3, a4, a5, a6, a7));
595 return (*
this)((a1, a2, a3, a4, a5, a6, a7, a8));
607 return (*
this)((a1, a2, a3, a4, a5, a6, a7, a8, a9));
615 operator std::string()
const;
649#define BINARYFUNC_OP_IMPLEMENT(op, OP) \
650 friend EBTerm operator op(const EBFunction & left, const EBFunction & right) \
652 mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
653 mooseAssert(EBTerm(right)._root != NULL, \
654 "Empty term provided on right side of operator " #op); \
655 return EBTerm(new EBBinaryOpTermNode( \
656 EBTerm(left).cloneRoot(), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
658 friend EBTerm operator op(int left, const EBFunction & right) \
660 mooseAssert(EBTerm(right)._root != NULL, \
661 "Empty term provided on right side of operator " #op); \
662 return EBTerm(new EBBinaryOpTermNode( \
663 new EBNumberNode<int>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
665 friend EBTerm operator op(Real left, const EBFunction & right) \
667 mooseAssert(EBTerm(right)._root != NULL, \
668 "Empty term provided on right side of operator " #op); \
669 return EBTerm(new EBBinaryOpTermNode( \
670 new EBNumberNode<Real>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
701 std::ostringstream s;
702 s << std::setprecision(12) << _value;
706template <
class Node_T>
711 const Node_T * match_node =
dynamic_cast<const Node_T *
>(node);
712 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