Ifpack2 Templated Preconditioning Package  Version 1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Ifpack2_Details_TriDiSolver_decl.hpp
1 // @HEADER
2 // *****************************************************************************
3 // Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
4 //
5 // Copyright 2009 NTESS and the Ifpack2 contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
10 #ifndef IFPACK2_DETAILS_TRIDISOLVER_DECL_HPP
11 #define IFPACK2_DETAILS_TRIDISOLVER_DECL_HPP
12 
15 
16 #include "Ifpack2_ConfigDefs.hpp"
19 #include "Ifpack2_Details_LapackSupportsScalar.hpp"
20 #include "Tpetra_RowMatrix.hpp"
21 #include "Tpetra_Import_fwd.hpp"
22 #include "Tpetra_Export_fwd.hpp"
24 #include <type_traits>
25 
26 namespace Ifpack2 {
27 namespace Details {
28 
41 template <class MatrixType,
42  const bool stub = !LapackSupportsScalar<typename MatrixType::scalar_type>::value>
43 class TriDiSolver : public Ifpack2::Preconditioner<typename MatrixType::scalar_type,
44  typename MatrixType::local_ordinal_type,
45  typename MatrixType::global_ordinal_type,
46  typename MatrixType::node_type>,
47  virtual public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<typename MatrixType::scalar_type,
48  typename MatrixType::local_ordinal_type,
49  typename MatrixType::global_ordinal_type,
50  typename MatrixType::node_type> > {};
51 
53 template <class MatrixType>
54 class TriDiSolver<MatrixType, false> : public Ifpack2::Preconditioner<typename MatrixType::scalar_type,
55  typename MatrixType::local_ordinal_type,
56  typename MatrixType::global_ordinal_type,
57  typename MatrixType::node_type>,
58  virtual public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<typename MatrixType::scalar_type,
59  typename MatrixType::local_ordinal_type,
60  typename MatrixType::global_ordinal_type,
61  typename MatrixType::node_type> > {
62  public:
64 
65 
69  typedef MatrixType matrix_type;
70 
72  typedef typename MatrixType::scalar_type scalar_type;
73 
75  typedef typename MatrixType::local_ordinal_type local_ordinal_type;
76 
78  typedef typename MatrixType::global_ordinal_type global_ordinal_type;
79 
81  typedef typename MatrixType::node_type node_type;
82 
85 
87  typedef Tpetra::RowMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type> row_matrix_type;
88 
89  static_assert(std::is_same<MatrixType, row_matrix_type>::value, "Ifpack2::Details::TriDiSolver: The template parameter MatrixType must be a Tpetra::RowMatrix specialization. Please don't use Tpetra::CrsMatrix (a subclass of Tpetra::RowMatrix) here anymore. The constructor can take either a RowMatrix or a CrsMatrix just fine.");
90 
91  typedef typename row_matrix_type::nonconst_global_inds_host_view_type nonconst_global_inds_host_view_type;
92  typedef typename row_matrix_type::nonconst_local_inds_host_view_type nonconst_local_inds_host_view_type;
93  typedef typename row_matrix_type::nonconst_values_host_view_type nonconst_values_host_view_type;
94 
96  typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> map_type;
97 
99 
101 
106 
108  virtual ~TriDiSolver();
109 
111 
113 
119 
125 
131  void
132  apply(const Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& X,
133  Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& Y,
137 
139 
141  void setParameters(const Teuchos::ParameterList& params);
142 
152  void initialize();
153 
155  bool isInitialized() const;
156 
166  void compute();
167 
169  bool isComputed() const;
170 
173 
176 
178  int getNumInitialize() const;
179 
181  int getNumCompute() const;
182 
184  int getNumApply() const;
185 
187  double getInitializeTime() const;
188 
190  double getComputeTime() const;
191 
193  double getApplyTime() const;
194 
196 
198 
200  std::string description() const;
201 
203  void
204  describe(Teuchos::FancyOStream& out,
205  const Teuchos::EVerbosityLevel verbLevel =
208  private:
210  void
211  describeLocal(Teuchos::FancyOStream& out,
212  const Teuchos::EVerbosityLevel verbLevel) const;
213 
215  void reset();
216 
224  static void
225  extract(Teuchos::SerialTriDiMatrix<int, scalar_type>& A_local_tridi,
226  const row_matrix_type& A_local);
227 
237  static void
239  const Teuchos::ArrayView<int>& ipiv);
240 
242  typedef Tpetra::MultiVector<scalar_type, local_ordinal_type,
244  MV;
245 
247  typedef Tpetra::Import<local_ordinal_type,
249  import_type;
250 
252  typedef Tpetra::Export<local_ordinal_type,
254  export_type;
255 
258 
267  void
268  applyImpl(const MV& X,
269  MV& Y,
270  const Teuchos::ETransp mode,
271  const scalar_type alpha,
272  const scalar_type beta) const;
273 
276 
279 
282 
284  Teuchos::Array<int> ipiv_;
285 
287  double initializeTime_;
288 
290  double computeTime_;
291 
293  mutable double applyTime_;
294 
296  int numInitialize_;
297 
299  int numCompute_;
300 
302  mutable int numApply_;
303 
305  bool isInitialized_;
306 
308  bool isComputed_;
309 };
310 
312 template <class MatrixType>
313 class TriDiSolver<MatrixType, true> : public Ifpack2::Preconditioner<typename MatrixType::scalar_type,
314  typename MatrixType::local_ordinal_type,
315  typename MatrixType::global_ordinal_type,
316  typename MatrixType::node_type>,
317  virtual public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<typename MatrixType::scalar_type,
318  typename MatrixType::local_ordinal_type,
319  typename MatrixType::global_ordinal_type,
320  typename MatrixType::node_type> > {
321  public:
323 
324 
328  typedef MatrixType matrix_type;
329 
331  typedef typename MatrixType::scalar_type scalar_type;
332 
334  typedef typename MatrixType::local_ordinal_type local_ordinal_type;
335 
337  typedef typename MatrixType::global_ordinal_type global_ordinal_type;
338 
340  typedef typename MatrixType::node_type node_type;
341 
344 
346  typedef Tpetra::RowMatrix<scalar_type, local_ordinal_type, global_ordinal_type, node_type> row_matrix_type;
347 
348  static_assert(std::is_same<MatrixType, row_matrix_type>::value, "Ifpack2::Details::TriDiSolver: The template parameter MatrixType must be a Tpetra::RowMatrix specialization. Please don't use Tpetra::CrsMatrix (a subclass of Tpetra::RowMatrix) here anymore. The constructor can take either a RowMatrix or a CrsMatrix just fine.");
349 
351  typedef Tpetra::Map<local_ordinal_type, global_ordinal_type, node_type> map_type;
352 
354 
356 
361 
363  virtual ~TriDiSolver();
364 
366 
368 
374 
380 
386  void
387  apply(const Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& X,
388  Tpetra::MultiVector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& Y,
392 
394 
396  void setParameters(const Teuchos::ParameterList& params);
397 
407  void initialize();
408 
410  bool isInitialized() const;
411 
421  void compute();
422 
424  bool isComputed() const;
425 
428 
431 
433  int getNumInitialize() const;
434 
436  int getNumCompute() const;
437 
439  int getNumApply() const;
440 
442  double getInitializeTime() const;
443 
445  double getComputeTime() const;
446 
448  double getApplyTime() const;
449 
451 
453 
455  std::string description() const;
456 
458  void
459  describe(Teuchos::FancyOStream& out,
460  const Teuchos::EVerbosityLevel verbLevel =
462 
463  void
464  describeLocal(Teuchos::FancyOStream& out,
465  const Teuchos::EVerbosityLevel verbLevel) const;
466 
468  private:
470  typedef Tpetra::MultiVector<scalar_type, local_ordinal_type,
472  MV;
473 };
474 
475 } // namespace Details
476 } // namespace Ifpack2
477 
478 #endif // IFPACK2_DETAILS_TRIDISOLVER_DECL_HPP
Mix-in interface for preconditioners that can change their matrix after construction.
Definition: Ifpack2_Details_CanChangeMatrix.hpp:60
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:334
Tpetra::RowMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > row_matrix_type
Specialization of Tpetra::RowMatrix used by this class.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:346
Teuchos::ScalarTraits< scalar_type >::magnitudeType magnitude_type
The type of the absolute value (magnitude) of a scalar_type.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:84
Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > map_type
Specialization of Tpetra::Map used by this class.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:348
&quot;Preconditioner&quot; that uses LAPACK&#39;s tridi LU.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:43
MatrixType::global_ordinal_type global_ordinal_type
The type of global indices in the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:78
MatrixType::scalar_type scalar_type
The type of entries in the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:331
Tpetra::RowMatrix< scalar_type, local_ordinal_type, global_ordinal_type, node_type > row_matrix_type
Specialization of Tpetra::RowMatrix used by this class.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:87
MatrixType::scalar_type scalar_type
The type of entries in the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:72
MatrixType::global_ordinal_type global_ordinal_type
The type of global indices in the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:337
MatrixType matrix_type
The first template parameter of this class.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:69
Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > map_type
Specialization of Tpetra::Map used by this class.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:96
virtual Teuchos::RCP< const Tpetra::Map< MatrixType::local_ordinal_type, MatrixType::global_ordinal_type, MatrixType::node_type > > getDomainMap() const =0
The domain Map of this operator.
MatrixType matrix_type
The first template parameter of this class.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:328
Teuchos::ScalarTraits< scalar_type >::magnitudeType magnitude_type
The type of the absolute value (magnitude) of a scalar_type.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:343
Interface for all Ifpack2 preconditioners.
Definition: Ifpack2_Preconditioner.hpp:74
virtual Teuchos::RCP< const Tpetra::RowMatrix< MatrixType::scalar_type, MatrixType::local_ordinal_type, MatrixType::global_ordinal_type, MatrixType::node_type > > getMatrix() const =0
The input matrix given to the constructor.
Declaration of interface for preconditioners that can change their matrix after construction.
static const EVerbosityLevel verbLevel_default
virtual bool isComputed() const =0
True if the preconditioner has been successfully computed, else false.
MatrixType::node_type node_type
The Node type of the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:340
virtual void setParameters(const Teuchos::ParameterList &List)=0
Set this preconditioner&#39;s parameters.
virtual Teuchos::RCP< const Tpetra::Map< MatrixType::local_ordinal_type, MatrixType::global_ordinal_type, MatrixType::node_type > > getRangeMap() const =0
The range Map of this operator.
virtual void apply(const Tpetra::MultiVector< MatrixType::scalar_type, MatrixType::local_ordinal_type, MatrixType::global_ordinal_type, MatrixType::node_type > &X, Tpetra::MultiVector< MatrixType::scalar_type, MatrixType::local_ordinal_type, MatrixType::global_ordinal_type, MatrixType::node_type > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, MatrixType::scalar_typealpha=Teuchos::ScalarTraits< MatrixType::scalar_type >::one(), MatrixType::scalar_typebeta=Teuchos::ScalarTraits< MatrixType::scalar_type >::zero()) const =0
Apply the preconditioner to X, putting the result in Y.
virtual bool isInitialized() const =0
True if the preconditioner has been successfully initialized, else false.
MatrixType::node_type node_type
The Node type of the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:81
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input (global) matrix.
Definition: Ifpack2_Details_TriDiSolver_decl.hpp:75
virtual void setMatrix(const Teuchos::RCP< const Tpetra::RowMatrix< MatrixType::scalar_type, MatrixType::local_ordinal_type, MatrixType::global_ordinal_type, MatrixType::node_type > > &A)=0
Set the new matrix.