10#ifndef AMESOS2_TACHO_DEF_HPP
11#define AMESOS2_TACHO_DEF_HPP
13#include <Teuchos_Tuple.hpp>
14#include <Teuchos_ParameterList.hpp>
15#include <Teuchos_StandardParameterEntryValidators.hpp>
18#include "Amesos2_Tacho_decl.hpp"
23template <
class Matrix,
class Vector>
25 Teuchos::RCP<const Matrix> A,
26 Teuchos::RCP<Vector> X,
27 Teuchos::RCP<const Vector> B )
33 data_.dofs_per_node = 1;
34 data_.pivot_pert =
false;
35 data_.diag_shift =
false;
36 data_.verbose =
false;
37 data_.team_on_user_stream =
false;
38 data_.small_problem_threshold_size = 1024;
39 tacho_initialized_ =
false;
43template <
class Matrix,
class Vector>
46 if ( this->
root_ && tacho_initialized_) {
47 data_.solver.release();
48 tacho_initialized_ =
false;
52template <
class Matrix,
class Vector>
56 std::ostringstream oss;
57 oss <<
"Tacho solver interface";
61template<
class Matrix,
class Vector>
68template <
class Matrix,
class Vector>
72#ifdef HAVE_AMESOS2_TIMERS
73 Teuchos::TimeMonitor symFactTime( this->
timers_.symFactTime_ );
78 if (tacho_initialized_) {
80 data_.solver.release();
81 tacho_initialized_ =
false;
85 this->
matrixA_->returnRowPtr_kokkos_view(host_row_ptr_view_);
86 this->
matrixA_->returnColInd_kokkos_view(host_cols_view_);
89 data_.solver.setSolutionMethod(data_.method);
90 data_.solver.setLevelSetOptionAlgorithmVariant(data_.variant);
91 data_.solver.setSmallProblemThresholdsize(data_.small_problem_threshold_size);
92 data_.solver.setVerbose(data_.verbose);
93 data_.solver.setLevelSetOptionNumStreams(data_.streams, data_.team_on_user_stream);
98 if (data_.dofs_per_node > 1) {
99 data_.solver.analyze(this->
globalNumCols_, data_.dofs_per_node, host_row_ptr_view_, host_cols_view_);
101 data_.solver.analyze(this->
globalNumCols_, host_row_ptr_view_, host_cols_view_);
103 data_.solver.initialize();
104 tacho_initialized_ =
true;
110template <
class Matrix,
class Vector>
114#ifdef HAVE_AMESOS2_TIMERS
115 Teuchos::TimeMonitor numFactTimer(this->
timers_.numFactTime_);
124 device_value_type_array device_nzvals_temp;
125 this->
matrixA_->returnValues_kokkos_view(device_nzvals_temp);
126 Kokkos::deep_copy(device_nzvals_view_, device_nzvals_temp);
128 if (data_.diag_shift) {
129 data_.solver.shiftDiagonal();
131 if (data_.pivot_pert) {
132 data_.solver.useDefaultPivotTolerance(2);
134 data_.solver.useNoPivotTolerance();
136 data_.solver.factorize(device_nzvals_view_);
141template <
class Matrix,
class Vector>
148 const global_size_type ld_rhs = this->
root_ ? X->getGlobalLength() : 0;
149 const size_t nrhs = X->getGlobalNumVectors();
158#ifdef HAVE_AMESOS2_TIMERS
159 Teuchos::TimeMonitor mvConvTimer(this->
timers_.vecConvTime_);
161 const bool initialize_data =
true;
162 const bool do_not_initialize_data =
false;
163 Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
164 device_solve_array_t>::do_get(initialize_data, B, this->bValues_,
167 bDidAssignX = Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
168 device_solve_array_t>::do_get(do_not_initialize_data, X, this->xValues_,
177#ifdef HAVE_AMESOS2_TIMERS
178 Teuchos::TimeMonitor solveTimer(this->
timers_.solveTime_);
180 if (workspace_.extent(0) < this->globalNumRows_ || workspace_.extent(1) < nrhs) {
181 workspace_ = device_solve_array_t(
182 Kokkos::ViewAllocateWithoutInitializing(
"t"), this->
globalNumRows_, nrhs);
185 data_.solver.solve(xValues_, bValues_, workspace_);
194 Teuchos::broadcast(*(this->
getComm()), 0, &ierr);
196 TEUCHOS_TEST_FOR_EXCEPTION( ierr != 0, std::runtime_error,
197 "tacho_solve has error code: " << ierr );
204#ifdef HAVE_AMESOS2_TIMERS
205 Teuchos::TimeMonitor redistTimer(this->
timers_.vecRedistTime_);
210 Util::template put_1d_data_helper_kokkos_view<
220template <
class Matrix,
class Vector>
225 return( this->
matrixA_->getGlobalNumRows() == this->matrixA_->getGlobalNumCols() );
229template <
class Matrix,
class Vector>
231TachoSolver<Matrix,Vector>::setParameters_impl(
const Teuchos::RCP<Teuchos::ParameterList> & parameterList )
233 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
238 auto method_name = parameterList->get<std::string> (
"method",
"chol");
239 if (method_name ==
"ldl-nopiv")
241 else if (method_name ==
"chol")
243 else if (method_name ==
"ldl")
245 else if (method_name ==
"lu")
248 std::cout <<
"Error: not supported solution method\n";
251 data_.variant = parameterList->get<
int> (
"variant", 2);
253 data_.small_problem_threshold_size = parameterList->get<
int> (
"small problem threshold size", 1024);
255 data_.verbose = parameterList->get<
bool> (
"verbose",
false);
257 data_.streams = parameterList->get<
int> (
"num-streams", 1);
259 data_.team_on_user_stream = parameterList->get<
bool> (
"team-on-user-stream",
false);
261 data_.dofs_per_node = parameterList->get<
int> (
"dofs-per-node", 1);
263 data_.pivot_pert = parameterList->get<
bool> (
"perturb-pivot",
false);
264 data_.diag_shift = parameterList->get<
bool> (
"shift-diag",
false);
271template <
class Matrix,
class Vector>
272Teuchos::RCP<const Teuchos::ParameterList>
275 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
277 if( is_null(valid_params) ){
278 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
280 pl->set(
"method",
"chol",
"Type of factorization, chol, ldl, or lu");
281 pl->set(
"variant", 2,
"Type of solver variant, 0, 1, or 2");
282 pl->set(
"small problem threshold size", 1024,
"Problem size threshold below with Tacho uses LAPACK.");
283 pl->set(
"verbose",
false,
"Verbosity");
284 pl->set(
"num-streams", 1,
"Number of GPU streams");
285 pl->set(
"dofs-per-node", 1,
"DoFs per node");
286 pl->set(
"perturb-pivot",
false,
"Perturb tiny pivots");
287 pl->set(
"shift-diag",
false,
"Shift diagonal entries");
288 pl->set(
"team-on-user-stream",
false,
"Use user stream-0 for team/batched kernels");
300template <
class Matrix,
class Vector>
303 return (this->
root_ && (this->
matrixA_->getComm()->getSize() == 1));
306template <
class Matrix,
class Vector>
311 if(current_phase == SOLVE) {
316#ifdef HAVE_AMESOS2_TIMERS
317 Teuchos::TimeMonitor convTimer(this->
timers_.mtxConvTime_);
328 if (device_nzvals_view_.extent(0) != this->globalNumNonZeros_)
330 if (host_cols_view_.extent(0) != this->globalNumNonZeros_)
332 if (host_row_ptr_view_.extent(0) != this->globalNumRows_ + 1)
335 Kokkos::resize(device_nzvals_view_, 0);
336 Kokkos::resize(host_cols_view_, 0);
337 Kokkos::resize(host_row_ptr_view_, 1);
341 typename host_size_type_array::value_type nnz_ret = 0;
343 #ifdef HAVE_AMESOS2_TIMERS
344 Teuchos::TimeMonitor mtxRedistTimer( this->
timers_.mtxRedistTime_ );
349 "Row and column maps have different indexbase ");
352 device_value_type_array, host_ordinal_type_array, host_size_type_array>::do_get(
359 this->columnIndexBase_);
366 device_nzvals_view_ = device_value_type_array(
375template <
class Matrix,
class Vector>
378 const Teuchos::EVerbosityLevel verbLevel)
const
380 out <<
" Tacho current parameters:" << std::endl;
381 out <<
" > method = " << data_.method;
382 if (data_.method == 0) out <<
" (ldl-nopiv)" << std::endl;
383 if (data_.method == 1) out <<
" (chol)" << std::endl;
384 if (data_.method == 2) out <<
" (ldl)" << std::endl;
385 if (data_.method == 3) out <<
" (lu)" << std::endl;
386 out <<
" > variant = " << data_.variant << std::endl;
387 out <<
" > verbose = " << data_.verbose << std::endl;
388 out <<
" > num-streams = " << data_.streams << std::endl;
389 out <<
" > dofs-per-node = " << data_.dofs_per_node << std::endl;
390 out <<
" > perturb-pivo = " << (data_.pivot_pert ?
"YES" :
"NO") << std::endl;
391 out <<
" > shift-diag = " << (data_.diag_shift ?
"YES" :
"NO") << std::endl;
392 out <<
" > team-on-user-stream = " << (data_.team_on_user_stream ?
"YES" :
"NO") << std::endl;
393 out <<
" > small problem threshold size = " << data_.small_problem_threshold_size << std::endl;
398template<
class Matrix,
class Vector>
@ ROOTED
Definition Amesos2_TypeDecl.hpp:93
@ ARBITRARY
Definition Amesos2_TypeDecl.hpp:109
EPhase
Used to indicate a phase in the direct solution.
Definition Amesos2_TypeDecl.hpp:31
Utility functions for Amesos2.
Teuchos::RCP< const MatrixAdapter< Matrix > > matrixA_
Definition Amesos2_SolverCore_decl.hpp:421
bool root_
Definition Amesos2_SolverCore_decl.hpp:472
SolverCore(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
global_size_type rowIndexBase_
Definition Amesos2_SolverCore_decl.hpp:451
global_size_type globalNumCols_
Definition Amesos2_SolverCore_decl.hpp:445
global_size_type columnIndexBase_
Definition Amesos2_SolverCore_decl.hpp:454
Timers timers_
Definition Amesos2_SolverCore_decl.hpp:463
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const override
Definition Amesos2_SolverCore_decl.hpp:329
global_size_type globalNumNonZeros_
Definition Amesos2_SolverCore_decl.hpp:448
global_size_type globalNumRows_
Definition Amesos2_SolverCore_decl.hpp:442
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition Amesos2_Tacho_def.hpp:222
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition Amesos2_Tacho_def.hpp:273
int numericFactorization_impl()
Tacho specific numeric factorization.
Definition Amesos2_Tacho_def.hpp:112
int solve_impl(const Teuchos::Ptr< MultiVecAdapter< Vector > > X, const Teuchos::Ptr< const MultiVecAdapter< Vector > > B) const
Tacho specific solve.
Definition Amesos2_Tacho_def.hpp:143
~TachoSolver()
Destructor.
Definition Amesos2_Tacho_def.hpp:44
bool do_optimization() const
can we optimize size_type and ordinal_type for straight pass through
Definition Amesos2_Tacho_def.hpp:302
static const char * name
Name of this solver interface.
Definition Amesos2_Tacho_decl.hpp:41
TachoSolver(Teuchos::RCP< const Matrix > A, Teuchos::RCP< Vector > X, Teuchos::RCP< const Vector > B)
Initialize from Teuchos::RCP.
Definition Amesos2_Tacho_def.hpp:24
std::string description() const override
Returns a short description of this Solver.
Definition Amesos2_Tacho_def.hpp:54
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition Amesos2_Tacho_def.hpp:308
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using Tacho.
Definition Amesos2_Tacho_def.hpp:70
void describe_impl(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Prints the status information about the current solver with some level of verbosity.
Definition Amesos2_Tacho_def.hpp:377
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition Amesos2_Tacho_def.hpp:63
A templated MultiVector class adapter for Amesos2.
Definition Amesos2_MultiVecAdapter_decl.hpp:142
Similar to get_ccs_helper , but used to get a CRS representation of the given matrix.
Definition Amesos2_Util.hpp:600