GEOS
KrylovSolver.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 TotalEnergies
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
20 #ifndef GEOS_LINEARALGEBRA_SOLVERS_KRYLOVSOLVER_HPP_
21 #define GEOS_LINEARALGEBRA_SOLVERS_KRYLOVSOLVER_HPP_
22 
28 
29 namespace geos
30 {
31 
36 template< typename VECTOR >
37 class KrylovSolver : public LinearOperator< VECTOR >
38 {
39 public:
40 
43 
45  using Vector = typename Base::Vector;
46 
54  static std::unique_ptr< KrylovSolver< VECTOR > >
56  LinearOperator< VECTOR > const & matrix,
57  LinearOperator< VECTOR > const & precond );
58 
66  LinearOperator< Vector > const & matrix,
67  LinearOperator< Vector > const & precond );
68 
74  virtual void solve( Vector const & b, Vector & x ) const = 0;
75 
81  virtual void apply( Vector const & src, Vector & dst ) const override final
82  {
83  solve( src, dst );
84  }
85 
86  virtual globalIndex numGlobalRows() const override final
87  {
88  return m_operator.numGlobalRows();
89  }
90 
91  virtual globalIndex numGlobalCols() const override final
92  {
93  return m_operator.numGlobalCols();
94  }
95 
96  virtual localIndex numLocalRows() const override final
97  {
98  return m_operator.numLocalRows();
99  }
100 
101  virtual localIndex numLocalCols() const override final
102  {
103  return m_operator.numLocalCols();
104  }
105 
106  virtual MPI_Comm comm() const override final
107  {
108  return m_operator.comm();
109  }
110 
115  {
116  return m_params;
117  }
118 
122  LinearSolverResult const & result() const
123  {
124  return m_result;
125  }
126 
132  {
133  return m_residualNorms;
134  }
135 
140  virtual string methodName() const = 0;
141 
142 private:
143 
145 
146  template< typename VEC >
147  struct VectorStorageHelper
148  {
149  using type = VEC;
150 
151  static VEC createFrom( VEC const & src )
152  {
153  VEC v;
154  v.create( src.localSize(), src.comm() );
155  return v;
156  }
157  };
158 
159  template< typename VEC >
160  struct VectorStorageHelper< BlockVectorView< VEC > >
161  {
162  using type = BlockVector< VEC >;
163 
164  static BlockVector< VEC > createFrom( BlockVectorView< VEC > const & src )
165  {
166  BlockVector< VEC > v( src.blockSize() );
167  for( localIndex i = 0; i < src.blockSize(); ++i )
168  {
169  v.block( i ).create( src.block( i ).localSize(), src.block( i ).comm() );
170  }
171  return v;
172  }
173  };
174 
176 
177 protected:
178 
180  using VectorTemp = typename VectorStorageHelper< VECTOR >::type;
181 
189  static VectorTemp createTempVector( Vector const & src )
190  {
191  return VectorStorageHelper< VECTOR >::createFrom( src );
192  }
193 
198  void logProgress() const;
199 
203  void logResult() const;
204 
207 
210 
213 
216 
219 };
220 
221 } //namespace geos
222 
223 #endif //GEOS_LINEARALGEBRA_SOLVERS_KRYLOVSOLVER_HPP_
Concrete representation of a block vector.
Definition: BlockVector.hpp:37
Abstract view of a block vector.
VECTOR const & block(localIndex const blockIndex) const
Get a reference to the vector corresponding to block blockRowIndex.
localIndex blockSize() const
Get block size.
Base class for Krylov solvers.
LinearSolverResult m_result
results of a solve
virtual void solve(Vector const &b, Vector &x) const =0
Solve preconditioned system.
virtual globalIndex numGlobalCols() const override final
virtual localIndex numLocalRows() const override final
LinearOperator< Vector > const & m_operator
reference to the operator to be solved
virtual localIndex numLocalCols() const override final
static VectorTemp createTempVector(Vector const &src)
Helper function to create temporary vectors based on a source vector.
void logResult() const
Output convergence result (called by implementations).
typename Base::Vector Vector
Alias for template parameter.
LinearSolverParameters const & parameters() const
typename VectorStorageHelper< VECTOR >::type VectorTemp
Alias for vector type that can be used for temporaries.
LinearOperator< Vector > const & m_precond
reference to the preconditioning operator
virtual void apply(Vector const &src, Vector &dst) const override final
Apply operator to a vector.
void logProgress() const
Output iteration progress (called by implementations).
virtual string methodName() const =0
Get name of the Krylov subspace method.
static std::unique_ptr< KrylovSolver< VECTOR > > create(LinearSolverParameters const &parameters, LinearOperator< VECTOR > const &matrix, LinearOperator< VECTOR > const &precond)
Factory method for instantiating Krylov solver objects.
LinearSolverResult const & result() const
virtual MPI_Comm comm() const override final
Get the MPI communicator the matrix was created with.
arrayView1d< real64 const > history() const
Get convergence history of a linear solve.
virtual globalIndex numGlobalRows() const override final
KrylovSolver(LinearSolverParameters params, LinearOperator< Vector > const &matrix, LinearOperator< Vector > const &precond)
Constructor.
array1d< real64 > m_residualNorms
Absolute residual norms at each iteration (if available)
LinearSolverParameters m_params
parameters of the solver
Abstract base class for linear operators.
virtual globalIndex numGlobalCols() const =0
VECTOR Vector
Alias for template parameter.
virtual globalIndex numGlobalRows() const =0
virtual localIndex numLocalRows() const =0
virtual localIndex numLocalCols() const =0
virtual MPI_Comm comm() const =0
Get the MPI communicator the matrix was created with.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:179
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
Definition: DataTypes.hpp:87
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:84
Array< T, 1 > array1d
Alias for 1D array.
Definition: DataTypes.hpp:175
Set of parameters for a linear solver or preconditioner.
Results/stats of a linear solve.