v0.16.0
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Static Private Member Functions | List of all members
MatOps::OpMaterialFactory< HUHU, MODEL_TYPE > Struct Template Reference

#include "src/materials/MatHuHu.hpp"

Public Member Functions

 OpMaterialFactory ()=delete
 

Static Public Member Functions

template<AssemblyType A, IntegrationType I, typename DomainEleOp >
static MoFEMErrorCode opRhsFactory (MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string fe_name, std::string field_name, boost::shared_ptr< PhysicalEquations > physical_equations_ptr, Sev sev=Sev::noisy)
 
template<AssemblyType A, IntegrationType I, typename DomainEleOp >
static MoFEMErrorCode opLhsFactory (MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string fe_name, std::string field_name, boost::shared_ptr< PhysicalEquations > physical_equations_ptr, Sev sev=Sev::noisy)
 

Static Private Member Functions

template<typename DomainEleOp >
static auto getPipThis (MoFEM::Interface &m_field, boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &pip, std::string fe_name, std::string field_name, boost::shared_ptr< PhysicalEquations > physical_equations_ptr, Sev sev)
 

Detailed Description

template<int MODEL_TYPE>
struct MatOps::OpMaterialFactory< HUHU, MODEL_TYPE >

Definition at line 35 of file MatHuHu.hpp.

Constructor & Destructor Documentation

◆ OpMaterialFactory()

template<int MODEL_TYPE>
MatOps::OpMaterialFactory< HUHU, MODEL_TYPE >::OpMaterialFactory ( )
delete

Member Function Documentation

◆ getPipThis()

template<int MODEL_TYPE>
template<typename DomainEleOp >
static auto MatOps::OpMaterialFactory< HUHU, MODEL_TYPE >::getPipThis ( MoFEM::Interface m_field,
boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &  pip,
std::string  fe_name,
std::string  field_name,
boost::shared_ptr< PhysicalEquations physical_equations_ptr,
Sev  sev 
)
inlinestaticprivate

Definition at line 90 of file MatHuHu.hpp.

94 {
95
96 auto &param_vec_by_range = physical_equations_ptr->paramVecByRange;
97 // range only if parameters are set via blockset
98 auto r = boost::make_shared<Range>();
99 for (auto &p : param_vec_by_range) {
100 r->merge(p.first);
101 }
102 MOFEM_LOG("WORLD", Sev::inform) << "HuHu number of entities " << r->size();
103
104 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
105
106 auto field_structure = m_field.get_field_structure(field_name);
107 auto base = field_structure->getApproxBase();
108 auto space = field_structure->getSpace();
109
110 using DomainEle = typename parent_of<DomainEleOp>::type;
111 auto op_this = new OpLoopThis<DomainEle>(m_field, fe_name, r, sev);
112 pip.push_back(op_this);
113 auto this_fe_ptr = op_this->getThisFEPtr();
114 auto &this_pip = op_this->getOpPtrVector();
115 this_fe_ptr->getRuleHook = [](int order_row, int order_col,
116 int order_data) {
117 return 2 * (order_data - 1);
118 };
119
120 auto base_mass = boost::make_shared<MatrixDouble>();
121 auto data_l2 = boost::make_shared<EntitiesFieldData>(MBENTITYSET);
122 auto jac_ptr = boost::make_shared<MatrixDouble>();
123 auto det_ptr = boost::make_shared<VectorDouble>();
124 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
125
126 // calculate jacobian at integration points
127 this_pip.push_back(new OpCalculateHOJac<DIM>(jac_ptr));
128 // calculate jacobian at integration points
129 this_pip.push_back(new OpInvertMatrix<DIM>(jac_ptr, det_ptr, inv_jac_ptr));
130 // calculate mass matrix to project derivatives
131 this_pip.push_back(
132 new OpBaseDerivativesMass<1>(base_mass, data_l2, base, L2));
133 // calculate second derivative of base functions, i.e. hessian
134 this_pip.push_back(new OpBaseDerivativesNext<1>(
135 BaseDerivatives::SecondDerivative, base_mass, data_l2, base, space));
136
137 switch (space) {
138 case H1:
139 // push first base derivatives tp physical element shape
140 this_pip.push_back(
141 new OpSetHOInvJacToScalarBases<DIM, 1>(space, inv_jac_ptr));
142 // push second base derivatives tp physical element shape
143 this_pip.push_back(
144 new OpSetHOInvJacToScalarBases<DIM, 2>(space, inv_jac_ptr));
145 break;
146 default:
147 MOFEM_LOG("WORLD", Sev::error)
148 << "Unsupported space: " << space << " for field: " << field_name;
150 }
151
152 auto m_grad =
153 physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("grad");
154 this_pip.push_back(
155 new OpCalculateVectorFieldGradient<DIM, DIM>(field_name, m_grad));
156
157 return op_this;
158 }
ElementsAndOps< SPACE_DIM >::DomainEle DomainEle
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
@ L2
field with C-1 continuity
Definition definitions.h:88
@ H1
continuous field
Definition definitions.h:85
@ MOFEM_OPERATION_UNSUCCESSFUL
Definition definitions.h:34
virtual const Field * get_field_structure(const std::string &name, enum MoFEMTypes bh=MF_EXIST) const =0
get field structure
#define MOFEM_LOG(channel, severity)
Log.
@ MODEL_3D
Definition MatOps.hpp:181
int r
Definition sdf.py:205
constexpr auto field_name
FieldApproximationBase getApproxBase() const
Get approximation basis type.

