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

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

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

Public Member Functions

 OpDomainLhs (std::string row_field_name, std::string col_field_name, boost::shared_ptr< VectorDouble > field_vec, boost::shared_ptr< MatrixDouble > field_grad_mat)
 
MoFEMErrorCode iNtegrate (EntData &row_data, EntData &col_data)
 

Private Attributes

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

Detailed Description

Definition at line 39 of file nonlinear_poisson_2d.hpp.

Constructor & Destructor Documentation

◆ OpDomainLhs()

NonlinearPoissonOps::OpDomainLhs::OpDomainLhs ( std::string row_field_name,
std::string col_field_name,
boost::shared_ptr< VectorDouble > field_vec,
boost::shared_ptr< MatrixDouble > field_grad_mat )
inline

Definition at line 41 of file nonlinear_poisson_2d.hpp.

45 : AssemblyDomainEleOp(row_field_name, col_field_name,
46 DomainEleOp::OPROWCOL),
47 fieldVec(field_vec), fieldGradMat(field_grad_mat) {}
boost::shared_ptr< VectorDouble > fieldVec
boost::shared_ptr< MatrixDouble > fieldGradMat
FormsIntegrators< DomainEleOp >::Assembly< A >::OpBase AssemblyDomainEleOp

Member Function Documentation

◆ iNtegrate()

MoFEMErrorCode NonlinearPoissonOps::OpDomainLhs::iNtegrate ( EntData & row_data,
EntData & col_data )
inline

Definition at line 49 of file nonlinear_poisson_2d.hpp.

50 {
52
53 auto &locLhs = AssemblyDomainEleOp::locMat;
54
55 const int nb_row_dofs = row_data.getIndices().size();
56 const int nb_col_dofs = col_data.getIndices().size();
57 // get element area
58 const double area = getMeasure();
59
60 // get number of integration points
61 const int nb_integration_points = getGaussPts().size2();
62 // get integration weights
63 auto t_w = getFTensor0IntegrationWeight();
64 // get solution (field value) at integration points
65 auto t_field = getFTensor0FromVec(*fieldVec);
66 // get gradient of field at integration points
67 auto t_field_grad = getFTensor1FromMat<2>(*fieldGradMat);
68
69 // get base functions on row
70 auto t_row_base = row_data.getFTensor0N();
71 // get derivatives of base functions on row
72 auto t_row_diff_base = row_data.getFTensor1DiffN<2>();
73
74 // START THE LOOP OVER INTEGRATION POINTS TO CALCULATE LOCAL MATRIX
75 for (int gg = 0; gg != nb_integration_points; gg++) {
76 const double a = t_w * area;
77
78 for (int rr = 0; rr != nb_row_dofs; ++rr) {
79 // get base functions on column
80 auto t_col_base = col_data.getFTensor0N(gg, 0);
81 // get derivatives of base functions on column
82 auto t_col_diff_base = col_data.getFTensor1DiffN<2>(gg, 0);
83
84 for (int cc = 0; cc != nb_col_dofs; cc++) {
85 locLhs(rr, cc) += (((1 + t_field * t_field) * t_row_diff_base(i) *
86 t_col_diff_base(i)) +
87 (2.0 * t_field * t_field_grad(i) *
88 t_row_diff_base(i) * t_col_base)) *
89 a;
90
91 // move to the next base functions on column
92 ++t_col_base;
93 // move to the derivatives of the next base function on column
94 ++t_col_diff_base;
95 }
96
97 // move to the next base function on row
98 ++t_row_base;
99 // move to the derivatives of the next base function on row
100 ++t_row_diff_base;
101 }
102
103 // move to the weight of the next integration point
104 ++t_w;
105 // move to the solution (field value) at the next integration point
106 ++t_field;
107 // move to the gradient of field value at the next integration point
108 ++t_field_grad;
109 }
110
112 }
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.
const VectorInt & getIndices() const
Get global indices of dofs on entity.

Member Data Documentation

◆ fieldGradMat

boost::shared_ptr<MatrixDouble> NonlinearPoissonOps::OpDomainLhs::fieldGradMat
private

Definition at line 116 of file nonlinear_poisson_2d.hpp.

◆ fieldVec

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

Definition at line 115 of file nonlinear_poisson_2d.hpp.


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