17 #include "MooseError.h"
18 #include "libmesh/libmesh_common.h"
68 virtual std::string stringify()
const = 0;
70 virtual int precedence()
const = 0;
87 virtual std::string stringify()
const;
100 virtual std::string stringify()
const;
116 virtual std::string stringify()
const;
159 virtual std::string stringify()
const;
180 virtual std::string stringify()
const;
229 virtual std::string stringify()
const;
230 virtual int precedence()
const;
256 virtual std::string stringify()
const;
290 virtual std::string stringify()
const;
307 template <
class Node_T>
316 virtual EBTermNode * substitute(
const Node_T &)
const = 0;
343 mooseAssert(_epsilon != NULL,
"Epsilon must not be an empty term in EBLogPlogSubstitution");
389 operator std::string()
const {
return _root->stringify(); }
413 #define UNARY_OP_IMPLEMENT(op, OP) \
414 EBTerm operator op() const \
416 mooseAssert(_root != NULL, "Empty term provided for unary operator " #op); \
417 return EBTerm(new EBUnaryOpTermNode(cloneRoot(), EBUnaryOpTermNode::OP)); \
419 UNARY_OP_IMPLEMENT(-, NEG)
420 UNARY_OP_IMPLEMENT(!, LOGICNOT)
439 #define BINARY_OP_IMPLEMENT(op, OP) \
440 EBTerm operator op(const EBTerm & term) const \
442 mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
443 mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
444 return EBTerm(new EBBinaryOpTermNode(cloneRoot(), term.cloneRoot(), EBBinaryOpTermNode::OP)); \
446 friend EBTerm operator op(int left, const EBTerm & right) \
448 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
449 return EBTerm(new EBBinaryOpTermNode( \
450 new EBNumberNode<int>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
452 friend EBTerm operator op(Real left, const EBTerm & right) \
454 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
455 return EBTerm(new EBBinaryOpTermNode( \
456 new EBNumberNode<Real>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
458 friend EBTerm operator op(const EBFunction & left, const EBTerm & right) \
460 mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
461 mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
462 return EBTerm(new EBBinaryOpTermNode( \
463 EBTerm(left).cloneRoot(), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
465 friend EBTerm operator op(const EBFunction & left, const EBFunction & right); \
466 friend EBTerm operator op(int left, const EBFunction & right); \
467 friend EBTerm operator op(Real left, const EBFunction & right);
468 BINARY_OP_IMPLEMENT(+, ADD)
469 BINARY_OP_IMPLEMENT(-, SUB)
470 BINARY_OP_IMPLEMENT(*, MUL)
471 BINARY_OP_IMPLEMENT(/, DIV)
472 BINARY_OP_IMPLEMENT(%, MOD)
473 BINARY_OP_IMPLEMENT(<, LESS)
474 BINARY_OP_IMPLEMENT(>, GREATER)
475 BINARY_OP_IMPLEMENT(<=, LESSEQ)
476 BINARY_OP_IMPLEMENT(>=, GREATEREQ)
477 BINARY_OP_IMPLEMENT(==, EQ)
478 BINARY_OP_IMPLEMENT(!=, NOTEQ)
483 #define BINARYCOMP_OP_IMPLEMENT(op, OP) \
484 EBTerm & operator op(const EBTerm & term) \
486 mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
487 mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
488 if (dynamic_cast<EBTempIDNode *>(_root)) \
489 mooseError("Using compound assignment operator on anonymous term. Set it to 0 first!"); \
490 _root = new EBBinaryOpTermNode(_root, term.cloneRoot(), EBBinaryOpTermNode::OP); \
493 BINARYCOMP_OP_IMPLEMENT(+=, ADD)
494 BINARYCOMP_OP_IMPLEMENT(-=, SUB)
495 BINARYCOMP_OP_IMPLEMENT(*=, MUL)
496 BINARYCOMP_OP_IMPLEMENT(/=, DIV)
497 BINARYCOMP_OP_IMPLEMENT(%=, MOD)
506 template <
typename T>
537 return (*
this)((a1, a2, a3));
542 return (*
this)((a1, a2, a3, a4));
550 return (*
this)((a1, a2, a3, a4, a5));
559 return (*
this)((a1, a2, a3, a4, a5, a6));
569 return (*
this)((a1, a2, a3, a4, a5, a6, a7));
580 return (*
this)((a1, a2, a3, a4, a5, a6, a7, a8));
592 return (*
this)((a1, a2, a3, a4, a5, a6, a7, a8, a9));
600 operator std::string()
const;
634 #define BINARYFUNC_OP_IMPLEMENT(op, OP) \
635 friend EBTerm operator op(const EBFunction & left, const EBFunction & right) \
637 mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
638 mooseAssert(EBTerm(right)._root != NULL, \
639 "Empty term provided on right side of operator " #op); \
640 return EBTerm(new EBBinaryOpTermNode( \
641 EBTerm(left).cloneRoot(), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
643 friend EBTerm operator op(int left, const EBFunction & right) \
645 mooseAssert(EBTerm(right)._root != NULL, \
646 "Empty term provided on right side of operator " #op); \
647 return EBTerm(new EBBinaryOpTermNode( \
648 new EBNumberNode<int>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
650 friend EBTerm operator op(Real left, const EBFunction & right) \
652 mooseAssert(EBTerm(right)._root != NULL, \
653 "Empty term provided on right side of operator " #op); \
654 return EBTerm(new EBBinaryOpTermNode( \
655 new EBNumberNode<Real>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
657 BINARYFUNC_OP_IMPLEMENT(+, ADD)
658 BINARYFUNC_OP_IMPLEMENT(-, SUB)
659 BINARYFUNC_OP_IMPLEMENT(*, MUL)
660 BINARYFUNC_OP_IMPLEMENT(/, DIV)
661 BINARYFUNC_OP_IMPLEMENT(%, MOD)
662 BINARYFUNC_OP_IMPLEMENT(<, LESS)
663 BINARYFUNC_OP_IMPLEMENT(>, GREATER)
664 BINARYFUNC_OP_IMPLEMENT(<=, LESSEQ)
665 BINARYFUNC_OP_IMPLEMENT(>=, GREATEREQ)
666 BINARYFUNC_OP_IMPLEMENT(==, EQ)
667 BINARYFUNC_OP_IMPLEMENT(!=, NOTEQ)
671 template <
typename T>
682 template <
typename T>
686 std::ostringstream s;
687 s << std::setprecision(12) << _value;
691 template <
class Node_T>
696 const Node_T * match_node = dynamic_cast<const Node_T *>(node);
697 if (match_node == NULL)
700 return substitute(*match_node);