◆ opLhsFactory()

template<int MODEL_TYPE>
template<AssemblyType A, IntegrationType I, typename DomainEleOp >
static MoFEMErrorCode MatOps::OpMaterialFactory< HUHU, MODEL_TYPE >::opLhsFactory ( MoFEM::Interface m_field,
boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &  pip,
std::string  fe_name,
std::string  field_name,
boost::shared_ptr< PhysicalEquations physical_equations_ptr,
Sev  sev = Sev::noisy 
)
inlinestatic

Definition at line 62 of file MatHuHu.hpp.

66 {
68 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
69 auto op_this = getPipThis<DomainEleOp>(m_field, pip, fe_name, field_name,
70 physical_equations_ptr, sev);
71 auto m_grad_grad = boost::make_shared<MatrixDouble>();
72 op_this->getOpPtrVector().push_back(
73 new OpCalculateVectorFieldHessian<DIM, DIM>(field_name, m_grad_grad));
74 op_this->getOpPtrVector().push_back(physical_equations_ptr->createOp(
75 physical_equations_ptr, true, true, false));
76 auto m_k = physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("k");
77 auto m_diff_k =
78 physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("k_dF");
79 op_this->getOpPtrVector().push_back(
80 new OpLhsHuHu<DIM, DIM, A, I, DomainEleOp>(field_name, m_k));
81 op_this->getOpPtrVector().push_back(
82 new OpLhsHuGrad<DIM, DIM, A, I, DomainEleOp>(field_name, m_grad_grad,
83 m_diff_k));
85 }
#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()

◆ opRhsFactory()

template<int MODEL_TYPE>
template<AssemblyType A, IntegrationType I, typename DomainEleOp >
static MoFEMErrorCode MatOps::OpMaterialFactory< HUHU, MODEL_TYPE >::opRhsFactory ( MoFEM::Interface m_field,
boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > &  pip,
std::string  fe_name,
std::string  field_name,
boost::shared_ptr< PhysicalEquations physical_equations_ptr,
Sev  sev = Sev::noisy 
)
inlinestatic

Definition at line 40 of file MatHuHu.hpp.

44 {
46 constexpr int DIM = (MODEL_TYPE == MODEL_3D) ? 3 : 2;
47 auto op_this = getPipThis<DomainEleOp>(m_field, pip, fe_name, field_name,
48 physical_equations_ptr, sev);
49 auto m_grad_grad = boost::make_shared<MatrixDouble>();
50 op_this->getOpPtrVector().push_back(
51 new OpCalculateVectorFieldHessian<DIM, DIM>(field_name, m_grad_grad));
52 op_this->getOpPtrVector().push_back(physical_equations_ptr->createOp(
53 physical_equations_ptr, true, false, false));
54 auto m_k = physical_equations_ptr->matOpsDataPtr->getCommonDataPtr("k");
55 op_this->getOpPtrVector().push_back(
56 new OpRhsHu<DIM, DIM, A, I, DomainEleOp>(field_name, m_grad_grad, m_k));
58 }

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