VertexCFD  0.0-dev
VertexCFD_LinearSolvers_Hypre.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 VERTEXFCFD_LINEARSOLVERS_HYPRE_HPP
11 #define VERTEXFCFD_LINEARSOLVERS_HYPRE_HPP
12 
13 #include <Ifpack2_Details_CanChangeMatrix.hpp>
14 #include <Ifpack2_Preconditioner.hpp>
15 
16 #include <Tpetra_CrsGraph.hpp>
17 #include <Tpetra_CrsMatrix.hpp>
18 #include <Tpetra_Map.hpp>
19 #include <Tpetra_MultiVector.hpp>
20 #include <Tpetra_Vector.hpp>
21 
22 #include <HYPREDRV.h>
23 
24 #include <HYPRE.h>
25 #include <HYPRE_IJ_mv.h>
26 #include <HYPRE_parcsr_ls.h>
27 #include <HYPRE_parcsr_mv.h>
28 #include <_hypre_IJ_mv.h>
29 #include <_hypre_parcsr_mv.h>
30 
31 namespace VertexCFD
32 {
33 namespace LinearSolvers
34 {
35 
36 //---------------------------------------------------------------------------//
37 class Hypre : public Ifpack2::Preconditioner<>,
38  public Ifpack2::Details::CanChangeMatrix<Tpetra::RowMatrix<>>
39 {
40  public:
42  // \name Constructors and destructors
44 
46  Hypre();
47 
49  ~Hypre();
50 
51  // @}
52  // @{ Construction methods
54  void initialize() override;
55 
58  bool isInitialized() const { return (is_initialized_); }
59 
62 
64  void compute() override;
65 
68  bool isComputed() const override { return (is_computed_); }
69 
72  void setParameters(const Teuchos::ParameterList& parameterlist) override;
73 
75 
76  void setMatrix(const Teuchos::RCP<const Tpetra::RowMatrix<>>& A);
100 
113  void
114  apply(const Tpetra::MultiVector<>& x,
115  Tpetra::MultiVector<>& y,
116  Teuchos::ETransp mode = Teuchos::NO_TRANS,
117  double alpha = Teuchos::ScalarTraits<double>::one(),
118  double beta = Teuchos::ScalarTraits<double>::zero()) const override;
119 
121  Teuchos::RCP<const Tpetra::Map<>> getDomainMap() const override;
122 
124  Teuchos::RCP<const Tpetra::Map<>> getRangeMap() const override;
125 
127  bool hasTransposeApply() const override;
128 
130 
132 
134  Teuchos::RCP<const Teuchos::Comm<int>> getComm() const;
135 
137  Teuchos::RCP<const Tpetra::RowMatrix<>> getMatrix() const override;
138 
140  int getNumInitialize() const override;
141 
143  int getNumCompute() const override;
144 
146  int getNumApply() const override;
147 
149  double getInitializeTime() const override;
150 
152  double getComputeTime() const override;
153 
155  double getApplyTime() const override;
156 
158 
160 
162  std::string description() const override;
163 
165  void describe(Teuchos::FancyOStream& out,
166  const Teuchos::EVerbosityLevel verbLevel
167  = Teuchos::Describable::verbLevel_default) const override;
168 
170 
171  private:
172  // @{ Private methods
173 
175  Hypre(const Hypre&);
176 
178  Hypre& operator=(const Hypre&);
179 
181  int copyTpetraToHypre();
182 
184  Teuchos::RCP<const Tpetra::Map<>> makeContiguousColumnMap(
185  Teuchos::RCP<const Tpetra::CrsMatrix<>>& Matrix) const;
186 
188  void destroy();
189 
190  // Apply only the hypre operator.
191  void
192  hypreApply(const Tpetra::MultiVector<>& x, Tpetra::MultiVector<>& y) const;
193 
194  // @}
195  // @{ Internal data
197  Teuchos::RCP<const Tpetra::RowMatrix<>> A_;
198 
200  Teuchos::ParameterList List_;
201 
203  bool is_initialized_;
204 
206  bool is_computed_;
207 
209  int num_initialize_;
210 
212  int num_compute_;
213 
218  mutable int num_apply_;
219 
221  double initialize_time_;
222 
224  double compute_time_;
225 
230  mutable double apply_time_;
231 
233  mutable HYPRE_IJMatrix hypre_A_;
234 
236  mutable HYPRE_IJVector hypre_x_;
237  mutable HYPRE_ParVector par_x_;
238 
240  mutable HYPRE_IJVector hypre_y_;
241  mutable HYPRE_ParVector par_y_;
242 
244  Teuchos::RCP<const Tpetra::Map<>> globally_contiguous_row_map_;
245  Teuchos::RCP<const Tpetra::Map<>> globally_contiguous_col_map_;
246 
248  std::string hypredrive_yaml_;
249 
251  HYPREDRV_t hypredrv_;
252 };
253 
254 //---------------------------------------------------------------------------//
255 
256 } // namespace LinearSolvers
257 } // namespace VertexCFD
258 
259 #endif /* VERTEXFCFD_LINEARSOLVERS_HYPRE_HPP */
VertexCFD::LinearSolvers::Hypre
Definition: VertexCFD_LinearSolvers_Hypre.hpp:39
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::LinearSolvers::Hypre::isInitialized
bool isInitialized() const
Definition: VertexCFD_LinearSolvers_Hypre.hpp:58
VertexCFD::LinearSolvers::Hypre::hasTransposeApply
bool hasTransposeApply() const override
Whether it's possible to apply the transpose of this operator.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:575
VertexCFD::LinearSolvers::Hypre::description
std::string description() const override
A simple one-line description of this object.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:333
VertexCFD::LinearSolvers::Hypre::getNumApply
int getNumApply() const override
The number of calls to apply().
Definition: VertexCFD_LinearSolvers_Hypre.cpp:508
VertexCFD::LinearSolvers::Hypre::getRangeMap
Teuchos::RCP< const Tpetra::Map<> > getRangeMap() const override
The Tpetra::Map representing the range of this operator.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:545
VertexCFD::LinearSolvers::Hypre::getInitializeTime
double getInitializeTime() const override
The time (in seconds) spent in initialize().
Definition: VertexCFD_LinearSolvers_Hypre.cpp:514
VertexCFD::LinearSolvers::Hypre::Hypre
Hypre()
Constructor.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:49
VertexCFD::LinearSolvers::Hypre::setMatrix
void setMatrix(const Teuchos::RCP< const Tpetra::RowMatrix<>> &A)
Set the matrix to be preconditioned.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:558
VertexCFD::LinearSolvers::Hypre::describe
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const override
Print the object with some verbosity level to a Teuchos::FancyOStream.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:360
VertexCFD::LinearSolvers::Hypre::getNumInitialize
int getNumInitialize() const override
The number of calls to initialize().
Definition: VertexCFD_LinearSolvers_Hypre.cpp:496
VertexCFD::LinearSolvers::Hypre::apply
void apply(const Tpetra::MultiVector<> &x, Tpetra::MultiVector<> &y, Teuchos::ETransp mode=Teuchos::NO_TRANS, double alpha=Teuchos::ScalarTraits< double >::one(), double beta=Teuchos::ScalarTraits< double >::zero()) const override
Apply the preconditioner to X, returning the result in Y.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:276
VertexCFD::LinearSolvers::Hypre::getDomainMap
Teuchos::RCP< const Tpetra::Map<> > getDomainMap() const override
The Tpetra::Map representing the domain of this operator.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:532
VertexCFD::LinearSolvers::Hypre::getMatrix
Teuchos::RCP< const Tpetra::RowMatrix<> > getMatrix() const override
The matrix for which this is a preconditioner.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:569
VertexCFD::LinearSolvers::Hypre::compute
void compute() override
Definition: VertexCFD_LinearSolvers_Hypre.cpp:195
VertexCFD::LinearSolvers::Hypre::getComm
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
The communicator over which the matrix is distributed.
VertexCFD::LinearSolvers::Hypre::~Hypre
~Hypre()
Destructor.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:62
VertexCFD::LinearSolvers::Hypre::getApplyTime
double getApplyTime() const override
The time (in seconds) spent in apply().
Definition: VertexCFD_LinearSolvers_Hypre.cpp:526
VertexCFD::LinearSolvers::Hypre::getNumCompute
int getNumCompute() const override
The number of calls to compute().
Definition: VertexCFD_LinearSolvers_Hypre.cpp:502
VertexCFD::LinearSolvers::Hypre::initialize
void initialize() override
Initialize the preconditioner, does not touch matrix values.
Definition: VertexCFD_LinearSolvers_Hypre.cpp:82
VertexCFD::LinearSolvers::Hypre::isComputed
bool isComputed() const override
Definition: VertexCFD_LinearSolvers_Hypre.hpp:68
VertexCFD::LinearSolvers::Hypre::getComputeTime
double getComputeTime() const override
The time (in seconds) spent in compute().
Definition: VertexCFD_LinearSolvers_Hypre.cpp:520
VertexCFD::LinearSolvers::Hypre::setParameters
void setParameters(const Teuchos::ParameterList &parameterlist) override
Definition: VertexCFD_LinearSolvers_Hypre.cpp:189