16 static constexpr auto blockLogTag =
"MatBlock for Neohookean";
21 static constexpr auto defaultLogTag =
"Default Topo Neohookean parameters:";
22 static constexpr auto blockLogTag =
"MatBlock for Topo Neohookean";
36 PetscOptionsBegin(PETSC_COMM_WORLD, Options::optionsPrefix,
"",
"none");
37 CHKERR PetscOptionsScalar(
"-c10",
"C10",
"",
C10, &
C10, PETSC_NULLPTR);
38 CHKERR PetscOptionsScalar(
"-K",
"Bulk modulus K",
"",
K, &
K, PETSC_NULLPTR);
42 <<
" C10 = " <<
C10 <<
" K = " <<
K;
45 std::string block_name =
"MAT_NEOHOOKEAN";
49 m_field_ptr->getInterface<MeshsetsManager>()->
52 std::regex((boost::format(
"%s(.*)") % block_name).str()))
56 std::vector<double> block_data;
57 CHKERR m->getAttributes(block_data);
58 if (block_data.size() < 2) {
60 "Expected that block has two attribute");
62 auto get_block_ents = [&]() {
65 m->meshset, ents,
true),
66 "can not get block entities");
70 A::paramVecByRange.push_back(
71 {get_block_ents(), {block_data[0], block_data[1]}});
74 << *
m <<
" C10 = " << block_data[0] <<
" K = " << block_data[1];
93 const auto ent = fe_ptr->getFEEntityHandle();
95 if (std::find(range.begin(), range.end(), ent) != range.end()) {
96 set_param_vec(
A::tAg, param_vec.size(), param_vec.data());
101 this->defaultMaterialParameters.data());
119 auto t_F = getFTensor2FromPtr<DIM, DIM>(
121 auto t_P = getFTensor2FromPtr<DIM, DIM>(
140 auto p_c10 = mkparam(this->
C10);
141 auto p_K = mkparam(this->
K);
143 ta_F(
i,
J) <<= t_F(
i,
J);
149 det_aF = determinantTensor(ta_F);
150 CHKERR invertTensor(ta_F, det_aF, ta_invF);
152 ta_P(
i,
I) = 2. * p_c10 * (ta_F(
i,
I) - ta_invF(
i,
I)) +
153 p_K * log(det_aF) * ta_invF(
i,
I);
155 ta_P(
i,
I) >>= t_P(
i,
I);
172 std::vector<double> adolc_c_param_vec;
175 adolc_c_param_vec.reserve(grad->size2() + var_grad->size2() +
178 for (
auto cc = 0; cc < grad->size2(); ++cc) {
179 adolc_c_param_vec.push_back((*grad)(gg, cc));
181 for (
auto cc = 0; cc < var_grad->size2(); ++cc) {
182 adolc_c_param_vec.push_back((*var_grad)(gg, cc));
184 const auto ent = fe_ptr->getFEEntityHandle();
186 if (std::find(range.begin(), range.end(), ent) != range.end()) {
187 adolc_c_param_vec.insert(adolc_c_param_vec.end(), param_vec.begin(),
189 set_param_vec(
A::tAg, adolc_c_param_vec.size(),
190 adolc_c_param_vec.data());
194 adolc_c_param_vec.insert(adolc_c_param_vec.end(),
195 this->defaultMaterialParameters.begin(),
196 this->defaultMaterialParameters.end());
197 set_param_vec(
A::tAg, adolc_c_param_vec.size(), adolc_c_param_vec.data());
210 MatrixDouble(DIM, DIM));
212 auto t_jac = getFTensor2FromPtr<DIM, DIM>(
234 for (
int ii = 0; ii < DIM; ++ii) {
235 for (
int JJ = 0; JJ < DIM; ++JJ) {
236 tp_F(ii, JJ) = mkparam(0.);
239 for (
int ii = 0; ii < DIM; ++ii) {
240 for (
int JJ = 0; JJ < DIM; ++JJ) {
241 tp_var_F(ii, JJ) = mkparam(0.);
244 auto p_c10 = mkparam(this->
C10);
245 auto p_K = mkparam(this->
K);
250 ta_jac(
i,
J) <<= t_jac(
i,
J);
251 det = determinantTensor(ta_jac);
254 ta_F(
i,
J) = ta_jac(
J,
K) * tp_F(
i,
K);
259 det_aF = determinantTensor(ta_F);
260 CHKERR invertTensor(ta_F, det_aF, ta_invF);
261 ta_P(
i,
I) = 2. * p_c10 * (ta_F(
i,
I) - ta_invF(
i,
I)) +
262 p_K * log(det_aF) * ta_invF(
i,
I);
263 ta_obj = det * ta_P(
i,
I) * ta_jac(
I,
K) * tp_var_F(
i,
K);
274boost::shared_ptr<PhysicalEquations>
276 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
277 return boost::make_shared<MatNeohookean<3>>(mat_ops_data_ptr, tag);
281boost::shared_ptr<PhysicalEquations>
283 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
284 return boost::make_shared<MatNeohookean<2>>(mat_ops_data_ptr, tag);
288boost::shared_ptr<PhysicalEquations>
290 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
291 return boost::make_shared<TopoDerivativeMatElasticImpl<3>>(mat_ops_data_ptr,
296boost::shared_ptr<PhysicalEquations>
299 boost::shared_ptr<MatOpsData> mat_ops_data_ptr,
int tag) {
300 return boost::make_shared<TopoDerivativeMatElasticImpl<2>>(mat_ops_data_ptr,
#define MOFEM_TAG_AND_LOG(channel, severity, tag)
Tag and log in channel.
#define FTENSOR_INDEXES(DIM,...)
#define FTENSOR_INDEX(DIM, I)
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#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_DATA_INCONSISTENCY
#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
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::NEOHOOKEAN, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::TOPO_NEOHOOKEAN, MODEL_3D >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
boost::shared_ptr< PhysicalEquations > createMatOpsPhysicalEquationsPtr< ELASTICITY::NEOHOOKEAN, MODEL_2D_PLANE_STRAIN >(boost::shared_ptr< MatOpsData > mat_ops_data_ptr, int tag)
constexpr IntegrationType I
FTensor::Index< 'm', 3 > m
static bool useDeformationGradient
std::vector< double > defaultMaterialParameters
MoFEMErrorCode getOptions(MoFEM::Interface *m_field_ptr=nullptr) override
static constexpr auto defaultLogTag
static constexpr auto blockLogTag
static constexpr auto optionsPrefix
MoFEMErrorCode recordTape() override
MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override
std::vector< std::pair< Range, std::vector< double > > > paramVecByRange
boost::shared_ptr< MatOpsData > matOpsDataPtr
MoFEMErrorCode setParams(FEMethod *fe_ptr, int gg) override
MoFEMErrorCode recordTape() override
Deprecated interface functions.