Skip to content
Snippets Groups Projects
Commit 58a65f80 authored by Elias Pipping's avatar Elias Pipping
Browse files

Make ignoreNodes optional

As the name suggests, anything that derives from CanIgnore is supposed
to optionally support ignoreNodes but not require them to be set.
parent d70e1a39
No related branches found
No related tags found
No related merge requests found
...@@ -33,7 +33,7 @@ std::istream& operator>>(std::istream& lhs, Direction& t); ...@@ -33,7 +33,7 @@ std::istream& operator>>(std::istream& lhs, Direction& t);
* \param direction Iteration direction (e.g. forward, backward, ...) * \param direction Iteration direction (e.g. forward, backward, ...)
*/ */
template <class M, class V, class BitVector, class LocalSolver> template <class M, class V, class BitVector, class LocalSolver>
void linearStep(const M& m, V& x, const V& b, const BitVector& ignore, void linearStep(const M& m, V& x, const V& b, const BitVector* ignore,
LocalSolver&& localSolver, LocalSolver&& localSolver,
Direction direction = Direction::FORWARD) { Direction direction = Direction::FORWARD) {
// Note: move-capture requires C++14 // Note: move-capture requires C++14
...@@ -43,8 +43,12 @@ void linearStep(const M& m, V& x, const V& b, const BitVector& ignore, ...@@ -43,8 +43,12 @@ void linearStep(const M& m, V& x, const V& b, const BitVector& ignore,
auto ri = b[i]; auto ri = b[i];
for (auto cIt = row_i.begin(); cIt != row_i.end(); ++cIt) for (auto cIt = row_i.begin(); cIt != row_i.end(); ++cIt)
cIt->mmv(x[cIt.index()], ri); cIt->mmv(x[cIt.index()], ri);
std::bitset<V::block_type::dimension> ignore_i(0);
if (ignore != nullptr)
ignore_i = (*ignore)[i];
// Update iterate with correction // Update iterate with correction
x[i] += localSolver(row_i[i], std::move(ri), ignore[i]); x[i] += localSolver(row_i[i], std::move(ri), ignore_i);
}; };
if (direction != Direction::BACKWARD) if (direction != Direction::BACKWARD)
...@@ -60,7 +64,8 @@ template <class M, class V, class BitVector, class LocalSolver> ...@@ -60,7 +64,8 @@ template <class M, class V, class BitVector, class LocalSolver>
void linearStep(LinearIterationStep<M, V, BitVector>& lis, void linearStep(LinearIterationStep<M, V, BitVector>& lis,
LocalSolver&& localSolver, LocalSolver&& localSolver,
Direction direction = Direction::FORWARD) { Direction direction = Direction::FORWARD) {
linearStep(*lis.mat_, *lis.x_, *lis.rhs_, lis.ignore(), BitVector const* ignore = lis.hasIgnore() ? &lis.ignore() : nullptr;
linearStep(*lis.mat_, *lis.x_, *lis.rhs_, ignore,
std::forward<LocalSolver>(localSolver), direction); std::forward<LocalSolver>(localSolver), direction);
} }
...@@ -310,7 +315,6 @@ struct BlockGSStep : public LinearIterationStep<Matrix, Vector, BitVector> { ...@@ -310,7 +315,6 @@ struct BlockGSStep : public LinearIterationStep<Matrix, Vector, BitVector> {
, direction_(direction) {} , direction_(direction) {}
void iterate() { void iterate() {
assert(this->hasIgnore());
assert(this->mat_ != nullptr); assert(this->mat_ != nullptr);
assert(this->x_ != nullptr); assert(this->x_ != nullptr);
assert(this->rhs_ != nullptr); assert(this->rhs_ != nullptr);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment