36 #ifndef OPM_CSRMATRIXBLOCKASSEMBLER_HPP_HEADER
37 #define OPM_CSRMATRIXBLOCKASSEMBLER_HPP_HEADER
39 #include <opm/core/transport/implicit/JacobianSystem.hpp>
51 namespace ImplicitTransportDefault {
65 template <
class Block>
67 assembleBlock(::std::size_t ndof,
73 assert (ndof == ndof_);
75 const ::std::size_t start = ia_[i*ndof + 0];
76 const ::std::size_t off =
79 for (::std::size_t row = 0; row < ndof; ++row) {
80 const ::std::size_t J = ia_[i*ndof + row] + off;
82 for (::std::size_t col = 0; col < ndof; ++col) {
83 sa_[J + col] += b[col*ndof + row];
88 template <
class Connections>
90 createBlockRow(::std::size_t i ,
91 const Connections& conn,
95 assert (ndof == ndof_);
96 assert (i == (ia_.size() - 1) / ndof_); (void) i;
98 expandSortConn(conn, ndof);
99 const int nconn =
static_cast<int>(esconn_.size());
101 for (::std::size_t dof = 0; dof < ndof; ++dof) {
102 ja_.insert(ja_.end(), esconn_.begin(), esconn_.end());
103 ia_.push_back(ia_.back() + nconn);
106 sa_.insert(sa_.end(), nconn * ndof, double(0.0));
112 finalizeStructure() {
118 setSize(
size_t ndof,
size_t m,
size_t n,
size_t nnz = 0) {
123 allocate(ndof, m, nnz);
129 struct CSRMatrix& matrix() {
return mat_; }
130 const struct CSRMatrix& matrix()
const {
return mat_; }
134 allocate(::std::size_t ndof, ::std::size_t m, ::std::size_t
nnz) {
135 ia_.reserve(1 + ( m * ndof));
136 ja_.reserve(0 + (nnz * ndof));
137 sa_.reserve(0 + (nnz * ndof));
154 template <
class Connections>
156 expandSortConn(
const Connections& conn, ::std::size_t ndof) {
158 sconn_.reserve(conn.size());
160 for (
typename Connections::const_iterator
161 c = conn.begin(), e = conn.end(); c != e; ++c) {
162 sconn_.push_back(static_cast<int>(*c));
165 ::std::sort(sconn_.begin(), sconn_.end());
168 esconn_.reserve(ndof * sconn_.size());
170 for (::std::vector<int>::iterator
171 c = sconn_.begin(), e = sconn_.end(); c != e; ++c) {
172 for (::std::size_t dof = 0; dof < ndof; ++dof) {
173 esconn_.push_back(static_cast<int>((*c)*ndof + dof));
180 mat_.m = ia_.size() - 1;
181 mat_.nnz = ja_.size() ;
186 ::std::vector<int> ia_;
187 ::std::vector<int> ja_;
188 ::std::vector<double> sa_;
190 ::std::vector<int> sconn_ ;
191 ::std::vector<int> esconn_;
Basic compressed-sparse row (CSR) matrix data structure.
Definition: sparse_sys.h:38
Definition: JacobianSystem.hpp:109
size_t csrmatrix_elm_index(int i, int j, const struct CSRMatrix *A)
Compute non-zero index of specified matrix element.
int * ia
Row pointers.
Definition: sparse_sys.h:43
Data structure and operations to manage sparse matrices in CSR formats.
void csrmatrix_zero(struct CSRMatrix *A)
Zero all matrix elements, typically in preparation of elemental assembly.
size_t nnz
Number of structurally non-zero elements.
Definition: sparse_sys.h:41