5 template<
typename ContactListType,
typename ContactForceModel>
10 const ContactListType& cntctList,
11 const ContactForceModel& forceModel,
24 using ValueType =
typename ContactListType::ValueType;
25 uint32 ss = cntctList.size();
26 uint32 lastItem = cntctList.loopCount();
27 if(lastItem == 0u)
return;
30 "pFlow::periodicBoundarySIKernels::sphereSphereInteraction",
35 if(!cntctList.isValid(
n))
return;
37 auto [i,j] = cntctList.getPair(
n);
41 real Ri = 0.5*diam[ind_i];
42 real Rj = 0.5*diam[ind_j];
44 realx3 xj = mirrorPoints.
field()[ind_j]+transferVec;
46 real ovrlp = (Ri+Rj) - dist;
50 auto Nij = (xj-xi)/dist;
51 auto wi = rVel[ind_i];
52 auto wj = rVel[ind_j];
53 auto Vr = vel[ind_i] - vel[ind_j] +
cross((Ri*wi+Rj*wj), Nij);
55 auto history = cntctList.getValue(
n);
57 int32 propId_i = propId[ind_i];
58 int32 propId_j = propId[ind_j];
60 realx3 FCn, FCt, Mri, Mrj, Mij, Mji;
63 forceModel.contactForce(
72 forceModel.rollingFriction(
81 auto M =
cross(Nij,FCt);
88 Kokkos::atomic_add(&cForce[ind_i].x_,FC.x_);
89 Kokkos::atomic_add(&cForce[ind_i].y_,FC.y_);
90 Kokkos::atomic_add(&cForce[ind_i].z_,FC.z_);
92 Kokkos::atomic_add(&cForce[ind_j].x_,-FC.x_);
93 Kokkos::atomic_add(&cForce[ind_j].y_,-FC.y_);
94 Kokkos::atomic_add(&cForce[ind_j].z_,-FC.z_);
96 Kokkos::atomic_add(&cTorque[ind_i].x_, Mij.
x_);
97 Kokkos::atomic_add(&cTorque[ind_i].y_, Mij.
y_);
98 Kokkos::atomic_add(&cTorque[ind_i].z_, Mij.
z_);
100 Kokkos::atomic_add(&cTorque[ind_j].x_, Mji.
x_);
101 Kokkos::atomic_add(&cTorque[ind_j].y_, Mji.
y_);
102 Kokkos::atomic_add(&cTorque[ind_j].z_, Mji.
z_);
105 cntctList.setValue(
n,history);
110 cntctList.setValue(
n, ValueType());