From 4c386b0e45198a12a7869d22d16d32256b6dd66f Mon Sep 17 00:00:00 2001 From: Halvor M Nilsen Date: Fri, 31 Jan 2025 17:27:48 +0100 Subject: [PATCH] Add Preconditions to Avoid Incorrect Interior Sizes --- opm/simulators/linalg/ParallelOverlappingILU0_impl.hpp | 5 +++++ opm/simulators/linalg/PreconditionerFactory_impl.hpp | 3 +++ 2 files changed, 8 insertions(+) diff --git a/opm/simulators/linalg/ParallelOverlappingILU0_impl.hpp b/opm/simulators/linalg/ParallelOverlappingILU0_impl.hpp index 78968b717..822ea19e3 100644 --- a/opm/simulators/linalg/ParallelOverlappingILU0_impl.hpp +++ b/opm/simulators/linalg/ParallelOverlappingILU0_impl.hpp @@ -31,6 +31,8 @@ #include #include +#include + namespace Opm { namespace detail @@ -41,6 +43,7 @@ template void ghost_last_bilu0_decomposition (M& A, std::size_t interiorSize) { // iterator types + assert(interiorSize <= A.N()); using rowiterator = typename M::RowIterator; using coliterator = typename M::ColIterator; using block = typename M::block_type; @@ -311,6 +314,7 @@ ParallelOverlappingILU0(const Matrix& A, { // BlockMatrix is a Subclass of FieldMatrix that just adds // methods. Therefore this cast should be safe. + assert(interiorSize <= A_->N()); update( ); } @@ -443,6 +447,7 @@ update() if (comm_) { interiorSize_ = detail::set_interiorSize(A_->N(), interiorSize_, *comm_); + assert(interiorSize_ <= A_->N()); } // create ILU-0 decomposition diff --git a/opm/simulators/linalg/PreconditionerFactory_impl.hpp b/opm/simulators/linalg/PreconditionerFactory_impl.hpp index 58e863928..44287b6eb 100644 --- a/opm/simulators/linalg/PreconditionerFactory_impl.hpp +++ b/opm/simulators/linalg/PreconditionerFactory_impl.hpp @@ -58,6 +58,8 @@ #include #endif +#include + namespace Opm { template @@ -396,6 +398,7 @@ struct StandardPreconditioners { // Already a parallel preconditioner. Need to pass comm, but no need to wrap it in a BlockPreconditioner. if (ilulevel == 0) { const std::size_t num_interior = interiorIfGhostLast(comm); + assert(num_interior <= op.getmat().N()); return std::make_shared>( op.getmat(), comm, w, MILU_VARIANT::ILU, num_interior, redblack, reorder_spheres); } else {