v0.15.0
Loading...
Searching...
No Matches
OpDomainResidualVector Struct Reference

Integrate the domain residual vector (RHS) More...

Inheritance diagram for OpDomainResidualVector:
[legend]
Collaboration diagram for OpDomainResidualVector:
[legend]

Public Member Functions

 OpDomainResidualVector (std::string field_name, boost::shared_ptr< MatrixDouble > field_grad_mat)
 
MoFEMErrorCode iNtegrate (EntData &data)
 

Private Attributes

boost::shared_ptr< MatrixDoublefieldGradMat
 

Detailed Description

Integrate the domain residual vector (RHS)

\[ \sum\limits_j {\left[ {\int\limits_{{\Omega _e}} {\left( {{a_n}\nabla {\phi _i} \cdot \nabla {\phi _j} - a_n^3\nabla {\phi _i}\left( {\nabla u \cdot \nabla {\phi _j}} \right)\nabla u} \right)d{\Omega _e}} } \right]\delta {U_j}} = \int\limits_{{\Omega _e}} {{\phi _i}fd{\Omega _e}} - \int\limits_{{\Omega _e}} {\nabla {\phi _i}{a_n}\nabla ud{\Omega _e}} \\ {a_n} = \frac{1}{{{{\left( {1 + {{\left| {\nabla u} \right|}^2}} \right)}^{\frac{1}{2}}}}} \]

Definition at line 118 of file minimal_surface_equation.cpp.

Constructor & Destructor Documentation

◆ OpDomainResidualVector()

OpDomainResidualVector::OpDomainResidualVector ( std::string field_name,
boost::shared_ptr< MatrixDouble > field_grad_mat )
inline

Definition at line 120 of file minimal_surface_equation.cpp.

122 : AssemblyDomainEleOp(field_name, field_name, AssemblyDomainEleOp::OPROW),
123 fieldGradMat(field_grad_mat) {}
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::OpBase AssemblyDomainEleOp
constexpr auto field_name
boost::shared_ptr< MatrixDouble > fieldGradMat

Member Function Documentation

◆ iNtegrate()

MoFEMErrorCode OpDomainResidualVector::iNtegrate ( EntData & data)
inline

Definition at line 125 of file minimal_surface_equation.cpp.

125 {
127
128 auto &nf = AssemblyDomainEleOp::locF;
129
130 // get element area
131 const double area = getMeasure();
132
133 // get number of integration points
134 const int nb_integration_points = getGaussPts().size2();
135 // get integration weights
136 auto t_w = getFTensor0IntegrationWeight();
137 // get gradient of the field at integration points
138 auto t_field_grad = getFTensor1FromMat<2>(*fieldGradMat);
139
140 // get base functions
141 auto t_base = data.getFTensor0N();
142 // get derivatives of base functions
143 auto t_diff_base = data.getFTensor1DiffN<2>();
144
145 // START THE LOOP OVER INTEGRATION POINTS TO CALCULATE LOCAL VECTOR
146 for (int gg = 0; gg != nb_integration_points; gg++) {
147
148 const double a = t_w * area;
149 const double an = 1. / std::sqrt(1 + t_field_grad(i) * t_field_grad(i));
150
151 for (int rr = 0; rr != AssemblyDomainEleOp::nbRows; rr++) {
152
153 // calculate components of the local vector
154 // remember to use -= here due to PETSc consideration of Residual Vec
155 nf[rr] += (t_diff_base(i) * t_field_grad(i)) * an * a;
156
157 // move to the next base function
158 ++t_base;
159 // move to the derivatives of the next base function
160 ++t_diff_base;
161 }
162
163 // move to the weight of the next integration point
164 ++t_w;
165 // move to the gradient of the field at the next integration point
166 ++t_field_grad;
167 }
168
170 }
constexpr double a
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
FTensor::Index< 'i', 2 > i
FTensor::Tensor1< FTensor::PackPtr< T *, S >, Tensor_Dim > getFTensor1FromMat(ublas::matrix< T, L, A > &data)
Get tensor rank 1 (vector) form data matrix.
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.

Member Data Documentation

◆ fieldGradMat

boost::shared_ptr<MatrixDouble> OpDomainResidualVector::fieldGradMat
private

Definition at line 173 of file minimal_surface_equation.cpp.


The documentation for this struct was generated from the following file: