www.cemf.ir
periodicBoundarySIKernels.hpp
Go to the documentation of this file.
1 
3 {
4 
5 template<typename ContactListType, typename ContactForceModel>
6 inline
8 (
9  real dt,
10  const ContactListType& cntctList,
11  const ContactForceModel& forceModel,
12  const realx3& transferVec,
13  const deviceScatteredFieldAccess<realx3>& thisPoints,
14  const deviceScatteredFieldAccess<realx3>& mirrorPoints,
15  const deviceViewType1D<real>& diam,
16  const deviceViewType1D<uint32>& propId,
17  const deviceViewType1D<realx3>& vel,
18  const deviceViewType1D<realx3>& rVel,
19  const deviceViewType1D<realx3>& cForce,
20  const deviceViewType1D<realx3>& cTorque
21 )
22 {
23 
24  using ValueType = typename ContactListType::ValueType;
25  uint32 ss = cntctList.size();
26  uint32 lastItem = cntctList.loopCount();
27  if(lastItem == 0u)return;
28 
29  Kokkos::parallel_for(
30  "pFlow::periodicBoundarySIKernels::sphereSphereInteraction",
31  deviceRPolicyDynamic(0,lastItem),
33  {
34 
35  if(!cntctList.isValid(n))return;
36 
37  auto [i,j] = cntctList.getPair(n);
38  uint32 ind_i = thisPoints.index(i);
39  uint32 ind_j = mirrorPoints.index(j);
40 
41  real Ri = 0.5*diam[ind_i];
42  real Rj = 0.5*diam[ind_j];
43  realx3 xi = thisPoints.field()[ind_i];
44  realx3 xj = mirrorPoints.field()[ind_j]+transferVec;
45  real dist = length(xj-xi);
46  real ovrlp = (Ri+Rj) - dist;
47 
48  if( ovrlp >0.0 )
49  {
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);
54 
55  auto history = cntctList.getValue(n);
56 
57  int32 propId_i = propId[ind_i];
58  int32 propId_j = propId[ind_j];
59 
60  realx3 FCn, FCt, Mri, Mrj, Mij, Mji;
61 
62  // calculates contact force
63  forceModel.contactForce(
64  dt, i, j,
65  propId_i, propId_j,
66  Ri, Rj,
67  ovrlp,
68  Vr, Nij,
69  history,
70  FCn, FCt);
71 
72  forceModel.rollingFriction(
73  dt, i, j,
74  propId_i, propId_j,
75  Ri, Rj,
76  wi, wj,
77  Nij,
78  FCn,
79  Mri, Mrj);
80 
81  auto M = cross(Nij,FCt);
82  Mij = Ri*M+Mri;
83  Mji = Rj*M+Mrj;
84 
85  auto FC = FCn + FCt;
86 
87 
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_);
91 
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_);
95 
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_);
99 
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_);
103 
104 
105  cntctList.setValue(n,history);
106 
107  }
108  else
109  {
110  cntctList.setValue(n, ValueType());
111  }
112 
113  });
114  Kokkos::fence();
115 }
116 
117 
118 } //pFlow::periodicBoundarySIKernels
pFlow::scatteredFieldAccess::field
const INLINE_FUNCTION_HD viewType & field() const
Definition: scatteredFieldAccess.hpp:106
pFlow::scatteredFieldAccess
Definition: scatteredFieldAccess.hpp:32
pFlow::real
float real
Definition: builtinTypes.hpp:45
pFlow::uint32
unsigned int uint32
Definition: builtinTypes.hpp:56
pFlow::deviceViewType1D
Kokkos::View< T * > deviceViewType1D
1D array (vector) with default device (memory space and execution space)
Definition: KokkosTypes.hpp:121
pFlow::periodicBoundarySIKernels::sphereSphereInteraction
void sphereSphereInteraction(real dt, const ContactListType &cntctList, const ContactForceModel &forceModel, const realx3 &transferVec, const deviceScatteredFieldAccess< realx3 > &thisPoints, const deviceScatteredFieldAccess< realx3 > &mirrorPoints, const deviceViewType1D< real > &diam, const deviceViewType1D< uint32 > &propId, const deviceViewType1D< realx3 > &vel, const deviceViewType1D< realx3 > &rVel, const deviceViewType1D< realx3 > &cForce, const deviceViewType1D< realx3 > &cTorque)
Definition: periodicBoundarySIKernels.hpp:8
cross
INLINE_FUNCTION_HD triple< T > cross(const triple< T > &v1, const triple< T > &v2)
length
INLINE_FUNCTION_HD T length(const triple< T > &v1)
pFlow::int32
int int32
Definition: builtinTypes.hpp:50
pFlow::triple::x_
T x_
data members
Definition: triple.hpp:49
pFlow::scatteredFieldAccess::index
INLINE_FUNCTION_HD uint32 index(uint32 i) const
Definition: scatteredFieldAccess.hpp:128
pFlow::triple::y_
T y_
Definition: triple.hpp:50
pFlow::triple::z_
T z_
Definition: triple.hpp:51
n
uint32 n
Definition: NBSLoop.hpp:24
LAMBDA_HD
#define LAMBDA_HD
Definition: pFlowMacros.hpp:58
pFlow::deviceRPolicyDynamic
Kokkos::RangePolicy< Kokkos::DefaultExecutionSpace, Kokkos::Schedule< Kokkos::Dynamic >, Kokkos::IndexType< pFlow::uint32 > > deviceRPolicyDynamic
Definition: KokkosTypes.hpp:76
pFlow::triple< real >
pFlow::periodicBoundarySIKernels
Definition: periodicBoundarySIKernels.hpp:2