Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/extern
diff options
context:
space:
mode:
authorSebastián Barschkis <sebbas@sebbas.org>2020-02-28 17:31:10 +0300
committerSebastián Barschkis <sebbas@sebbas.org>2020-02-28 18:20:13 +0300
commit21bdeb5cc00f29ef452ff61d8947269bb1baba66 (patch)
treeb1f996e1707544594b04c37dd0aa78199c5c9b7a /extern
parentaf54bbd61c769c69891c9b39df19eb3cad9dafe2 (diff)
Fluid: Updated Manta pp files
Updates include: - std::move() cleanup in rcmatrix.h - Enabled parallelization for fluid guiding (fairly noticeable speed improvement). - More flexible flags setter function with control over boundary width.
Diffstat (limited to 'extern')
-rw-r--r--extern/mantaflow/helper/util/rcmatrix.h84
-rw-r--r--extern/mantaflow/preprocessed/gitinfo.h2
-rw-r--r--extern/mantaflow/preprocessed/plugin/initplugins.cpp37
3 files changed, 35 insertions, 88 deletions
diff --git a/extern/mantaflow/helper/util/rcmatrix.h b/extern/mantaflow/helper/util/rcmatrix.h
index 39951cece2e..3a466952ac2 100644
--- a/extern/mantaflow/helper/util/rcmatrix.h
+++ b/extern/mantaflow/helper/util/rcmatrix.h
@@ -17,16 +17,13 @@
// link to omp & tbb for now
#if OPENMP == 1 || TBB == 1
-# define MANTA_ENABLE_PARALLEL 0
+# define MANTA_ENABLE_PARALLEL 1
// allow the preconditioner to be computed in parallel? (can lead to slightly non-deterministic
// results)
# define MANTA_ENABLE_PARALLEL_PC 0
-// use c++11 code?
-# define MANTA_USE_CPP11 1
#else
# define MANTA_ENABLE_PARALLEL 0
# define MANTA_ENABLE_PARALLEL_PC 0
-# define MANTA_USE_CPP11 0
#endif
#if MANTA_ENABLE_PARALLEL == 1
@@ -503,11 +500,7 @@ template<class N, class T> struct RCMatrix {
for (Iterator it = row_begin(i); it; ++it)
result.fix_element(it.index(), i, it.value());
}
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
return result;
-#endif
}
RCMatrix getKtK() const
@@ -532,12 +525,7 @@ template<class N, class T> struct RCMatrix {
}
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix operator*(const RCMatrix &m) const
@@ -561,12 +549,7 @@ template<class N, class T> struct RCMatrix {
}
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix sqrt() const
@@ -581,12 +564,7 @@ template<class N, class T> struct RCMatrix {
result.set_element(i, j, std::sqrt(it_A.value()));
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix operator*(const double k) const
@@ -601,12 +579,7 @@ template<class N, class T> struct RCMatrix {
result.add_to_element(i, j, it_A.value() * k);
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix applyKernel(const RCMatrix &kernel, const int nx, const int ny) const
@@ -640,12 +613,7 @@ template<class N, class T> struct RCMatrix {
}
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix applyHorizontalKernel(const RCMatrix &kernel, const int nx, const int ny) const
@@ -679,12 +647,7 @@ template<class N, class T> struct RCMatrix {
}
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix applyVerticalKernel(const RCMatrix &kernel, const int nx, const int ny) const
@@ -718,12 +681,7 @@ template<class N, class T> struct RCMatrix {
}
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix applySeparableKernel(const RCMatrix &kernelH,
@@ -747,11 +705,7 @@ template<class N, class T> struct RCMatrix {
{
std::vector<T> result(n, 0.0);
multiply(rhs, result);
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
return result;
-#endif
}
void multiply(const std::vector<T> &rhs, std::vector<T> &result) const
{
@@ -832,11 +786,7 @@ template<class N, class T> struct RCMatrix {
for (N i = 0; i < result.size(); i++) {
result[i] = std::abs(result[i] - rhs[i]);
}
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
return result;
-#endif
}
T norm() const
{
@@ -1024,11 +974,7 @@ template<class N, class T> struct RCFixedMatrix {
{
std::vector<T> result(n, 0.0);
multiply(rhs, result);
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
return result;
-#endif
}
void multiply(const std::vector<T> &rhs, std::vector<T> &result) const
{
@@ -1064,12 +1010,7 @@ template<class N, class T> struct RCFixedMatrix {
}
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
RCMatrix<N, T> toRCMatrix() const
@@ -1087,12 +1028,7 @@ template<class N, class T> struct RCFixedMatrix {
result.matrix[i]->value[j] = value[rowstart[i] + j];
}
}
- parallel_end
-#if MANTA_USE_CPP11 == 1
- return std::move(result);
-#else
- return result;
-#endif
+ parallel_end return result;
}
};
diff --git a/extern/mantaflow/preprocessed/gitinfo.h b/extern/mantaflow/preprocessed/gitinfo.h
index 614bf2b91c4..29a9158d5c3 100644
--- a/extern/mantaflow/preprocessed/gitinfo.h
+++ b/extern/mantaflow/preprocessed/gitinfo.h
@@ -1,3 +1,3 @@
-#define MANTA_GIT_VERSION "commit ce000bcbd7004e6549ac2f118755fcdc1f679bc3"
+#define MANTA_GIT_VERSION "commit 1d52e96ad602f1974dfee75bef293bc397e4b41b"
diff --git a/extern/mantaflow/preprocessed/plugin/initplugins.cpp b/extern/mantaflow/preprocessed/plugin/initplugins.cpp
index 519aa41a08d..7a765813f9f 100644
--- a/extern/mantaflow/preprocessed/plugin/initplugins.cpp
+++ b/extern/mantaflow/preprocessed/plugin/initplugins.cpp
@@ -1829,13 +1829,15 @@ struct KnUpdateFlagsObs : public KernelBase {
const MACGrid *fractions,
const Grid<Real> &phiObs,
const Grid<Real> *phiOut,
- const Grid<Real> *phiIn)
- : KernelBase(&flags, 1),
+ const Grid<Real> *phiIn,
+ int boundaryWidth)
+ : KernelBase(&flags, boundaryWidth),
flags(flags),
fractions(fractions),
phiObs(phiObs),
phiOut(phiOut),
- phiIn(phiIn)
+ phiIn(phiIn),
+ boundaryWidth(boundaryWidth)
{
runMessage();
run();
@@ -1847,7 +1849,8 @@ struct KnUpdateFlagsObs : public KernelBase {
const MACGrid *fractions,
const Grid<Real> &phiObs,
const Grid<Real> *phiOut,
- const Grid<Real> *phiIn) const
+ const Grid<Real> *phiIn,
+ int boundaryWidth) const
{
bool isObs = false;
@@ -1910,6 +1913,11 @@ struct KnUpdateFlagsObs : public KernelBase {
return phiIn;
}
typedef Grid<Real> type4;
+ inline int &getArg5()
+ {
+ return boundaryWidth;
+ }
+ typedef int type5;
void runMessage()
{
debMsg("Executing kernel KnUpdateFlagsObs ", 3);
@@ -1923,15 +1931,15 @@ struct KnUpdateFlagsObs : public KernelBase {
const int _maxY = maxY;
if (maxZ > 1) {
for (int k = __r.begin(); k != (int)__r.end(); k++)
- for (int j = 1; j < _maxY; j++)
- for (int i = 1; i < _maxX; i++)
- op(i, j, k, flags, fractions, phiObs, phiOut, phiIn);
+ for (int j = boundaryWidth; j < _maxY; j++)
+ for (int i = boundaryWidth; i < _maxX; i++)
+ op(i, j, k, flags, fractions, phiObs, phiOut, phiIn, boundaryWidth);
}
else {
const int k = 0;
for (int j = __r.begin(); j != (int)__r.end(); j++)
- for (int i = 1; i < _maxX; i++)
- op(i, j, k, flags, fractions, phiObs, phiOut, phiIn);
+ for (int i = boundaryWidth; i < _maxX; i++)
+ op(i, j, k, flags, fractions, phiObs, phiOut, phiIn, boundaryWidth);
}
}
void run()
@@ -1939,13 +1947,14 @@ struct KnUpdateFlagsObs : public KernelBase {
if (maxZ > 1)
tbb::parallel_for(tbb::blocked_range<IndexInt>(minZ, maxZ), *this);
else
- tbb::parallel_for(tbb::blocked_range<IndexInt>(1, maxY), *this);
+ tbb::parallel_for(tbb::blocked_range<IndexInt>(boundaryWidth, maxY), *this);
}
FlagGrid &flags;
const MACGrid *fractions;
const Grid<Real> &phiObs;
const Grid<Real> *phiOut;
const Grid<Real> *phiIn;
+ int boundaryWidth;
};
//! update obstacle and outflow flags from levelsets
@@ -1954,9 +1963,10 @@ void setObstacleFlags(FlagGrid &flags,
const Grid<Real> &phiObs,
const MACGrid *fractions = NULL,
const Grid<Real> *phiOut = NULL,
- const Grid<Real> *phiIn = NULL)
+ const Grid<Real> *phiIn = NULL,
+ int boundaryWidth = 1)
{
- KnUpdateFlagsObs(flags, fractions, phiObs, phiOut, phiIn);
+ KnUpdateFlagsObs(flags, fractions, phiObs, phiOut, phiIn, boundaryWidth);
}
static PyObject *_W_18(PyObject *_self, PyObject *_linargs, PyObject *_kwds)
{
@@ -1973,8 +1983,9 @@ static PyObject *_W_18(PyObject *_self, PyObject *_linargs, PyObject *_kwds)
const MACGrid *fractions = _args.getPtrOpt<MACGrid>("fractions", 2, NULL, &_lock);
const Grid<Real> *phiOut = _args.getPtrOpt<Grid<Real>>("phiOut", 3, NULL, &_lock);
const Grid<Real> *phiIn = _args.getPtrOpt<Grid<Real>>("phiIn", 4, NULL, &_lock);
+ int boundaryWidth = _args.getOpt<int>("boundaryWidth", 5, 1, &_lock);
_retval = getPyNone();
- setObstacleFlags(flags, phiObs, fractions, phiOut, phiIn);
+ setObstacleFlags(flags, phiObs, fractions, phiOut, phiIn, boundaryWidth);
_args.check();
}
pbFinalizePlugin(parent, "setObstacleFlags", !noTiming);