Loading...
Searching...
No Matches
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
16namespace CubbyFlow
17{
18template <typename T, size_t N>
20 const Vector<size_t, N>& end, const T& val)
21{
22 ForEachIndex(begin, end, [&](auto... idx) { a(idx...) = val; });
23}
24
25template <typename T, size_t N>
26void Fill(ArrayView<T, N> a, const T& val)
27{
29}
30
31template <typename T>
32void 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
37template <typename T, typename U, size_t N>
40{
41 ForEachIndex(begin, end, [&](auto... idx) { dst(idx...) = src(idx...); });
42}
43
44template <typename T, typename U, size_t N>
49
50template <typename T, typename U>
51void 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
56template <typename T, typename U>
59{
60 const Vector2UZ size = input.Size();
61
62 assert(size == valid.Size());
63 assert(size == output.Size());
64
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
120 }
121}
122
123template <typename T, typename U>
126{
127 const Vector3UZ size = input.Size();
128
129 assert(size == valid.Size());
130 assert(size == output.Size());
131
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
199 }
200}
201} // namespace CubbyFlow
202
203#endif
Definition Matrix.hpp:30
void Swap(Matrix &other)
Definition Matrix-Impl.hpp:254
Definition pybind11Utils.hpp:21
void ForEachIndex(const Vector< IndexType, N > &begin, const Vector< IndexType, N > &end, const Func &func)
Definition IterationUtils-Impl.hpp:51
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
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
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
void ParallelForEachIndex(const Vector< IndexType, N > &begin, const Vector< IndexType, N > &end, const Func &func, ExecutionPolicy policy)
Definition IterationUtils-Impl.hpp:98
void ExtrapolateToRegion(ArrayView2< T > input, ArrayView2< char > valid, unsigned int numberOfIterations, ArrayView2< U > output)
Extrapolates 2-D input data from 'valid' (1) to 'invalid' (0) region.
Definition ArrayUtils-Impl.hpp:57