IFEM  90A354
FiniteElement.h
Go to the documentation of this file.
1 // $Id$
2 //==============================================================================
12 //==============================================================================
13 
14 #ifndef _FINITE_ELEMENT_H
15 #define _FINITE_ELEMENT_H
16 
17 #include "BasisFunctionVals.h"
18 #include "ItgPoint.h"
19 #include "MatVec.h"
20 #include "Vec3.h"
21 #include "Tensor.h"
22 
23 
28 class FiniteElement : public ItgPoint
29 {
30 public:
32  explicit FiniteElement(size_t n = 0, size_t i = 0) : ItgPoint(i), N(n), Te(3)
33  { p = q = r = 0; age = h = 0.0; detJxW = 1.0; }
34 
36  virtual size_t getNoBasis() const { return 1; }
37 
39  virtual const Vector& basis(char) const { return N; }
41  virtual Vector& basis(char) { return N; }
42 
44  virtual const Matrix& grad(char) const { return dNdX; }
46  virtual const Matrix3D& hess(char) const { return d2NdX2; }
48  virtual const Matrix4D& hess2(char) const { return d3NdX3; }
49 
50 protected:
52  virtual Matrix& grad(char) { return dNdX; }
54  virtual Matrix3D& hess(char) { return d2NdX2; }
55 
57  virtual std::ostream& write(std::ostream& os) const;
58 
60  friend std::ostream& operator<<(std::ostream& os, const FiniteElement& fe)
61  {
62  return fe.write(os);
63  }
64 
65 public:
66  // Gauss point quantities
67  double detJxW;
74 
83 
94 
95  // Element quantities
96  short int p;
97  short int q;
98  short int r;
99  double age;
100  double h;
105  std::vector<Tensor> Tn;
107 };
108 
109 
115 {
116 public:
118  explicit MxFiniteElement(const std::vector<size_t>& n, size_t ip = 0);
119 
121  size_t getNoBasis() const override { return 1+M.size(); }
122 
124  const Vector& basis(char b) const override { return b < 2 ? N : M[b-2]; }
126  Vector& basis(char b) override { return b < 2 ? N : M[b-2]; }
127 
129  const Matrix& grad(char b) const override { return b < 2 ? dNdX : dMdX[b-2]; }
131  const Matrix3D& hess(char b) const override { return b < 2 ? d2NdX2 : d2MdX2[b-2]; }
133  const Matrix4D& hess2(char b) const override { return b < 2 ? d3NdX3 : d3MdX3[b-2]; }
134 
140  bool Jacobian(Matrix& Jac, const Matrix& Xnod,
141  unsigned short int gBasis,
142  const BasisValuesPtrs& bfs);
143 
154  bool Jacobian(Matrix& Jac, Vec3& n, const Matrix& Xnod,
155  unsigned short int gBasis,
156  const BasisValuesPtrs& bfs,
157  size_t t1, size_t t2, size_t nBasis = 0,
158  const Matrix* Xnod2 = nullptr);
159 
166  bool Hessian(Matrix3D& Hess, const Matrix& Jac, const Matrix& Xnod,
167  unsigned short int gBasis,
168  const BasisValuesPtrs& bfs);
169 
175  void piolaMapping (const double detJ,
176  const Matrix& Ji,
177  const Matrix& Xnod,
178  const BasisValuesPtrs& bfs);
179 
183  void piolaBasis(const double detJ, const Matrix& J);
184 
185 protected:
192  void piolaGradient(const double detJ, const Matrix& J, const Matrix& Ji,
193  const Matrix& Xnod, const BasisValuesPtrs& bfs);
194 
196  Matrix& grad(char b) override { return b < 2 ? dNdX : dMdX[b-2]; }
198  Matrix3D& hess(char b) override { return b < 2 ? d2NdX2 : d2MdX2[b-2]; }
199 
201  std::ostream& write(std::ostream& os) const override;
202 
203 private:
204  std::vector<Vector> M;
205  std::vector<Matrix> dMdX;
206  std::vector<Matrix3D> d2MdX2;
207  std::vector<Matrix4D> d3MdX3;
208 };
209 
210 #endif
Basis function values container.
std::vector< const BasisFunctionVals * > BasisValuesPtrs
Convenience type alias.
Definition: BasisFunctionVals.h:34
Integration point representation.
Global algebraic operations on index 1-based matrices and vectors.
Representation of second-order tensors with some basic operations.
Representation of a point in 3D space with some basic operations.
std::vector< Vec3 > Vec3Vec
An array of point vectors.
Definition: Vec3.h:318
Class representing a finite element.
Definition: FiniteElement.h:29
Vector N
Basis function values.
Definition: FiniteElement.h:68
virtual const Matrix4D & hess2(char) const
Returns a const reference to the basis function 3nd-derivatives.
Definition: FiniteElement.h:48
Matrix3D d2NdX2
Second derivatives of the basis functions.
Definition: FiniteElement.h:70
Vec3Vec En
Array of nodal eccentricity vectors.
Definition: FiniteElement.h:106
virtual const Matrix3D & hess(char) const
Returns a const reference to the basis function 2nd-derivatives.
Definition: FiniteElement.h:46
short int q
Polynomial order of the basis in v-direction.
Definition: FiniteElement.h:97
Tensor Te
Local-to-global element transformation matrix.
Definition: FiniteElement.h:104
Vec3Vec XC
Array with element corner coordinate vectors.
Definition: FiniteElement.h:101
virtual size_t getNoBasis() const
Returns the number of bases.
Definition: FiniteElement.h:36
Vector Navg
Volume-averaged basis function values.
Definition: FiniteElement.h:102
virtual const Vector & basis(char) const
Returns a const reference to the basis function values.
Definition: FiniteElement.h:39
short int r
Polynomial order of the basis in r-direction.
Definition: FiniteElement.h:98
double detJxW
Weighted determinant of the coordinate mapping.
Definition: FiniteElement.h:67
Matrix G
Covariant basis / Matrix used for stabilized methods.
Definition: FiniteElement.h:72
Matrix dNdX
First derivatives (gradient) of the basis functions.
Definition: FiniteElement.h:69
friend std::ostream & operator<<(std::ostream &os, const FiniteElement &fe)
Global output stream operator.
Definition: FiniteElement.h:60
virtual const Matrix & grad(char) const
Returns a const reference to the basis function derivatives.
Definition: FiniteElement.h:44
Matrix P
Matrix holding Piola-mapped basis function values.
Definition: FiniteElement.h:82
short int p
Polynomial order of the basis in u-direction.
Definition: FiniteElement.h:96
virtual Matrix3D & hess(char)
Returns a reference to the basis function 2nd-derivatives.
Definition: FiniteElement.h:54
virtual Vector & basis(char)
Returns a reference to the basis function values.
Definition: FiniteElement.h:41
double age
Time since birth of this element.
Definition: FiniteElement.h:99
FiniteElement(size_t n=0, size_t i=0)
Default constructor.
Definition: FiniteElement.h:32
Matrix dPdX
Matrix holding Piola-mapped basis derivatives.
Definition: FiniteElement.h:93
virtual std::ostream & write(std::ostream &os) const
Writes the finite element object to the given output stream.
Definition: FiniteElement.C:20
double h
Characteristic element size/diameter.
Definition: FiniteElement.h:100
virtual Matrix & grad(char)
Returns a reference to the basis function derivatives.
Definition: FiniteElement.h:52
Matrix Xn
Matrix of element nodal coordinates.
Definition: FiniteElement.h:103
Matrix H
Hessian.
Definition: FiniteElement.h:73
std::vector< Tensor > Tn
Array of element nodal rotation matrices.
Definition: FiniteElement.h:105
Matrix4D d3NdX3
Third derivatives of the basis functions.
Definition: FiniteElement.h:71
Class representing an integration point.
Definition: ItgPoint.h:25
Class representing a mixed finite element.
Definition: FiniteElement.h:115
Matrix3D & hess(char b) override
Returns a reference to the basis function 2nd-derivatives.
Definition: FiniteElement.h:198
std::vector< Matrix > dMdX
First derivatives of the basis functions.
Definition: FiniteElement.h:205
const Matrix4D & hess2(char b) const override
Returns a const reference to the basis function 3rd-derivatives.
Definition: FiniteElement.h:133
std::vector< Matrix4D > d3MdX3
Third derivatives of the basis functions.
Definition: FiniteElement.h:207
const Matrix & grad(char b) const override
Returns a const reference to the basis function derivatives.
Definition: FiniteElement.h:129
bool Jacobian(Matrix &Jac, const Matrix &Xnod, unsigned short int gBasis, const BasisValuesPtrs &bfs)
Sets up the Jacobian matrix of the coordinate mapping.
Definition: FiniteElement.C:82
std::ostream & write(std::ostream &os) const override
Writes the finite element object to the given output stream.
Definition: FiniteElement.C:61
Matrix & grad(char b) override
Returns a reference to the basis function derivatives.
Definition: FiniteElement.h:196
size_t getNoBasis() const override
Returns the number of bases.
Definition: FiniteElement.h:121
void piolaGradient(const double detJ, const Matrix &J, const Matrix &Ji, const Matrix &Xnod, const BasisValuesPtrs &bfs)
Calculates the Piola derivatives.
Definition: FiniteElement.C:208
Vector & basis(char b) override
Returns a reference to the basis function values.
Definition: FiniteElement.h:126
const Matrix3D & hess(char b) const override
Returns a const reference to the basis function 2nd-derivatives.
Definition: FiniteElement.h:131
std::vector< Vector > M
Basis function values.
Definition: FiniteElement.h:204
const Vector & basis(char b) const override
Returns a const reference to the basis function values.
Definition: FiniteElement.h:124
MxFiniteElement(const std::vector< size_t > &n, size_t ip=0)
The constructor initializes the size of each basis.
Definition: FiniteElement.C:48
bool Hessian(Matrix3D &Hess, const Matrix &Jac, const Matrix &Xnod, unsigned short int gBasis, const BasisValuesPtrs &bfs)
Sets up the Hessian matrix of the coordinate mapping.
Definition: FiniteElement.C:156
void piolaBasis(const double detJ, const Matrix &J)
Calculates the Piola basis functions.
Definition: FiniteElement.C:192
std::vector< Matrix3D > d2MdX2
Second derivatives of the basis functions.
Definition: FiniteElement.h:206
void piolaMapping(const double detJ, const Matrix &Ji, const Matrix &Xnod, const BasisValuesPtrs &bfs)
Calculates the Piola basis functions and their derivatives.
Definition: FiniteElement.C:180
Simple class for representing a non-symmetric second-order tensor.
Definition: Tensor.h:28
Simple class for representing a point in 3D space.
Definition: Vec3.h:27
A vector class with some added algebraic operations.
Definition: matrix.h:64