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"
23 template <
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_.verbose =
false;
39 template <
class Matrix,
class Vector>
43 data_.solver.release();
47 template <
class Matrix,
class Vector>
51 std::ostringstream oss;
52 oss <<
"Tacho solver interface";
56 template<
class Matrix,
class Vector>
63 template <
class Matrix,
class Vector>
67 #ifdef HAVE_AMESOS2_TIMERS
68 Teuchos::TimeMonitor symFactTime( this->timers_.symFactTime_ );
73 if(do_optimization()) {
74 this->matrixA_->returnRowPtr_kokkos_view(host_row_ptr_view_);
75 this->matrixA_->returnColInd_kokkos_view(host_cols_view_);
78 data_.solver.setSolutionMethod(data_.method);
79 data_.solver.setLevelSetOptionAlgorithmVariant(data_.variant);
80 data_.solver.setSmallProblemThresholdsize(data_.small_problem_threshold_size);
81 data_.solver.setVerbose(data_.verbose);
82 data_.solver.setLevelSetOptionNumStreams(data_.streams);
87 if (data_.dofs_per_node > 1) {
88 data_.solver.analyze(this->globalNumCols_, data_.dofs_per_node, host_row_ptr_view_, host_cols_view_);
90 data_.solver.analyze(this->globalNumCols_, host_row_ptr_view_, host_cols_view_);
92 data_.solver.initialize();
98 template <
class Matrix,
class Vector>
102 #ifdef HAVE_AMESOS2_TIMERS
103 Teuchos::TimeMonitor numFactTimer(this->timers_.numFactTime_);
108 if(do_optimization()) {
109 this->matrixA_->returnValues_kokkos_view(device_nzvals_view_);
111 if (data_.pivot_pert) {
112 data_.solver.useDefaultPivotTolerance();
114 data_.solver.useNoPivotTolerance();
116 data_.solver.factorize(device_nzvals_view_);
121 template <
class Matrix,
class Vector>
128 const global_size_type ld_rhs = this->root_ ? X->getGlobalLength() : 0;
129 const size_t nrhs = X->getGlobalNumVectors();
138 #ifdef HAVE_AMESOS2_TIMERS
139 Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_);
140 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
142 const bool initialize_data =
true;
143 const bool do_not_initialize_data =
false;
144 Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
145 device_solve_array_t>::do_get(initialize_data, B, this->bValues_,
147 ROOTED, this->rowIndexBase_);
148 bDidAssignX = Util::get_1d_copy_helper_kokkos_view<MultiVecAdapter<Vector>,
149 device_solve_array_t>::do_get(do_not_initialize_data, X, this->xValues_,
151 ROOTED, this->rowIndexBase_);
157 #ifdef HAVE_AMESOS2_TIMER
158 Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_);
161 if (workspace_.extent(0) < this->globalNumRows_ || workspace_.extent(1) < nrhs) {
162 workspace_ = device_solve_array_t(
163 Kokkos::ViewAllocateWithoutInitializing(
"t"), this->globalNumRows_, nrhs);
166 data_.solver.solve(xValues_, bValues_, workspace_);
175 Teuchos::broadcast(*(this->getComm()), 0, &ierr);
177 TEUCHOS_TEST_FOR_EXCEPTION( ierr != 0, std::runtime_error,
178 "tacho_solve has error code: " << ierr );
185 #ifdef HAVE_AMESOS2_TIMERS
186 Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_);
191 Util::template put_1d_data_helper_kokkos_view<
194 ROOTED, this->rowIndexBase_);
201 template <
class Matrix,
class Vector>
206 return( this->matrixA_->getGlobalNumRows() == this->matrixA_->getGlobalNumCols() );
210 template <
class Matrix,
class Vector>
214 RCP<const Teuchos::ParameterList> valid_params = getValidParameters_impl();
219 auto method_name = parameterList->get<std::string> (
"method",
"chol");
220 if (method_name ==
"chol")
222 else if (method_name ==
"ldl")
224 else if (method_name ==
"lu")
227 std::cout <<
"Error: not supported solution method\n";
230 data_.variant = parameterList->get<
int> (
"variant", 2);
232 data_.small_problem_threshold_size = parameterList->get<
int> (
"small problem threshold size", 1024);
234 data_.verbose = parameterList->get<
bool> (
"verbose",
false);
236 data_.streams = parameterList->get<
int> (
"num-streams", 1);
238 data_.dofs_per_node = parameterList->get<
int> (
"dofs-per-node", 1);
240 data_.pivot_pert = parameterList->get<
bool> (
"perturb-pivot",
false);
247 template <
class Matrix,
class Vector>
248 Teuchos::RCP<const Teuchos::ParameterList>
251 static Teuchos::RCP<const Teuchos::ParameterList> valid_params;
253 if( is_null(valid_params) ){
254 Teuchos::RCP<Teuchos::ParameterList> pl = Teuchos::parameterList();
256 pl->set(
"method",
"chol",
"Type of factorization, chol, ldl, or lu");
257 pl->set(
"variant", 2,
"Type of solver variant, 0, 1, or 2");
258 pl->set(
"small problem threshold size", 1024,
"Problem size threshold below with Tacho uses LAPACK.");
259 pl->set(
"verbose",
false,
"Verbosity");
260 pl->set(
"num-streams", 1,
"Number of GPU streams");
261 pl->set(
"dofs-per-node", 1,
"DoFs per node");
262 pl->set(
"perturb-pivot",
false,
"Perturb tiny pivots");
274 template <
class Matrix,
class Vector>
277 return (this->root_ && (this->matrixA_->getComm()->getSize() == 1));
280 template <
class Matrix,
class Vector>
285 if(current_phase == SOLVE) {
289 if(!do_optimization()) {
290 #ifdef HAVE_AMESOS2_TIMERS
291 Teuchos::TimeMonitor convTimer(this->timers_.mtxConvTime_);
301 device_nzvals_view_ = device_value_type_array(
302 Kokkos::ViewAllocateWithoutInitializing(
"nzvals"), this->globalNumNonZeros_);
303 host_cols_view_ = host_ordinal_type_array(
304 Kokkos::ViewAllocateWithoutInitializing(
"colind"), this->globalNumNonZeros_);
305 host_row_ptr_view_ = host_size_type_array(
306 Kokkos::ViewAllocateWithoutInitializing(
"rowptr"), this->globalNumRows_ + 1);
309 typename host_size_type_array::value_type nnz_ret = 0;
311 #ifdef HAVE_AMESOS2_TIMERS
312 Teuchos::TimeMonitor mtxRedistTimer( this->timers_.mtxRedistTime_ );
315 TEUCHOS_TEST_FOR_EXCEPTION( this->rowIndexBase_ != this->columnIndexBase_,
317 "Row and column maps have different indexbase ");
320 device_value_type_array, host_ordinal_type_array, host_size_type_array>::do_get(
321 this->matrixA_.ptr(),
327 this->columnIndexBase_);
335 template<
class Matrix,
class Vector>
341 #endif // AMESOS2_TACHO_DEF_HPP
Amesos2::SolverCore: A templated interface for interaction with third-party direct sparse solvers...
Definition: Amesos2_SolverCore_decl.hpp:71
EPhase
Used to indicate a phase in the direct solution.
Definition: Amesos2_TypeDecl.hpp:31
Amesos2 interface to the Tacho package.
Definition: Amesos2_Tacho_decl.hpp:33
int symbolicFactorization_impl()
Perform symbolic factorization of the matrix using Tacho.
Definition: Amesos2_Tacho_def.hpp:65
Utility functions for Amesos2.
bool matrixShapeOK_impl() const
Determines whether the shape of the matrix is OK for this solver.
Definition: Amesos2_Tacho_def.hpp:203
int numericFactorization_impl()
Tacho specific numeric factorization.
Definition: Amesos2_Tacho_def.hpp:100
int preOrdering_impl()
Performs pre-ordering on the matrix to increase efficiency.
Definition: Amesos2_Tacho_def.hpp:58
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters_impl() const
Definition: Amesos2_Tacho_def.hpp:249
Similar to get_ccs_helper , but used to get a CRS representation of the given matrix.
Definition: Amesos2_Util.hpp:625
std::string description() const override
Returns a short description of this Solver.
Definition: Amesos2_Tacho_def.hpp:49
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:123
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
bool loadA_impl(EPhase current_phase)
Reads matrix data into internal structures.
Definition: Amesos2_Tacho_def.hpp:282
bool do_optimization() const
can we optimize size_type and ordinal_type for straight pass through
Definition: Amesos2_Tacho_def.hpp:276
A templated MultiVector class adapter for Amesos2.
Definition: Amesos2_MultiVecAdapter_decl.hpp:142
~TachoSolver()
Destructor.
Definition: Amesos2_Tacho_def.hpp:40