5 template<
typename ContactListType,
typename ContactForceModel>
10 const ContactListType& cntctList,
11 const ContactForceModel& forceModel,
25 using ValueType =
typename ContactListType::ValueType;
26 uint32 ss = cntctList.size();
27 uint32 lastItem = cntctList.loopCount();
28 if(lastItem == 0u)
return;
31 "pFlow::periodicBoundarySIKernels::grainGrainInteraction",
36 if(!cntctList.isValid(
n))
return;
38 auto [i,j] = cntctList.getPair(
n);
42 real Ri = 0.5*diam[ind_i];
43 real Rj = 0.5*diam[ind_j];
44 real cGFi = coarseGrainFactor[ind_i];
45 real cGFj = coarseGrainFactor[ind_j];
47 realx3 xj = mirrorPoints.
field()[ind_j]+transferVec;
49 real ovrlp = (Ri+Rj) - dist;
53 auto Nij = (xj-xi)/dist;
54 auto wi = rVel[ind_i];
55 auto wj = rVel[ind_j];
56 auto Vr = vel[ind_i] - vel[ind_j] +
cross((Ri*wi+Rj*wj), Nij);
58 auto history = cntctList.getValue(
n);
60 int32 propId_i = propId[ind_i];
61 int32 propId_j = propId[ind_j];
63 realx3 FCn, FCt, Mri, Mrj, Mij, Mji;
66 forceModel.contactForce(
75 forceModel.rollingFriction(
84 auto M =
cross(Nij,FCt);
91 Kokkos::atomic_add(&cForce[ind_i].x_,FC.x_);
92 Kokkos::atomic_add(&cForce[ind_i].y_,FC.y_);
93 Kokkos::atomic_add(&cForce[ind_i].z_,FC.z_);
95 Kokkos::atomic_add(&cForce[ind_j].x_,-FC.x_);
96 Kokkos::atomic_add(&cForce[ind_j].y_,-FC.y_);
97 Kokkos::atomic_add(&cForce[ind_j].z_,-FC.z_);
99 Kokkos::atomic_add(&cTorque[ind_i].x_, Mij.
x_);
100 Kokkos::atomic_add(&cTorque[ind_i].y_, Mij.
y_);
101 Kokkos::atomic_add(&cTorque[ind_i].z_, Mij.
z_);
103 Kokkos::atomic_add(&cTorque[ind_j].x_, Mji.
x_);
104 Kokkos::atomic_add(&cTorque[ind_j].y_, Mji.
y_);
105 Kokkos::atomic_add(&cTorque[ind_j].z_, Mji.
z_);
108 cntctList.setValue(
n,history);
113 cntctList.setValue(
n, ValueType());