19#ifndef AMESOS2_CSSMKL_DEF_HPP
20#define AMESOS2_CSSMKL_DEF_HPP
24#include <Teuchos_Tuple.hpp>
25#include <Teuchos_toString.hpp>
26#include <Teuchos_StandardParameterEntryValidators.hpp>
36# include <mkl_pardiso.h>
39 template <
class Matrix,
class Vector>
41 Teuchos::RCP<Vector> X,
42 Teuchos::RCP<const Vector> B)
44 , n_(Teuchos::as<int_t>(this->globalNumRows_))
45 , perm_(this->globalNumRows_)
47 , css_initialized_(false)
48 , is_contiguous_(true)
52 Teuchos::RCP<const Teuchos::Comm<int> > matComm = this->
matrixA_->
getComm ();
53 const global_ordinal_type indexBase = this->
matrixA_->getRowMap ()->getIndexBase ();
54 const local_ordinal_type nrows = this->
matrixA_->getLocalNumRows();
58 Teuchos::rcp (
new map_type (this->
globalNumRows_, nrows, indexBase, matComm));
59 css_contig_rowmap_ = Teuchos::rcp (
new map_type (0, 0, indexBase, matComm));
60 css_contig_colmap_ = Teuchos::rcp (
new map_type (0, 0, indexBase, matComm));
64 set_css_mkl_default_parameters(
pt_,
iparm_);
67 iparm_[34] = (indexBase == 0 ? 1 : 0);
69 auto frow = css_rowmap_->getMinGlobalIndex();
75 TEUCHOS_TEST_FOR_EXCEPTION(
76 matComm.is_null (), std::logic_error,
"Amesos2::CssMKL "
77 "constructor: The matrix's communicator is null!");
78 Teuchos::RCP<const Teuchos::MpiComm<int> > matMpiComm =
79 Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> > (matComm);
80 TEUCHOS_TEST_FOR_EXCEPTION(
81 matMpiComm.is_null (), std::logic_error,
"Amesos2::CssMKL "
82 "constructor: The matrix's communicator is not an MpiComm!");
83 TEUCHOS_TEST_FOR_EXCEPTION(
84 matMpiComm->getRawMpiComm ().is_null (), std::logic_error,
"Amesos2::"
85 "CssMKL constructor: The matrix's communicator claims to be a "
86 "Teuchos::MpiComm<int>, but its getRawPtrComm() method returns "
87 "Teuchos::null! This means that the underlying MPI_Comm doesn't even "
88 "exist, which likely implies that the Teuchos::MpiComm was constructed "
89 "incorrectly. It means something different than if the MPI_Comm were "
91 MPI_Comm CssComm = *(matMpiComm->getRawMpiComm ());
92 CssComm_ = MPI_Comm_c2f(CssComm);
96 template <
class Matrix,
class Vector>
103 if (css_initialized_)
106 void *bdummy, *xdummy;
107 const MPI_Fint CssComm = CssComm_;
108 function_map::cluster_sparse_solver( pt_,
const_cast<int_t*
>(&maxfct_),
109 const_cast<int_t*
>(&mnum_), &mtype_, &phase, &n_,
110 nzvals_view_.data(), rowptr_view_.data(),
111 colind_view_.data(), perm_.getRawPtr(), &nrhs_, iparm_,
112 const_cast<int_t*
>(&msglvl_), &bdummy, &xdummy, &CssComm, &error );
113 css_initialized_ =
false;
115 check_css_mkl_error(Amesos2::CLEAN, error);
119 template<
class Matrix,
class Vector>
129 template <
class Matrix,
class Vector>
133 if (msglvl_ > 0 && this->matrixA_->getComm()->getRank() == 0) {
134 std::cout <<
" CssMKL::symbolicFactorization:\n" << std::endl;
135 for (
int i=0; i < 64; i++) std::cout <<
" * IPARM[" << i <<
"] = " << iparm_[i] << std::endl;
139#ifdef HAVE_AMESOS2_TIMERS
140 Teuchos::TimeMonitor symbFactTimer( this->timers_.symFactTime_ );
143 if (css_initialized_)
146 void *bdummy, *xdummy;
147 const MPI_Fint CssComm = CssComm_;
148 function_map::cluster_sparse_solver( pt_,
const_cast<int_t*
>(&maxfct_),
149 const_cast<int_t*
>(&mnum_), &mtype_, &phase, &n_,
150 nzvals_view_.data(), rowptr_view_.data(),
151 colind_view_.data(), perm_.getRawPtr(), &nrhs_, iparm_,
152 const_cast<int_t*
>(&msglvl_), &bdummy, &xdummy, &CssComm, &error );
153 css_initialized_ =
false;
154 if (msglvl_ > 0 && error != 0 && this->matrixA_->getComm()->getRank() == 0) {
155 std::cout <<
" CssMKL::symbolicFactorization: clean-up failed with " << error << std::endl;
161 void *bdummy, *xdummy;
162 const MPI_Fint CssComm = CssComm_;
163 function_map::cluster_sparse_solver( pt_,
const_cast<int_t*
>(&maxfct_),
164 const_cast<int_t*
>(&mnum_), &mtype_, &phase, &n_,
165 nzvals_view_.data(), rowptr_view_.data(),
166 colind_view_.data(), perm_.getRawPtr(), &nrhs_, iparm_,
167 const_cast<int_t*
>(&msglvl_), &bdummy, &xdummy, &CssComm, &error );
169 check_css_mkl_error(Amesos2::SYMBFACT, error);
170 if (msglvl_ > 0 && this->matrixA_->getComm()->getRank() == 0) {
171 std::cout <<
" CssMKL::symbolicFactorization done:" << std::endl;
172#ifdef HAVE_AMESOS2_TIMERS
173 std::cout <<
" * Time : " << this->timers_.symFactTime_.totalElapsedTime() << std::endl;
175 std::cout <<
" * Time : not enabled" << std::endl;
182 this->setNnzLU(iparm_[17]);
183 css_initialized_ =
true;
188 template <
class Matrix,
class Vector>
192 if (msglvl_ > 0 && this->matrixA_->getComm()->getRank() == 0) {
193 std::cout <<
" CssMKL::numericFactorization:\n" << std::endl;
197#ifdef HAVE_AMESOS2_TIMERS
198 Teuchos::TimeMonitor numFactTimer( this->timers_.numFactTime_ );
203 void *bdummy, *xdummy;
204 const MPI_Fint CssComm = CssComm_;
205 function_map::cluster_sparse_solver( pt_,
const_cast<int_t*
>(&maxfct_),
206 const_cast<int_t*
>(&mnum_), &mtype_, &phase, &n_,
207 nzvals_view_.data(), rowptr_view_.data(),
208 colind_view_.data(), perm_.getRawPtr(), &nrhs_, iparm_,
209 const_cast<int_t*
>(&msglvl_), &bdummy, &xdummy, &CssComm, &error );
211 check_css_mkl_error(Amesos2::NUMFACT, error);
212 if (msglvl_ > 0 && this->matrixA_->getComm()->getRank() == 0) {
213 std::cout <<
" CssMKL::numericFactorization done:" << std::endl;
214#ifdef HAVE_AMESOS2_TIMERS
215 std::cout <<
" * Time : " << this->timers_.numFactTime_.totalElapsedTime() << std::endl;
217 std::cout <<
" * Time : not enabled" << std::endl;
225 template <
class Matrix,
class Vector>
233 const local_ordinal_type ld_rhs = this->matrixA_->getLocalNumRows();
234 nrhs_ = as<int_t>(X->getGlobalNumVectors());
236 const size_t val_store_size = as<size_t>(ld_rhs * nrhs_);
237 xvals_.resize(val_store_size);
238 bvals_.resize(val_store_size);
240#ifdef HAVE_AMESOS2_TIMERS
241 Teuchos::TimeMonitor mvConvTimer( this->timers_.vecConvTime_ );
242 Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ );
247 solver_scalar_type>::do_get(B, bvals_(),
249 Teuchos::ptrInArg(*css_rowmap_));
254#ifdef HAVE_AMESOS2_TIMERS
255 Teuchos::TimeMonitor solveTimer( this->timers_.solveTime_ );
258 const int_t phase = 33;
259 const MPI_Fint CssComm = CssComm_;
260 function_map::cluster_sparse_solver( pt_,
261 const_cast<int_t*
>(&maxfct_),
262 const_cast<int_t*
>(&mnum_),
263 const_cast<int_t*
>(&mtype_),
264 const_cast<int_t*
>(&phase),
265 const_cast<int_t*
>(&n_),
266 const_cast<solver_scalar_type*
>(nzvals_view_.data()),
267 const_cast<int_t*
>(rowptr_view_.data()),
268 const_cast<int_t*
>(colind_view_.data()),
269 const_cast<int_t*
>(perm_.getRawPtr()),
271 const_cast<int_t*
>(iparm_),
272 const_cast<int_t*
>(&msglvl_),
273 as<void*>(bvals_.getRawPtr()),
274 as<void*>(xvals_.getRawPtr()), &CssComm, &error );
276 check_css_mkl_error(Amesos2::SOLVE, error);
280#ifdef HAVE_AMESOS2_TIMERS
281 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
286 solver_scalar_type>::do_put(X, xvals_(),
288 Teuchos::ptrInArg(*css_rowmap_));
290 if (msglvl_ > 0 && this->matrixA_->getComm()->getRank() == 0) {
291 std::cout <<
" CssMKL::solve done:" << std::endl;
292#ifdef HAVE_AMESOS2_TIMERS
293 std::cout <<
" * Time : " << this->timers_.vecRedistTime_.totalElapsedTime()
294 <<
" + " << this->timers_.solveTime_.totalElapsedTime() << std::endl;
296 std::cout <<
" * Time : not enabled" << std::endl;
304 template <
class Matrix,
class Vector>
309 return( this->globalNumRows_ == this->globalNumCols_ );
313 template <
class Matrix,
class Vector>
318 using Teuchos::getIntegralValue;
319 using Teuchos::ParameterEntryValidator;
321 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
324 if( parameterList->isParameter(
"IPARM(2)") )
326 RCP<const ParameterEntryValidator> fillin_validator = valid_params->getEntry(
"IPARM(2)").validator();
327 parameterList->getEntry(
"IPARM(2)").setValidator(fillin_validator);
328 iparm_[1] = getIntegralValue<int>(*parameterList,
"IPARM(2)");
332 if( parameterList->isParameter(
"IPARM(8)") )
334 RCP<const ParameterEntryValidator> refine_validator = valid_params->getEntry(
"IPARM(8)").validator();
335 parameterList->getEntry(
"IPARM(8)").setValidator(refine_validator);
336 iparm_[7] = getIntegralValue<int>(*parameterList,
"IPARM(8)");
340 if( parameterList->isParameter(
"IPARM(10)") )
342 RCP<const ParameterEntryValidator> pivot_perturb_validator = valid_params->getEntry(
"IPARM(10)").validator();
343 parameterList->getEntry(
"IPARM(10)").setValidator(pivot_perturb_validator);
344 iparm_[9] = getIntegralValue<int>(*parameterList,
"IPARM(10)");
349 iparm_[11] = this->control_.useTranspose_ ? 2 : 0;
351 if( parameterList->isParameter(
"IPARM(12)") )
353 RCP<const ParameterEntryValidator> trans_validator = valid_params->getEntry(
"IPARM(12)").validator();
354 parameterList->getEntry(
"IPARM(12)").setValidator(trans_validator);
355 iparm_[11] = getIntegralValue<int>(*parameterList,
"IPARM(12)");
359 if( parameterList->isParameter(
"IPARM(13)") )
361 RCP<const ParameterEntryValidator> trans_validator = valid_params->getEntry(
"IPARM(13)").validator();
362 parameterList->getEntry(
"IPARM(13)").setValidator(trans_validator);
363 iparm_[12] = getIntegralValue<int>(*parameterList,
"IPARM(13)");
367 if( parameterList->isParameter(
"IPARM(18)") )
369 RCP<const ParameterEntryValidator> report_validator = valid_params->getEntry(
"IPARM(18)").validator();
370 parameterList->getEntry(
"IPARM(18)").setValidator(report_validator);
371 iparm_[17] = getIntegralValue<int>(*parameterList,
"IPARM(18)");
375 if( parameterList->isParameter(
"IPARM(27)") )
377 RCP<const ParameterEntryValidator> report_validator = valid_params->getEntry(
"IPARM(27)").validator();
378 parameterList->getEntry(
"IPARM(27)").setValidator(report_validator);
379 iparm_[26] = getIntegralValue<int>(*parameterList,
"IPARM(27)");
382 if( parameterList->isParameter(
"IsContiguous") ){
383 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous");
386 if( parameterList->isParameter(
"verbose") ){
387 msglvl_ = parameterList->get<
int>(
"verbose");
412template <
class Matrix,
class Vector>
413Teuchos::RCP<const Teuchos::ParameterList>
419 using Teuchos::tuple;
420 using Teuchos::toString;
421 using Teuchos::EnhancedNumberValidator;
422 using Teuchos::setStringToIntegralParameter;
423 using Teuchos::anyNumberParameterEntryValidator;
425 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
427 if( is_null(valid_params) ){
428 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
431 int_t iparm_temp[64];
432 set_css_mkl_default_parameters(pt_temp, iparm_temp);
433 setStringToIntegralParameter<int>(
"IPARM(2)", toString(iparm_temp[1]),
434 "Fill-in reducing ordering for the input matrix",
435 tuple<string>(
"2",
"3",
"10"),
436 tuple<string>(
"Nested dissection algorithm from METIS",
437 "Parallel version of the nested dissection algorithm",
438 "MPI version of the nested dissection and symbolic factorization algorithms"),
439 tuple<int>(2, 3, 10),
442 setStringToIntegralParameter<int>(
"IPARM(12)", toString(iparm_temp[11]),
443 "Solve with transposed or conjugate transposed matrix A",
444 tuple<string>(
"0",
"1",
"2"),
445 tuple<string>(
"Non-transposed",
446 "Conjugate-transposed",
451 setStringToIntegralParameter<int>(
"IPARM(13)", toString(iparm_temp[12]),
452 "Use weighted matching",
453 tuple<string>(
"0",
"1"),
454 tuple<string>(
"No matching",
"Use matching"),
458 Teuchos::AnyNumberParameterEntryValidator::EPreferredType preferred_int =
459 Teuchos::AnyNumberParameterEntryValidator::PREFER_INT;
461 Teuchos::AnyNumberParameterEntryValidator::AcceptedTypes accept_int(
false );
462 accept_int.allowInt(
true );
464 pl->set(
"IPARM(8)" , as<int>(iparm_temp[7]) ,
"Iterative refinement step",
465 anyNumberParameterEntryValidator(preferred_int, accept_int));
467 pl->set(
"IPARM(10)", as<int>(iparm_temp[9]) ,
"Pivoting perturbation",
468 anyNumberParameterEntryValidator(preferred_int, accept_int));
470 pl->set(
"IPARM(18)", as<int>(iparm_temp[17]),
"Report the number of non-zero elements in the factors",
471 anyNumberParameterEntryValidator(preferred_int, accept_int));
473 pl->set(
"IPARM(28)", as<int>(iparm_temp[27]),
"Check input matrix is sorted",
474 anyNumberParameterEntryValidator(preferred_int, accept_int));
476 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
478 pl->set(
"verbose", 0,
"Verbosity Message Level");
488template <
class Matrix,
class Vector>
492#ifdef HAVE_AMESOS2_TIMERS
493 Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
497 if( current_phase == PREORDERING )
return(
false );
506 css_rowmap_ = this->matrixA_->getRowMap();
507 Teuchos::RCP<const MatrixAdapter<Matrix> > contig_mat = this->matrixA_->reindex(css_contig_rowmap_, css_contig_colmap_, current_phase);
510 Teuchos::RCP<const MatrixAdapter<Matrix> > contig_mat = this->matrixA_->get(ptrInArg(*css_rowmap_));
514 if (current_phase == SYMBFACT) {
515 Kokkos::resize(nzvals_temp_, contig_mat->getLocalNNZ());
516 Kokkos::resize(nzvals_view_, contig_mat->getLocalNNZ());
517 Kokkos::resize(colind_view_, contig_mat->getLocalNNZ());
518 Kokkos::resize(rowptr_view_, contig_mat->getLocalNumRows() + 1);
522#ifdef HAVE_AMESOS2_TIMERS
523 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
526 host_value_type_array,host_ordinal_type_array, host_size_type_array >::do_get(
528 nzvals_temp_, colind_view_, rowptr_view_,
530 ptrInArg(*(contig_mat->getRowMap())),
537 Kokkos::deep_copy(nzvals_view_, nzvals_temp_);
540 if (current_phase == SYMBFACT) {
542 Kokkos::resize(nzvals_temp_, this->matrixA_->getLocalNNZ());
543 Kokkos::resize(nzvals_view_, this->matrixA_->getLocalNNZ());
544 Kokkos::resize(colind_view_, this->matrixA_->getLocalNNZ());
545 Kokkos::resize(rowptr_view_, this->matrixA_->getLocalNumRows() + 1);
548 Kokkos::resize(nzvals_temp_, this->matrixA_->getGlobalNNZ());
549 Kokkos::resize(nzvals_view_, this->matrixA_->getGlobalNNZ());
550 Kokkos::resize(colind_view_, this->matrixA_->getGlobalNNZ());
551 Kokkos::resize(rowptr_view_, this->matrixA_->getGlobalNumRows() + 1);
553 Kokkos::resize(nzvals_temp_, 0);
554 Kokkos::resize(nzvals_view_, 0);
555 Kokkos::resize(colind_view_, 0);
556 Kokkos::resize(rowptr_view_, 0);
562#ifdef HAVE_AMESOS2_TIMERS
563 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
566 host_value_type_array,host_ordinal_type_array, host_size_type_array >::do_get(
567 this->matrixA_.ptr(),
568 nzvals_temp_, colind_view_, rowptr_view_,
570 ptrInArg(*(this->matrixA_->getRowMap())),
573 Kokkos::deep_copy(nzvals_view_, nzvals_temp_);
580template <
class Matrix,
class Vector>
586 Teuchos::broadcast(*(this->getComm()), 0, &error_i);
588 if( error == 0 )
return;
590 std::string errmsg =
"Other error";
593 errmsg =
"CssMKL reported error: 'Input inconsistent'";
596 errmsg =
"CssMKL reported error: 'Not enough memory'";
599 errmsg =
"CssMKL reported error: 'Reordering problem'";
603 "CssMKL reported error: 'Zero pivot, numerical "
604 "factorization or iterative refinement problem'";
607 errmsg =
"CssMKL reported error: 'Unclassified (internal) error'";
610 errmsg =
"CssMKL reported error: 'Reordering failed'";
613 errmsg =
"CssMKL reported error: 'Diagonal matrix is singular'";
616 errmsg =
"CssMKL reported error: '32-bit integer overflow problem'";
619 errmsg =
"CssMKL reported error: 'Not enough memory for OOC'";
622 errmsg =
"CssMKL reported error: 'Problems with opening OOC temporary files'";
625 errmsg =
"CssMKL reported error: 'Read/write problem with OOC data file'";
628 errmsg += (
" at phase = "+std::to_string(phase));
630 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error, errmsg );
634template <
class Matrix,
class Vector>
647 TEUCHOS_TEST_FOR_EXCEPTION( complex_,
648 std::invalid_argument,
649 "Cannot set a real CSS matrix type with scalar type complex" );
652 TEUCHOS_TEST_FOR_EXCEPTION( !complex_,
653 std::invalid_argument,
654 "Cannot set a complex CSS matrix type with non-complex scalars" );
657 TEUCHOS_TEST_FOR_EXCEPTION(
true,
658 std::invalid_argument,
659 "Symmetric matrices are not yet supported by the Amesos2 interface" );
664template <
class Matrix,
class Vector>
668 for(
int i = 0; i < 64; ++i ){
684 if (mtype_ == -2 || mtype_ == -4) {
693 if constexpr ( std::is_same_v<solver_magnitude_type, PMKL::_REAL_t> ) {
702template <
class Matrix,
class Vector>
705template <
class Matrix,
class Vector>
706const typename CssMKL<Matrix,Vector>::int_t
707CssMKL<Matrix,Vector>::maxfct_ = 1;
709template <
class Matrix,
class Vector>
710const typename CssMKL<Matrix,Vector>::int_t
711CssMKL<Matrix,Vector>::mnum_ = 1;
A template class that does nothing useful besides show developers what, in general,...
EDistribution
Definition Amesos2_TypeDecl.hpp:89
@ DISTRIBUTED_NO_OVERLAP
Definition Amesos2_TypeDecl.hpp:91
@ ROOTED
Definition Amesos2_TypeDecl.hpp:93
@ CONTIGUOUS_AND_ROOTED
Definition Amesos2_TypeDecl.hpp:94
@ SORTED_INDICES
Definition Amesos2_TypeDecl.hpp:108
Amesos2 interface to the CssMKL package.
Definition Amesos2_CssMKL_decl.hpp:50
void * pt_[64]
CssMKL internal data address pointer.
Definition Amesos2_CssMKL_decl.hpp:274
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition Amesos2_CssMKL_def.hpp:490
~CssMKL()
Destructor.
Definition Amesos2_CssMKL_def.hpp:97
void check_css_mkl_error(EPhase phase, int_t error) const
Throws an appropriate runtime error in the event that error < 0 .
Definition Amesos2_CssMKL_def.hpp:582
static const char * name
The name of this solver interface.
Definition Amesos2_CssMKL_decl.hpp:57
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition Amesos2_CssMKL_def.hpp:121
int numericFactorization_impl()
CssMKL specific numeric factorization.
Definition Amesos2_CssMKL_def.hpp:190
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using CssMKL.
Definition Amesos2_CssMKL_def.hpp:131
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition Amesos2_CssMKL_def.hpp:306
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
CssMKL specific solve.
Definition Amesos2_CssMKL_def.hpp:227
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition Amesos2_CssMKL_def.hpp:414
int_t iparm_[64]
Definition Amesos2_CssMKL_decl.hpp:292
void set_css_mkl_matrix_type(int_t mtype=0)
Definition Amesos2_CssMKL_def.hpp:636
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition Amesos2_CssMKL_def.hpp:315
CssMKL(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition Amesos2_CssMKL_def.hpp:40
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers.
Definition Amesos2_SolverCore_decl.hpp:72
Teuchos::RCP< const MatrixAdapter< Matrix > > matrixA_
The LHS operator.
Definition Amesos2_SolverCore_decl.hpp:421
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const override
Returns a pointer to the Teuchos::Comm communicator with this operator.
Definition Amesos2_SolverCore_decl.hpp:329
global_size_type globalNumRows_
Number of global rows in matrixA_.
Definition Amesos2_SolverCore_decl.hpp:442
EPhase
Used to indicate a phase in the direct solution.
Definition Amesos2_TypeDecl.hpp:31
A templated MultiVector class adapter for Amesos2.
Definition Amesos2_MultiVecAdapter_decl.hpp:142
Helper class for getting 1-D copies of multivectors.
Definition Amesos2_MultiVecAdapter_decl.hpp:233
Similar to get_ccs_helper , but used to get a CRS representation of the given matrix.
Definition Amesos2_Util.hpp:600
Helper class for putting 1-D data arrays into multivectors.
Definition Amesos2_MultiVecAdapter_decl.hpp:339