33 const auto dim =
data.d_modelDeck_p->d_dim;
34 const bool is_state =
data.d_particlesListTypeAll[0]->getMaterial()->isStateActive();
35 const auto selfContact =
37 const bool abs_stretch_break =
38 (
data.d_modelDeck_p->d_bondBreak ==
"absolute_stretch");
44 tf::Taskflow taskflow;
46 taskflow.for_each_index(
47 (std::size_t) 0,
data.d_fPdCompNodes.size(), (std::size_t) 1,
48 [&
data, abs_stretch_break](std::size_t II) {
49 auto i = data.d_fPdCompNodes[II];
51 const auto rho = data.getDensity(i);
52 const auto &fix = data.d_fix[i];
53 const auto &ptId = data.getPtId(i);
54 auto &pi = data.getParticleFromAllList(ptId);
56 if (pi->d_material_p->isStateActive()) {
58 const double horizon = pi->getHorizon();
59 const double mesh_size = pi->getMeshSize();
60 const auto &xi = data.d_xRef[i];
61 const auto &ui = data.d_u[i];
64 const auto &m = data.d_mX[i];
68 auto check_up = horizon + 0.5 * mesh_size;
69 auto check_low = horizon - 0.5 * mesh_size;
72 for (size_t j : data.d_neighPd[i]) {
74 const auto &xj = data.d_xRef[j];
75 const auto &uj = data.d_u[j];
76 double rji = (xj - xi).length();
82 double change_length = (xj - xi + uj - ui).length() - rji;
85 double s = change_length / rji;
86 double sc = pi->d_material_p->getSc(rji);
89 auto fs = data.d_fracture_p->getBondState(i, k);
92 const bool broke = abs_stretch_break
93 ? util::isGreater(std::abs(s), sc + 1.0e-10)
94 : util::isGreater(s, sc + 1.0e-10);
98 data.d_fracture_p->setBondState(i, k, fs);
103 auto volj = data.d_vol[j];
105 if (util::isGreater(rji, check_low))
106 volj *= (check_up - rji) / mesh_size;
108 theta += rji * change_length * pi->d_material_p->getInfFn(rji) *
115 data.d_thetaX[i] = 3. * theta / m;
120 executor.run(taskflow).get();
128 tf::Taskflow taskflow;
130 taskflow.for_each_index(
131 (std::size_t) 0,
data.d_fPdCompNodes.size(), (std::size_t) 1,
132 [&
data, selfContact = selfContact.get(), abs_stretch_break](std::size_t II) {
133 auto i = data.d_fPdCompNodes[II];
136 util::Point force_i = util::Point();
137 double scalar_f = 0.;
145 double vol_intact = 0.;
149 const auto rhoi = data.getDensity(i);
150 const auto &ptIdi = data.getPtId(i);
151 auto &pi = data.getParticleFromAllList(ptIdi);
153 const double horizon = pi->getHorizon();
154 const double mesh_size = pi->getMeshSize();
155 const auto &xi = data.d_xRef[i];
156 const auto &ui = data.d_u[i];
157 const auto &mi = data.d_mX[i];
158 const auto &thetai = data.d_thetaX[i];
161 auto check_up = horizon + 0.5 * mesh_size;
162 auto check_low = horizon - 0.5 * mesh_size;
167 for (size_t j : data.d_neighPd[i]) {
168 auto fs = data.d_fracture_p->getBondState(i, k);
169 const auto &xj = data.d_xRef[j];
170 const auto &uj = data.d_u[j];
171 auto volj = data.d_vol[j];
172 double rji = (xj - xi).length();
177 double Sji = pi->d_material_p->getS(xj - xi, uj - ui);
180 const auto &mj = data.d_mX[j];
181 const auto &thetaj = data.d_thetaX[j];
184 if (util::isGreater(rji, check_low))
185 volj *= (check_up - rji) / mesh_size;
188 if (pi->d_material_p->isStateActive()) {
191 pi->d_material_p->getBondEF(rji, Sji, fs, mi, thetai);
193 pi->d_material_p->getBondEF(rji, Sji, fs, mj, thetaj);
196 scalar_f = (ef_i.second + ef_j.second) * volj;
198 force_i += scalar_f * pi->d_material_p->getBondForceDirection(
206 const double Sc = pi->d_material_p->getSc(rji);
207 const bool broke = abs_stretch_break
208 ? util::isGreater(std::abs(Sji), Sc + 1.0e-10)
209 : util::isGreater(Sji, Sc + 1.0e-10);
212 data.d_fracture_p->setBondState(i, k, fs);
216 pi->d_material_p->getBondEF(rji, Sji, fs, false);
217 scalar_f = ef.second * volj;
218 force_i += scalar_f * pi->d_material_p->getBondForceDirection(
221 const auto yji = xj + uj - (xi + ui);
223 selfContact->force(yji, volj, pi->d_Kn, pi->d_Rc, rji);
228 const auto yji = xj + uj - (xi + ui);
230 selfContact->force(yji, volj, pi->d_Kn, pi->d_Rc, rji);
234 auto Sc = pi->d_material_p->getSc(rji);
235 if (util::isGreater(std::abs(Sji / Sc), Zi))
236 Zi = std::abs(Sji / Sc);
239 vol_all += data.d_vol[j];
241 if (!data.d_fracture_p->getBondState(i, k))
242 vol_intact += data.d_vol[j];
253 data.d_f[i] = force_i;
256 if (!
data.d_phi.empty())
258 (vol_all > 0.) ?
static_cast<float>(1. - vol_intact / vol_all) : 0.f;
259 if (!
data.d_phiBond.empty())
261 (n_bonds > 0) ?
static_cast<float>(double(n_broken) / double(n_bonds))
266 executor.run(taskflow).get();