24 :
eP(ep),
dataFieldEval(ep.mField.getInterface<FieldEvaluatorInterface>()
30 "build field evaluator tree");
32 auto no_rule = [](int, int, int) {
return -1; };
34 auto set_element_for_field_eval = [&]() {
36 boost::shared_ptr<Ele> vol_ele(
dataFieldEval->feMethodPtr.lock());
37 vol_ele->getRuleHook = no_rule;
38 vol_ele->getUserPolynomialBase() =
39 boost::make_shared<CGGUserPolynomialBase>();
40 EshelbianPlasticity::AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
44 auto piola_scale_ptr = boost::make_shared<double>(1.0);
45 vol_ele->getOpPtrVector().push_back(
48 vol_ele->getOpPtrVector().push_back(
new OpCalculateHVecTensorField<3, 3>(
50 vol_ele->getOpPtrVector().push_back(
51 new OpCalculateHTensorTensorField<3, 3>(
53 SmartPetscObj<Vec>(), MBMAXTYPE));
55 vol_ele->getOpPtrVector().push_back(
59 vol_ele->getOpPtrVector().push_back(
60 new OpCalculateTensor2SymmetricFieldValues<3>(
64 vol_ele->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
66 vol_ele->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
68 vol_ele->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
72 vol_ele->getOpPtrVector().push_back(
new OpCalculateVectorFieldValues<3>(
74 vol_ele->getOpPtrVector().push_back(
75 new OpCalculateVectorFieldGradient<3, 3>(
78 vol_ele->getOpPtrVector().push_back(
83 auto set_element_for_post_process_energy = [&]() {
112 auto reads_post_proc_data = [](
PtsHashMap &pts_hash_map) {
117 if (!file.is_open()) {
123 while (std::getline(file, line)) {
124 std::istringstream iss(line);
126 double col2, col3, col4;
128 if (iss >> col1 >> col2 >> col3 >> col4) {
129 MOFEM_LOG(
"EP", Sev::verbose) <<
"Read: " << col1 <<
", " << col2
130 <<
", " << col3 <<
", " << col4;
131 pts_hash_map[col1] = {col2, col3, col4};
133 MOFEM_LOG(
"EP", Sev::error) <<
"Error parsing line: " << line;
143 "set element for post energy");
145 PetscBool test_cook_flg = PETSC_FALSE;
147 &test_cook_flg, PETSC_NULLPTR),
148 "get post proc points");
151 ptsHashMap[
"Point B"] = {48. / 2., 44. + (60. - 44.) / 2., 0.};
152 ptsHashMap[
"Point C"] = {48. / 2., (44. - 0.) / 2., 0.};
161 ptsHashMap[
"Point (2.5, 0., 0.)"] = {2.5, 0, 0.};
167 "get write restart option");
182 MOFEM_LOG(
"EP", Sev::inform) <<
"Monitor postProcess";
184 auto get_step = [](
auto ts_step) {
185 std::ostringstream ss;
186 ss << boost::str(boost::format(
"%d") %
static_cast<int>(ts_step));
187 std::string s = ss.str();
191 auto calculate_reaction_forces = [&]() {
195 auto get_ents_on_mesh_skin = [&]() {
196 std::map<std::string, Range> boundary_entities_vec;
198 auto get_block_vec_impl = [&](
auto block_name) {
202 (boost::format(
"%s(.*)") % block_name).str()
207 auto add_blockset_ents_impl = [&](
auto &&vec) {
209 for (
auto it : vec) {
210 Range boundary_entities;
212 boundary_entities,
true);
213 std::string meshset_name = it->getName();
214 boundary_entities_vec[meshset_name] = boundary_entities;
215 boundary_entities.clear();
220 for (
auto block_name : {
"SPATIAL_DISP",
"FIX",
"CONTACT",
221 "SPATIAL_ROTATION",
"NORMAL_DISPLACEMENT"}) {
223 add_blockset_ents_impl(get_block_vec_impl(block_name)),
224 "add blockset entities");
227 return boundary_entities_vec;
230 auto boundary_entities_vec = get_ents_on_mesh_skin();
232 std::vector<std::tuple<std::string, Range, std::array<double, 6>>>
234 for (
const auto &pair : boundary_entities_vec) {
235 reactionForces.push_back(std::make_tuple(
236 pair.first, pair.second,
237 std::array<double, 6>{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}));
240 auto integration_rule_face = [](int, int,
int approx_order) {
244 boost::make_shared<FaceElementForcesAndSourcesCore>(
eP.
mField);
245 auto no_rule = [](int, int, int) {
return -1; };
246 face_fe->getRuleHook = integration_rule_face;
248 EshelbianPlasticity::AddHOOps<SPACE_DIM - 1, SPACE_DIM, SPACE_DIM>::add(
254 face_fe->getOpPtrVector().push_back(op_side);
255 auto side_fe_ptr = op_side->getSideFEPtr();
257 boost::make_shared<EshelbianPlasticity::CGGUserPolynomialBase>();
258 side_fe_ptr->getUserPolynomialBase() = base_ptr;
260 EshelbianPlasticity::AddHOOps<SPACE_DIM, SPACE_DIM, SPACE_DIM>::add(
263 auto piola_scale_ptr = boost::make_shared<double>(1.0);
264 side_fe_ptr->getOpPtrVector().push_back(
267 side_fe_ptr->getOpPtrVector().push_back(
268 new OpCalculateHVecTensorField<SPACE_DIM, SPACE_DIM>(
271 side_fe_ptr->getOpPtrVector().push_back(
272 new OpCalculateHTensorTensorField<3, 3>(
274 side_fe_ptr->getOpPtrVector().push_back(
276 side_fe_ptr->getOpPtrVector().push_back(
277 new OpCalculateVectorFieldValues<3>(
279 for (
auto &[name, ents, reaction_vec] : reactionForces) {
287 for (
auto &[name, ents, reaction_vec] : reactionForces) {
288 std::array<double, 6> block_reaction_force{0.0, 0.0, 0.0,
291 MPI_Allreduce(reaction_vec.data(), &block_reaction_force, 6, MPI_DOUBLE,
294 for (
auto &force : block_reaction_force) {
295 if (std::abs(force) < 1e-12) {
300 "Step %d time %3.4g Block %s Reaction force [%3.6e, "
302 ts_step, ts_t, name.c_str(), block_reaction_force[0],
303 block_reaction_force[1], block_reaction_force[2]);
305 "Step %d time %3.4g Block %s Moment [%3.6e, %3.6e, %3.6e]",
306 ts_step, ts_t, name.c_str(), block_reaction_force[3],
307 block_reaction_force[4], block_reaction_force[5]);
312 auto save_restart_file = [&]() {
317 CHKERR PetscViewerBinaryOpen(
318 PETSC_COMM_WORLD, (
"restart_" + get_step(ts_step) +
".dat").c_str(),
319 FILE_MODE_WRITE, &viewer);
320 CHKERR PetscViewerBinarySetSkipInfo(viewer, PETSC_TRUE);
321 CHKERR VecView(ts_u, viewer);
322 CHKERR PetscViewerDestroy(&viewer);
327 auto post_process_skin = [&]() {
334 auto post_process_material_forces = [&]() {
341 auto post_process_skeleton_results = [&]() {
343 auto get_material_force_tags = [&]() {
345 std::vector<Tag> tag(2);
353 bool post_process_skeleton =
true;
355 post_process_skeleton =
true;
357 if (post_process_skeleton) {
359 1,
"out_skeleton_" + get_step(ts_step) +
".h5m", PETSC_NULLPTR,
360 get_material_force_tags());
365 auto calculate_energy = [&]() {
374 double body_energy = 0;
375 MPI_Allreduce(
gEnergy.get(), &body_energy, 1, MPI_DOUBLE, MPI_SUM,
378 auto crack_area_ptr = boost::make_shared<double>(0.0);
381 "Step %d time %3.4g strain energy %3.6e crack "
383 ts_step, ts_t, body_energy, *crack_area_ptr);
386 if (crack_faces.empty()) {
391 (boost::format(
"crack_faces_step_%d.vtk") % ts_step).str(),
395 (boost::format(
"front_edges_step_%d.vtk") % ts_step).str(),
400 MOFEM_LOG_C(
"EP", Sev::inform,
"Step %d time %3.4g strain energy %3.6e",
401 ts_step, ts_t, body_energy);
406 auto post_proc_at_points = [&](std::array<double, 3> point,
410 dataFieldEval->setEvalPoints(point.data(), point.size() / 3);
412 struct OpPrint :
public VolOp {
415 std::array<double, 3> point;
423 MoFEMErrorCode doWork(
int side, EntityType type,
424 EntitiesFieldData::EntData &data) {
427 if (getGaussPts().size2()) {
429 auto t_h = getFTensor2FromMat<3, 3>(eP.
dataAtPts->hAtPts);
431 getFTensor2FromMat<3, 3>(eP.
dataAtPts->approxPAtPts);
436 const double jac = determinantTensor3by3(t_h);
438 t_cauchy(
i,
j) = (1. / jac) * (t_approx_P(
i,
k) * t_h(
j,
k));
441 std::ostringstream s;
442 s << str <<
" elem " << getFEEntityHandle() <<
" ";
446 auto print_tensor = [](
auto &
t) {
447 std::ostringstream s;
452 std::ostringstream print;
456 << add() <<
"point " << getVectorAdaptor(point.data(), 3);
458 << add() <<
"coords at gauss pts " << getCoordsAtGaussPts();
460 << add() <<
"w " << eP.
dataAtPts->wL2AtPts;
462 << add() <<
"Piola " << eP.
dataAtPts->approxPAtPts;
464 << add() <<
"Cauchy " << print_tensor(t_cauchy);
473 fe_ptr->getOpPtrVector().push_back(
new OpPrint(
eP, point, str));
475 ->evalFEAtThePoint<SPACE_DIM>(
476 point.data(), 1e-12, problemPtr->getName(),
"EP",
dataFieldEval,
479 fe_ptr->getOpPtrVector().pop_back();
485 auto check_external_strain = [&](std::array<double, 3> point,
489 dataFieldEval->setEvalPoints(point.data(), point.size() / 3);
495 ->evalFEAtThePoint<SPACE_DIM>(
496 point.data(), 1e-12, problemPtr->getName(),
"EP",
dataFieldEval,
501 VecSetValue(vec, 0, 0.0, ADD_VALUES);
504 std::ostringstream s;
505 s << str <<
" elem " << getFEEntityHandle() <<
" ";
511 << add() <<
"point " << getVectorAdaptor(point.data(), 3);
515 VecSetValue(vec, 0, disp_at_point, ADD_VALUES);
520 CHKERR VecAssemblyBegin(vec);
521 CHKERR VecAssemblyEnd(vec);
525 CHKERR VecGetValues(vec, 1, &idx, &error);
527 MPI_Bcast(&error, 1, MPI_DOUBLE, 0, PETSC_COMM_WORLD);
531 if (std::abs(error - 0.25) > 1e-5) {
533 "Atom test %d failed: wrong displacement.",
atom_test);
539 CHKERR save_restart_file();
540 CHKERR calculate_reaction_forces();
541 CHKERR calculate_energy();
543 CHKERR post_process_material_forces();
544 CHKERR post_process_skin();
545 CHKERR post_process_skeleton_results();
559 CHKERR post_proc_at_points(pts.second, pts.first);