diff options
Diffstat (limited to 'src/lib/netlist/plib/mat_cr.h')
-rw-r--r-- | src/lib/netlist/plib/mat_cr.h | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/lib/netlist/plib/mat_cr.h b/src/lib/netlist/plib/mat_cr.h index 827f9a6c270..be2d730b215 100644 --- a/src/lib/netlist/plib/mat_cr.h +++ b/src/lib/netlist/plib/mat_cr.h @@ -28,6 +28,9 @@ namespace plib { + // FIXME: causes a crash with GMRES handler + // template<typename T, int N, typename C = std::size_t> + template<typename T, int N, typename C = uint16_t> struct matrix_compressed_rows_t { @@ -69,7 +72,7 @@ namespace plib ~matrix_compressed_rows_t() = default; - index_type size() const { return m_size; } + constexpr index_type size() const { return (N>0) ? N : m_size; } void set_scalar(const T scalar) { @@ -382,7 +385,7 @@ namespace plib * */ - for (std::size_t i = 1; i < m_size; i++) // row i + for (std::size_t i = 1; i < size(); i++) // row i { const std::size_t p_i_end = row_idx[i + 1]; // loop over all columns k left of diag in row i @@ -398,8 +401,8 @@ namespace plib while (i_j < p_i_end && k_j < p_k_end ) // pj = (i, j) { // we can assume that within a row ja increases continuously */ - const auto c_i_j = col_idx[i_j]; // row i, column j - const auto c_k_j = col_idx[k_j]; // row i, column j + const std::size_t c_i_j = col_idx[i_j]; // row i, column j + const std::size_t c_k_j = col_idx[k_j]; // row i, column j if (c_k_j < c_i_j) k_j++; else if (c_k_j == c_i_j) @@ -435,7 +438,7 @@ namespace plib * This can be solved for x using backwards elimination in U. * */ - for (std::size_t i = 1; i < m_size; ++i ) + for (std::size_t i = 1; i < size(); ++i ) { T tmp = 0.0; const std::size_t j1 = row_idx[i]; @@ -443,11 +446,10 @@ namespace plib for (std::size_t j = j1; j < j2; ++j ) tmp += A[j] * r[col_idx[j]]; - r[i] -= tmp; } // i now is equal to n; - for (std::size_t i = m_size; i-- > 0; ) + for (std::size_t i = size(); i-- > 0; ) { T tmp = 0.0; const std::size_t di = diag[i]; |