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<real>& coarseGrainFactor,
17  const deviceViewType1D<uint32>& propId,
18  const deviceViewType1D<realx3>& vel,
19  const deviceViewType1D<realx3>& rVel,
20  const deviceViewType1D<realx3>& cForce,
21  const deviceViewType1D<realx3>& cTorque
22 )
23 {
24 
25  using ValueType = typename ContactListType::ValueType;
26  uint32 ss = cntctList.size();
27  uint32 lastItem = cntctList.loopCount();
28  if(lastItem == 0u)return;
29 
30  Kokkos::parallel_for(
31  "pFlow::periodicBoundarySIKernels::grainGrainInteraction",
32  deviceRPolicyDynamic(0,lastItem),
34  {
35 
36  if(!cntctList.isValid(n))return;
37 
38  auto [i,j] = cntctList.getPair(n);
39  uint32 ind_i = thisPoints.index(i);
40  uint32 ind_j = mirrorPoints.index(j);
41 
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];
46  realx3 xi = thisPoints.field()[ind_i];
47  realx3 xj = mirrorPoints.field()[ind_j]+transferVec;
48  real dist = length(xj-xi);
49  real ovrlp = (Ri+Rj) - dist;
50 
51  if( ovrlp >0.0 )
52  {
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);
57 
58  auto history = cntctList.getValue(n);
59 
60  int32 propId_i = propId[ind_i];
61  int32 propId_j = propId[ind_j];
62 
63  realx3 FCn, FCt, Mri, Mrj, Mij, Mji;
64 
65  // calculates contact force
66  forceModel.contactForce(
67  dt, i, j,
68  propId_i, propId_j,
69  Ri, Rj, cGFi , cGFj ,
70  ovrlp,
71  Vr, Nij,
72  history,
73  FCn, FCt);
74 
75  forceModel.rollingFriction(
76  dt, i, j,
77  propId_i, propId_j,
78  Ri, Rj, cGFi , cGFj ,
79  wi, wj,
80  Nij,
81  FCn,
82  Mri, Mrj);
83 
84  auto M = cross(Nij,FCt);
85  Mij = Ri*M+Mri;
86  Mji = Rj*M+Mrj;
87 
88  auto FC = FCn + FCt;
89 
90 
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_);
94 
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_);
98 
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_);
102 
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_);
106 
107 
108  cntctList.setValue(n,history);
109 
110  }
111  else
112  {
113  cntctList.setValue(n, ValueType());
114  }
115 
116  });
117  Kokkos::fence();
118 }
119 
120 
121 } //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::periodicBoundarySIKernels::grainGrainInteraction
void grainGrainInteraction(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< real > &coarseGrainFactor, const deviceViewType1D< uint32 > &propId, const deviceViewType1D< realx3 > &vel, const deviceViewType1D< realx3 > &rVel, const deviceViewType1D< realx3 > &cForce, const deviceViewType1D< realx3 > &cTorque)
Definition: periodicBoundarySIKernels.hpp:8
pFlow::deviceViewType1D
Kokkos::View< T * > deviceViewType1D
1D array (vector) with default device (memory space and execution space)
Definition: KokkosTypes.hpp:121
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