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, dim](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) *
116 data.d_thetaX[i] = double(dim) * theta / m;
121 executor.run(taskflow).get();
128 if (
data.d_e.size() !=
data.d_x.size())
129 data.d_e.resize(
data.d_x.size(), 0.f);
133 tf::Taskflow taskflow;
135 taskflow.for_each_index(
136 (std::size_t) 0,
data.d_fPdCompNodes.size(), (std::size_t) 1,
137 [&
data, selfContact = selfContact.get(), abs_stretch_break](std::size_t II) {
138 auto i = data.d_fPdCompNodes[II];
141 util::Point force_i = util::Point();
142 double scalar_f = 0.;
143 double energy_i = 0.;
151 double vol_intact = 0.;
155 const auto rhoi = data.getDensity(i);
156 const auto &ptIdi = data.getPtId(i);
157 auto &pi = data.getParticleFromAllList(ptIdi);
159 const double horizon = pi->getHorizon();
160 const double mesh_size = pi->getMeshSize();
161 const auto &xi = data.d_xRef[i];
162 const auto &ui = data.d_u[i];
163 const auto &mi = data.d_mX[i];
164 const auto &thetai = data.d_thetaX[i];
167 auto check_up = horizon + 0.5 * mesh_size;
168 auto check_low = horizon - 0.5 * mesh_size;
173 for (size_t j : data.d_neighPd[i]) {
174 auto fs = data.d_fracture_p->getBondState(i, k);
175 const auto &xj = data.d_xRef[j];
176 const auto &uj = data.d_u[j];
177 auto volj = data.d_vol[j];
178 double rji = (xj - xi).length();
183 double Sji = pi->d_material_p->getS(xj - xi, uj - ui);
186 const auto &mj = data.d_mX[j];
187 const auto &thetaj = data.d_thetaX[j];
190 if (util::isGreater(rji, check_low))
191 volj *= (check_up - rji) / mesh_size;
194 if (pi->d_material_p->isStateActive()) {
197 pi->d_material_p->getBondEF(rji, Sji, fs, mi, thetai);
199 pi->d_material_p->getBondEF(rji, Sji, fs, mj, thetaj);
202 scalar_f = (ef_i.second + ef_j.second) * volj;
203 energy_i += ef_i.first * volj;
205 force_i += scalar_f * pi->d_material_p->getBondForceDirection(
213 const double Sc = pi->d_material_p->getBreakSc(rji);
214 const bool broke = abs_stretch_break
215 ? util::isGreater(std::abs(Sji), Sc + 1.0e-10)
216 : util::isGreater(Sji, Sc + 1.0e-10);
219 data.d_fracture_p->setBondState(i, k, fs);
223 pi->d_material_p->getBondEF(rji, Sji, fs, false);
224 scalar_f = ef.second * volj;
225 energy_i += ef.first * volj;
226 force_i += scalar_f * pi->d_material_p->getBondForceDirection(
229 const auto yji = xj + uj - (xi + ui);
231 selfContact->force(yji, volj, pi->d_Kn, pi->d_Rc, rji);
236 const auto yji = xj + uj - (xi + ui);
238 selfContact->force(yji, volj, pi->d_Kn, pi->d_Rc, rji);
242 auto Sc = pi->d_material_p->getSc(rji);
243 if (util::isGreater(std::abs(Sji / Sc), Zi))
244 Zi = std::abs(Sji / Sc);
247 vol_all += data.d_vol[j];
249 if (!data.d_fracture_p->getBondState(i, k))
250 vol_intact += data.d_vol[j];
261 data.d_f[i] = force_i;
262 if (pi->d_material_p->isStateActive())
263 energy_i += pi->d_material_p->getDilatationEnergyDensity(thetai);
264 data.d_e[i] =
static_cast<float>(energy_i);
267 if (!
data.d_phi.empty())
269 (vol_all > 0.) ?
static_cast<float>(1. - vol_intact / vol_all) : 0.f;
270 if (!
data.d_phiBond.empty())
272 (n_bonds > 0) ?
static_cast<float>(
double(n_broken) / double(n_bonds))
277 executor.run(taskflow).get();
281 for (
auto i :
data.d_fPdCompNodes)
282 te += double(
data.d_e[i]) *
data.d_vol[i];
283 data.d_te =
static_cast<float>(te);