v0.15.0
Loading...
Searching...
No Matches
NonlinearPoissonOps::OpDomainRhs Struct Reference

#include "tutorials/scl-4/src/nonlinear_poisson_2d.hpp"

Inheritance diagram for NonlinearPoissonOps::OpDomainRhs:
[legend]
Collaboration diagram for NonlinearPoissonOps::OpDomainRhs:
[legend]

Public Member Functions

 OpDomainRhs (std::string field_name, ScalarFunc source_term_function, boost::shared_ptr< VectorDouble > field_vec, boost::shared_ptr< MatrixDouble > field_grad_mat)
 
MoFEMErrorCode iNtegrate (EntData &data)
 

Private Attributes

ScalarFunc sourceTermFunc
 
boost::shared_ptr< VectorDouble > fieldVec
 
boost::shared_ptr< MatrixDouble > fieldGradMat
 

Detailed Description

Definition at line 119 of file nonlinear_poisson_2d.hpp.

Constructor & Destructor Documentation

◆ OpDomainRhs()

NonlinearPoissonOps::OpDomainRhs::OpDomainRhs ( std::string field_name,
ScalarFunc source_term_function,
boost::shared_ptr< VectorDouble > field_vec,
boost::shared_ptr< MatrixDouble > field_grad_mat )
inline

Definition at line 121 of file nonlinear_poisson_2d.hpp.

125 : AssemblyDomainEleOp(field_name, field_name, AssemblyDomainEleOp::OPROW),
126 sourceTermFunc(source_term_function), fieldVec(field_vec),
127 fieldGradMat(field_grad_mat) {}
constexpr auto field_name
boost::shared_ptr< VectorDouble > fieldVec
boost::shared_ptr< MatrixDouble > fieldGradMat
FormsIntegrators< DomainEleOp >::Assembly< A >::OpBase AssemblyDomainEleOp

Member Function Documentation

◆ iNtegrate()

MoFEMErrorCode NonlinearPoissonOps::OpDomainRhs::iNtegrate ( EntData & data)
inline

Definition at line 129 of file nonlinear_poisson_2d.hpp.

129 {
131
132 auto &nf = AssemblyDomainEleOp::locF;
133
134
135 // get element area
136 const double area = getMeasure();
137
138 // get number of integration points
139 const int nb_integration_points = getGaussPts().size2();
140 // get integration weights
141 auto t_w = getFTensor0IntegrationWeight();
142 // get coordinates of the integration point
143 auto t_coords = getFTensor1CoordsAtGaussPts();
144 // get solution (field value) at integration point
145 auto t_field = getFTensor0FromVec(*fieldVec);
146 // get gradient of field value of integration point
147 auto t_field_grad = getFTensor1FromMat<2>(*fieldGradMat);
148
149 // get base function
150 auto t_base = data.getFTensor0N();
151 // get derivatives of base function
152 auto t_grad_base = data.getFTensor1DiffN<2>();
153
154 // START THE LOOP OVER INTEGRATION POINTS TO CALCULATE LOCAL VECTOR
155 for (int gg = 0; gg != nb_integration_points; gg++) {
156 const double a = t_w * area;
157 double body_source =
158 sourceTermFunc(t_coords(0), t_coords(1), t_coords(2));
159
160 // calculate the local vector
161 for (int rr = 0; rr != AssemblyDomainEleOp::nbRows; rr++) {
162 nf[rr] +=
163 (-t_base * body_source +
164 t_grad_base(i) * t_field_grad(i) * (1 + t_field * t_field)) *
165 a;
166
167 // move to the next base function
168 ++t_base;
169 // move to the derivatives of the next base function
170 ++t_grad_base;
171 }
172
173 // move to the weight of the next integration point
174 ++t_w;
175 // move to the coordinates of the next integration point
176 ++t_coords;
177 // move to the solution (field value) at the next integration point
178 ++t_field;
179 // move to the gradient of field value at the next integration point
180 ++t_field_grad;
181
182 }
183
185 }
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::Tensor1< FTensor::PackPtr< T *, S >, Tensor_Dim > getFTensor1FromMat(ublas::matrix< T, L, A > &data)
Get tensor rank 1 (vector) form data matrix.
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
FTensor::Index< 'i', 2 > i
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> NonlinearPoissonOps::OpDomainRhs::fieldGradMat
private

Definition at line 190 of file nonlinear_poisson_2d.hpp.

◆ fieldVec

boost::shared_ptr<VectorDouble> NonlinearPoissonOps::OpDomainRhs::fieldVec
private

Definition at line 189 of file nonlinear_poisson_2d.hpp.

◆ sourceTermFunc

ScalarFunc NonlinearPoissonOps::OpDomainRhs::sourceTermFunc
private

Definition at line 188 of file nonlinear_poisson_2d.hpp.


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