https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
20using namespace libMesh;
21
48{
49public:
51
52 // forward delcarations
53 class EBTerm;
54 class EBTermNode;
55 class EBFunction;
56 class EBSubstitutionRule;
57 typedef std::vector<EBTerm> EBTermList;
58 typedef std::vector<EBTermNode *> EBTermNodeList;
59 typedef std::vector<const EBSubstitutionRule *> EBSubstitutionRuleList;
60
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
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:
152
154 {
155 }
156 virtual EBUnaryFuncTermNode * clone() const
157 {
158 return new EBUnaryFuncTermNode(_subnode->clone(), _type);
159 };
160
161 virtual std::string stringify() const;
162 virtual int precedence() const { return 2; }
163 };
164
167 {
168 public:
170 {
174
175 EBUnaryOpTermNode(EBTermNode * subnode, NodeType type) : EBUnaryTermNode(subnode), _type(type)
176 {
177 }
178 virtual EBUnaryOpTermNode * clone() const
179 {
180 return new EBUnaryOpTermNode(_subnode->clone(), _type);
181 };
182
183 virtual std::string stringify() const;
184 virtual int precedence() const { return 3; }
185 };
186
189 {
190 public:
191 EBBinaryTermNode(EBTermNode * left, EBTermNode * right) : _left(left), _right(right) {}
193 {
194 delete _left;
195 delete _right;
196 };
197
198 virtual unsigned int substitute(const EBSubstitutionRuleList & rule);
199
200 protected:
203 };
204
207 {
208 public:
224
226 : EBBinaryTermNode(left, right), _type(type)
227 {
228 }
229 virtual EBBinaryOpTermNode * clone() const
230 {
231 return new EBBinaryOpTermNode(_left->clone(), _right->clone(), _type);
232 };
233
234 virtual std::string stringify() const;
235 virtual int precedence() const;
236
237 protected:
239 };
240
243 {
244 public:
253
255 : EBBinaryTermNode(left, right), _type(type)
256 {
257 }
258 virtual EBBinaryFuncTermNode * clone() const
259 {
260 return new EBBinaryFuncTermNode(_left->clone(), _right->clone(), _type);
261 };
262
263 virtual std::string stringify() const;
264 virtual int precedence() const { return 2; }
265 };
266
269 {
270 public:
272 : EBBinaryTermNode(left, right), _middle(middle)
273 {
274 }
275 virtual ~EBTernaryTermNode() { delete _middle; };
276
277 virtual unsigned int substitute(const EBSubstitutionRuleList & rule);
278
279 protected:
281 };
282
285 {
286 public:
288 {
291
293 : EBTernaryTermNode(left, middle, right), _type(type)
294 {
295 }
296 virtual EBTernaryFuncTermNode * clone() const
297 {
299 };
300
301 virtual std::string stringify() const;
302 virtual int precedence() const { return 2; }
303 };
304
309 {
310 public:
311 virtual EBTermNode * apply(const EBTermNode *) const = 0;
313 };
314
318 template <class Node_T>
320 {
321 public:
322 virtual EBTermNode * apply(const EBTermNode *) const;
323
324 protected:
325 // on successful substitution this returns a new node to replace the old one, otherwise it
326 // returns NULL
327 virtual EBTermNode * substitute(const Node_T &) const = 0;
328 };
329
334 class EBTermSubstitution : public EBSubstitutionRuleTyped<EBSymbolNode>
335 {
336 public:
337 EBTermSubstitution(const EBTerm & find, const EBTerm & replace);
338 virtual ~EBTermSubstitution() { delete _replace; }
339
340 protected:
341 virtual EBTermNode * substitute(const EBSymbolNode &) const;
342 std::string _find;
344 };
345
350 class EBLogPlogSubstitution : public EBSubstitutionRuleTyped<EBUnaryFuncTermNode>
351 {
352 public:
353 EBLogPlogSubstitution(const EBTerm & epsilon) : _epsilon(epsilon.cloneRoot())
354 {
355 mooseAssert(_epsilon != NULL, "Epsilon must not be an empty term in EBLogPlogSubstitution");
356 }
357 virtual ~EBLogPlogSubstitution() { delete _epsilon; }
358
359 protected:
360 virtual EBTermNode * substitute(const EBUnaryFuncTermNode &) const;
362 };
363
370 class EBTerm
371 {
372 public:
373 // the default constructor assigns a temporary id node to root we use the address of the
374 // current EBTerm object as the ID. This could be problematic if we create and destroy terms,
375 // but then we should not expect the substitution to do sane things anyways.
376 __attribute__((noinline)) EBTerm()
377 : _root(new EBTempIDNode(reinterpret_cast<unsigned long long>(this)))
378 {
379 }
380
381 EBTerm(const EBTerm & term) : _root(term.cloneRoot()) {}
382 ~EBTerm() { delete _root; };
383
384 private:
385 // construct a term from a node
386 EBTerm(EBTermNode * root) : _root(root) {}
387
388 public:
389 // construct from number or string
390 EBTerm(int number) : _root(new EBNumberNode<int>(number)) {}
391 EBTerm(Real number) : _root(new EBNumberNode<Real>(number)) {}
392 EBTerm(const char * symbol) : _root(new EBSymbolNode(symbol)) {}
393
394 // concatenate terms to form a parameter list with (()) syntax (those need to be out-of-class!)
396 const ExpressionBuilder::EBTerm & rarg);
398 const ExpressionBuilder::EBTermList & rargs);
400 const ExpressionBuilder::EBTerm & rarg);
401
402 // dump term as FParser expression
403 friend std::ostream & operator<<(std::ostream & os, const EBTerm & term);
404 // cast into a string
405 operator std::string() const { return _root->stringify(); }
406
407 // assign a term
408 EBTerm & operator=(const EBTerm & term)
409 {
410 delete _root;
411 _root = term.cloneRoot();
412 return *this;
413 }
414
415 // perform a substitution (returns substituton count)
416 unsigned int substitute(const EBSubstitutionRule & rule);
417 unsigned int substitute(const EBSubstitutionRuleList & rules);
418
419 const EBTermNode * getRoot() const { return _root; }
420 EBTermNode * cloneRoot() const { return _root == NULL ? NULL : _root->clone(); }
421
422 protected:
424
425 public:
429#define UNARY_OP_IMPLEMENT(op, OP) \
430 EBTerm operator op() const \
431 { \
432 mooseAssert(_root != NULL, "Empty term provided for unary operator " #op); \
433 return EBTerm(new EBUnaryOpTermNode(cloneRoot(), EBUnaryOpTermNode::OP)); \
434 }
436 UNARY_OP_IMPLEMENT(!, LOGICNOT)
437
438
441 friend EBTerm sin(const EBTerm &);
442 friend EBTerm cos(const EBTerm &);
443 friend EBTerm tan(const EBTerm &);
444 friend EBTerm abs(const EBTerm &);
445 friend EBTerm log(const EBTerm &);
446 friend EBTerm log2(const EBTerm &);
447 friend EBTerm log10(const EBTerm &);
448 friend EBTerm exp(const EBTerm &);
449 friend EBTerm sinh(const EBTerm &);
450 friend EBTerm cosh(const EBTerm &);
451 friend EBTerm tanh(const EBTerm &);
452
453/*
454 * Binary operators (including number,term operations)
455 */
456#define BINARY_OP_IMPLEMENT(op, OP) \
457 EBTerm operator op(const EBTerm & term) const \
458 { \
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)); \
462 } \
463 friend EBTerm operator op(int left, const EBTerm & right) \
464 { \
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)); \
468 } \
469 friend EBTerm operator op(Real left, const EBTerm & right) \
470 { \
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)); \
474 } \
475 friend EBTerm operator op(const EBFunction & left, const EBTerm & right) \
476 { \
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)); \
481 } \
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);
486 BINARY_OP_IMPLEMENT(-, SUB)
487 BINARY_OP_IMPLEMENT(*, MUL)
489 BINARY_OP_IMPLEMENT(%, MOD)
491 BINARY_OP_IMPLEMENT(>, GREATER)
493 BINARY_OP_IMPLEMENT(>=, GREATEREQ)
495 BINARY_OP_IMPLEMENT(!=, NOTEQ)
496
497/*
498 * Compound assignment operators
499 */
500#define BINARYCOMP_OP_IMPLEMENT(op, OP) \
501 EBTerm & operator op(const EBTerm & term) \
502 { \
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); \
508 return *this; \
509 }
515
520 friend EBTerm min(const EBTerm &, const EBTerm &);
521 friend EBTerm max(const EBTerm &, const EBTerm &);
522 friend EBTerm pow(const EBTerm &, const EBTerm &);
523 template <typename T>
524 friend EBTerm pow(const EBTerm &, T exponent);
525 friend EBTerm atan2(const EBTerm &, const EBTerm &);
526 friend EBTerm hypot(const EBTerm &, const EBTerm &);
527 friend EBTerm plog(const EBTerm &, const EBTerm &);
529
533 friend EBTerm conditional(const EBTerm &, const EBTerm &, const EBTerm &);
534 };
535
538 {
539 public:
541
545 EBFunction & operator()(const EBTerm & arg);
546 EBFunction & operator()(const EBTermList & args);
548
551 EBFunction & operator()(const EBTerm & a1, const EBTerm & a2) { return (*this)((a1, a2)); }
552 EBFunction & operator()(const EBTerm & a1, const EBTerm & a2, const EBTerm & a3)
553 {
554 return (*this)((a1, a2, a3));
555 }
556 EBFunction &
557 operator()(const EBTerm & a1, const EBTerm & a2, const EBTerm & a3, const EBTerm & a4)
558 {
559 return (*this)((a1, a2, a3, a4));
560 }
562 const EBTerm & a2,
563 const EBTerm & a3,
564 const EBTerm & a4,
565 const EBTerm & a5)
566 {
567 return (*this)((a1, a2, a3, a4, a5));
568 }
570 const EBTerm & a2,
571 const EBTerm & a3,
572 const EBTerm & a4,
573 const EBTerm & a5,
574 const EBTerm & a6)
575 {
576 return (*this)((a1, a2, a3, a4, a5, a6));
577 }
579 const EBTerm & a2,
580 const EBTerm & a3,
581 const EBTerm & a4,
582 const EBTerm & a5,
583 const EBTerm & a6,
584 const EBTerm & a7)
585 {
586 return (*this)((a1, a2, a3, a4, a5, a6, a7));
587 }
589 const EBTerm & a2,
590 const EBTerm & a3,
591 const EBTerm & a4,
592 const EBTerm & a5,
593 const EBTerm & a6,
594 const EBTerm & a7,
595 const EBTerm & a8)
596 {
597 return (*this)((a1, a2, a3, a4, a5, a6, a7, a8));
598 }
600 const EBTerm & a2,
601 const EBTerm & a3,
602 const EBTerm & a4,
603 const EBTerm & a5,
604 const EBTerm & a6,
605 const EBTerm & a7,
606 const EBTerm & a8,
607 const EBTerm & a9)
608 {
609 return (*this)((a1, a2, a3, a4, a5, a6, a7, a8, a9));
610 }
612
614 operator EBTerm() const;
615
617 operator std::string() const;
618
621 EBFunction & operator=(const EBTerm &);
624
626 std::string args();
627
630 EBTerm operator-() { return -EBTerm(*this); }
631 EBTerm operator!() { return !EBTerm(*this); }
633
634 // perform a substitution (returns substituton count)
635 unsigned int substitute(const EBSubstitutionRule & rule);
636 unsigned int substitute(const EBSubstitutionRuleList & rules);
637
638 protected:
643
644 // underlying term that the _eval_arguments are substituted in
646 };
647
648/*
649 * Binary operators
650 */
651#define BINARYFUNC_OP_IMPLEMENT(op, OP) \
652 friend EBTerm operator op(const EBFunction & left, const EBFunction & right) \
653 { \
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)); \
659 } \
660 friend EBTerm operator op(int left, const EBFunction & right) \
661 { \
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)); \
666 } \
667 friend EBTerm operator op(Real left, const EBFunction & right) \
668 { \
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)); \
673 }
680 BINARYFUNC_OP_IMPLEMENT(>, GREATER)
682 BINARYFUNC_OP_IMPLEMENT(>=, GREATEREQ)
684 BINARYFUNC_OP_IMPLEMENT(!=, NOTEQ)
685};
686
687// convenience function for numeric exponent
688template <typename T>
697
698// convert a number node into a string
699template <typename T>
700std::string
702{
703 std::ostringstream s;
704 s << std::setprecision(12) << _value;
705 return s.str();
706}
707
708template <class Node_T>
711 const ExpressionBuilder::EBTermNode * node) const
712{
713 const Node_T * match_node = dynamic_cast<const Node_T *>(node);
714 if (match_node == NULL)
715 return NULL;
716 else
717 return substitute(*match_node);
718}
const double T
void ErrorVector unsigned int
Node representing a function with two arguments.
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.
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 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 ...
virtual EBTermNode * substitute(const EBUnaryFuncTermNode &) const
Template class for leaf nodes holding numbers in the expression tree.
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
Template class for leaf nodes holding symbols (i.e. variables) in the expression tree.
virtual EBSymbolNode * clone() const
virtual std::string stringify() const
Template class for leaf nodes holding anonymous IDs in the expression tree.
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
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 &)
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)
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
EBTernaryFuncTermNode(EBTermNode *left, EBTermNode *middle, EBTermNode *right, NodeType type)
enum ExpressionBuilder::EBTernaryFuncTermNode::NodeType _type
Base class for nodes with two sub nodes (i.e. functions or operators taking two arguments)
virtual unsigned int substitute(const EBSubstitutionRuleList &rule)
EBTernaryTermNode(EBTermNode *left, EBTermNode *middle, EBTermNode *right)
Node representing a function with two arguments.
virtual std::string stringify() const
enum ExpressionBuilder::EBUnaryFuncTermNode::NodeType _type
virtual EBUnaryFuncTermNode * clone() const
EBUnaryFuncTermNode(EBTermNode *subnode, NodeType type)
Node representing a unary operator.
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)
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