19 #ifndef AMESOS2_CHOLMOD_DEF_HPP
20 #define AMESOS2_CHOLMOD_DEF_HPP
22 #include <Teuchos_Tuple.hpp>
23 #include <Teuchos_ParameterList.hpp>
24 #include <Teuchos_StandardParameterEntryValidators.hpp>
29 #if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD)
30 #include "KokkosSparse_sptrsv_cholmod.hpp"
36 template <
class Matrix,
class Vector>
38 Teuchos::RCP<const Matrix> A,
39 Teuchos::RCP<Vector> X,
40 Teuchos::RCP<const Vector> B )
45 , is_contiguous_(true)
46 , use_triangular_solves_(false)
47 , use_cholmod_int_type_(false)
53 data_.c.supernodal = CHOLMOD_AUTO;
54 data_.c.quick_return_if_not_posdef = 1;
58 template <
class Matrix,
class Vector>
61 if(use_cholmod_int_type_) {
62 cholmod_free_factor(&(data_.L), &(data_.c));
63 cholmod_free_dense(&(data_.Y), &data_.c);
64 cholmod_free_dense(&(data_.E), &data_.c);
65 cholmod_finish(&(data_.c));
70 cholmod_l_free_factor(&(data_.L), &(data_.c));
71 cholmod_l_free_dense(&(data_.Y), &data_.c);
72 cholmod_l_free_dense(&(data_.E), &data_.c);
73 cholmod_l_finish(&(data_.c));
77 template<
class Matrix,
class Vector>
81 #ifdef HAVE_AMESOS2_TIMERS
82 Teuchos::TimeMonitor preOrderTimer(this->timers_.preOrderTime_);
87 if(use_cholmod_int_type_) {
88 data_.L = cholmod_analyze(&data_.A, &(data_.c));
91 data_.L = cholmod_l_analyze(&data_.A, &(data_.c));
94 info = data_.c.status;
98 Teuchos::broadcast(*(this->matrixA_->getComm()), 0, &info);
100 TEUCHOS_TEST_FOR_EXCEPTION(info != 0,
102 "Amesos2 cholmod_l_analyze failure in Cholmod preOrdering_impl");
108 template <
class Matrix,
class Vector>
115 #ifdef HAVE_AMESOS2_TIMERS
116 Teuchos::TimeMonitor symFactTimer(this->timers_.symFactTime_);
119 if(use_cholmod_int_type_) {
120 cholmod_resymbol (&data_.A, NULL, 0,
true, data_.L, &(data_.c));
123 cholmod_l_resymbol (&data_.A, NULL, 0,
true, data_.L, &(data_.c));
126 info = data_.c.status;
133 skip_symfact =
false;
137 Teuchos::broadcast(*(this->matrixA_->getComm()), 0, &info);
139 TEUCHOS_TEST_FOR_EXCEPTION(info != 0,
141 "Amesos2 cholmod_l_resymbol failure in Cholmod symbolicFactorization_impl");
143 if(use_triangular_solves_) {
144 triangular_solve_symbolic();
151 template <
class Matrix,
class Vector>
157 #ifdef HAVE_AMESOS2_DEBUG
158 TEUCHOS_TEST_FOR_EXCEPTION(data_.A.ncol != Teuchos::as<size_t>(this->globalNumCols_),
160 "Error in converting to cholmod_sparse: wrong number of global columns." );
161 TEUCHOS_TEST_FOR_EXCEPTION(data_.A.nrow != Teuchos::as<size_t>(this->globalNumRows_),
163 "Error in converting to cholmod_sparse: wrong number of global rows." );
166 #ifdef HAVE_AMESOS2_TIMERS
167 Teuchos::TimeMonitor numFactTimer(this->timers_.numFactTime_);
170 #ifdef HAVE_AMESOS2_VERBOSE_DEBUG
174 if(use_cholmod_int_type_) {
175 cholmod_factorize(&data_.A, data_.L, &(data_.c));
178 cholmod_l_factorize(&data_.A, data_.L, &(data_.c));
181 info = data_.c.status;
184 Teuchos::broadcast(*(this->matrixA_->getComm()), 0, &info);
186 TEUCHOS_TEST_FOR_EXCEPTION(info == CHOLMOD_OUT_OF_MEMORY,
188 "Amesos2 cholmod_l_factorize error code: CHOLMOD_OUT_OF_MEMORY");
190 TEUCHOS_TEST_FOR_EXCEPTION(info == CHOLMOD_NOT_POSDEF,
192 "Amesos2 cholmod_l_factorize error code: CHOLMOD_NOT_POSDEF.");
194 TEUCHOS_TEST_FOR_EXCEPTION(info != 0,
196 "Amesos2 cholmod_l_factorize error code:" << info);
198 if(use_triangular_solves_) {
199 triangular_solve_numeric();
206 template <
class Matrix,
class Vector>
211 const global_size_type ld_rhs = X->getGlobalLength();
212 const size_t nrhs = X->getGlobalNumVectors();
216 #ifdef HAVE_AMESOS2_TIMERS
217 Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_);
218 Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ );
223 const bool initialize_data =
true;
224 const bool do_not_initialize_data =
false;
225 if(use_triangular_solves_) {
226 #if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD)
227 Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
228 device_solve_array_t>::do_get(initialize_data, B, device_bValues_,
229 Teuchos::as<size_t>(ld_rhs),
230 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
231 this->rowIndexBase_);
232 bDidAssignX = Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
233 device_solve_array_t>::do_get(do_not_initialize_data, X, device_xValues_,
234 Teuchos::as<size_t>(ld_rhs),
235 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
236 this->rowIndexBase_);
240 Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
241 host_solve_array_t>::do_get(initialize_data, B, host_bValues_,
242 Teuchos::as<size_t>(ld_rhs),
243 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
244 this->rowIndexBase_);
245 bDidAssignX = Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
246 host_solve_array_t>::do_get(do_not_initialize_data, X, host_xValues_,
247 Teuchos::as<size_t>(ld_rhs),
248 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
249 this->rowIndexBase_);
255 #ifdef HAVE_AMESOS2_TIMERS
256 Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_);
259 if(use_triangular_solves_) {
263 function_map::cholmod_init_dense(Teuchos::as<long>(this->globalNumRows_),
264 Teuchos::as<int>(nrhs), Teuchos::as<int>(ld_rhs), host_bValues_.data(), &data_.b);
265 function_map::cholmod_init_dense(Teuchos::as<long>(this->globalNumRows_),
266 Teuchos::as<int>(nrhs), Teuchos::as<int>(ld_rhs), host_xValues_.data(), &data_.x);
268 cholmod_dense *xtemp = &(data_.x);
269 if(use_cholmod_int_type_) {
270 cholmod_solve2(CHOLMOD_A, data_.L, &data_.b, NULL,
271 &(xtemp), NULL, &data_.Y, &data_.E, &data_.c);
274 cholmod_l_solve2(CHOLMOD_A, data_.L, &data_.b, NULL,
275 &(xtemp), NULL, &data_.Y, &data_.E, &data_.c);
279 ierr = data_.c.status;
282 Teuchos::broadcast(*(this->getComm()), 0, &ierr);
284 TEUCHOS_TEST_FOR_EXCEPTION(ierr == -2, std::runtime_error,
"Ran out of memory" );
291 #ifdef HAVE_AMESOS2_TIMERS
292 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
295 if(use_triangular_solves_) {
296 #if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD)
297 Util::put_1d_data_helper_kokkos_view<
299 Teuchos::as<size_t>(ld_rhs),
300 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
301 this->rowIndexBase_);
305 Util::put_1d_data_helper_kokkos_view<
307 Teuchos::as<size_t>(ld_rhs),
308 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
309 this->rowIndexBase_);
317 template <
class Matrix,
class Vector>
321 return( this->matrixA_->getGlobalNumRows() == this->matrixA_->getGlobalNumCols() );
325 template <
class Matrix,
class Vector>
333 use_cholmod_int_type_ = parameterList->get<
bool>(
"CholmodInt",
false);
335 if(use_cholmod_int_type_) {
336 data_.c.itype = CHOLMOD_INT;
337 cholmod_start(&data_.c);
340 data_.c.itype = CHOLMOD_LONG;
341 cholmod_l_start(&data_.c);
345 using Teuchos::getIntegralValue;
346 using Teuchos::ParameterEntryValidator;
348 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
350 is_contiguous_ = parameterList->get<
bool>(
"IsContiguous",
true);
351 use_triangular_solves_ = parameterList->get<
bool>(
"Enable_KokkosKernels_TriangularSolves",
false);
353 if(use_triangular_solves_) {
354 #if not defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) || not defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD)
355 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
356 "Calling for triangular solves but KokkosKernels_ENABLE_SUPERNODAL_SPTRSV and KokkosKernels_ENABLE_TPL_CHOLMOD not configured." );
360 data_.c.dbound = parameterList->get<
double>(
"dbound", 0.0);
361 data_.c.prefer_upper = (parameterList->get<
bool>(
"PreferUpper",
true)) ? 1 : 0;
362 data_.c.print = parameterList->get<
int>(
"print", 3);
363 data_.c.nmethods = parameterList->get<
int>(
"nmethods", 0);
368 #ifdef KOKKOS_ENABLE_CUDA
369 const int default_gpu_setting = 1;
373 const int default_gpu_setting = 0;
376 data_.c.useGPU = parameterList->get<
int>(
"useGPU", default_gpu_setting);
378 #ifdef KOKKOS_ENABLE_CUDA
379 TEUCHOS_TEST_FOR_EXCEPTION(data_.c.useGPU != 0 && use_cholmod_int_type_, std::runtime_error,
380 "Amesos2 Cholmod solver must not use GPU (parameter useGPU = 0) if CholmodInt is turned on because Cholmod only supports GPU with long." );
383 bool bSuperNodal = parameterList->get<
bool>(
"SuperNodal",
false);
384 data_.c.supernodal = bSuperNodal ? CHOLMOD_SUPERNODAL : CHOLMOD_AUTO;
388 template <
class Matrix,
class Vector>
389 Teuchos::RCP<const Teuchos::ParameterList>
393 using Teuchos::tuple;
394 using Teuchos::ParameterList;
395 using Teuchos::EnhancedNumberValidator;
396 using Teuchos::setStringToIntegralParameter;
397 using Teuchos::stringToIntegralParameterEntryValidator;
399 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
401 if( is_null(valid_params) ){
402 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
405 Teuchos::RCP<EnhancedNumberValidator<int> > print_validator
406 = Teuchos::rcp(
new EnhancedNumberValidator<int>(0,5));
408 Teuchos::RCP<EnhancedNumberValidator<int> > nmethods_validator
409 = Teuchos::rcp(
new EnhancedNumberValidator<int>(0,9));
411 pl->set(
"nmethods", 0,
"Specifies the number of different ordering methods to try", nmethods_validator);
413 pl->set(
"print", 3,
"Specifies the verbosity of the print statements", print_validator);
415 pl->set(
"dbound", 0.0,
416 "Specifies the smallest absolute value on the diagonal D for the LDL factorization");
418 pl->set(
"PreferUpper",
true,
419 "Specifies whether the matrix will be "
420 "stored in upper triangular form.");
422 pl->set(
"useGPU", -1,
"1: Use GPU is 1, 0: Do not use GPU, -1: ENV CHOLMOD_USE_GPU set GPU usage.");
424 pl->set(
"Enable_KokkosKernels_TriangularSolves",
false,
"Whether to use triangular solves.");
426 pl->set(
"CholmodInt",
false,
"Whether to use cholmod in int form");
428 pl->set(
"IsContiguous",
true,
"Whether GIDs contiguous");
430 pl->set(
"SuperNodal",
false,
"Whether to use super nodal");
439 template <
class Matrix,
class Vector>
443 #ifdef HAVE_AMESOS2_TIMERS
444 Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
448 Kokkos::resize(host_nzvals_view_, this->globalNumNonZeros_);
449 if(use_cholmod_int_type_) {
450 Kokkos::resize(host_rows_int_view_, this->globalNumNonZeros_);
451 Kokkos::resize(host_col_ptr_int_view_, this->globalNumRows_ + 1);
454 Kokkos::resize(host_rows_long_view_, this->globalNumNonZeros_);
455 Kokkos::resize(host_col_ptr_long_view_, this->globalNumRows_ + 1);
459 #ifdef HAVE_AMESOS2_TIMERS
460 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
463 TEUCHOS_TEST_FOR_EXCEPTION(this->rowIndexBase_ != this->columnIndexBase_,
465 "Row and column maps have different indexbase ");
467 if(use_cholmod_int_type_) {
471 host_size_int_type_array>::do_get(this->matrixA_.ptr(),
472 host_nzvals_view_, host_rows_int_view_,
473 host_col_ptr_int_view_, nnz_ret,
474 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
476 this->rowIndexBase_);
478 TEUCHOS_TEST_FOR_EXCEPTION(nnz_ret != Teuchos::as<long>(this->globalNumNonZeros_),
480 "Did not get the expected number of non-zero vals");
487 host_size_long_type_array>::do_get(this->matrixA_.ptr(),
488 host_nzvals_view_, host_rows_long_view_,
489 host_col_ptr_long_view_, nnz_ret,
490 (is_contiguous_ ==
true) ? ROOTED : CONTIGUOUS_AND_ROOTED,
492 this->rowIndexBase_);
494 TEUCHOS_TEST_FOR_EXCEPTION(nnz_ret != Teuchos::as<long>(this->globalNumNonZeros_),
496 "Did not get the expected number of non-zero vals");
500 if(use_cholmod_int_type_) {
501 function_map::cholmod_init_sparse(Teuchos::as<size_t>(this->globalNumRows_),
502 Teuchos::as<size_t>(this->globalNumCols_),
503 Teuchos::as<size_t>(this->globalNumNonZeros_),
505 host_col_ptr_int_view_.data(),
506 host_nzvals_view_.data(),
507 host_rows_int_view_.data(),
512 function_map::cholmod_init_sparse(Teuchos::as<size_t>(this->globalNumRows_),
513 Teuchos::as<size_t>(this->globalNumCols_),
514 Teuchos::as<size_t>(this->globalNumNonZeros_),
516 host_col_ptr_long_view_.data(),
517 host_nzvals_view_.data(),
518 host_rows_long_view_.data(),
523 TEUCHOS_TEST_FOR_EXCEPTION(data_.A.stype == 0, std::runtime_error,
524 "CHOLMOD loadA_impl loaded matrix but it is not symmetric.");
530 template <
class Matrix,
class Vector>
534 #if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD)
536 if(use_cholmod_int_type_) {
537 device_int_khL_.create_sptrsv_handle(
538 KokkosSparse::Experimental::SPTRSVAlgorithm::SUPERNODAL_ETREE, data_.L->n,
true);
539 device_int_khU_.create_sptrsv_handle(
540 KokkosSparse::Experimental::SPTRSVAlgorithm::SUPERNODAL_ETREE, data_.L->n,
false);
543 device_long_khL_.create_sptrsv_handle(
544 KokkosSparse::Experimental::SPTRSVAlgorithm::SUPERNODAL_ETREE, data_.L->n,
true);
545 device_long_khU_.create_sptrsv_handle(
546 KokkosSparse::Experimental::SPTRSVAlgorithm::SUPERNODAL_ETREE, data_.L->n,
false);
550 Kokkos::resize(host_trsv_etree_, data_.L->nsuper);
551 if(use_cholmod_int_type_) {
552 int *int_etree =
static_cast<int*
>(data_.c.Iwork) + 2 * data_.L->n;
553 for (
size_t i = 0 ; i < data_.L->nsuper; ++i) {
554 host_trsv_etree_(i) = int_etree[i];
558 long *long_etree =
static_cast<long*
>(data_.c.Iwork) + 2 * data_.L->n;
559 for (
size_t i = 0 ; i < data_.L->nsuper; ++i) {
560 host_trsv_etree_(i) =
static_cast<int>(long_etree[i]);
565 if(use_cholmod_int_type_) {
566 device_int_khL_.set_sptrsv_etree(host_trsv_etree_.data());
567 device_int_khU_.set_sptrsv_etree(host_trsv_etree_.data());
570 device_long_khL_.set_sptrsv_etree(host_trsv_etree_.data());
571 device_long_khU_.set_sptrsv_etree(host_trsv_etree_.data());
574 size_t ld_rhs = this->matrixA_->getGlobalNumRows();
575 Kokkos::resize(host_trsv_perm_, ld_rhs);
576 if(use_cholmod_int_type_) {
577 int *int_iperm =
static_cast<int*
>(data_.L->Perm);
578 for (
size_t i = 0; i < ld_rhs; i++) {
579 host_trsv_perm_(int_iperm[i]) = i;
583 long *long_iperm =
static_cast<long*
>(data_.L->Perm);
584 for (
size_t i = 0; i < ld_rhs; i++) {
585 host_trsv_perm_(long_iperm[i]) = i;
588 deep_copy_or_assign_view(device_trsv_perm_, host_trsv_perm_);
591 if(use_cholmod_int_type_) {
592 device_int_khL_.set_sptrsv_perm(host_trsv_perm_.data());
593 device_int_khU_.set_sptrsv_perm(host_trsv_perm_.data());
596 device_long_khL_.set_sptrsv_perm(host_trsv_perm_.data());
597 device_long_khU_.set_sptrsv_perm(host_trsv_perm_.data());
601 if(use_cholmod_int_type_) {
602 KokkosSparse::Experimental::sptrsv_symbolic<int, kernel_handle_int_type>
603 (&device_int_khL_, &device_int_khU_, data_.L, &data_.c);
606 KokkosSparse::Experimental::sptrsv_symbolic<long, kernel_handle_long_type>
607 (&device_long_khL_, &device_long_khU_, data_.L, &data_.c);
613 template <
class Matrix,
class Vector>
615 Cholmod<Matrix,Vector>::triangular_solve_numeric()
617 #if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD)
619 if(use_cholmod_int_type_) {
620 KokkosSparse::Experimental::sptrsv_compute<int, kernel_handle_int_type>
621 (&device_int_khL_, &device_int_khU_, data_.L, &data_.c);
624 KokkosSparse::Experimental::sptrsv_compute<long, kernel_handle_long_type>
625 (&device_long_khL_, &device_long_khU_, data_.L, &data_.c);
627 #endif // HAVE_AMESOS2_TRIANGULAR_SOLVE
631 template <
class Matrix,
class Vector>
633 Cholmod<Matrix,Vector>::triangular_solve()
const
635 #if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD)
636 size_t ld_rhs = device_xValues_.extent(0);
637 size_t nrhs = device_xValues_.extent(1);
639 Kokkos::resize(device_trsv_rhs_, ld_rhs, nrhs);
640 Kokkos::resize(device_trsv_sol_, ld_rhs, nrhs);
643 auto local_device_bValues = device_bValues_;
644 auto local_device_trsv_perm = device_trsv_perm_;
645 auto local_device_trsv_rhs = device_trsv_rhs_;
646 Kokkos::parallel_for(Kokkos::RangePolicy<DeviceExecSpaceType>(0, ld_rhs),
647 KOKKOS_LAMBDA(
size_t j) {
648 for(
size_t k = 0; k < nrhs; ++k) {
649 local_device_trsv_rhs(local_device_trsv_perm(j),k) = local_device_bValues(j,k);
653 for(
size_t k = 0; k < nrhs; ++k) {
654 auto sub_sol = Kokkos::subview(device_trsv_sol_, Kokkos::ALL, k);
655 auto sub_rhs = Kokkos::subview(device_trsv_rhs_, Kokkos::ALL, k);
658 if(use_cholmod_int_type_) {
659 KokkosSparse::Experimental::sptrsv_solve(&device_int_khL_, sub_sol, sub_rhs);
662 KokkosSparse::Experimental::sptrsv_solve(&device_long_khL_, sub_sol, sub_rhs);
666 if(use_cholmod_int_type_) {
667 KokkosSparse::Experimental::sptrsv_solve(&device_int_khU_, sub_rhs, sub_sol);
670 KokkosSparse::Experimental::sptrsv_solve(&device_long_khU_, sub_rhs, sub_sol);
676 auto local_device_xValues = device_xValues_;
677 Kokkos::parallel_for(Kokkos::RangePolicy<DeviceExecSpaceType>(0, ld_rhs),
678 KOKKOS_LAMBDA(
size_t j) {
679 for(
size_t k = 0; k < nrhs; ++k) {
680 local_device_xValues(j,k) = local_device_trsv_rhs(local_device_trsv_perm(j),k);
687 template<
class Matrix,
class Vector>
688 const char* Cholmod<Matrix,Vector>::name =
"Cholmod";
693 #endif // AMESOS2_CHOLMOD_DEF_HPP
~Cholmod()
Destructor.
Definition: Amesos2_Cholmod_def.hpp:59
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition: Amesos2_Cholmod_def.hpp:79
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers...
Definition: Amesos2_SolverCore_decl.hpp:71
A generic helper class for getting a CCS representation of a Matrix.
Definition: Amesos2_Util.hpp:614
EPhase
Used to indicate a phase in the direct solution.
Definition: Amesos2_TypeDecl.hpp:31
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_Cholmod_def.hpp:390
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_Cholmod_def.hpp:319
Cholmod(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition: Amesos2_Cholmod_def.hpp:37
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
CHOLMOD specific solve.
Definition: Amesos2_Cholmod_def.hpp:208
void setParameters_impl(const Teuchos::RCP< Teuchos::ParameterList > ¶meterList)
Definition: Amesos2_Cholmod_def.hpp:327
Amesos2 CHOLMOD declarations.
A Matrix adapter interface for Amesos2.
Definition: Amesos2_MatrixAdapter_decl.hpp:42
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_Cholmod_def.hpp:441
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using CHOLMOD.
Definition: Amesos2_Cholmod_def.hpp:110
Amesos2 interface to the CHOLMOD package.
Definition: Amesos2_Cholmod_decl.hpp:42
A templated MultiVector class adapter for Amesos2.
Definition: Amesos2_MultiVecAdapter_decl.hpp:142
int numericFactorization_impl()
CHOLMOD specific numeric factorization.
Definition: Amesos2_Cholmod_def.hpp:153