36 #ifndef OPM_CSRMATRIXBLOCKASSEMBLER_HPP_HEADER
37 #define OPM_CSRMATRIXBLOCKASSEMBLER_HPP_HEADER
51 namespace ImplicitTransportDefault {
65 template <
class Block>
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>
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));
118 setSize(
size_t ndof,
size_t m,
size_t n,
size_t nnz = 0) {
123 allocate(ndof, m, nnz);
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_;
void finalizeStructure()
Definition: CSRMatrixBlockAssembler.hpp:112
struct CSRMatrix & matrix()
Definition: CSRMatrixBlockAssembler.hpp:129
int * ia
Definition: sparse_sys.h:43
Definition: sparse_sys.h:38
size_t m
Definition: sparse_sys.h:40
Definition: AnisotropicEikonal.hpp:43
size_t nnz
Definition: sparse_sys.h:41
void createBlockRow(::std::size_t i, const Connections &conn,::std::size_t ndof)
Definition: CSRMatrixBlockAssembler.hpp:90
size_t csrmatrix_elm_index(int i, int j, const struct CSRMatrix *A)
static void zero(struct CSRMatrix &A)
Definition: CSRMatrixBlockAssembler.hpp:57
const struct CSRMatrix & matrix() const
Definition: CSRMatrixBlockAssembler.hpp:130
Definition: JacobianSystem.hpp:109
void csrmatrix_zero(struct CSRMatrix *A)
void assembleBlock(::std::size_t ndof,::std::size_t i,::std::size_t j, const Block &b)
Definition: CSRMatrixBlockAssembler.hpp:67
void setSize(size_t ndof, size_t m, size_t n, size_t nnz=0)
Definition: CSRMatrixBlockAssembler.hpp:118