www.cemf.ir
mapperNBSKernels.cpp
Go to the documentation of this file.
1 
2 
3 /*------------------------------- phasicFlow ---------------------------------
4  O C enter of
5  O O E ngineering and
6  O O M ultiscale modeling of
7  OOOOOOO F luid flow
8 ------------------------------------------------------------------------------
9  Copyright (C): www.cemf.ir
10  email: hamid.r.norouzi AT gmail.com
11 ------------------------------------------------------------------------------
12 Licence:
13  This file is part of phasicFlow code. It is a free software for simulating
14  granular and multiphase flows. You can redistribute it and/or modify it under
15  the terms of GNU General Public License v3 or any other later versions.
16 
17  phasicFlow is distributed to help others in their research in the field of
18  granular and multiphase flows, but WITHOUT ANY WARRANTY; without even the
19  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 
21 -----------------------------------------------------------------------------*/
22 
23 #include "mapperNBSKernels.hpp"
24 
25 
27 (
28  const deviceViewType1D<realx3>& points,
29  const pFlagTypeDevice& flags,
30  realx3& minPoint,
31  realx3& maxPoint
32 )
33 {
34  if(flags.numActive() == 0)
35  {
36  minPoint = {0,0,0};
37  maxPoint = {0,0,0};
38  return;
39  }
40 
41  real minX;
42  real minY;
43  real minZ;
44  real maxX;
45  real maxY;
46  real maxZ;
47  auto aRange = flags.activeRange();
48  Kokkos::parallel_reduce(
49  "pFlow::mapperNBSKernels::findPointExtends",
50  deviceRPolicyStatic(aRange.start(), aRange.end()),
51  LAMBDA_HD(
52  uint32 i,
53  real& minXUpdate,
54  real& minYUpdate,
55  real& minZUpdate,
56  real& maxXUpdate,
57  real& maxYUpdate,
58  real& maxZUpdate)
59  {
60  if(flags(i))
61  {
62  auto p = points(i);
63  minXUpdate = min(p.x(), minXUpdate);
64  minYUpdate = min(p.y(), minYUpdate);
65  minZUpdate = min(p.z(), minZUpdate);
66  maxXUpdate = max(p.x(), maxXUpdate);
67  maxYUpdate = max(p.y(), maxYUpdate);
68  maxZUpdate = max(p.z(), maxZUpdate);
69  }
70 
71  },
72  Kokkos::Min<real>(minX),
73  Kokkos::Min<real>(minY),
74  Kokkos::Min<real>(minZ),
75  Kokkos::Max<real>(maxX),
76  Kokkos::Max<real>(maxY),
77  Kokkos::Max<real>(maxZ)
78  );
79 
80  minPoint = {minX, minY, minZ};
81  maxPoint = {maxX, maxY, maxZ};
82 }
83 
85 (
86  const cells &searchCell,
87  const deviceViewType3D<uint32> &head,
88  const deviceViewType1D<uint32> &next,
89  const deviceViewType1D<realx3> &points,
90  const pFlagTypeDevice &flags
91 )
92 {
93  uint32 numOut = 0;
94  auto aRange = flags.activeRange();
95 
96  if(flags.isAllActive())
97  {
98  Kokkos::parallel_reduce
99  (
100  "pFlow::mapperNBSKernels::buildListsReduce",
101  deviceRPolicyStatic(aRange.start(), aRange.end()),
102  LAMBDA_HD(uint32 i, uint32& valToUpdate)
103  {
104  int32x3 ind;
105  if( searchCell.pointIndexInDomain(points[i], ind) )
106  {
107  uint32 old = Kokkos::atomic_exchange(&head(ind.x(), ind.y(), ind.z()), i);
108  next[i] = old;
109  }
110  else
111  {
112  valToUpdate++;
113  }
114  },
115  numOut
116  );
117  }
118  else
119  {
120  Kokkos::parallel_reduce
121  (
122  "pFlow::mapperNBSKernels::buildListsReduce",
123  deviceRPolicyStatic(aRange.start(), aRange.end()),
124  LAMBDA_HD(uint32 i, uint32& valToUpdate)
125  {
126  int32x3 ind;
127  if( flags(i) )
128  {
129  if( searchCell.pointIndexInDomain(points[i], ind) )
130  {
131  uint32 old = Kokkos::atomic_exchange(&head(ind.x(), ind.y(), ind.z()), i);
132  next[i] = old;
133  }
134  else
135  {
136  valToUpdate++;
137  }
138  }
139  },
140  numOut
141  );
142  }
143 
144  return numOut == 0u ;
145 }
146 
148 (
149  const cells &searchCell,
150  const deviceViewType3D<uint32> &head,
151  const deviceViewType1D<uint32> &next,
152  const deviceViewType1D<realx3> &points,
153  const pFlagTypeDevice &flags
154 )
155 {
156  auto aRange = flags.activeRange();
157  if(flags.isAllActive() )
158  {
159  Kokkos::parallel_for
160  (
161  "pFlow::mapperNBSKernels::buildLists",
162  deviceRPolicyStatic(aRange.start(), aRange.end()),
163  LAMBDA_HD(uint32 i)
164  {
165  auto ind = searchCell.pointIndex(points[i]);
166  uint32 old = Kokkos::atomic_exchange(&head(ind.x(), ind.y(), ind.z()), i);
167  next[i] = old;
168  }
169  );
170  Kokkos::fence();
171  }
172  else
173  {
174  Kokkos::parallel_for
175  (
176  "pFlow::mapperNBSKernels::buildLists",
177  deviceRPolicyStatic(aRange.start(), aRange.end()),
178  LAMBDA_HD(uint32 i)
179  {
180  if( flags(i) )
181  {
182  auto ind = searchCell.pointIndex(points[i]);
183  uint32 old = Kokkos::atomic_exchange(&head(ind.x(), ind.y(), ind.z()), i);
184  next[i] = old;
185  }
186  }
187  );
188  Kokkos::fence();
189  }
190 
191  return true;
192 }
pFlow::mapperNBSKernels::buildLists
bool buildLists(const cells &searchCell, const deviceViewType3D< uint32 > &head, const deviceViewType1D< uint32 > &next, const deviceViewType1D< realx3 > &points, const pFlagTypeDevice &flags)
Definition: mapperNBSKernels.cpp:148
pFlow::real
float real
Definition: builtinTypes.hpp:45
mapperNBSKernels.hpp
pFlow::algorithms::KOKKOS::max
INLINE_FUNCTION_H Type max(const Type *first, uint32 numElems)
Definition: kokkosAlgorithms.hpp:104
pFlow::algorithms::KOKKOS::min
INLINE_FUNCTION_H Type min(const Type *first, int32 numElems)
Definition: kokkosAlgorithms.hpp:124
pFlow::cells::pointIndexInDomain
INLINE_FUNCTION_HD bool pointIndexInDomain(const realx3 p, int32x3 &index) const
Definition: cells.hpp:139
pFlow::uint32
unsigned int uint32
Definition: builtinTypes.hpp:56
pFlow::pointFlag::numActive
INLINE_FUNCTION_HD auto numActive() const
Definition: pointFlag.hpp:191
pFlow::mapperNBSKernels::findPointExtends
void findPointExtends(const deviceViewType1D< realx3 > &points, const pFlagTypeDevice &flags, realx3 &minPoint, realx3 &maxPoint)
Definition: mapperNBSKernels.cpp:27
pFlow::deviceViewType1D
Kokkos::View< T * > deviceViewType1D
1D array (vector) with default device (memory space and execution space)
Definition: KokkosTypes.hpp:121
pFlow::mapperNBSKernels::buildListsReduce
bool buildListsReduce(const cells &searchCell, const deviceViewType3D< uint32 > &head, const deviceViewType1D< uint32 > &next, const deviceViewType1D< realx3 > &points, const pFlagTypeDevice &flags)
Definition: mapperNBSKernels.cpp:85
pFlow::deviceViewType3D
Kokkos::View< T ***, Layout, void > deviceViewType3D
3D view on device as an array on device
Definition: KokkosTypes.hpp:129
pFlow::pointFlag::isAllActive
INLINE_FUNCTION_HD bool isAllActive() const
Definition: pointFlag.hpp:173
pFlow::pointFlag::activeRange
const INLINE_FUNCTION_HD auto & activeRange() const
Definition: pointFlag.hpp:179
pFlow::cells::pointIndex
INLINE_FUNCTION_HD int32x3 pointIndex(const realx3 &p) const
Definition: cells.hpp:133
LAMBDA_HD
#define LAMBDA_HD
Definition: pFlowMacros.hpp:58
pFlow::deviceRPolicyStatic
Kokkos::RangePolicy< Kokkos::DefaultExecutionSpace, Kokkos::Schedule< Kokkos::Static >, Kokkos::IndexType< pFlow::uint32 > > deviceRPolicyStatic
Definition: KokkosTypes.hpp:66
pFlow::cells
Definition: cells.hpp:31
pFlow::triple< real >
pFlow::pointFlag< DefaultExecutionSpace >