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

Integrate the domain tangent matrix (LHS) More...

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

Public Member Functions

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

Private Attributes

boost::shared_ptr< MatrixDoublefieldGradMat
 

Detailed Description

Integrate the domain tangent matrix (LHS)

\[ \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 40 of file minimal_surface_equation.cpp.

Constructor & Destructor Documentation

◆ OpDomainTangentMatrix()

OpDomainTangentMatrix::OpDomainTangentMatrix ( std::string row_field_name,
std::string col_field_name,
boost::shared_ptr< MatrixDouble > field_grad_mat )
inline

Definition at line 42 of file minimal_surface_equation.cpp.

44 : AssemblyDomainEleOp(row_field_name, col_field_name,
45 DomainEleOp::OPROWCOL),
46 fieldGradMat(field_grad_mat) {}
FormsIntegrators< DomainEleOp >::Assembly< PETSC >::OpBase AssemblyDomainEleOp
boost::shared_ptr< MatrixDouble > fieldGradMat

Member Function Documentation

◆ iNtegrate()

MoFEMErrorCode OpDomainTangentMatrix::iNtegrate ( EntData & row_data,
EntData & col_data )
inline

Definition at line 48 of file minimal_surface_equation.cpp.

48 {
50
51 auto &locLhs = AssemblyDomainEleOp::locMat;
52
53 // get element area
54 const double area = getMeasure();
55
56 // get number of integration points
57 const int nb_integration_points = getGaussPts().size2();
58 // get integration weights
59 auto t_w = getFTensor0IntegrationWeight();
60 // get gradient of the field at integration points
61 auto t_field_grad = getFTensor1FromMat<2>(*fieldGradMat);
62
63 // get derivatives of base functions on row
64 auto t_row_diff_base = row_data.getFTensor1DiffN<2>();
65
66 // START THE LOOP OVER INTEGRATION POINTS TO CALCULATE LOCAL MATRIX
67 for (int gg = 0; gg != nb_integration_points; gg++) {
68
69 const double a = t_w * area;
70 const double an = 1. / std::sqrt(1 + t_field_grad(i) * t_field_grad(i));
71
72 for (int rr = 0; rr != AssemblyDomainEleOp::nbRows; ++rr) {
73 // get derivatives of base functions on column
74 auto t_col_diff_base = col_data.getFTensor1DiffN<2>(gg, 0);
75
76 for (int cc = 0; cc != AssemblyDomainEleOp::nbRows; cc++) {
77
78 // calculate components of the local matrix
79 locLhs(rr, cc) += (t_row_diff_base(i) * t_col_diff_base(i)) * an * a -
80 t_row_diff_base(i) *
81 (t_field_grad(i) * t_col_diff_base(i)) *
82 t_field_grad(i) * an * an * an * a;
83
84 // move to the derivatives of the next base functions on column
85 ++t_col_diff_base;
86 }
87
88 // move to the derivatives of the next base functions on row
89 ++t_row_diff_base;
90 }
91
92 // move to the weight of the next integration point
93 ++t_w;
94 // move to the gradient of the field at the next integration point
95 ++t_field_grad;
96 }
97
99 }
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.

Member Data Documentation

◆ fieldGradMat

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

Definition at line 102 of file minimal_surface_equation.cpp.


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