25 createOp(boost::shared_ptr<PhysicalEquations> physical_ptr,
bool eval_stress,
26 bool eval_tangent,
bool update)
override;
32 PetscOptionsBegin(PETSC_COMM_WORLD,
"huhu_",
"",
"none");
33 CHKERR PetscOptionsScalar(
"-K",
"Bulk modulus K",
"",
K, &
K, PETSC_NULLPTR);
40 std::string block_name =
"MAT_HUHU";
47 std::regex((boost::format(
"%s(.*)") % block_name).str()))
51 std::vector<double> block_data;
52 CHKERR m->getAttributes(block_data);
53 if (block_data.size() < 1) {
57 auto get_block_ents = [&]() {
60 m->meshset, ents,
true),
61 "can not get block entities");
68 << *
m <<
" K = " << block_data[0];
78 if (std::find(range.begin(), range.end(), ent) != range.end()) {
79 set_param_vec(
A::tAg, param_vec.size(), param_vec.data());
100 auto t_F = getFTensor2FromPtr<DIM, DIM>(
120 auto p_K = mkparam(
K);
121 ta_F(
i,
J) <<= t_F(
i,
J);
136boost::shared_ptr<PhysicalEquations>
138 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
139 return boost::make_shared<MatHuHu<3>>(mat_ops_data_ptr, tag);
143boost::shared_ptr<PhysicalEquations>
145 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
146 return boost::make_shared<MatHuHu<2>>(mat_ops_data_ptr, tag);
149template <
int DIM,
typename DomainEleOp>
153 bool eval_stress,
bool eval_tangent)
165template <
int DIM,
typename DomainEleOp>
173 int nb_integration_pts = data.
getN().size1();
174 auto *fe_ptr =
const_cast<FEMethod *
>(this->getFEMethod());
177 auto get_tag = [&]() {
178 if (physicalPtr->tagVsRangePtr) {
179 for (
const auto &tag_range_pair : *physicalPtr->tagVsRangePtr) {
180 if (tag_range_pair.second.find(ent) != tag_range_pair.second.end()) {
181 return tag_range_pair.first;
185 return physicalPtr->tAg;
188 const int current_tag = get_tag();
190 auto mat_grad_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"grad");
191 auto mat_k_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"k");
192 auto mat_k_dF_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"k_dF");
195 if (!mat_grad_ptr || !mat_k_ptr || !mat_k_dF_ptr) {
197 "Missing common data for ADOL-C evaluation");
199 if (mat_grad_ptr->size2() != DIM * DIM) {
201 "Inconsistent size of gradient matrix for ADOL-C evaluation");
203 if (mat_grad_ptr->size1() != nb_integration_pts) {
205 "Inconsistent size of gradient matrix data for ADOL-C evaluation");
210 auto get_grad_at_pts =
212 *mat_grad_ptr, nb_integration_pts);
215 *mat_k_ptr, nb_integration_pts);
216 auto get_k_dF_at_pts =
218 *mat_k_dF_ptr, nb_integration_pts);
226 auto t_grad_at_pts = get_grad_at_pts();
227 auto t_k_at_pts = get_k_at_pts();
236 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
237 auto t_F = getFTensor2FromPtr<DIM, DIM>(
238 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->data().data());
240 CHKERR physicalPtr->setParams(fe_ptr, gg);
241 CHKERR physicalPtr->evaluateVariable(current_tag, ent, gg);
243 (*physicalPtr->matOpsDataPtr->getDependentDataPtr(
"k"))(0, 0);
254 auto t_grad_at_pts = get_grad_at_pts();
255 auto t_k_dF_at_pts = get_k_dF_at_pts();
263 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
264 auto t_F = getFTensor2FromPtr<DIM, DIM>(
265 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->data().data());
267 CHKERR physicalPtr->setParams(fe_ptr, gg);
268 CHKERR physicalPtr->evaluateDerivatives(current_tag, ent, gg);
269 auto t_k_dF = getFTensor2FromPtr<DIM, DIM>(
270 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr(
"k_dF")
273 t_k_dF_at_pts(
i,
J) = t_k_dF(
i,
J);
281template <
int DIM,
typename EleOp>
283 bool eval_stress,
bool eval_tangent,
bool update) {
292 bool eval_stress,
bool eval_tangent,
bool update) {
294 return createOpImpl<3, EleOp>(physical_ptr, eval_stress, eval_tangent,
301 bool eval_stress,
bool eval_tangent,
bool update) {
303 return createOpImpl<2, EleOp>(physical_ptr, eval_stress, eval_tangent,
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
#define FTENSOR_INDEX(DIM, I)
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ MOFEM_OPERATION_UNSUCCESSFUL
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< HUHU, MODEL_2D_PLANE_STRAIN >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< HUHU, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
static EleOp * createOpImpl(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent, bool update)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasMatrix< double > MatrixDouble
implementation of Data Operators for Forces and Sources
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
decltype(GetFTensor2FromMatImpl< Tensor_Dim0, Tensor_Dim1, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor2FromMatType
constexpr IntegrationType I
FTensor::Index< 'm', 3 > m
MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr=nullptr) override
ForcesAndSourcesCore::UserDataOperator * createOp(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent, bool update) override
MoFEMErrorCode recordTape() override
PhysicalEquations()=delete
std::vector< double > defaultMaterialParameters
MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
OpEvalMatHuHuImpl(boost::shared_ptr< PhysicalEquations > physical_ptr, bool eval_stress, bool eval_tangent)
boost::shared_ptr< PhysicalEquations > physicalPtr
std::vector< std::pair< Range, std::vector< double > > > paramVecByRange
boost::shared_ptr< MatOpsData > matOpsDataPtr
PhysicalEquations()=delete
Deprecated interface functions.
Data on single entity (This is passed as argument to DataOperator::doWork)
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
const VectorInt & getIndices() const
Get global indices of degrees of freedom on entity.
Structure for user loop methods on finite elements.
EntityHandle getFEEntityHandle() const
Get the entity handle of the current finite element.
Interface for managing meshsets containing materials and boundary conditions.