31 boost::shared_ptr<GenericElementInterface> mfront_interface =
nullptr,
39 using OpPPMap = OpPostProcMapInMoab<SPACE_DIM, SPACE_DIM>;
42 OpScale(boost::shared_ptr<MatrixDouble> m_ptr,
double s)
44 mPtr(m_ptr),
scale(s) {}
51 boost::shared_ptr<MatrixDouble> mPtr;
55 auto push_domain_ops = [&](
auto &pip) {
57 pip, {
H1,
HDIV},
"GEOMETRY")),
58 "Apply base transform");
59 auto henky_common_data_ptr =
60 commonDataFactory<SPACE_DIM, GAUSS, DomainEleOp>(
61 *m_field_ptr, pip,
"U",
"MAT_ELASTIC", Sev::inform);
62 auto contact_stress_ptr = boost::make_shared<MatrixDouble>();
63 pip.push_back(
new OpCalculateHVecTensorField<SPACE_DIM, SPACE_DIM>(
64 "SIGMA", contact_stress_ptr));
65 pip.push_back(
new OpScale(contact_stress_ptr,
scale));
66 return std::make_tuple(henky_common_data_ptr, contact_stress_ptr);
69 auto push_bdy_ops = [&](
auto &pip) {
71 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
72 pip.push_back(
new OpCalculateVectorFieldValues<SPACE_DIM>(
73 "U", common_data_ptr->contactDispPtr()));
74 pip.push_back(
new OpCalculateHVecTensorTrace<SPACE_DIM, BoundaryEleOp>(
75 "SIGMA", common_data_ptr->contactTractionPtr()));
76 pip.push_back(
new OpScale(common_data_ptr->contactTractionPtr(),
scale));
78 pip.push_back(
new typename C::template OpEvaluateSDF<SPACE_DIM, GAUSS>(
80 return common_data_ptr;
83 auto get_domain_pip = [&](
auto &pip)
84 -> boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> & {
86 auto op_loop_side =
new OpLoopSide<SideEle>(
87 *m_field_ptr,
"dFE",
SPACE_DIM, Sev::noisy,
89 ForcesAndSourcesCore::UserDataOperator::AdjCache>());
90 pip.push_back(op_loop_side);
91 return op_loop_side->getOpPtrVector();
97 auto get_post_proc_domain_fe = [&]() {
99 boost::make_shared<PostProcEleDomain>(*m_field_ptr,
postProcMesh);
100 auto &pip = post_proc_fe->getOpPtrVector();
102 auto [henky_common_data_ptr, contact_stress_ptr] =
103 push_domain_ops(get_domain_pip(pip));
105 auto u_ptr = boost::make_shared<MatrixDouble>();
106 pip.push_back(
new OpCalculateVectorFieldValues<SPACE_DIM>(
"U", u_ptr));
107 auto X_ptr = boost::make_shared<MatrixDouble>();
109 new OpCalculateVectorFieldValues<SPACE_DIM>(
"GEOMETRY", X_ptr));
117 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
122 {
"U", u_ptr}, {
"GEOMETRY", X_ptr}
127 {
"SIGMA", contact_stress_ptr},
129 {
"G", henky_common_data_ptr->matGradPtr},
131 {
"P2", henky_common_data_ptr->getMatFirstPiolaStress()}
143 pip, {
HDIV},
"GEOMETRY")),
145 auto common_data_ptr = push_bdy_ops(pip);
151 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
153 {{
"SDF", common_data_ptr->sdfPtr()},
154 {
"CONSTRAINT_CONTACT", common_data_ptr->constraintPtr()}},
158 {
"TRACTION_CONTACT", common_data_ptr->contactTractionPtr()},
159 {
"GRAD_SDF", common_data_ptr->gradSdfPtr()}
165 {{
"HESS_SDF", common_data_ptr->hessSdfPtr()}}
175 auto get_post_proc_bdy_fe = [&]() {
177 boost::make_shared<PostProcEleBdy>(*m_field_ptr, postProcMesh);
178 auto &pip = post_proc_fe->getOpPtrVector();
181 pip, {
HDIV},
"GEOMETRY")),
183 auto common_data_ptr = push_bdy_ops(pip);
186 auto op_loop_side =
new OpLoopSide<SideEle>(
187 *m_field_ptr,
"dFE",
SPACE_DIM, Sev::noisy,
189 ForcesAndSourcesCore::UserDataOperator::AdjCache>());
190 pip.push_back(op_loop_side);
192 auto [henky_common_data_ptr, contact_stress_ptr] =
193 push_domain_ops(op_loop_side->getOpPtrVector());
195 auto X_ptr = boost::make_shared<MatrixDouble>();
197 new OpCalculateVectorFieldValues<SPACE_DIM>(
"GEOMETRY", X_ptr));
203 post_proc_fe->getPostProcMesh(), post_proc_fe->getMapGaussPts(),
205 {{
"SDF", common_data_ptr->sdfPtr()},
206 {
"CONSTRAINT_CONTACT", common_data_ptr->constraintPtr()}},
208 {{
"U", common_data_ptr->contactDispPtr()},
210 {
"TRACTION_CONTACT", common_data_ptr->contactTractionPtr()},
211 {
"GRAD_SDF", common_data_ptr->gradSdfPtr()}
217 {{
"HESS_SDF", common_data_ptr->hessSdfPtr()}}
226 auto get_integrate_traction = [&]() {
227 auto integrate_traction = boost::make_shared<BoundaryEle>(*m_field_ptr);
228 auto common_data_ptr = boost::make_shared<ContactOps::CommonData>();
230 (AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
231 integrate_traction->getOpPtrVector(), {HDIV},
"GEOMETRY")),
235 integrate_traction->getOpPtrVector().push_back(
236 new OpSetHOWeightsOnSubDim<SPACE_DIM>());
242 (opFactoryCalculateTraction<SPACE_DIM, GAUSS, BoundaryEleOp>(
244 "push operators to calculate traction");
246 return integrate_traction;
249 postProcDomainFe = get_post_proc_domain_fe();
251 postProcBdyFe = get_post_proc_bdy_fe();
252 integrateTraction = get_integrate_traction();
263 auto post_proc = [&]() {
266 if (!mfrontInterface) {
267 auto post_proc_begin =
268 boost::make_shared<PostProcBrokenMeshInMoabBaseBegin>(*m_field_ptr,
271 boost::make_shared<PostProcBrokenMeshInMoabBaseEnd>(*m_field_ptr,
275 post_proc_begin->getFEMethod());
276 if (!postProcBdyFe) {
277 postProcDomainFe->copyTs(*
this);
280 postProcDomainFe->copyTs(*
this);
281 postProcBdyFe->copyTs(*
this);
286 post_proc_end->getFEMethod());
288 CHKERR post_proc_end->writeFile(
289 "out_contact_" + boost::lexical_cast<std::string>(sTEP) +
".h5m");
291 CHKERR mfrontInterface->updateElementVariables();
292 CHKERR mfrontInterface->postProcessElement(ts_step);
298 auto calculate_traction = [&] {
300 CHKERR VecZeroEntries(CommonData::totalTraction);
302 CHKERR VecAssemblyBegin(CommonData::totalTraction);
303 CHKERR VecAssemblyEnd(CommonData::totalTraction);
307 auto calculate_reactions = [&]() {
312 auto assemble_domain = [&]() {
314 auto fe_rhs = boost::make_shared<DomainEle>(*m_field_ptr);
315 auto &pip = fe_rhs->getOpPtrVector();
323 CHKERR AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(pip, {
H1},
325 CHKERR HenckyOps::opFactoryDomainRhs<SPACE_DIM, PETSC, IT, DomainEleOp>(
326 *m_field_ptr, pip,
"U",
"MAT_ELASTIC", Sev::inform);
331 auto assemble_boundary = [&]() {
333 auto fe_rhs = boost::make_shared<BoundaryEle>(*m_field_ptr);
334 auto &pip = fe_rhs->getOpPtrVector();
342 CHKERR AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(pip, {},
346 pip.push_back(
new OpSetHOWeightsOnSubDim<SPACE_DIM>());
348 auto u_disp = boost::make_shared<MatrixDouble>();
349 pip.push_back(
new OpCalculateVectorFieldValues<SPACE_DIM>(
"U", u_disp));
351 new OpSpringRhs(
"U", u_disp, [
this](
double,
double,
double) {
361 CHKERR assemble_boundary();
363 auto fe_post_proc_ptr = boost::make_shared<FEMethod>();
364 auto get_post_proc_hook_rhs = [
this, fe_post_proc_ptr, res,
367 CHKERR EssentialPreProcReaction<DisplacementCubitBcData>(
368 *m_field_ptr, fe_post_proc_ptr, res)();
371 fe_post_proc_ptr->postProcessHook = get_post_proc_hook_rhs;
377 auto print_max_min = [&](
auto &tuple,
const std::string msg) {
379 CHKERR VecScatterBegin(std::get<1>(tuple), ts_u, std::get<0>(tuple),
380 INSERT_VALUES, SCATTER_FORWARD);
381 CHKERR VecScatterEnd(std::get<1>(tuple), ts_u, std::get<0>(tuple),
382 INSERT_VALUES, SCATTER_FORWARD);
384 CHKERR VecMax(std::get<0>(tuple), PETSC_NULL, &max);
385 CHKERR VecMin(std::get<0>(tuple), PETSC_NULL, &min);
386 MOFEM_LOG_C(
"CONTACT", Sev::inform,
"%s time %3.4e min %3.4e max %3.4e",
387 msg.c_str(), ts_t, min, max);
391 auto print_traction = [&](
const std::string msg) {
397 CHKERR VecGetArrayRead(CommonData::totalTraction, &t_ptr);
398 MOFEM_LOG_C(
"CONTACT", Sev::inform,
"%s time %3.4e %3.4e %3.4e %3.4e",
399 msg.c_str(), ts_t, t_ptr[0], t_ptr[1], t_ptr[2]);
400 CHKERR VecRestoreArrayRead(CommonData::totalTraction, &t_ptr);
408 if (!(ts_step % se)) {
410 <<
"Write file at time " << ts_t <<
" write step " << sTEP;
413 CHKERR calculate_traction();
414 CHKERR calculate_reactions();
416 CHKERR print_max_min(uXScatter,
"Ux");
417 CHKERR print_max_min(uYScatter,
"Uy");
419 CHKERR print_max_min(uZScatter,
"Uz");
420 CHKERR print_traction(
"Contact force");
428 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> ux_scatter,
429 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> uy_scatter,
430 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>> uz_scatter) {
432 uXScatter = ux_scatter;
433 uYScatter = uy_scatter;
434 uZScatter = uz_scatter;
439 SmartPetscObj<DM>
dM;
440 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>>
uXScatter;
441 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>>
uYScatter;
442 std::tuple<SmartPetscObj<Vec>, SmartPetscObj<VecScatter>>
uZScatter;
444 boost::shared_ptr<moab::Core> postProcMesh = boost::make_shared<moab::Core>();