15 EshelbianCore &ep, boost::shared_ptr<VolumeElementForcesAndSourcesCore> fe,
16 ForcesAndSourcesCore::GaussHookFun interior_integration_hook,
17 SmartPetscObj<Vec> lambda_vec = SmartPetscObj<Vec>()) {
19 auto data_at_pts_ptr = boost::make_shared<DataAtIntegrationPts>();
22 boost::make_shared<CGGUserPolynomialBase::CachePhi>(0, 0, MatrixDouble());
23 fe->getUserPolynomialBase() =
24 boost::make_shared<CGGUserPolynomialBase>(bubble_cache);
25 EshelbianPlasticity::AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
30 fe->getRuleHook = [](int, int, int) {
return -1; };
31 fe->setRuleHook = interior_integration_hook;
34 fe->getOpPtrVector().push_back(
new OpCalculateHVecTensorField<3, 3>(
35 ep.
piolaStress, data_at_pts_ptr->getApproxPAtPts()));
36 fe->getOpPtrVector().push_back(
new OpCalculateHTensorTensorField<3, 3>(
37 ep.
bubbleField, data_at_pts_ptr->getApproxPAtPts(), MBMAXTYPE));
38 fe->getOpPtrVector().push_back(
new OpCalculateHVecTensorDivergence<3, 3>(
42 fe->getOpPtrVector().push_back(
46 fe->getOpPtrVector().push_back(
47 new OpCalculateTensor2SymmetricFieldValues<3>(
48 ep.
stretchTensor, data_at_pts_ptr->getLogStretchTensorAtPts(),
52 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
53 ep.
rotAxis, data_at_pts_ptr->getRotAxisAtPts(), MBTET));
54 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
55 ep.
spatialL2Disp, data_at_pts_ptr->getSmallWL2AtPts(), MBTET));
58 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
60 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldGradient<3, 3>(
64 fe->getOpPtrVector().push_back(
65 new OpCalculateHVecTensorField<SPACE_DIM, SPACE_DIM>(
66 ep.
piolaStress, data_at_pts_ptr->getVarPiolaPts(),
nullptr,
68 fe->getOpPtrVector().push_back(
new OpCalculateHTensorTensorField<3, 3>(
69 ep.
bubbleField, data_at_pts_ptr->getVarPiolaPts(),
nullptr, lambda_vec,
71 fe->getOpPtrVector().push_back(
new OpCalculateHVecTensorDivergence<3, 3>(
72 ep.
piolaStress, data_at_pts_ptr->getDivVarPiolaPts(), lambda_vec));
74 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
75 ep.
spatialL2Disp, data_at_pts_ptr->getVarWL2Pts(), lambda_vec, MBTET));
76 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
77 ep.
rotAxis, data_at_pts_ptr->getVarRotAxisPts(), lambda_vec, MBTET));
78 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldGradient<3, 3>(
79 ep.
rotAxis, data_at_pts_ptr->getVarGradRotAxisPts(), lambda_vec, MBTET));
82 fe->getOpPtrVector().push_back(
86 fe->getOpPtrVector().push_back(
87 new OpCalculateTensor2SymmetricFieldValues<3>(
93 return data_at_pts_ptr;
98 boost::shared_ptr<VolumeElementForcesAndSourcesCore> fe,
99 ForcesAndSourcesCore::GaussHookFun boundary_integration_hook) {
101 auto &m_field = ep.
mField;
104 PipelineManager::ElementsAndOpsByDim<SPACE_DIM>::BoundaryEle;
106 PipelineManager::ElementsAndOpsByDim<SPACE_DIM>::FaceSideEle;
107 using SideEleOp = EleOnSide::UserDataOperator;
108 using BdyEleOp = BoundaryEle::UserDataOperator;
112 auto op_loop_skeleton_side =
113 new OpLoopSide<BoundaryEle>(m_field, fe_name,
SPACE_DIM - 1, Sev::noisy);
114 op_loop_skeleton_side->getSideFEPtr()->getRuleHook = [](int, int, int) {
117 op_loop_skeleton_side->getSideFEPtr()->setRuleHook =
118 boundary_integration_hook;
121 EshelbianPlasticity::AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
127 auto broken_data_ptr = boost::make_shared<std::vector<BrokenBaseSideData>>();
129 auto op_loop_domain_side =
new OpBrokenLoopSide<EleOnSide>(
131 op_loop_domain_side->getSideFEPtr()->getUserPolynomialBase() =
132 boost::make_shared<CGGUserPolynomialBase>();
134 EshelbianPlasticity::AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
135 op_loop_domain_side->getOpPtrVector(), {HDIV, H1, L2},
137 op_loop_domain_side->getOpPtrVector().push_back(
138 new OpGetBrokenBaseSideData<SideEleOp>(ep.
piolaStress, broken_data_ptr));
139 auto flux_mat_ptr = boost::make_shared<MatrixDouble>();
140 op_loop_domain_side->getOpPtrVector().push_back(
141 new OpCalculateHVecTensorField<SPACE_DIM, SPACE_DIM>(ep.
piolaStress,
143 op_loop_domain_side->getOpPtrVector().push_back(
144 new OpSetFlux<SideEleOp>(broken_data_ptr, flux_mat_ptr));
145 op_loop_skeleton_side->getOpPtrVector().push_back(op_loop_domain_side);
147 return std::make_tuple(op_loop_skeleton_side,
148 op_loop_domain_side->getSideFEPtr(), broken_data_ptr);
152 EshelbianCore &ep, boost::shared_ptr<ForcesAndSourcesCore> fe,
153 boost::shared_ptr<DataAtIntegrationPts> data_at_pts_ptr,
154 boost::shared_ptr<TopologicalData> topo_ptr) {
156 auto dJ_dx_vec = createDMVector(ep.
dmElastic);
158 fe->getOpPtrVector().push_back(
162 ep.
bubbleField, data_at_pts_ptr, topo_ptr,
nullptr, dJ_dx_vec,
Tag()));
165 ep.
piolaStress, data_at_pts_ptr, topo_ptr,
nullptr, dJ_dx_vec,
168 ep.
bubbleField, data_at_pts_ptr, topo_ptr,
nullptr, dJ_dx_vec,
171 fe->getOpPtrVector().push_back(
new OpJ_dUImpl(
172 ep.
stretchTensor, data_at_pts_ptr, topo_ptr,
nullptr, dJ_dx_vec,
175 fe->getOpPtrVector().push_back(
196 EshelbianCore &ep, boost::shared_ptr<VolumeElementForcesAndSourcesCore> fe,
197 ForcesAndSourcesCore::GaussHookFun interior_integration_hook,
198 ForcesAndSourcesCore::GaussHookFun boundary_integration_hook) {
200 auto data_at_pts_ptr =
202 auto [op_skeleton_side, domain_side_fe_ptr, broken_data_ptr] =
204 boundary_integration_hook);
205 fe->getOpPtrVector().push_back(op_skeleton_side);
207 auto topo_ptr = boost::make_shared<TopologicalData>();
208 char objective_function_file_name[255] =
"objective_function.py";
209 CHKERR PetscOptionsGetString(
210 PETSC_NULLPTR, PETSC_NULLPTR,
"-objective_function",
211 objective_function_file_name, 255, PETSC_NULLPTR);
213 create_python_objective_function(objective_function_file_name);
215 data_at_pts_ptr, topo_ptr, python_ptr));
230 EshelbianCore &ep, boost::shared_ptr<VolumeElementForcesAndSourcesCore> fe,
231 ForcesAndSourcesCore::GaussHookFun interior_integration_hook,
232 ForcesAndSourcesCore::GaussHookFun boundary_integration_hook,
233 boost::shared_ptr<double> J_ptr,
Tag th_grad_tag) {
236 auto data_at_pts_ptr =
238 auto [op_skeleton_side, domain_side_fe_ptr, broken_data_ptr] =
240 boundary_integration_hook);
241 fe->getOpPtrVector().push_back(op_skeleton_side);
243 auto topo_ptr = boost::make_shared<TopologicalData>();
244 char objective_function_file_name[255] =
"objective_function.py";
245 CHKERR PetscOptionsGetString(
246 PETSC_NULLPTR, PETSC_NULLPTR,
"-objective_function",
247 objective_function_file_name, 255, PETSC_NULLPTR);
249 create_python_objective_function(objective_function_file_name);
251 data_at_pts_ptr, topo_ptr, python_ptr));
252 fe->getOpPtrVector().push_back(
254 J_ptr, SmartPetscObj<Vec>(), th_grad_tag));
259 EshelbianCore &ep, boost::shared_ptr<VolumeElementForcesAndSourcesCore> fe,
260 ForcesAndSourcesCore::GaussHookFun interior_integration_hook,
261 ForcesAndSourcesCore::GaussHookFun boundary_integration_hook,
262 SmartPetscObj<Vec> lambda_vec,
Tag th_grad_tag,
263 const double alpha,
const double rho,
const double alpha_omega) {
268 ep, fe, interior_integration_hook, lambda_vec);
270 auto add_hybridised_dJ_gradient = [&](
auto fe_ptr) {
273 PipelineManager::ElementsAndOpsByDim<SPACE_DIM>::BoundaryEle;
274 using BdyEleOp = BoundaryEle::UserDataOperator;
276 auto [op_skeleton_side, domain_side_fe_ptr, broken_data_ptr] =
278 boundary_integration_hook);
279 domain_side_fe_ptr->getOpPtrVector().push_back(
280 new OpCalculateHVecTensorField<SPACE_DIM, SPACE_DIM>(
281 ep.
piolaStress, data_at_pts_ptr->getVarPiolaPts(),
nullptr,
283 op_skeleton_side->getOpPtrVector().push_back(
284 new OpCalculateVectorFieldValues<SPACE_DIM>(
287 op_skeleton_side->getOpPtrVector().push_back(
288 new OpCalculateVectorFieldValues<SPACE_DIM>(
290 auto topo_ptr = boost::make_shared<TopologicalData>();
291 op_skeleton_side->getOpPtrVector().push_back(
new OpGetHONormalsOnFace(
293 topo_ptr->getTangent2AtPts(), topo_ptr->getNormalAtPts()));
295 using OpTopoC_dHybrid = FormsIntegrators<BdyEleOp>::Assembly<
A>
::LinearForm<
296 GAUSS>::OpTopoDerivativeBrokenSpaceConstrainDHybrid<SPACE_DIM>;
297 using OpTopoC_dBroken = FormsIntegrators<BdyEleOp>::Assembly<
A>
::LinearForm<
298 GAUSS>::OpTopoDerivativeBrokenSpaceConstrainDFlux<SPACE_DIM>;
299 op_skeleton_side->getOpPtrVector().push_back(
new OpTopoC_dHybrid(
301 data_at_pts_ptr->getVarHybridDispAtPts(), topo_ptr->getTangent1AtPts(),
302 topo_ptr->getTangent2AtPts(), boost::make_shared<double>(1.0),
303 SmartPetscObj<Vec>(), th_grad_tag));
304 op_skeleton_side->getOpPtrVector().push_back(
new OpTopoC_dBroken(
305 broken_data_ptr, data_at_pts_ptr->getHybridDispAtPts(),
306 data_at_pts_ptr->getVarHybridDispAtPts(), topo_ptr->getTangent1AtPts(),
307 topo_ptr->getTangent2AtPts(), boost::make_shared<double>(1.0),
308 SmartPetscObj<Vec>(), th_grad_tag));
310 fe_ptr->getOpPtrVector().push_back(op_skeleton_side);
315 "Failed to add hybridised dJ/dx gradient operators");
317 auto topo_ptr = boost::make_shared<TopologicalData>();
318 fe->getOpPtrVector().push_back(
new OpCalculateVectorFieldGradient<3, 3>(
320 fe->getOpPtrVector().push_back(
new OpInvertMatrix<3>(
321 topo_ptr->getJacobianAtPts(), topo_ptr->getDetJacobianAtPts(),
322 topo_ptr->getInvJacobianAtPts()));