Skip to content
Snippets Groups Projects

Fix: Cope with omitted diagonal blocks in outer GS loop.

Merged maxka requested to merge feature/blocksolver-missing-diagonal into master
@@ -40,16 +40,23 @@ void linearStep(const M& m, V& x, const V& b, const BitVector* ignore,
@@ -40,16 +40,23 @@ void linearStep(const M& m, V& x, const V& b, const BitVector* ignore,
// Note: move-capture requires C++14
// Note: move-capture requires C++14
auto blockStep = [&, localSolver = std::move(localSolver) ](size_t i) {
auto blockStep = [&, localSolver = std::move(localSolver) ](size_t i) {
const auto& row_i = m[i];
const auto& row_i = m[i];
 
// Compute residual
// Compute residual
auto ri = b[i];
auto ri = b[i];
for (auto cIt = row_i.begin(); cIt != row_i.end(); ++cIt)
using Block = typename M::block_type;
cIt->mmv(x[cIt.index()], ri);
const Block* diag = nullptr;
 
for (auto cIt = row_i.begin(); cIt != row_i.end(); ++cIt) {
 
size_t j = cIt.index();
 
cIt->mmv(x[j], ri);
 
if (j == i)
 
diag = &*cIt;
 
}
 
 
using Ignore = std::bitset<V::block_type::dimension>;
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(diag != nullptr ? *diag : Block(0.0), std::move(ri),
 
ignore != nullptr ? (*ignore)[i] : Ignore(0));
};
};
if (direction != Direction::BACKWARD)
if (direction != Direction::BACKWARD)
Loading