35 bool continue_dt =
false;
36 auto check_dt =
data.d_outputDeck_p->d_dtTestOut;
37 if ((
data.d_n % check_dt == 0) && (
data.d_n >= check_dt))
44 const auto &p0 =
data.d_particlesListTypeAll[0];
45 const auto &p1 =
data.d_particlesListTypeAll[1];
48 const auto &xc0 = p0->getXCenter();
49 const auto &xc1 = p1->getXCenter();
50 const double &r = p0->d_geom_p->boundingRadius();
52 const auto &
contact =
data.d_particleDeck_p->d_contactDeck.getContact(p0->getGroupId(
"contact_id"), p1->getGroupId(
"contact_id"));
53 double r_e = r +
contact.d_contactR;
55 double pen_dist = xc1.dist(xc0) - r_e - r;
56 double contact_area_radius = 0.;
59 std::sqrt(std::pow(r_e, 2.) - std::pow(r_e + pen_dist, 2.));
62 contact_area_radius = 0.;
66 double max_dist = xc1.d_y + p1->d_geom_p->boundingRadius();
69 double max_y_loc = p1->getXLocal(0).d_y;
71 for (
size_t i = 0; i < p1->getNumNodes(); i++)
73 max_y_loc = p1->getXLocal(i).d_y;
78 data.setKeyData(
"pen_dist", pen_dist);
79 data.setKeyData(
"contact_area_radius", contact_area_radius);
80 data.setKeyData(
"max_y", max_y);
81 data.setKeyData(
"max_dist", max_dist);
82 data.setKeyData(
"max_y_loc", max_y_loc);
85 return std::format(
" Post-processing: max y = {:.6f} \n", max_y);
91 bool continue_dt =
false;
92 auto check_dt =
data.d_outputDeck_p->d_dtTestOut;
93 if ((
data.d_n % check_dt == 0) && (
data.d_n >= check_dt))
100 auto w_id =
data.d_testDeck_p->d_particleIdCompressiveTest;
101 auto f_dir =
data.d_testDeck_p->d_particleForceDirectionCompressiveTest - 1;
102 const auto &wall =
data.d_particlesListTypeAll[w_id];
105 auto dx = wall->getXLocal(0) - wall->getXRefLocal(0);
106 double wall_penetration = dx[f_dir];
110 double tot_reaction_force = 0.;
111 for (
size_t i = 0; i < wall->getNumNodes(); i++) {
112 tot_reaction_force += wall->getFLocal(i)[f_dir] * wall->getVolLocal(i);
116 MPI_Allreduce(&tot_reaction_force, &reduced, 1, MPI_DOUBLE, MPI_SUM,
118 tot_reaction_force = reduced;
123 if (!
data.d_ppFile.is_open()) {
124 std::string tag_pp_file =
data.d_outputDeck_p->d_tagPPFile.empty()
126 :
data.d_outputDeck_p->d_tagPPFile;
127 std::string filename =
data.d_outputDeck_p->d_path +
"pp_" +
128 data.d_testDeck_p->d_testName +
"_" +
129 tag_pp_file +
".csv";
130 data.d_ppFile.open(filename.c_str(), std::ofstream::out | std::ofstream::app);
131 data.d_ppFile <<
"t, delta, force \n";
133 data.d_ppFile << std::format(
"{:.6e}, {:.6e}, {:.6e}\n",
data.d_time,
134 wall_penetration, tot_reaction_force);
137 data.setKeyData(
"wall_penetration", wall_penetration);
138 data.setKeyData(
"tot_reaction_force", tot_reaction_force);
140 return std::format(
" Post-processing: wall penetration = {:"
142 "reaction force = {:5.3e} \n",
143 wall_penetration, tot_reaction_force);
150 if (
data.d_outputDeck_p->d_outCriteria ==
"max_particle_dist" &&
151 data.d_testDeck_p->d_testName ==
"two_particle") {
155 const auto &xci =
data.d_particlesListTypeAll[0]->getXCenter();
156 const auto &xcj =
data.d_particlesListTypeAll[1]->getXCenter();
160 data.d_outputDeck_p->d_outCriteriaParams[0])) {
162 if(
data.d_ppFile.is_open())
163 data.d_ppFile.close();
167 else if (
data.d_outputDeck_p->d_outCriteria ==
"max_node_dist") {
177 auto max_x =
data.d_x[max_pt_and_index.second];
181 data.d_outputDeck_p->d_outCriteriaParams[0])) {
184 if(
data.d_ppFile.is_open())
185 data.d_ppFile.close();
187 util::io::log(0, std::format(
"{}: Terminating simulation as one of the failing"
188 " criteria is met. Point ({:.6f}, {:.6f}, {:.6f}) is at "
191 " allowed distance {:.6f}\n",
192 data.d_name, max_x.d_x, max_x.d_y, max_x.d_z, max_x.length(),
193 data.d_outputDeck_p->d_outCriteriaParams[0]));
virtual std::string twoParticle(data::ModelData &data)
virtual void checkStop(data::ModelData &data)
virtual std::string compressive(data::ModelData &data)
virtual void close(data::ModelData &data)
void log(std::ostringstream &oss, bool screen_out=false, int printMpiRank=print_default_mpi_rank)
Global method to log the message.