IFEM  90A354
Integrand.h
Go to the documentation of this file.
1 // $Id$
2 //==============================================================================
12 //==============================================================================
13 
14 #ifndef _INTEGRAND_H
15 #define _INTEGRAND_H
16 
17 #include "SIMenums.h"
18 #include <vector>
19 #include <string>
20 
21 struct TimeDomain;
22 class LocalIntegral;
23 class FiniteElement;
24 class MxFiniteElement;
25 class Vec3;
26 
27 
43 class Integrand
44 {
45 protected:
47  Integrand() {}
48 
49 public:
51  virtual ~Integrand() {}
52 
58  virtual void setNeumannOrder(char) {}
59 
61  virtual void initPatch(size_t) {}
62 
63 
64  // Element-level initialization interface
65  // ======================================
66 
71  virtual LocalIntegral* getLocalIntegral(size_t nen, size_t iEl,
72  bool neumann = false) const = 0;
82  virtual LocalIntegral* getLocalIntegral(const std::vector<size_t>& nen,
83  size_t iEl,
84  bool neumann = false) const
85  {
86  return this->getLocalIntegral(nen.front(),iEl,neumann);
87  }
88 
102  virtual bool initElement(const std::vector<int>& MNPC,
103  const FiniteElement& fe,
104  const Vec3& X0, size_t nPt,
105  LocalIntegral& elmInt) = 0;
117  virtual bool initElement(const std::vector<int>& MNPC,
118  LocalIntegral& elmInt) = 0;
124  virtual bool initElement(const std::vector<int>& MNPC,
125  const std::vector<size_t>& elem_sizes,
126  const std::vector<size_t>& basis_sizes,
127  LocalIntegral& elmInt) = 0;
134  virtual bool initElement(const std::vector<int>& MNPC,
135  const MxFiniteElement& fe,
136  const std::vector<size_t>& elem_sizes,
137  const std::vector<size_t>& basis_sizes,
138  LocalIntegral& elmInt) = 0;
139 
143  virtual bool initElementBou(const std::vector<int>& MNPC,
144  LocalIntegral& elmInt) = 0;
150  virtual bool initElementBou(const std::vector<int>& MNPC,
151  const std::vector<size_t>& elem_sizes,
152  const std::vector<size_t>& basis_sizes,
153  LocalIntegral& elmInt) = 0;
154 
155 
156  // Integrand evaluation interface
157  // ==============================
158 
160  enum Traits {
161  STANDARD = 0,
165  AVERAGE = 1<< 3,
166  ELEMENT_CORNERS = 1<< 4,
167  ELEMENT_CENTER = 1<< 5,
168  G_MATRIX = 1<< 6,
169  NODAL_ROTATIONS = 1<< 7,
170  XO_ELEMENTS = 1<< 8,
171  INTERFACE_TERMS = 1<< 9,
172  NORMAL_DERIVS = 1<<10,
173  UPDATED_NODES = 1<<11,
174  PIOLA_MAPPING = 1<<12,
176  };
177 
179  virtual SIM::SolutionMode getMode(bool = false) const = 0;
181  virtual int getIntegrandType() const { return STANDARD; }
183  virtual int getReducedIntegration(int) const { return 0; }
185  virtual int getBouIntegrationPoints(int nGP) const { return nGP; }
186 
195  virtual bool reducedInt(LocalIntegral& elmInt,
196  const FiniteElement& fe, const Vec3& X) const
197  {
198  return false;
199  }
200 
209  virtual bool evalInt(LocalIntegral& elmInt, const FiniteElement& fe,
210  const TimeDomain& time, const Vec3& X) const
211  {
212  return this->evalInt(elmInt,fe,X);
213  }
214 
224  virtual bool evalIntMx(LocalIntegral& elmInt, const MxFiniteElement& fe,
225  const TimeDomain& time, const Vec3& X) const
226  {
227  return this->evalIntMx(elmInt,fe,X);
228  }
229 
239  virtual bool evalInt(LocalIntegral& elmInt, const FiniteElement& fe,
240  const TimeDomain& time,
241  const Vec3& X, const Vec3& normal) const
242  {
243  return this->evalInt(elmInt,fe,X,normal);
244  }
245 
255  virtual bool evalIntMx(LocalIntegral& elmInt, const MxFiniteElement& fe,
256  const TimeDomain& time,
257  const Vec3& X, const Vec3& normal) const
258  {
259  return this->evalIntMx(elmInt,fe,X,normal);
260  }
261 
269  virtual bool evalPoint(LocalIntegral& elmInt, const FiniteElement& fe,
270  const Vec3& pval) { return false; }
271 
288  virtual bool finalizeElement(LocalIntegral& elmInt, const FiniteElement& fe,
289  const TimeDomain& time, size_t iGP = 0)
290  {
291  return this->finalizeElement(elmInt,time,iGP);
292  }
293 
305  virtual bool finalizeElementBou(LocalIntegral& elmInt,
306  const FiniteElement& fe,
307  const TimeDomain& time)
308  {
309  return true;
310  }
311 
321  virtual bool evalBou(LocalIntegral& elmInt, const FiniteElement& fe,
322  const TimeDomain& time,
323  const Vec3& X, const Vec3& normal) const
324  {
325  return this->evalBou(elmInt,fe,X,normal);
326  }
327 
338  virtual bool evalBouMx(LocalIntegral& elmInt, const MxFiniteElement& fe,
339  const TimeDomain& time,
340  const Vec3& X, const Vec3& normal) const
341  {
342  return this->evalBouMx(elmInt,fe,X,normal);
343  }
344 
345 protected:
347  virtual bool evalInt(LocalIntegral&, const FiniteElement& fe,
348  const Vec3&) const { return false; }
350  virtual bool evalIntMx(LocalIntegral&, const MxFiniteElement& fe,
351  const Vec3&) const { return false; }
353  virtual bool evalInt(LocalIntegral&, const FiniteElement& fe,
354  const Vec3&, const Vec3&) const { return false; }
356  virtual bool evalIntMx(LocalIntegral&, const MxFiniteElement& fe,
357  const Vec3&, const Vec3&) const { return false; }
358 
360  virtual bool evalBou(LocalIntegral&, const FiniteElement&,
361  const Vec3&, const Vec3&) const { return false; }
363  virtual bool evalBouMx(LocalIntegral&, const MxFiniteElement&,
364  const Vec3&, const Vec3&) const { return false; }
365 
371  virtual bool finalizeElement(LocalIntegral& elmInt, const TimeDomain&, size_t)
372  {
373  return this->finalizeElement(elmInt);
374  }
378  virtual bool finalizeElement(LocalIntegral&) { return true; }
379 
380 public:
382  virtual void setParam(const std::string&, double) {}
384  virtual void setParam(const std::string&, const Vec3&) {}
385 };
386 
387 #endif
Various enums for simulation scope.
Class representing a finite element.
Definition: FiniteElement.h:29
Abstract base class representing a system level integrated quantity.
Definition: Integrand.h:44
virtual bool initElement(const std::vector< int > &MNPC, const MxFiniteElement &fe, const std::vector< size_t > &elem_sizes, const std::vector< size_t > &basis_sizes, LocalIntegral &elmInt)=0
Initializes current element for numerical integration (mixed).
virtual bool evalIntMx(LocalIntegral &elmInt, const MxFiniteElement &fe, const TimeDomain &time, const Vec3 &X, const Vec3 &normal) const
Evaluates the integrand at an element interface point.
Definition: Integrand.h:255
virtual bool finalizeElement(LocalIntegral &)
Finalizes the element quantities after the numerical integration.
Definition: Integrand.h:378
virtual LocalIntegral * getLocalIntegral(size_t nen, size_t iEl, bool neumann=false) const =0
Returns a local integral contribution object for the given element.
virtual bool evalBou(LocalIntegral &elmInt, const FiniteElement &fe, const TimeDomain &time, const Vec3 &X, const Vec3 &normal) const
Evaluates the integrand at a boundary point.
Definition: Integrand.h:321
virtual bool evalInt(LocalIntegral &elmInt, const FiniteElement &fe, const TimeDomain &time, const Vec3 &X) const
Evaluates the integrand at an interior point.
Definition: Integrand.h:209
virtual bool evalInt(LocalIntegral &, const FiniteElement &fe, const Vec3 &, const Vec3 &) const
Evaluates the integrand at interface points, stationary problems.
Definition: Integrand.h:353
virtual bool evalInt(LocalIntegral &, const FiniteElement &fe, const Vec3 &) const
Evaluates the integrand at interior points for stationary problems.
Definition: Integrand.h:347
virtual void setNeumannOrder(char)
Defines the Neumann order that is the subject of integration.
Definition: Integrand.h:58
virtual bool finalizeElement(LocalIntegral &elmInt, const TimeDomain &, size_t)
Finalizes the element quantities after the numerical integration.
Definition: Integrand.h:371
virtual bool finalizeElementBou(LocalIntegral &elmInt, const FiniteElement &fe, const TimeDomain &time)
Finalizes the element quantities after boundary integration.
Definition: Integrand.h:305
virtual bool initElementBou(const std::vector< int > &MNPC, const std::vector< size_t > &elem_sizes, const std::vector< size_t > &basis_sizes, LocalIntegral &elmInt)=0
Initializes current element for boundary integration (mixed).
virtual bool finalizeElement(LocalIntegral &elmInt, const FiniteElement &fe, const TimeDomain &time, size_t iGP=0)
Finalizes the element quantities after the numerical integration.
Definition: Integrand.h:288
virtual bool reducedInt(LocalIntegral &elmInt, const FiniteElement &fe, const Vec3 &X) const
Evaluates reduced integration terms at an interior point.
Definition: Integrand.h:195
virtual LocalIntegral * getLocalIntegral(const std::vector< size_t > &nen, size_t iEl, bool neumann=false) const
Returns a local integral contribution object for the given element.
Definition: Integrand.h:82
virtual bool evalIntMx(LocalIntegral &elmInt, const MxFiniteElement &fe, const TimeDomain &time, const Vec3 &X) const
Evaluates the integrand at an interior point.
Definition: Integrand.h:224
virtual int getReducedIntegration(int) const
Returns the number of reduced-order integration points.
Definition: Integrand.h:183
virtual bool initElementBou(const std::vector< int > &MNPC, LocalIntegral &elmInt)=0
Initializes current element for boundary integration.
virtual SIM::SolutionMode getMode(bool=false) const =0
Returns current solution mode.
virtual void setParam(const std::string &, double)
Assigns a parameter value to property functions of the integrand.
Definition: Integrand.h:382
virtual void setParam(const std::string &, const Vec3 &)
Assigns parameter values to property functions of the integrand.
Definition: Integrand.h:384
virtual bool initElement(const std::vector< int > &MNPC, const FiniteElement &fe, const Vec3 &X0, size_t nPt, LocalIntegral &elmInt)=0
Initializes current element for numerical integration.
virtual bool evalIntMx(LocalIntegral &, const MxFiniteElement &fe, const Vec3 &) const
Evaluates the integrand at interior points for stationary problems.
Definition: Integrand.h:350
virtual bool evalIntMx(LocalIntegral &, const MxFiniteElement &fe, const Vec3 &, const Vec3 &) const
Evaluates the integrand at interface points, stationary problems.
Definition: Integrand.h:356
virtual bool initElement(const std::vector< int > &MNPC, LocalIntegral &elmInt)=0
Initializes current element for numerical integration.
virtual int getBouIntegrationPoints(int nGP) const
Returns the number of boundary integration points.
Definition: Integrand.h:185
Integrand()
The default constructor is protected to allow sub-classes only.
Definition: Integrand.h:47
virtual bool evalPoint(LocalIntegral &elmInt, const FiniteElement &fe, const Vec3 &pval)
Evaluates the dirac-delta integrand at a specified point.
Definition: Integrand.h:269
virtual bool evalBouMx(LocalIntegral &, const MxFiniteElement &, const Vec3 &, const Vec3 &) const
Evaluates the integrand at boundary points for stationary problems.
Definition: Integrand.h:363
virtual bool evalBouMx(LocalIntegral &elmInt, const MxFiniteElement &fe, const TimeDomain &time, const Vec3 &X, const Vec3 &normal) const
Evaluates the integrand at a boundary point.
Definition: Integrand.h:338
virtual bool evalBou(LocalIntegral &, const FiniteElement &, const Vec3 &, const Vec3 &) const
Evaluates the integrand at boundary points for stationary problems.
Definition: Integrand.h:360
virtual int getIntegrandType() const
Defines which FE quantities are needed by the integrand.
Definition: Integrand.h:181
virtual ~Integrand()
Empty destructor.
Definition: Integrand.h:51
virtual void initPatch(size_t)
Define the index of the patch being processed.
Definition: Integrand.h:61
virtual bool evalInt(LocalIntegral &elmInt, const FiniteElement &fe, const TimeDomain &time, const Vec3 &X, const Vec3 &normal) const
Evaluates the integrand at an element interface point.
Definition: Integrand.h:239
Traits
Enum defining the additional terms that an Integrand may require.
Definition: Integrand.h:160
@ AVERAGE
Integrand wants basis function averages.
Definition: Integrand.h:165
@ G_MATRIX
Integrand wants the G matrix.
Definition: Integrand.h:168
@ PIOLA_MAPPING
Integrand wants Piola mapping.
Definition: Integrand.h:174
@ THIRD_DERIVATIVES
Integrand wants third derivatives.
Definition: Integrand.h:164
@ XO_ELEMENTS
Integrand uses extraordinary elements.
Definition: Integrand.h:170
@ STANDARD
Default integrand type (first derivatives only)
Definition: Integrand.h:161
@ UPDATED_NODES
Integrand wants updated nodal coordinates.
Definition: Integrand.h:173
@ POINT_DEFORMATION
Integrand wants point-wise deformation.
Definition: Integrand.h:175
@ ELEMENT_CORNERS
Integrand wants element corner coordinates.
Definition: Integrand.h:166
@ NORMAL_DERIVS
Integrand uses p-order normal derivatives.
Definition: Integrand.h:172
@ SECOND_DERIVATIVES
Integrand wants second derivatives.
Definition: Integrand.h:163
@ ELEMENT_CENTER
Integrand wants element center coordinates.
Definition: Integrand.h:167
@ NODAL_ROTATIONS
Integrand wants nodal rotation tensors.
Definition: Integrand.h:169
@ INTERFACE_TERMS
Integrand has element interface terms.
Definition: Integrand.h:171
@ NO_DERIVATIVES
Integrand don't want any derivatives.
Definition: Integrand.h:162
virtual bool initElement(const std::vector< int > &MNPC, const std::vector< size_t > &elem_sizes, const std::vector< size_t > &basis_sizes, LocalIntegral &elmInt)=0
Initializes current element for numerical integration (mixed).
Abstract base class representing an element level integrated quantity.
Definition: LocalIntegral.h:25
Class representing a mixed finite element.
Definition: FiniteElement.h:115
Simple class for representing a point in 3D space.
Definition: Vec3.h:27
SolutionMode
Enum defining the various solution modes that may occur.
Definition: SIMenums.h:31
Struct representing the time domain.
Definition: TimeDomain.h:23