57 const std::vector<numeric_index_type> & brows,
58 const std::vector<numeric_index_type> & bcols)
60 libmesh_assert_equal_to (dm.
m() / brows.size(), dm.
n() / bcols.size());
63 (dm.
m() / brows.size());
65 libmesh_assert_equal_to (dm.
m()%blocksize, 0);
66 libmesh_assert_equal_to (dm.
n()%blocksize, 0);
68 std::vector<numeric_index_type> rows, cols;
70 rows.reserve(blocksize*brows.size());
71 cols.reserve(blocksize*bcols.size());
73 for (std::size_t ib=0; ib<brows.size(); ib++)
77 for (
unsigned int v=0; v<blocksize; v++)
81 for (std::size_t jb=0; jb<bcols.size(); jb++)
85 for (
unsigned int v=0; v<blocksize; v++)
89 this->add_matrix (dm, rows, cols);
102 libmesh_not_implemented();
105 os <<
"Real part:" << std::endl;
109 os << std::setw(8) << (*this)(i,j).real() <<
" ";
113 os << std::endl <<
"Imaginary part:" << std::endl;
117 os << std::setw(8) << (*this)(i,j).imag() <<
" ";
128 template <
typename T>
129 std::unique_ptr<SparseMatrix<T>>
137 switch (solver_package)
140 #ifdef LIBMESH_HAVE_LASPACK 142 return libmesh_make_unique<LaspackMatrix<T>>(comm);
146 #ifdef LIBMESH_HAVE_PETSC 148 return libmesh_make_unique<PetscMatrix<T>>(comm);
152 #ifdef LIBMESH_TRILINOS_HAVE_EPETRA 154 return libmesh_make_unique<EpetraMatrix<T>>(comm);
158 #ifdef LIBMESH_HAVE_EIGEN 160 return libmesh_make_unique<EigenSparseMatrix<T>>(comm);
164 libmesh_error_msg(
"ERROR: Unrecognized solver package: " << solver_package);
169 template <
typename T>
174 this->vector_mult_add(dest,arg);
179 template <
typename T>
190 template <
typename T>
194 libmesh_not_implemented();
199 template <
typename T>
202 parallel_object_only();
207 libmesh_error_msg(
"Error! Trying to print a matrix with no dof_map set!");
211 if (this->processor_id() == 0)
213 libmesh_assert_equal_to (this->_dof_map->first_dof(), 0);
215 i!=this->_dof_map->end_dof(); ++i)
222 if (c != static_cast<T>(0.0))
224 os << i <<
" " << j <<
" " << c << std::endl;
231 os << (*
this)(i,j) <<
" ";
236 std::vector<numeric_index_type> ibuf, jbuf;
241 this->comm().receive(p, ibuf);
242 this->comm().receive(p, jbuf);
243 this->comm().receive(p, cbuf);
244 libmesh_assert_equal_to (ibuf.size(), jbuf.size());
245 libmesh_assert_equal_to (ibuf.size(), cbuf.size());
249 libmesh_assert_greater_equal (ibuf.front(), currenti);
250 libmesh_assert_greater_equal (ibuf.back(), ibuf.front());
252 std::size_t currentb = 0;
253 for (;currenti <= ibuf.back(); ++currenti)
259 if (currentb < ibuf.size() &&
260 ibuf[currentb] == currenti &&
263 os << currenti <<
" " << j <<
" " << cbuf[currentb] << std::endl;
272 if (currentb < ibuf.size() &&
273 ibuf[currentb] == currenti &&
276 os << cbuf[currentb] <<
" ";
280 os << static_cast<T>(0.0) <<
" ";
288 for (; currenti != this->m(); ++currenti)
291 os << static_cast<T>(0.0) <<
" ";
298 std::vector<numeric_index_type> ibuf, jbuf;
304 i!=this->_dof_map->end_dof(); ++i)
309 if (c != static_cast<T>(0.0))
317 this->comm().send(0,ibuf);
318 this->comm().send(0,jbuf);
319 this->comm().send(0,cbuf);
SparseMatrix(const Parallel::Communicator &comm)
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
uint8_t processor_id_type
Provides a uniform interface to vector storage schemes for different linear algebra libraries...
void libmesh_ignore(const Args &...)
dof_id_type numeric_index_type
An object whose state is distributed along a set of processors.
A matrix object used for finite element assembly and numerics.