Skip to content
Snippets Groups Projects
Commit 64fdd4e7 authored by Max Kahnt's avatar Max Kahnt
Browse files

Use hybrid algorithms for addProduct operation.

parent b18ba9cc
Branches
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <dune/istl/bcrsmatrix.hh> #include <dune/istl/bcrsmatrix.hh>
#include <dune/istl/scaledidmatrix.hh> #include <dune/istl/scaledidmatrix.hh>
#include "algorithm.hh"
#include "matrixtraits.hh" #include "matrixtraits.hh"
#include "scalartraits.hh" #include "scalartraits.hh"
...@@ -30,18 +31,13 @@ namespace MatrixVector { ...@@ -30,18 +31,13 @@ namespace MatrixVector {
class ADummy = A, class ADummy = A,
std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0> std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0>
static void addProduct(A& a, const B& b, const C& c) { static void addProduct(A& a, const B& b, const C& c) {
typename B::ConstRowIterator bi = b.begin(); rangeForEach(b, [&](auto&& bi, auto&& i) {
typename B::ConstRowIterator bEnd = b.end(); rangeForEach(bi, [&](auto&& bik, auto&& k) {
for (; bi != bEnd; ++bi) { rangeForEach(c[k], [&](auto&& ckj, auto&& j) {
typename B::ConstColIterator bik = bi->begin(); Dune::MatrixVector::addProduct(a[i][j], bik, ckj);
typename B::ConstColIterator biEnd = bi->end(); });
for (; bik != biEnd; ++bik) { });
typename C::ConstColIterator ckj = c[bik.index()].begin(); });
typename C::ConstColIterator ckEnd = c[bik.index()].end();
for (; ckj != ckEnd; ++ckj)
a[bi.index()][ckj.index()] += (*bik) * (*ckj);
}
}
} }
}; };
...@@ -61,18 +57,13 @@ namespace MatrixVector { ...@@ -61,18 +57,13 @@ namespace MatrixVector {
class ADummy = A, class ADummy = A,
std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0> std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0>
static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c) { static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c) {
typename B::ConstRowIterator bi = b.begin(); rangeForEach(b, [&](auto&& bi, auto&& i) {
typename B::ConstRowIterator bEnd = b.end(); rangeForEach(bi, [&](auto&& bik, auto&& k) {
for (; bi != bEnd; ++bi) { rangeForEach(c[k], [&](auto&& ckj, auto&& j) {
typename B::ConstColIterator bik = b[bi.index()].begin(); Dune::MatrixVector::addProduct(a[i][j], scalar, bik, ckj);
typename B::ConstColIterator biEnd = b[bi.index()].end(); });
for (; bik != biEnd; ++bik) { });
typename C::ConstColIterator ckj = c[bik.index()].begin(); });
typename C::ConstColIterator ckEnd = c[bik.index()].end();
for (; ckj != ckEnd; ++ckj)
a[bi.index()][ckj.index()] += scalar * (*bik) * (*ckj);
}
}
} }
}; };
...@@ -257,15 +248,11 @@ namespace MatrixVector { ...@@ -257,15 +248,11 @@ namespace MatrixVector {
class ADummy = A, class ADummy = A,
std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0> std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0>
static void addProduct(A& a, const B& b, const C& c) { static void addProduct(A& a, const B& b, const C& c) {
typename C::ConstRowIterator ci = c.begin(); rangeForEach(c, [&](auto&& ci, auto && i) {
typename C::ConstRowIterator cEnd = c.end(); rangeForEach(ci, [&](auto&& cij, auto && j) {
for (; ci != cEnd; ++ci) { Dune::MatrixVector::addProduct(a[i][j], b, cij);
typename C::ConstColIterator cik = c[ci.index()].begin(); });
typename C::ConstColIterator ciEnd = c[ci.index()].end(); });
for (; cik != ciEnd; ++cik) {
a[ci.index()][cik.index()] += b * (*cik);
}
}
} }
}; };
...@@ -286,15 +273,11 @@ namespace MatrixVector { ...@@ -286,15 +273,11 @@ namespace MatrixVector {
class ADummy = A, class ADummy = A,
std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0> std::enable_if_t<MatrixTraits<ADummy>::isMatrix, int> SFINAE_Dummy = 0>
static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c) { static void addProduct(A& a, const Scalar& scalar, const B& b, const C& c) {
typename C::ConstRowIterator ci = c.begin(); rangeForEach(c, [&](auto&& ci, auto&& i) {
typename C::ConstRowIterator cEnd = c.end(); rangeForEach(ci, [&](auto&& cij, auto&& j) {
for (; ci != cEnd; ++ci) { Dune::MatrixVector::addProduct(a[i][j], scalar, b, cij);
typename C::ConstColIterator cik = c[ci.index()].begin(); });
typename C::ConstColIterator ciEnd = c[ci.index()].end(); });
for (; cik != ciEnd; ++cik) {
a[ci.index()][cik.index()] += scalar * b * (*cik);
}
}
} }
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment