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);
150boost::shared_ptr<PhysicalEquations>
152 boost::shared_ptr<MatOpsData>,
int) {
154 "HuHu is not implemented for axisymmetric models");
158template <
int DIM,
typename DomainEleOp>
162 bool eval_stress,
bool eval_tangent)
174template <
int DIM,
typename DomainEleOp>
182 int nb_integration_pts = data.
getN().size1();
183 auto *fe_ptr =
const_cast<FEMethod *
>(this->getFEMethod());
186 auto get_tag = [&]() {
187 if (physicalPtr->tagVsRangePtr) {
188 for (
const auto &tag_range_pair : *physicalPtr->tagVsRangePtr) {
189 if (tag_range_pair.second.find(ent) != tag_range_pair.second.end()) {
190 return tag_range_pair.first;
194 return physicalPtr->tAg;
197 const int current_tag = get_tag();
199 auto mat_grad_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"grad");
200 auto mat_k_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"k");
201 auto mat_k_dF_ptr = physicalPtr->matOpsDataPtr->getCommonDataPtr(
"k_dF");
204 if (!mat_grad_ptr || !mat_k_ptr || !mat_k_dF_ptr) {
206 "Missing common data for ADOL-C evaluation");
208 if (mat_grad_ptr->size2() != DIM * DIM) {
210 "Inconsistent size of gradient matrix for ADOL-C evaluation");
212 if (mat_grad_ptr->size1() != nb_integration_pts) {
214 "Inconsistent size of gradient matrix data for ADOL-C evaluation");
219 auto get_grad_at_pts =
221 *mat_grad_ptr, nb_integration_pts);
224 *mat_k_ptr, nb_integration_pts);
225 auto get_k_dF_at_pts =
227 *mat_k_dF_ptr, nb_integration_pts);
235 auto t_grad_at_pts = get_grad_at_pts();
236 auto t_k_at_pts = get_k_at_pts();
245 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
246 auto t_F = getFTensor2FromPtr<DIM, DIM>(
247 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->data().data());
249 CHKERR physicalPtr->setParams(fe_ptr, gg);
250 CHKERR physicalPtr->evaluateVariable(current_tag, ent, gg);
252 (*physicalPtr->matOpsDataPtr->getDependentDataPtr(
"k"))(0, 0);
263 auto t_grad_at_pts = get_grad_at_pts();
264 auto t_k_dF_at_pts = get_k_dF_at_pts();
272 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
273 auto t_F = getFTensor2FromPtr<DIM, DIM>(
274 physicalPtr->matOpsDataPtr->getActiveDataPtr(
"F")->data().data());
276 CHKERR physicalPtr->setParams(fe_ptr, gg);
277 CHKERR physicalPtr->evaluateDerivatives(current_tag, ent, gg);
278 auto t_k_dF = getFTensor2FromPtr<DIM, DIM>(
279 physicalPtr->matOpsDataPtr->getDependentDerivativesDataPtr(
"k_dF")
282 t_k_dF_at_pts(
i,
J) = t_k_dF(
i,
J);
290template <
int DIM,
typename EleOp>
292 bool eval_stress,
bool eval_tangent,
bool update) {
301 bool eval_stress,
bool eval_tangent,
bool update) {
303 return createOpImpl<3, EleOp>(physical_ptr, eval_stress, eval_tangent,
310 bool eval_stress,
bool eval_tangent,
bool update) {
312 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 CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#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)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< HUHU, MODEL_AXISYMMETRIC >(boost::shared_ptr< MatOpsData >, int)
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.