81 boost::shared_ptr<MatOps::GenericElastic> physical_ptr) {
84 double max_damage = 0.999;
85 CHKERR PetscOptionsGetScalar(PETSC_NULLPTR,
"",
"-generic_max_damage",
86 &max_damage, PETSC_NULLPTR);
87 max_damage = std::min(0.999, std::max(0., max_damage));
96 CHKERR physical_ptr->matOpsDataPtr->bindStateTag(m_field,
"damage", 1);
97 CHKERR physical_ptr->matOpsDataPtr->bindStateTag(m_field,
"F",
99 CHKERR physical_ptr->matOpsDataPtr->setupStateData();
101 physical_ptr->hookEvaluateVariable =
102 [mat_D_ptr](boost::shared_ptr<MatOps::MatOpsData> mat_ops_data_ptr,
106 auto t_grad = getFTensor2FromPtr<SPACE_DIM, SPACE_DIM>(
107 mat_ops_data_ptr->getActiveDataPtr(
"F")->data().data());
108 auto t_P = getFTensor2FromPtr<SPACE_DIM, SPACE_DIM>(
109 mat_ops_data_ptr->getDependentDataPtr(
"P")->data().data());
110 auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*mat_D_ptr);
111 auto t_damage = getFTensor0FromPtr(
112 &(*mat_ops_data_ptr->getStateDataPtr(
"damage", ent, gg))(0, 0));
119 t_P(
i,
J) = (1. - t_damage) * t_D(
i,
J,
k, L) * t_grad(
k, L);
124 physical_ptr->hookEvaluateDerivatives =
125 [mat_D_ptr](boost::shared_ptr<MatOps::MatOpsData> mat_ops_data_ptr,
131 ->getDependentDerivativesDataPtr(
135 auto t_D = getFTensor4DdgFromMat<SPACE_DIM, SPACE_DIM, 0>(*mat_D_ptr);
136 auto t_damage = getFTensor0FromPtr(
137 &(*mat_ops_data_ptr->getStateDataPtr(
"damage", ent, gg))(0, 0));
144 t_dP(
i,
J,
k, L) = (1. - t_damage) * t_D(
i,
J,
k, L);
149 physical_ptr->hookUpdateState =
150 [max_damage](boost::shared_ptr<MatOps::MatOpsData> mat_ops_data_ptr,
154 auto t_F = getFTensor2FromPtr<SPACE_DIM, SPACE_DIM>(
155 mat_ops_data_ptr->getActiveDataPtr(
"F")->data().data());
157 auto damage_ptr = mat_ops_data_ptr->getStateDataPtr(
"damage", ent, gg);
158 auto t_damage = getFTensor0FromPtr(&(*damage_ptr)(0, 0));
159 auto F_state_ptr = mat_ops_data_ptr->getStateDataPtr(
"F", ent, gg);
160 auto t_F_state = getFTensor2FromPtr<SPACE_DIM, SPACE_DIM>(
161 &(*F_state_ptr)(0, 0));
166 const double grad_norm = std::sqrt(t_F(
i,
J) * t_F(
i,
J));
167 const double old_damage = t_damage;
169 t_damage = std::min(max_damage, std::max(old_damage, grad_norm));
170 t_F_state(
i,
J) = t_F(
i,
J);