https://mooseframework.inl.gov
ExpressionBuilder.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include <vector>
13 #include <ostream>
14 #include <sstream>
15 #include <iomanip>
16 
17 #include "MooseError.h"
18 #include "libmesh/libmesh_common.h"
19 
20 using namespace libMesh;
21 
48 {
49 public:
51 
52  // forward delcarations
53  class EBTerm;
54  class EBTermNode;
55  class EBFunction;
57  typedef std::vector<EBTerm> EBTermList;
58  typedef std::vector<EBTermNode *> EBTermNodeList;
59  typedef std::vector<const EBSubstitutionRule *> EBSubstitutionRuleList;
60 
62  class EBTermNode
63  {
64  public:
65  virtual ~EBTermNode(){};
66  virtual EBTermNode * clone() const = 0;
67 
68  virtual std::string stringify() const = 0;
69  virtual unsigned int substitute(const EBSubstitutionRuleList & /*rule*/) { return 0; }
70  virtual int precedence() const = 0;
71  friend std::ostream & operator<<(std::ostream & os, const EBTermNode & node)
72  {
73  return os << node.stringify();
74  }
75  };
76 
78  template <typename T>
79  class EBNumberNode : public EBTermNode
80  {
82 
83  public:
84  EBNumberNode(T value) : _value(value){};
85  virtual EBNumberNode<T> * clone() const { return new EBNumberNode(_value); }
86 
87  virtual std::string stringify() const;
88  virtual int precedence() const { return 0; }
89  };
90 
92  class EBSymbolNode : public EBTermNode
93  {
94  std::string _symbol;
95 
96  public:
97  EBSymbolNode(std::string symbol) : _symbol(symbol){};
98  virtual EBSymbolNode * clone() const { return new EBSymbolNode(_symbol); }
99 
100  virtual std::string stringify() const;
101  virtual int precedence() const { return 0; }
102  };
103 
108  class EBTempIDNode : public EBTermNode
109  {
110  unsigned long _id;
111 
112  public:
113  EBTempIDNode(unsigned int id) : _id(id){};
114  virtual EBTempIDNode * clone() const { return new EBTempIDNode(_id); }
115 
116  virtual std::string stringify() const; // returns "[idnumber]"
117  virtual int precedence() const { return 0; }
118  };
119 
122  {
123  public:
124  EBUnaryTermNode(EBTermNode * subnode) : _subnode(subnode){};
125  virtual ~EBUnaryTermNode() { delete _subnode; };
126 
127  virtual unsigned int substitute(const EBSubstitutionRuleList & rule);
128  const EBTermNode * getSubnode() const { return _subnode; }
129 
130  protected:
132  };
133 
136  {
137  public:
138  enum NodeType
139  {
150  TANH
151  } _type;
152 
154  : EBUnaryTermNode(subnode), _type(type){};
155  virtual EBUnaryFuncTermNode * clone() const
156  {
157  return new EBUnaryFuncTermNode(_subnode->clone(), _type);
158  };
159 
160  virtual std::string stringify() const;
161  virtual int precedence() const { return 2; }
162  };
163 
166  {
167  public:
168  enum NodeType
169  {
171  LOGICNOT
172  } _type;
173 
175  : EBUnaryTermNode(subnode), _type(type){};
176  virtual EBUnaryOpTermNode * clone() const
177  {
178  return new EBUnaryOpTermNode(_subnode->clone(), _type);
179  };
180 
181  virtual std::string stringify() const;
182  virtual int precedence() const { return 3; }
183  };
184 
187  {
188  public:
189  EBBinaryTermNode(EBTermNode * left, EBTermNode * right) : _left(left), _right(right){};
191  {
192  delete _left;
193  delete _right;
194  };
195 
196  virtual unsigned int substitute(const EBSubstitutionRuleList & rule);
197 
198  protected:
201  };
202 
205  {
206  public:
207  enum NodeType
208  {
219  EQ,
220  NOTEQ
221  };
222 
224  : EBBinaryTermNode(left, right), _type(type){};
225  virtual EBBinaryOpTermNode * clone() const
226  {
227  return new EBBinaryOpTermNode(_left->clone(), _right->clone(), _type);
228  };
229 
230  virtual std::string stringify() const;
231  virtual int precedence() const;
232 
233  protected:
235  };
236 
239  {
240  public:
241  enum NodeType
242  {
247  PLOG
248  } _type;
249 
251  : EBBinaryTermNode(left, right), _type(type){};
252  virtual EBBinaryFuncTermNode * clone() const
253  {
254  return new EBBinaryFuncTermNode(_left->clone(), _right->clone(), _type);
255  };
256 
257  virtual std::string stringify() const;
258  virtual int precedence() const { return 2; }
259  };
260 
263  {
264  public:
266  : EBBinaryTermNode(left, right), _middle(middle){};
267  virtual ~EBTernaryTermNode() { delete _middle; };
268 
269  virtual unsigned int substitute(const EBSubstitutionRuleList & rule);
270 
271  protected:
273  };
274 
277  {
278  public:
279  enum NodeType
280  {
281  CONDITIONAL
282  } _type;
283 
285  : EBTernaryTermNode(left, middle, right), _type(type){};
286  virtual EBTernaryFuncTermNode * clone() const
287  {
288  return new EBTernaryFuncTermNode(_left->clone(), _middle->clone(), _right->clone(), _type);
289  };
290 
291  virtual std::string stringify() const;
292  virtual int precedence() const { return 2; }
293  };
294 
299  {
300  public:
301  virtual EBTermNode * apply(const EBTermNode *) const = 0;
302  virtual ~EBSubstitutionRule() {}
303  };
304 
308  template <class Node_T>
310  {
311  public:
312  virtual EBTermNode * apply(const EBTermNode *) const;
313 
314  protected:
315  // on successful substitution this returns a new node to replace the old one, otherwise it
316  // returns NULL
317  virtual EBTermNode * substitute(const Node_T &) const = 0;
318  };
319 
324  class EBTermSubstitution : public EBSubstitutionRuleTyped<EBSymbolNode>
325  {
326  public:
327  EBTermSubstitution(const EBTerm & find, const EBTerm & replace);
328  virtual ~EBTermSubstitution() { delete _replace; }
329 
330  protected:
331  virtual EBTermNode * substitute(const EBSymbolNode &) const;
332  std::string _find;
334  };
335 
340  class EBLogPlogSubstitution : public EBSubstitutionRuleTyped<EBUnaryFuncTermNode>
341  {
342  public:
343  EBLogPlogSubstitution(const EBTerm & epsilon) : _epsilon(epsilon.cloneRoot())
344  {
345  mooseAssert(_epsilon != NULL, "Epsilon must not be an empty term in EBLogPlogSubstitution");
346  }
347  virtual ~EBLogPlogSubstitution() { delete _epsilon; }
348 
349  protected:
350  virtual EBTermNode * substitute(const EBUnaryFuncTermNode &) const;
352  };
353 
360  class EBTerm
361  {
362  public:
363  // the default constructor assigns a temporary id node to root we use the address of the
364  // current EBTerm object as the ID. This could be problematic if we create and destroy terms,
365  // but then we should not expect the substitution to do sane things anyways.
366  __attribute__((noinline)) EBTerm()
367  : _root(new EBTempIDNode(reinterpret_cast<unsigned long long>(this))) {};
368 
369  EBTerm(const EBTerm & term) : _root(term.cloneRoot()){};
370  ~EBTerm() { delete _root; };
371 
372  private:
373  // construct a term from a node
374  EBTerm(EBTermNode * root) : _root(root){};
375 
376  public:
377  // construct from number or string
378  EBTerm(int number) : _root(new EBNumberNode<int>(number)) {}
379  EBTerm(Real number) : _root(new EBNumberNode<Real>(number)) {}
380  EBTerm(const char * symbol) : _root(new EBSymbolNode(symbol)) {}
381 
382  // concatenate terms to form a parameter list with (()) syntax (those need to be out-of-class!)
383  friend EBTermList operator,(const ExpressionBuilder::EBTerm & larg,
384  const ExpressionBuilder::EBTerm & rarg);
385  friend EBTermList operator,(const ExpressionBuilder::EBTerm & larg,
386  const ExpressionBuilder::EBTermList & rargs);
388  const ExpressionBuilder::EBTerm & rarg);
389 
390  // dump term as FParser expression
391  friend std::ostream & operator<<(std::ostream & os, const EBTerm & term);
392  // cast into a string
393  operator std::string() const { return _root->stringify(); }
394 
395  // assign a term
396  EBTerm & operator=(const EBTerm & term)
397  {
398  delete _root;
399  _root = term.cloneRoot();
400  return *this;
401  }
402 
403  // perform a substitution (returns substituton count)
404  unsigned int substitute(const EBSubstitutionRule & rule);
405  unsigned int substitute(const EBSubstitutionRuleList & rules);
406 
407  const EBTermNode * getRoot() const { return _root; }
408  EBTermNode * cloneRoot() const { return _root == NULL ? NULL : _root->clone(); }
409 
410  protected:
412 
413  public:
417 #define UNARY_OP_IMPLEMENT(op, OP) \
418  EBTerm operator op() const \
419  { \
420  mooseAssert(_root != NULL, "Empty term provided for unary operator " #op); \
421  return EBTerm(new EBUnaryOpTermNode(cloneRoot(), EBUnaryOpTermNode::OP)); \
422  }
423  UNARY_OP_IMPLEMENT(-, NEG)
424  UNARY_OP_IMPLEMENT(!, LOGICNOT)
425 
426 
429  friend EBTerm sin(const EBTerm &);
430  friend EBTerm cos(const EBTerm &);
431  friend EBTerm tan(const EBTerm &);
432  friend EBTerm abs(const EBTerm &);
433  friend EBTerm log(const EBTerm &);
434  friend EBTerm log2(const EBTerm &);
435  friend EBTerm log10(const EBTerm &);
436  friend EBTerm exp(const EBTerm &);
437  friend EBTerm sinh(const EBTerm &);
438  friend EBTerm cosh(const EBTerm &);
439  friend EBTerm tanh(const EBTerm &);
440 
441 /*
442  * Binary operators (including number,term operations)
443  */
444 #define BINARY_OP_IMPLEMENT(op, OP) \
445  EBTerm operator op(const EBTerm & term) const \
446  { \
447  mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
448  mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
449  return EBTerm(new EBBinaryOpTermNode(cloneRoot(), term.cloneRoot(), EBBinaryOpTermNode::OP)); \
450  } \
451  friend EBTerm operator op(int left, const EBTerm & right) \
452  { \
453  mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
454  return EBTerm(new EBBinaryOpTermNode( \
455  new EBNumberNode<int>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
456  } \
457  friend EBTerm operator op(Real left, const EBTerm & right) \
458  { \
459  mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
460  return EBTerm(new EBBinaryOpTermNode( \
461  new EBNumberNode<Real>(left), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
462  } \
463  friend EBTerm operator op(const EBFunction & left, const EBTerm & right) \
464  { \
465  mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
466  mooseAssert(right._root != NULL, "Empty term provided on right side of operator " #op); \
467  return EBTerm(new EBBinaryOpTermNode( \
468  EBTerm(left).cloneRoot(), right.cloneRoot(), EBBinaryOpTermNode::OP)); \
469  } \
470  friend EBTerm operator op(const EBFunction & left, const EBFunction & right); \
471  friend EBTerm operator op(int left, const EBFunction & right); \
472  friend EBTerm operator op(Real left, const EBFunction & right);
473  BINARY_OP_IMPLEMENT(+, ADD)
474  BINARY_OP_IMPLEMENT(-, SUB)
475  BINARY_OP_IMPLEMENT(*, MUL)
476  BINARY_OP_IMPLEMENT(/, DIV)
477  BINARY_OP_IMPLEMENT(%, MOD)
478  BINARY_OP_IMPLEMENT(<, LESS)
479  BINARY_OP_IMPLEMENT(>, GREATER)
480  BINARY_OP_IMPLEMENT(<=, LESSEQ)
481  BINARY_OP_IMPLEMENT(>=, GREATEREQ)
482  BINARY_OP_IMPLEMENT(==, EQ)
483  BINARY_OP_IMPLEMENT(!=, NOTEQ)
484 
485 /*
486  * Compound assignment operators
487  */
488 #define BINARYCOMP_OP_IMPLEMENT(op, OP) \
489  EBTerm & operator op(const EBTerm & term) \
490  { \
491  mooseAssert(_root != NULL, "Empty term provided on left side of operator " #op); \
492  mooseAssert(term._root != NULL, "Empty term provided on right side of operator " #op); \
493  if (dynamic_cast<EBTempIDNode *>(_root)) \
494  mooseError("Using compound assignment operator on anonymous term. Set it to 0 first!"); \
495  _root = new EBBinaryOpTermNode(_root, term.cloneRoot(), EBBinaryOpTermNode::OP); \
496  return *this; \
497  }
498  BINARYCOMP_OP_IMPLEMENT(+=, ADD)
499  BINARYCOMP_OP_IMPLEMENT(-=, SUB)
500  BINARYCOMP_OP_IMPLEMENT(*=, MUL)
501  BINARYCOMP_OP_IMPLEMENT(/=, DIV)
502  BINARYCOMP_OP_IMPLEMENT(%=, MOD)
503 
504 
508  friend EBTerm min(const EBTerm &, const EBTerm &);
509  friend EBTerm max(const EBTerm &, const EBTerm &);
510  friend EBTerm pow(const EBTerm &, const EBTerm &);
511  template <typename T>
512  friend EBTerm pow(const EBTerm &, T exponent);
513  friend EBTerm atan2(const EBTerm &, const EBTerm &);
514  friend EBTerm hypot(const EBTerm &, const EBTerm &);
515  friend EBTerm plog(const EBTerm &, const EBTerm &);
517 
521  friend EBTerm conditional(const EBTerm &, const EBTerm &, const EBTerm &);
522  };
523 
526  {
527  public:
529 
533  EBFunction & operator()(const EBTerm & arg);
534  EBFunction & operator()(const EBTermList & args);
536 
539  EBFunction & operator()(const EBTerm & a1, const EBTerm & a2) { return (*this)((a1, a2)); }
540  EBFunction & operator()(const EBTerm & a1, const EBTerm & a2, const EBTerm & a3)
541  {
542  return (*this)((a1, a2, a3));
543  }
544  EBFunction &
545  operator()(const EBTerm & a1, const EBTerm & a2, const EBTerm & a3, const EBTerm & a4)
546  {
547  return (*this)((a1, a2, a3, a4));
548  }
550  const EBTerm & a2,
551  const EBTerm & a3,
552  const EBTerm & a4,
553  const EBTerm & a5)
554  {
555  return (*this)((a1, a2, a3, a4, a5));
556  }
558  const EBTerm & a2,
559  const EBTerm & a3,
560  const EBTerm & a4,
561  const EBTerm & a5,
562  const EBTerm & a6)
563  {
564  return (*this)((a1, a2, a3, a4, a5, a6));
565  }
567  const EBTerm & a2,
568  const EBTerm & a3,
569  const EBTerm & a4,
570  const EBTerm & a5,
571  const EBTerm & a6,
572  const EBTerm & a7)
573  {
574  return (*this)((a1, a2, a3, a4, a5, a6, a7));
575  }
577  const EBTerm & a2,
578  const EBTerm & a3,
579  const EBTerm & a4,
580  const EBTerm & a5,
581  const EBTerm & a6,
582  const EBTerm & a7,
583  const EBTerm & a8)
584  {
585  return (*this)((a1, a2, a3, a4, a5, a6, a7, a8));
586  }
588  const EBTerm & a2,
589  const EBTerm & a3,
590  const EBTerm & a4,
591  const EBTerm & a5,
592  const EBTerm & a6,
593  const EBTerm & a7,
594  const EBTerm & a8,
595  const EBTerm & a9)
596  {
597  return (*this)((a1, a2, a3, a4, a5, a6, a7, a8, a9));
598  }
600 
602  operator EBTerm() const;
603 
605  operator std::string() const;
606 
609  EBFunction & operator=(const EBTerm &);
610  EBFunction & operator=(const EBFunction &);
612 
614  std::string args();
615 
618  EBTerm operator-() { return -EBTerm(*this); }
619  EBTerm operator!() { return !EBTerm(*this); }
621 
622  // perform a substitution (returns substituton count)
623  unsigned int substitute(const EBSubstitutionRule & rule);
624  unsigned int substitute(const EBSubstitutionRuleList & rules);
625 
626  protected:
631 
632  // underlying term that the _eval_arguments are substituted in
634  };
635 
636 /*
637  * Binary operators
638  */
639 #define BINARYFUNC_OP_IMPLEMENT(op, OP) \
640  friend EBTerm operator op(const EBFunction & left, const EBFunction & right) \
641  { \
642  mooseAssert(EBTerm(left)._root != NULL, "Empty term provided on left side of operator " #op); \
643  mooseAssert(EBTerm(right)._root != NULL, \
644  "Empty term provided on right side of operator " #op); \
645  return EBTerm(new EBBinaryOpTermNode( \
646  EBTerm(left).cloneRoot(), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
647  } \
648  friend EBTerm operator op(int left, const EBFunction & right) \
649  { \
650  mooseAssert(EBTerm(right)._root != NULL, \
651  "Empty term provided on right side of operator " #op); \
652  return EBTerm(new EBBinaryOpTermNode( \
653  new EBNumberNode<int>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
654  } \
655  friend EBTerm operator op(Real left, const EBFunction & right) \
656  { \
657  mooseAssert(EBTerm(right)._root != NULL, \
658  "Empty term provided on right side of operator " #op); \
659  return EBTerm(new EBBinaryOpTermNode( \
660  new EBNumberNode<Real>(left), EBTerm(right).cloneRoot(), EBBinaryOpTermNode::OP)); \
661  }
662  BINARYFUNC_OP_IMPLEMENT(+, ADD)
663  BINARYFUNC_OP_IMPLEMENT(-, SUB)
664  BINARYFUNC_OP_IMPLEMENT(*, MUL)
665  BINARYFUNC_OP_IMPLEMENT(/, DIV)
666  BINARYFUNC_OP_IMPLEMENT(%, MOD)
667  BINARYFUNC_OP_IMPLEMENT(<, LESS)
668  BINARYFUNC_OP_IMPLEMENT(>, GREATER)
669  BINARYFUNC_OP_IMPLEMENT(<=, LESSEQ)
670  BINARYFUNC_OP_IMPLEMENT(>=, GREATEREQ)
671  BINARYFUNC_OP_IMPLEMENT(==, EQ)
672  BINARYFUNC_OP_IMPLEMENT(!=, NOTEQ)
673 };
674 
675 // convenience function for numeric exponent
676 template <typename T>
678 pow(const ExpressionBuilder::EBTerm & left, T exponent)
679 {
684 }
685 
686 // convert a number node into a string
687 template <typename T>
688 std::string
690 {
691  std::ostringstream s;
692  s << std::setprecision(12) << _value;
693  return s.str();
694 }
695 
696 template <class Node_T>
699  const ExpressionBuilder::EBTermNode * node) const
700 {
701  const Node_T * match_node = dynamic_cast<const Node_T *>(node);
702  if (match_node == NULL)
703  return NULL;
704  else
705  return substitute(*match_node);
706 }
Node representing a function with three arguments.
User facing host object for an expression tree.
MetaPhysicL::DualNumber< V, D, asd > abs(const MetaPhysicL::DualNumber< V, D, asd > &a)
virtual EBNumberNode< T > * clone() const
Base class for nodes with two sub nodes (i.e. functions or operators taking two arguments) ...
virtual EBUnaryOpTermNode * clone() const
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
virtual EBBinaryOpTermNode * clone() const
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5, const EBTerm &a6)
Node representing a unary operator.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sin(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tan
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4)
Template class for leaf nodes holding anonymous IDs in the expression tree.
const double T
auto exp(const T &)
Node representing a binary operator.
ExpressionBuilder::EBTermList operator,(const ExpressionBuilder::EBTerm &larg, const ExpressionBuilder::EBTerm &rarg)
Base class for nodes with a single sub node (i.e. functions or operators taking one argument) ...
virtual EBUnaryFuncTermNode * clone() const
const EBTermNode * getSubnode() const
std::ostream & operator<<(std::ostream &os, const OrderWrapper &order)
EBTermList _eval_arguments
argument list passed in when evaluating the function
Node representing a function with two arguments.
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)
virtual EBTermNode * clone() const =0
std::vector< EBTerm > EBTermList
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
std::basic_ostream< charT, traits > * os
ExpressionBuilder adds an interface to derived classes that enables convenient construction of FParse...
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3)
virtual std::string stringify() const
virtual EBSymbolNode * clone() const
Substitution rule base class that applies to nodes of type Node_T.
EBBinaryTermNode(EBTermNode *left, EBTermNode *right)
Base class for nodes in the expression tree.
auto max(const L &left, const R &right)
virtual EBTempIDNode * clone() const
friend std::ostream & operator<<(std::ostream &os, const EBTermNode &node)
Template class for leaf nodes holding symbols (i.e. variables) in the expression tree.
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template cos(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(cos
Template class for leaf nodes holding numbers in the expression tree.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
virtual unsigned int substitute(const EBSubstitutionRuleList &)
Node representing a function with two arguments.
EBUnaryOpTermNode(EBTermNode *subnode, NodeType type)
EBUnaryFuncTermNode(EBTermNode *subnode, NodeType type)
Real root(std::function< Real(Real)> const &f, Real x1, Real x2, Real tol=1.0e-12)
Finds the root of a function using Brent&#39;s method.
Definition: BrentsMethod.C:66
auto conditional(const C &, const L &, const R &)
virtual EBBinaryFuncTermNode * clone() const
auto log(const T &)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2)
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template sinh(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(erf
virtual std::string stringify() const =0
std::vector< const EBSubstitutionRule * > EBSubstitutionRuleList
virtual EBTernaryFuncTermNode * clone() const
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
const EBTermNode * getRoot() const
Substitution rule to replace all occurences of log(x) with plog(x, epsilon) with a user defined term ...
infix_ostream_iterator< T, charT, traits > & operator=(T const &item)
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)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< EBTermNode * > EBTermNodeList
User facing host object for a function. This combines a term with an argument list.
EBTerm(const char *symbol)
__attribute__((noinline)) EBTerm()
EBTernaryFuncTermNode(EBTermNode *left, EBTermNode *middle, EBTermNode *right, NodeType type)
EBTermList _arguments
argument list the function is declared with
EBTernaryTermNode(EBTermNode *left, EBTermNode *middle, EBTermNode *right)
std::string stringify(const ReactionNetworkUtils::Reaction &t)
virtual EBTermNode * apply(const EBTermNode *) const
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template cosh(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(cosh
Generic Substitution rule to replace all occurences of a given symbol node term with a user defined t...
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5)
EBTerm(const EBTerm &term)
auto min(const L &left, const R &right)
Substitution rule functor base class to perform flexible term substitutions.
void ErrorVector unsigned int
EBBinaryFuncTermNode(EBTermNode *left, EBTermNode *right, NodeType type)
EBFunction & operator()(const EBTerm &a1, const EBTerm &a2, const EBTerm &a3, const EBTerm &a4, const EBTerm &a5, const EBTerm &a6, const EBTerm &a7)
EBTermNode * cloneRoot() const
EBBinaryOpTermNode(EBTermNode *left, EBTermNode *right, NodeType type)
Base class for nodes with two sub nodes (i.e. functions or operators taking two arguments) ...
EBTerm & operator=(const EBTerm &term)