16#ifndef CABANA_GRID_HYPRESTRUCTUREDSOLVER_HPP
17#define CABANA_GRID_HYPRESTRUCTUREDSOLVER_HPP
26#include <HYPRE_config.h>
27#include <HYPRE_struct_ls.h>
28#include <HYPRE_struct_mv.h>
30#include <Kokkos_Core.hpp>
31#include <Kokkos_Profiling_ScopedRegion.hpp>
47template <
class Scalar,
class EntityType,
class MemorySpace>
59 "HYPRE not compatible with solver memory space" );
67 template <
class ArrayLayout_t>
69 const bool is_preconditioner =
false )
70 : _comm( layout.localGrid()->globalGrid().comm() )
71 , _is_preconditioner( is_preconditioner )
74 "Must use an array layout" );
76 std::is_same<
typename ArrayLayout_t::entity_type,
78 "Array layout entity type mush match solver entity type" );
81 const std::size_t num_space_dim = ArrayLayout_t::num_space_dim;
84 if ( !_is_preconditioner )
87 auto error = HYPRE_StructGridCreate( _comm, num_space_dim, &_grid );
98 auto global_space = layout.indexSpace(
Own(),
Global() );
99 _lower.resize( num_space_dim );
100 _upper.resize( num_space_dim );
101 for ( std::size_t d = 0; d < num_space_dim; ++d )
103 _lower[d] =
static_cast<HYPRE_Int
>(
104 global_space.min( num_space_dim - d - 1 ) );
105 _upper[d] =
static_cast<HYPRE_Int
>(
106 global_space.max( num_space_dim - d - 1 ) - 1 );
108 error = HYPRE_StructGridSetExtents( _grid, _lower.data(),
113 const auto& global_grid = layout.localGrid()->globalGrid();
114 HYPRE_Int periodic[num_space_dim];
115 for ( std::size_t d = 0; d < num_space_dim; ++d )
116 periodic[num_space_dim - 1 - d] =
117 global_grid.isPeriodic( d )
118 ? layout.localGrid()->globalGrid().globalNumEntity(
121 error = HYPRE_StructGridSetPeriodic( _grid, periodic );
125 error = HYPRE_StructGridAssemble( _grid );
130 std::array<long, num_space_dim> reorder_size;
131 for ( std::size_t d = 0; d < num_space_dim; ++d )
133 reorder_size[d] = global_space.extent( d );
138 "vector_values", reorder_space );
139 Kokkos::deep_copy( vector_values, 0.0 );
141 error = HYPRE_StructVectorCreate( _comm, _grid, &
_b );
143 error = HYPRE_StructVectorInitialize(
_b );
145 error = HYPRE_StructVectorSetBoxValues(
146 _b, _lower.data(), _upper.data(), vector_values.data() );
148 error = HYPRE_StructVectorAssemble(
_b );
151 error = HYPRE_StructVectorCreate( _comm, _grid, &
_x );
153 error = HYPRE_StructVectorInitialize(
_x );
155 error = HYPRE_StructVectorSetBoxValues(
156 _x, _lower.data(), _upper.data(), vector_values.data() );
158 error = HYPRE_StructVectorAssemble(
_x );
167 if ( !_is_preconditioner )
169 HYPRE_StructVectorDestroy(
_x );
170 HYPRE_StructVectorDestroy(
_b );
171 HYPRE_StructMatrixDestroy(
_A );
172 HYPRE_StructStencilDestroy( _stencil );
173 HYPRE_StructGridDestroy( _grid );
188 template <std::
size_t NumSpaceDim>
191 const bool is_symmetric =
false )
194 if ( _is_preconditioner )
195 throw std::logic_error(
196 "Cannot call setMatrixStencil() on preconditioners" );
199 _stencil_size = stencil.size();
201 HYPRE_StructStencilCreate( NumSpaceDim, _stencil_size, &_stencil );
203 std::array<HYPRE_Int, NumSpaceDim> offset;
204 for (
unsigned n = 0; n < stencil.size(); ++n )
206 for ( std::size_t d = 0; d < NumSpaceDim; ++d )
207 offset[d] = stencil[n][d];
208 error = HYPRE_StructStencilSetElement( _stencil, n, offset.data() );
213 error = HYPRE_StructMatrixCreate( _comm, _grid, _stencil, &
_A );
215 error = HYPRE_StructMatrixSetSymmetric(
_A, is_symmetric );
217 error = HYPRE_StructMatrixInitialize(
_A );
229 template <
class Array_t>
234 std::is_same<typename Array_t::entity_type, entity_type>::value,
235 "Array entity type mush match solver entity type" );
237 std::is_same<typename Array_t::memory_space, MemorySpace>::value,
238 "Array memory space and solver memory space are different." );
241 std::is_same<typename Array_t::value_type, value_type>::value,
242 "Array value type and solver value type are different." );
245 if ( _is_preconditioner )
246 throw std::logic_error(
247 "Cannot call setMatrixValues() on preconditioners" );
249 if ( values.layout()->dofsPerEntity() !=
250 static_cast<int>( _stencil_size ) )
251 throw std::runtime_error(
252 "Number of matrix values does not match stencil size" );
255 const std::size_t num_space_dim = Array_t::num_space_dim;
259 auto owned_space = values.layout()->indexSpace(
Own(),
Local() );
260 std::array<long, num_space_dim + 1> reorder_size;
261 for ( std::size_t d = 0; d < num_space_dim; ++d )
263 reorder_size[d] = owned_space.extent( d );
265 reorder_size.back() = _stencil_size;
269 "a_values", reorder_space );
270 auto values_subv =
createSubview( values.view(), owned_space );
271 Kokkos::deep_copy( a_values, values_subv );
274 std::vector<HYPRE_Int> indices( _stencil_size );
275 std::iota( indices.begin(), indices.end(), 0 );
276 auto error = HYPRE_StructMatrixSetBoxValues(
277 _A, _lower.data(), _upper.data(), indices.size(), indices.data(),
280 error = HYPRE_StructMatrixAssemble(
_A );
290 HYPRE_StructMatrixPrint( prefix,
_A, 0 );
299 HYPRE_StructVectorPrint( prefix,
_x, 0 );
308 HYPRE_StructVectorPrint( prefix,
_b, 0 );
326 Scalar, EntityType, MemorySpace>>& preconditioner )
329 if ( _is_preconditioner )
330 throw std::logic_error(
331 "Cannot call setPreconditioner() on a preconditioner" );
334 if ( !preconditioner->isPreconditioner() )
335 throw std::logic_error(
"Not a preconditioner" );
337 _preconditioner = preconditioner;
345 if ( _is_preconditioner )
346 throw std::logic_error(
"Cannot call setup() on preconditioners" );
357 template <
class Array_t>
358 void solve(
const Array_t& b, Array_t& x )
360 Kokkos::Profiling::ScopedRegion region(
361 "Cabana::Grid::HypreStructuredSolver::solve" );
365 std::is_same<typename Array_t::entity_type, entity_type>::value,
366 "Array entity type mush match solver entity type" );
368 std::is_same<typename Array_t::memory_space, MemorySpace>::value,
369 "Array memory space and solver memory space are different." );
372 std::is_same<typename Array_t::value_type, value_type>::value,
373 "Array value type and solver value type are different." );
376 if ( _is_preconditioner )
377 throw std::logic_error(
"Cannot call solve() on preconditioners" );
379 if ( b.layout()->dofsPerEntity() != 1 ||
380 x.layout()->dofsPerEntity() != 1 )
381 throw std::runtime_error(
382 "Structured solver only for scalar fields" );
385 const std::size_t num_space_dim = Array_t::num_space_dim;
388 auto owned_space = b.layout()->indexSpace(
Own(),
Local() );
389 std::array<long, num_space_dim + 1> reorder_size;
390 for ( std::size_t d = 0; d < num_space_dim; ++d )
392 reorder_size[d] = owned_space.extent( d );
394 reorder_size.back() = 1;
398 "vector_values", reorder_space );
400 Kokkos::deep_copy( vector_values, b_subv );
403 auto error = HYPRE_StructVectorSetBoxValues(
404 _b, _lower.data(), _upper.data(), vector_values.data() );
406 error = HYPRE_StructVectorAssemble(
_b );
413 error = HYPRE_StructVectorGetBoxValues(
414 _x, _lower.data(), _upper.data(), vector_values.data() );
419 Kokkos::deep_copy( x_subv, vector_values );
463 preconditioner ) = 0;
471 HYPRE_DescribeError( error, error_msg );
472 std::stringstream out;
473 out <<
"HYPRE structured solver error: ";
474 out << error <<
" " << error_msg;
475 HYPRE_ClearError( error );
476 throw std::runtime_error( out.str() );
482 HYPRE_StructMatrix
_A;
484 HYPRE_StructVector
_b;
486 HYPRE_StructVector
_x;
490 bool _is_preconditioner;
491 HYPRE_StructGrid _grid;
492 std::vector<HYPRE_Int> _lower;
493 std::vector<HYPRE_Int> _upper;
494 HYPRE_StructStencil _stencil;
495 unsigned _stencil_size;
496 std::shared_ptr<HypreStructuredSolver<Scalar, EntityType, MemorySpace>>
502template <
class Scalar,
class EntityType,
class MemorySpace>
510 template <
class ArrayLayout_t>
512 const bool is_preconditioner =
false )
515 if ( is_preconditioner )
516 throw std::logic_error(
517 "HYPRE PCG cannot be used as a preconditioner" );
519 auto error = HYPRE_StructPCGCreate(
520 layout.localGrid()->globalGrid().comm(), &_solver );
523 HYPRE_StructPCGSetTwoNorm( _solver, 1 );
533 auto error = HYPRE_StructPCGSetAbsoluteTol( _solver, tol );
541 auto error = HYPRE_StructPCGSetRelChange( _solver, rel_change );
548 auto error = HYPRE_StructPCGSetLogging( _solver, logging );
555 return HYPRE_StructPCGSetup;
559 return HYPRE_StructPCGSolve;
565 auto error = HYPRE_StructPCGSetTol( _solver, tol );
571 auto error = HYPRE_StructPCGSetMaxIter( _solver, max_iter );
577 auto error = HYPRE_StructPCGSetPrintLevel( _solver, print_level );
583 auto error = HYPRE_StructPCGSetup( _solver, _A, _b, _x );
589 auto error = HYPRE_StructPCGSolve( _solver, _A, _b, _x );
596 auto error = HYPRE_StructPCGGetNumIterations( _solver, &num_iter );
605 HYPRE_StructPCGGetFinalRelativeResidualNorm( _solver, &norm );
612 preconditioner )
override
614 auto error = HYPRE_StructPCGSetPrecond(
622 HYPRE_StructSolver _solver;
630template <
class Scalar,
class EntityType,
class MemorySpace>
638 template <
class ArrayLayout_t>
640 const bool is_preconditioner =
false )
643 if ( is_preconditioner )
644 throw std::logic_error(
645 "HYPRE GMRES cannot be used as a preconditioner" );
647 auto error = HYPRE_StructGMRESCreate(
648 layout.localGrid()->globalGrid().comm(), &_solver );
659 auto error = HYPRE_StructGMRESSetAbsoluteTol( _solver, tol );
666 auto error = HYPRE_StructGMRESSetKDim( _solver, k_dim );
673 auto error = HYPRE_StructGMRESSetLogging( _solver, logging );
680 return HYPRE_StructGMRESSetup;
684 return HYPRE_StructGMRESSolve;
690 auto error = HYPRE_StructGMRESSetTol( _solver, tol );
696 auto error = HYPRE_StructGMRESSetMaxIter( _solver, max_iter );
702 auto error = HYPRE_StructGMRESSetPrintLevel( _solver, print_level );
708 auto error = HYPRE_StructGMRESSetup( _solver, _A, _b, _x );
714 auto error = HYPRE_StructGMRESSolve( _solver, _A, _b, _x );
721 auto error = HYPRE_StructGMRESGetNumIterations( _solver, &num_iter );
730 HYPRE_StructGMRESGetFinalRelativeResidualNorm( _solver, &norm );
737 preconditioner )
override
739 auto error = HYPRE_StructGMRESSetPrecond(
747 HYPRE_StructSolver _solver;
755template <
class Scalar,
class EntityType,
class MemorySpace>
763 template <
class ArrayLayout_t>
765 const bool is_preconditioner =
false )
768 if ( is_preconditioner )
769 throw std::logic_error(
770 "HYPRE BiCGSTAB cannot be used as a preconditioner" );
772 auto error = HYPRE_StructBiCGSTABCreate(
773 layout.localGrid()->globalGrid().comm(), &_solver );
784 auto error = HYPRE_StructBiCGSTABSetAbsoluteTol( _solver, tol );
791 auto error = HYPRE_StructBiCGSTABSetLogging( _solver, logging );
798 return HYPRE_StructBiCGSTABSetup;
802 return HYPRE_StructBiCGSTABSolve;
808 auto error = HYPRE_StructBiCGSTABSetTol( _solver, tol );
814 auto error = HYPRE_StructBiCGSTABSetMaxIter( _solver, max_iter );
820 auto error = HYPRE_StructBiCGSTABSetPrintLevel( _solver, print_level );
826 auto error = HYPRE_StructBiCGSTABSetup( _solver, _A, _b, _x );
832 auto error = HYPRE_StructBiCGSTABSolve( _solver, _A, _b, _x );
839 auto error = HYPRE_StructBiCGSTABGetNumIterations( _solver, &num_iter );
848 HYPRE_StructBiCGSTABGetFinalRelativeResidualNorm( _solver, &norm );
855 preconditioner )
override
857 auto error = HYPRE_StructBiCGSTABSetPrecond(
865 HYPRE_StructSolver _solver;
873template <
class Scalar,
class EntityType,
class MemorySpace>
881 template <
class ArrayLayout_t>
883 const bool is_preconditioner =
false )
886 auto error = HYPRE_StructPFMGCreate(
887 layout.localGrid()->globalGrid().comm(), &_solver );
890 if ( is_preconditioner )
892 error = HYPRE_StructPFMGSetZeroGuess( _solver );
904 auto error = HYPRE_StructPFMGSetMaxLevels( _solver, max_levels );
912 auto error = HYPRE_StructPFMGSetRelChange( _solver, rel_change );
927 auto error = HYPRE_StructPFMGSetRelaxType( _solver, relax_type );
934 auto error = HYPRE_StructPFMGSetJacobiWeight( _solver, weight );
950 auto error = HYPRE_StructPFMGSetRAPType( _solver, rap_type );
957 auto error = HYPRE_StructPFMGSetNumPreRelax( _solver, num_pre_relax );
964 auto error = HYPRE_StructPFMGSetNumPostRelax( _solver, num_post_relax );
973 auto error = HYPRE_StructPFMGSetSkipRelax( _solver, skip_relax );
980 auto error = HYPRE_StructPFMGSetLogging( _solver, logging );
987 return HYPRE_StructPFMGSetup;
991 return HYPRE_StructPFMGSolve;
997 auto error = HYPRE_StructPFMGSetTol( _solver, tol );
1003 auto error = HYPRE_StructPFMGSetMaxIter( _solver, max_iter );
1009 auto error = HYPRE_StructPFMGSetPrintLevel( _solver, print_level );
1015 auto error = HYPRE_StructPFMGSetup( _solver, _A, _b, _x );
1021 auto error = HYPRE_StructPFMGSolve( _solver, _A, _b, _x );
1028 auto error = HYPRE_StructPFMGGetNumIterations( _solver, &num_iter );
1037 HYPRE_StructPFMGGetFinalRelativeResidualNorm( _solver, &norm );
1045 throw std::logic_error(
1046 "HYPRE PFMG solver does not support preconditioning." );
1050 HYPRE_StructSolver _solver;
1058template <
class Scalar,
class EntityType,
class MemorySpace>
1066 template <
class ArrayLayout_t>
1068 const bool is_preconditioner =
false )
1069 :
base_type( layout, is_preconditioner )
1071 auto error = HYPRE_StructSMGCreate(
1072 layout.localGrid()->globalGrid().comm(), &_solver );
1075 if ( is_preconditioner )
1077 error = HYPRE_StructSMGSetZeroGuess( _solver );
1090 auto error = HYPRE_StructSMGSetRelChange( _solver, rel_change );
1097 auto error = HYPRE_StructSMGSetNumPreRelax( _solver, num_pre_relax );
1104 auto error = HYPRE_StructSMGSetNumPostRelax( _solver, num_post_relax );
1111 auto error = HYPRE_StructSMGSetLogging( _solver, logging );
1118 return HYPRE_StructSMGSetup;
1122 return HYPRE_StructSMGSolve;
1128 auto error = HYPRE_StructSMGSetTol( _solver, tol );
1134 auto error = HYPRE_StructSMGSetMaxIter( _solver, max_iter );
1140 auto error = HYPRE_StructSMGSetPrintLevel( _solver, print_level );
1146 auto error = HYPRE_StructSMGSetup( _solver, _A, _b, _x );
1152 auto error = HYPRE_StructSMGSolve( _solver, _A, _b, _x );
1159 auto error = HYPRE_StructSMGGetNumIterations( _solver, &num_iter );
1168 HYPRE_StructSMGGetFinalRelativeResidualNorm( _solver, &norm );
1176 throw std::logic_error(
1177 "HYPRE SMG solver does not support preconditioning." );
1181 HYPRE_StructSolver _solver;
1189template <
class Scalar,
class EntityType,
class MemorySpace>
1197 template <
class ArrayLayout_t>
1199 const bool is_preconditioner =
false )
1200 :
base_type( layout, is_preconditioner )
1202 auto error = HYPRE_StructJacobiCreate(
1203 layout.localGrid()->globalGrid().comm(), &_solver );
1206 if ( is_preconditioner )
1208 error = HYPRE_StructJacobiSetZeroGuess( _solver );
1218 return HYPRE_StructJacobiSetup;
1222 return HYPRE_StructJacobiSolve;
1228 auto error = HYPRE_StructJacobiSetTol( _solver, tol );
1234 auto error = HYPRE_StructJacobiSetMaxIter( _solver, max_iter );
1245 auto error = HYPRE_StructJacobiSetup( _solver, _A, _b, _x );
1251 auto error = HYPRE_StructJacobiSolve( _solver, _A, _b, _x );
1258 auto error = HYPRE_StructJacobiGetNumIterations( _solver, &num_iter );
1267 HYPRE_StructJacobiGetFinalRelativeResidualNorm( _solver, &norm );
1275 throw std::logic_error(
1276 "HYPRE Jacobi solver does not support preconditioning." );
1280 HYPRE_StructSolver _solver;
1288template <
class Scalar,
class EntityType,
class MemorySpace>
1296 template <
class ArrayLayout_t>
1298 const bool is_preconditioner =
false )
1299 :
base_type( layout, is_preconditioner )
1301 if ( !is_preconditioner )
1302 throw std::logic_error(
1303 "Diagonal preconditioner cannot be used as a solver" );
1309 return HYPRE_StructDiagScaleSetup;
1313 return HYPRE_StructDiagScale;
1319 throw std::logic_error(
1320 "Diagonal preconditioner cannot be used as a solver" );
1325 throw std::logic_error(
1326 "Diagonal preconditioner cannot be used as a solver" );
1331 throw std::logic_error(
1332 "Diagonal preconditioner cannot be used as a solver" );
1337 throw std::logic_error(
1338 "Diagonal preconditioner cannot be used as a solver" );
1343 throw std::logic_error(
1344 "Diagonal preconditioner cannot be used as a solver" );
1349 throw std::logic_error(
1350 "Diagonal preconditioner cannot be used as a solver" );
1355 throw std::logic_error(
1356 "Diagonal preconditioner cannot be used as a solver" );
1362 throw std::logic_error(
1363 "Diagonal preconditioner does not support preconditioning." );
1372template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1374 HypreStructPCG<Scalar, typename ArrayLayout_t::entity_type, MemorySpace>>
1376 const bool is_preconditioner =
false )
1379 "Must use an array layout" );
1381 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>(
1382 layout, is_preconditioner );
1387template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1389 HypreStructGMRES<Scalar, typename ArrayLayout_t::entity_type, MemorySpace>>
1391 const bool is_preconditioner =
false )
1394 "Must use an array layout" );
1396 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>(
1397 layout, is_preconditioner );
1402template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1403std::shared_ptr<HypreStructBiCGSTAB<Scalar,
typename ArrayLayout_t::entity_type,
1406 const bool is_preconditioner =
false )
1409 "Must use an array layout" );
1411 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>(
1412 layout, is_preconditioner );
1417template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1419 HypreStructPFMG<Scalar, typename ArrayLayout_t::entity_type, MemorySpace>>
1421 const bool is_preconditioner =
false )
1424 "Must use an array layout" );
1426 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>(
1427 layout, is_preconditioner );
1432template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1434 HypreStructSMG<Scalar, typename ArrayLayout_t::entity_type, MemorySpace>>
1436 const bool is_preconditioner =
false )
1439 "Must use an array layout" );
1441 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>(
1442 layout, is_preconditioner );
1447template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1449 HypreStructJacobi<Scalar, typename ArrayLayout_t::entity_type, MemorySpace>>
1451 const bool is_preconditioner =
false )
1454 "Must use an array layout" );
1456 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>(
1457 layout, is_preconditioner );
1462template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1463std::shared_ptr<HypreStructDiagonal<Scalar,
typename ArrayLayout_t::entity_type,
1466 const bool is_preconditioner =
false )
1469 "Must use an array layout" );
1471 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>(
1472 layout, is_preconditioner );
1486template <
class Scalar,
class MemorySpace,
class ArrayLayout_t>
1487std::shared_ptr<HypreStructuredSolver<
1488 Scalar,
typename ArrayLayout_t::entity_type, MemorySpace>>
1490 const ArrayLayout_t& layout,
1491 const bool is_preconditioner =
false )
1494 "Must use an array layout" );
1496 if (
"PCG" == solver_type )
1498 is_preconditioner );
1499 else if (
"GMRES" == solver_type )
1501 is_preconditioner );
1502 else if (
"BiCGSTAB" == solver_type )
1504 layout, is_preconditioner );
1505 else if (
"PFMG" == solver_type )
1507 is_preconditioner );
1508 else if (
"SMG" == solver_type )
1510 is_preconditioner );
1511 else if (
"Jacobi" == solver_type )
1513 layout, is_preconditioner );
1514 else if (
"Diagonal" == solver_type )
1516 layout, is_preconditioner );
1518 throw std::runtime_error(
"Invalid solver type" );
std::shared_ptr< HypreStructGMRES< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructGMRES(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1390
std::shared_ptr< HypreStructJacobi< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructJacobi(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1450
std::shared_ptr< HypreStructBiCGSTAB< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructBiCGSTAB(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1405
std::shared_ptr< HypreStructDiagonal< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructDiagonal(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1465
std::shared_ptr< HypreStructPCG< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructPCG(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1375
std::shared_ptr< HypreStructPFMG< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructPFMG(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1420
std::shared_ptr< HypreStructSMG< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructSMG(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1435
std::shared_ptr< HypreStructuredSolver< Scalar, typename ArrayLayout_t::entity_type, MemorySpace > > createHypreStructuredSolver(const std::string &solver_type, const ArrayLayout_t &layout, const bool is_preconditioner=false)
Create a HYPRE structured solver.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1489
HYPRE memory space handling.
KOKKOS_INLINE_FUNCTION auto createSubview(const ViewType &view, const IndexSpace< 1 > &index_space) -> decltype(Kokkos::subview(view, index_space.range(0)))
Given a view create a subview over the given index space.
Definition Cabana_Grid_IndexSpace.hpp:369
Kokkos::View< Scalar *, Params... > createView(const std::string &label, const IndexSpace< 1 > &index_space)
Given an index space create a view over the extent of that index space.
Definition Cabana_Grid_IndexSpace.hpp:235
BiCGSTAB solver.
Definition Cabana_Grid_HypreStructuredSolver.hpp:758
double getFinalRelativeResidualNormImpl() override
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:844
void solveImpl() override
Solver implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:830
void setLogging(const int logging)
Set the amount of logging to do.
Definition Cabana_Grid_HypreStructuredSolver.hpp:789
void setAbsoluteTol(const double tol)
Set the absolute tolerance.
Definition Cabana_Grid_HypreStructuredSolver.hpp:782
HYPRE_StructSolver getHypreSolver() const override
Get the preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:795
int getNumIterImpl() override
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:836
HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const override
Get the preconditioner setup function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:796
HypreStructuredSolver< Scalar, EntityType, MemorySpace > base_type
Base HYPRE structured solver type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:761
void setMaxIterImpl(const int max_iter) override
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:812
void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &preconditioner) override
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:853
void setPrintLevelImpl(const int print_level) override
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:818
HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const override
Get the preconditioner solve function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:800
void setupImpl() override
Setup implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:824
void setToleranceImpl(const double tol) override
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:806
HypreStructBiCGSTAB(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Constructor.
Definition Cabana_Grid_HypreStructuredSolver.hpp:764
Diagonal preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1291
void solveImpl() override
Solver implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1341
double getFinalRelativeResidualNormImpl() override
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1353
int getNumIterImpl() override
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1347
void setupImpl() override
Setup implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1335
void setPrintLevelImpl(const int) override
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1329
HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const override
Get the preconditioner setup function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1307
HYPRE_StructSolver getHypreSolver() const override
Get the preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1306
HypreStructuredSolver< Scalar, EntityType, MemorySpace > base_type
Base HYPRE structured solver type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1294
void setToleranceImpl(const double) override
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1317
HypreStructDiagonal(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Constructor.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1297
void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &) override
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1359
void setMaxIterImpl(const int) override
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1323
HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const override
Get the preconditioner solve function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1311
GMRES solver.
Definition Cabana_Grid_HypreStructuredSolver.hpp:633
void setToleranceImpl(const double tol) override
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:688
void solveImpl() override
Solver implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:712
HypreStructuredSolver< Scalar, EntityType, MemorySpace > base_type
Base HYPRE structured solver type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:636
HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const override
Get the preconditioner setup function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:678
HypreStructGMRES(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Constructor.
Definition Cabana_Grid_HypreStructuredSolver.hpp:639
int getNumIterImpl() override
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:718
void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &preconditioner) override
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:735
void setMaxIterImpl(const int max_iter) override
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:694
HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const override
Get the preconditioner solve function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:682
HYPRE_StructSolver getHypreSolver() const override
Get the preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:677
void setKDim(const int k_dim)
Set the max size of the Krylov space.
Definition Cabana_Grid_HypreStructuredSolver.hpp:664
double getFinalRelativeResidualNormImpl() override
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:726
void setLogging(const int logging)
Set the amount of logging to do.
Definition Cabana_Grid_HypreStructuredSolver.hpp:671
void setAbsoluteTol(const double tol)
Set the absolute tolerance.
Definition Cabana_Grid_HypreStructuredSolver.hpp:657
void setupImpl() override
Setup implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:706
void setPrintLevelImpl(const int print_level) override
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:700
Jacobi solver.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1192
void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &) override
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1272
void setToleranceImpl(const double tol) override
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1226
double getFinalRelativeResidualNormImpl() override
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1263
HypreStructuredSolver< Scalar, EntityType, MemorySpace > base_type
Base HYPRE structured solver type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1195
HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const override
Get the preconditioner solve function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1220
void setupImpl() override
Setup implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1243
void setMaxIterImpl(const int max_iter) override
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1232
int getNumIterImpl() override
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1255
void setPrintLevelImpl(const int) override
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1238
HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const override
Get the preconditioner setup function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1216
void solveImpl() override
Solver implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1249
HYPRE_StructSolver getHypreSolver() const override
Get the preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1215
HypreStructJacobi(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Constructor.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1198
PCG solver.
Definition Cabana_Grid_HypreStructuredSolver.hpp:505
void setRelChange(const int rel_change)
Definition Cabana_Grid_HypreStructuredSolver.hpp:539
void setToleranceImpl(const double tol) override
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:563
void setupImpl() override
Setup implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:581
HYPRE_StructSolver getHypreSolver() const override
Get the preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:552
HypreStructuredSolver< Scalar, EntityType, MemorySpace > base_type
Base HYPRE structured solver type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:508
HypreStructPCG(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Constructor.
Definition Cabana_Grid_HypreStructuredSolver.hpp:511
HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const override
Get the preconditioner setup function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:553
void solveImpl() override
Solver implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:587
int getNumIterImpl() override
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:593
void setAbsoluteTol(const double tol)
Set the absolute tolerance.
Definition Cabana_Grid_HypreStructuredSolver.hpp:531
double getFinalRelativeResidualNormImpl() override
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:601
void setMaxIterImpl(const int max_iter) override
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:569
HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const override
Get the preconditioner solve function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:557
void setPrintLevelImpl(const int print_level) override
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:575
void setLogging(const int logging)
Set the amount of logging to do.
Definition Cabana_Grid_HypreStructuredSolver.hpp:546
void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &preconditioner) override
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:610
PFMG solver.
Definition Cabana_Grid_HypreStructuredSolver.hpp:876
HypreStructuredSolver< Scalar, EntityType, MemorySpace > base_type
Base HYPRE structured solver type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:879
HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const override
Get the preconditioner solve function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:989
void setRelaxType(const int relax_type)
Set relaxation type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:925
void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &) override
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1042
void setSkipRelax(const int skip_relax)
Definition Cabana_Grid_HypreStructuredSolver.hpp:971
void setPrintLevelImpl(const int print_level) override
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1007
double getFinalRelativeResidualNormImpl() override
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1033
void setLogging(const int logging)
Set the amount of logging to do.
Definition Cabana_Grid_HypreStructuredSolver.hpp:978
void setNumPreRelax(const int num_pre_relax)
Set number of relaxation sweeps before coarse-grid correction.
Definition Cabana_Grid_HypreStructuredSolver.hpp:955
void setJacobiWeight(const double weight)
Set the Jacobi weight.
Definition Cabana_Grid_HypreStructuredSolver.hpp:932
HYPRE_StructSolver getHypreSolver() const override
Get the preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:984
void solveImpl() override
Solver implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1019
HypreStructPFMG(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Constructor.
Definition Cabana_Grid_HypreStructuredSolver.hpp:882
HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const override
Get the preconditioner setup function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:985
void setupImpl() override
Setup implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1013
int getNumIterImpl() override
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1025
void setMaxIterImpl(const int max_iter) override
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1001
void setToleranceImpl(const double tol) override
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:995
void setRelChange(const int rel_change)
Definition Cabana_Grid_HypreStructuredSolver.hpp:910
void setNumPostRelax(const int num_post_relax)
Set number of relaxation sweeps before coarse-grid correction.
Definition Cabana_Grid_HypreStructuredSolver.hpp:962
void setMaxLevels(const int max_levels)
Set the maximum number of multigrid levels.
Definition Cabana_Grid_HypreStructuredSolver.hpp:902
void setRAPType(const int rap_type)
Set type of coarse-grid operator to use.
Definition Cabana_Grid_HypreStructuredSolver.hpp:948
SMG solver.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1061
HypreStructSMG(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Constructor.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1067
void solveImpl() override
Solver implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1150
void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &) override
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1173
void setToleranceImpl(const double tol) override
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1126
void setRelChange(const int rel_change)
Definition Cabana_Grid_HypreStructuredSolver.hpp:1088
HypreStructuredSolver< Scalar, EntityType, MemorySpace > base_type
Base HYPRE structured solver type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1064
HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const override
Get the preconditioner setup function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1116
HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const override
Get the preconditioner solve function.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1120
void setLogging(const int logging)
Set the amount of logging to do.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1109
void setMaxIterImpl(const int max_iter) override
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1132
int getNumIterImpl() override
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1156
void setPrintLevelImpl(const int print_level) override
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1138
void setupImpl() override
Setup implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1144
double getFinalRelativeResidualNormImpl() override
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1164
void setNumPostRelax(const int num_post_relax)
Set number of relaxation sweeps before coarse-grid correction.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1102
void setNumPreRelax(const int num_pre_relax)
Set number of relaxation sweeps before coarse-grid correction.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1095
HYPRE_StructSolver getHypreSolver() const override
Get the preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:1115
Hypre structured solver interface for scalar fields.
Definition Cabana_Grid_HypreStructuredSolver.hpp:49
bool isPreconditioner() const
Return if this solver is a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:178
Scalar value_type
Scalar value type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:56
virtual HYPRE_PtrToStructSolverFcn getHypreSetupFunction() const =0
Get the preconditioner setup function.
void printMatrix(const char *prefix)
Print the hypre matrix to output file.
Definition Cabana_Grid_HypreStructuredSolver.hpp:288
HYPRE_StructMatrix _A
Matrix for the problem Ax = b.
Definition Cabana_Grid_HypreStructuredSolver.hpp:482
HYPRE_StructVector _b
Forcing term for the problem Ax = b.
Definition Cabana_Grid_HypreStructuredSolver.hpp:484
double getFinalRelativeResidualNorm()
Get the relative residual norm achieved on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:426
void setup()
Setup the problem.
Definition Cabana_Grid_HypreStructuredSolver.hpp:342
virtual void setMaxIterImpl(const int max_iter)=0
Set maximum iteration implementation.
HypreStructuredSolver(const ArrayLayout_t &layout, const bool is_preconditioner=false)
Hypre memory space compatibility check.
Definition Cabana_Grid_HypreStructuredSolver.hpp:68
virtual void setPreconditionerImpl(const HypreStructuredSolver< Scalar, EntityType, MemorySpace > &preconditioner)=0
Set a preconditioner.
virtual void setToleranceImpl(const double tol)=0
Set convergence tolerance implementation.
void setMatrixStencil(const std::vector< std::array< int, NumSpaceDim > > &stencil, const bool is_symmetric=false)
Set the operator stencil.
Definition Cabana_Grid_HypreStructuredSolver.hpp:190
EntityType entity_type
Entity type.
Definition Cabana_Grid_HypreStructuredSolver.hpp:52
virtual double getFinalRelativeResidualNormImpl()=0
Get the relative residual norm achieved on the last solve.
void setPrintLevel(const int print_level)
Set the output level.
Definition Cabana_Grid_HypreStructuredSolver.hpp:318
virtual void solveImpl()=0
Solver implementation.
virtual int getNumIterImpl()=0
Get the number of iterations taken on the last solve.
MemorySpace memory_space
Kokkos memory space..
Definition Cabana_Grid_HypreStructuredSolver.hpp:54
virtual HYPRE_StructSolver getHypreSolver() const =0
Get the preconditioner.
void setMatrixValues(const Array_t &values)
Set the matrix values.
Definition Cabana_Grid_HypreStructuredSolver.hpp:230
void printLHS(const char *prefix)
Print the hypre LHS to output file.
Definition Cabana_Grid_HypreStructuredSolver.hpp:297
void printRHS(const char *prefix)
Print the hypre RHS to output file.
Definition Cabana_Grid_HypreStructuredSolver.hpp:306
void checkHypreError(const int error) const
Check a hypre error.
Definition Cabana_Grid_HypreStructuredSolver.hpp:466
int getNumIter()
Get the number of iterations taken on the last solve.
Definition Cabana_Grid_HypreStructuredSolver.hpp:423
virtual HYPRE_PtrToStructSolverFcn getHypreSolveFunction() const =0
Get the preconditioner solve function.
virtual void setupImpl()=0
Setup implementation.
HYPRE_StructVector _x
Solution to the problem Ax = b.
Definition Cabana_Grid_HypreStructuredSolver.hpp:486
void setMaxIter(const int max_iter)
Set maximum iteration implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:315
void solve(const Array_t &b, Array_t &x)
Solve the problem Ax = b for x.
Definition Cabana_Grid_HypreStructuredSolver.hpp:358
void setTolerance(const double tol)
Set convergence tolerance implementation.
Definition Cabana_Grid_HypreStructuredSolver.hpp:312
void setPreconditioner(const std::shared_ptr< HypreStructuredSolver< Scalar, EntityType, MemorySpace > > &preconditioner)
Set a preconditioner.
Definition Cabana_Grid_HypreStructuredSolver.hpp:325
virtual void setPrintLevelImpl(const int print_level)=0
Set the output level.
Structured index space.
Definition Cabana_Grid_IndexSpace.hpp:37
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
Global index tag.
Definition Cabana_Grid_Types.hpp:215
Hypre device compatibility check.
Definition Cabana_Grid_Hypre.hpp:39
Local index tag.
Definition Cabana_Grid_Types.hpp:208
Owned decomposition tag.
Definition Cabana_Grid_Types.hpp:190
Array static type checker.
Definition Cabana_Grid_Array.hpp:160
Definition Cabana_Grid_Array.hpp:322