ArrayUtils-Impl.hpp
Go to the documentation of this file.
1 // This code is based on Jet framework.
2 // Copyright (c) 2018 Doyub Kim
3 // CubbyFlow is voxel-based fluid simulation engine for computer games.
4 // Copyright (c) 2020 CubbyFlow Team
5 // Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6 // AI Part: Dongheon Cho, Minseo Kim
7 // We are making my contributions/submissions to this project solely in our
8 // personal capacity and are not conveying any rights to any intellectual
9 // property of any third parties.
10 
11 #ifndef CUBBYFLOW_ARRAY_UTILS_IMPL_HPP
12 #define CUBBYFLOW_ARRAY_UTILS_IMPL_HPP
13 
14 #include <Core/Array/Array.hpp>
15 
16 namespace CubbyFlow
17 {
18 template <typename T, size_t N>
19 void Fill(ArrayView<T, N> a, const Vector<size_t, N>& begin,
20  const Vector<size_t, N>& end, const T& val)
21 {
22  ForEachIndex(begin, end, [&](auto... idx) { a(idx...) = val; });
23 }
24 
25 template <typename T, size_t N>
26 void Fill(ArrayView<T, N> a, const T& val)
27 {
28  Fill(a, Vector<size_t, N>{}, Vector<size_t, N>{ a.Size() }, val);
29 }
30 
31 template <typename T>
32 void Fill(ArrayView<T, 1> a, size_t begin, size_t end, const T& val)
33 {
34  Fill(a, Vector1UZ{ begin }, Vector1UZ{ end }, val);
35 }
36 
37 template <typename T, typename U, size_t N>
38 void Copy(ArrayView<T, N> src, const Vector<size_t, N>& begin,
39  const Vector<size_t, N>& end, ArrayView<U, N> dst)
40 {
41  ForEachIndex(begin, end, [&](auto... idx) { dst(idx...) = src(idx...); });
42 }
43 
44 template <typename T, typename U, size_t N>
46 {
47  Copy(src, Vector<size_t, N>{}, Vector<size_t, N>{ src.Size() }, dst);
48 }
49 
50 template <typename T, typename U>
51 void Copy(ArrayView<T, 1> src, size_t begin, size_t end, ArrayView<U, 1> dst)
52 {
53  Copy(src, Vector1UZ{ begin }, Vector1UZ{ end }, dst);
54 }
55 
56 template <typename T, typename U>
58  unsigned int numberOfIterations, ArrayView2<U> output)
59 {
60  const Vector2UZ size = input.Size();
61 
62  assert(size == valid.Size());
63  assert(size == output.Size());
64 
65  Array2<char> valid0(size);
66  Array2<char> valid1(size);
67 
68  ParallelForEachIndex(valid0.Size(), [&](size_t i, size_t j) {
69  valid0(i, j) = valid(i, j);
70  output(i, j) = input(i, j);
71  });
72 
73  for (unsigned int iter = 0; iter < numberOfIterations; ++iter)
74  {
75  ForEachIndex(valid0.Size(), [&](size_t i, size_t j) {
76  if (!valid0(i, j))
77  {
78  T sum = T{};
79  unsigned int count = 0;
80 
81  if (i + 1 < size.x && valid0(i + 1, j))
82  {
83  sum += output(i + 1, j);
84  ++count;
85  }
86 
87  if (i > 0 && valid0(i - 1, j))
88  {
89  sum += output(i - 1, j);
90  ++count;
91  }
92 
93  if (j + 1 < size.y && valid0(i, j + 1))
94  {
95  sum += output(i, j + 1);
96  ++count;
97  }
98 
99  if (j > 0 && valid0(i, j - 1))
100  {
101  sum += output(i, j - 1);
102  ++count;
103  }
104 
105  if (count > 0)
106  {
107  output(i, j) =
108  sum /
109  static_cast<typename GetScalarType<T>::value>(count);
110  valid1(i, j) = 1;
111  }
112  }
113  else
114  {
115  valid1(i, j) = 1;
116  }
117  });
118 
119  valid0.Swap(valid1);
120  }
121 }
122 
123 template <typename T, typename U>
125  unsigned int numberOfIterations, ArrayView3<U> output)
126 {
127  const Vector3UZ size = input.Size();
128 
129  assert(size == valid.Size());
130  assert(size == output.Size());
131 
132  Array3<char> valid0(size);
133  Array3<char> valid1(size);
134 
135  ParallelForEachIndex(valid0.Size(), [&](size_t i, size_t j, size_t k) {
136  valid0(i, j, k) = valid(i, j, k);
137  output(i, j, k) = input(i, j, k);
138  });
139 
140  for (unsigned int iter = 0; iter < numberOfIterations; ++iter)
141  {
142  ForEachIndex(valid0.Size(), [&](size_t i, size_t j, size_t k) {
143  if (!valid0(i, j, k))
144  {
145  T sum = T{};
146  unsigned int count = 0;
147 
148  if (i + 1 < size.x && valid0(i + 1, j, k))
149  {
150  sum += output(i + 1, j, k);
151  ++count;
152  }
153 
154  if (i > 0 && valid0(i - 1, j, k))
155  {
156  sum += output(i - 1, j, k);
157  ++count;
158  }
159 
160  if (j + 1 < size.y && valid0(i, j + 1, k))
161  {
162  sum += output(i, j + 1, k);
163  ++count;
164  }
165 
166  if (j > 0 && valid0(i, j - 1, k))
167  {
168  sum += output(i, j - 1, k);
169  ++count;
170  }
171 
172  if (k + 1 < size.z && valid0(i, j, k + 1))
173  {
174  sum += output(i, j, k + 1);
175  ++count;
176  }
177 
178  if (k > 0 && valid0(i, j, k - 1))
179  {
180  sum += output(i, j, k - 1);
181  ++count;
182  }
183 
184  if (count > 0)
185  {
186  output(i, j, k) =
187  sum /
188  static_cast<typename GetScalarType<T>::value>(count);
189  valid1(i, j, k) = 1;
190  }
191  }
192  else
193  {
194  valid1(i, j, k) = 1;
195  }
196  });
197 
198  valid0.Swap(valid1);
199  }
200 }
201 } // namespace CubbyFlow
202 
203 #endif
void ExtrapolateToRegion(ArrayView2< T > input, ArrayView2< char > valid, unsigned int numberOfIterations, ArrayView2< U > output)
Extrapolates 2-D input data from &#39;valid&#39; (1) to &#39;invalid&#39; (0) region.
Definition: ArrayUtils-Impl.hpp:57
void Copy(ArrayView< T, N > src, const Vector< size_t, N > &begin, const Vector< size_t, N > &end, ArrayView< U, N > dst)
Definition: ArrayUtils-Impl.hpp:38
Definition: Matrix.hpp:27
Definition: pybind11Utils.hpp:20
void Fill(ArrayView< T, N > a, const Vector< size_t, N > &begin, const Vector< size_t, N > &end, const T &val)
Definition: ArrayUtils-Impl.hpp:19
Definition: Array-Impl.hpp:19
void ParallelForEachIndex(const Vector< IndexType, N > &begin, const Vector< IndexType, N > &end, const Func &func, ExecutionPolicy policy)
Definition: IterationUtils-Impl.hpp:98
Generic N-dimensional array class interface.
Definition: Array.hpp:32
void ForEachIndex(const Vector< IndexType, N > &begin, const Vector< IndexType, N > &end, const Func &func)
Definition: IterationUtils-Impl.hpp:51
const Vector< size_t, N > & Size() const
Definition: ArrayBase-Impl.hpp:51
T value
Definition: TypeHelpers.hpp:20