28 for (
auto &pi :
data.d_particlesListTypeParticle) {
30 if (!pi->d_computeForce)
37 auto pi_id = pi->getId();
39 double Ri = pi->d_geom_p->boundingRadius();
40 double vol_pi = M_PI * Ri * Ri;
41 auto pi_xc = pi->getXCenter();
42 auto pi_vc = pi->getVCenter();
43 auto rhoi = pi->getDensity();
46 for (
auto &pj :
data.d_particlesListTypeParticle) {
47 if (pj->getId() != pi->getId()) {
48 auto Rj = pj->d_geom_p->boundingRadius();
49 auto xc_ji = pj->getXCenter() - pi_xc;
50 auto dist_xcji = xc_ji.length();
52 const auto &
contact =
data.d_particleDeck_p->d_contactDeck.getContact(pi->getGroupId(
"contact_id"), pj->getGroupId(
"contact_id"));
59 auto vol_pj = M_PI * Rj * Rj;
60 auto rhoj = pj->getDensity();
68 hat_xc_ji = xc_ji / dist_xcji;
72 auto vc_ji = pj->getVCenter() - pi_vc;
73 auto vc_mag = vc_ji * hat_xc_ji;
77 force_i += beta_n * vc_mag * hat_xc_ji / vol_pi;
82 data.d_neighWallNodesCondensed[pi->getId()].clear();
84 for (
size_t j=0; j<
data.d_neighWallNodes[pi_id].size(); j++) {
86 const auto &j_id = pi->getNodeId(j);
87 const auto &yj =
data.d_x[j_id];
89 for (
size_t k=0; k<
data.d_neighWallNodes[pi_id][j].size(); k++) {
91 const auto &k_id =
data.d_neighWallNodes[pi_id][j][k];
92 const auto &pk =
data.d_particlesListTypeAll[
data.d_ptId[k_id]];
94 double Rjk = (
data.d_x[k_id] - yj).length();
97 data.d_particleDeck_p->d_contactDeck.getContact(pi->getGroupId(
"contact_id"), pk->getGroupId(
"contact_id"));
106 for (
auto &j :
data.d_neighWallNodesCondensed[pi_id]) {
108 auto &ptIdj =
data.d_ptId[j];
109 auto &pj =
data.d_particlesListTypeAll[ptIdj];
110 auto meq = rhoi * vol_pi;
113 =
data.d_particleDeck_p->d_contactDeck.getContact(pi->getGroupId(
"contact_id"), pj->getGroupId(
"contact_id"));
118 auto beta_n =
contact.d_betan *
121 auto xc_ji =
data.d_x[j] - pi_xc;
124 hat_xc_ji = xc_ji / xc_ji.length();
126 auto vc_ji =
data.d_v[j] - pi_vc;
127 auto vc_mag = vc_ji * hat_xc_ji;
131 force_i += beta_n * vc_mag * hat_xc_ji / vol_pi;
134 for (
size_t i = 0; i < pi->getNumNodes(); i++) {
135 const size_t g = pi->getNodeId(i);
136 if (
data.d_pdDofMpi &&
137 (
data.d_pdNodePartition.size() !=
data.d_x.size() ||
138 static_cast<int>(
data.d_pdNodePartition[g]) != mpi_rank))
140 data.d_f[g] += force_i;
bool isLocallyOwned(const BaseParticle &p)
True if this rank updates / assembles forces for the particle. Walls are replicated on every rank....
void log(std::ostringstream &oss, bool screen_out=false, int printMpiRank=print_default_mpi_rank)
Global method to log the message.