Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_Hypre.H
Go to the documentation of this file.
1#ifndef AMREX_HYPRE_H_
2#define AMREX_HYPRE_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Geometry.H>
6#include <AMReX_MultiFab.H>
7#include <AMReX_BndryData.H>
8
9#include "HYPRE.h"
10#include "_hypre_utilities.h"
11
12#include <memory>
13
14namespace amrex
15{
16
17class Hypre
18{
19public:
20
21 enum class Interface : int { structed, semi_structed, ij };
22
23 Hypre (const BoxArray& grids,
24 const DistributionMapping& dmap,
25 const Geometry& geom,
26 MPI_Comm comm_);
27
28 virtual ~Hypre ();
29 Hypre (Hypre &&) noexcept = default;
30 Hypre& operator= (Hypre &&) noexcept = default;
31
32 Hypre (Hypre const&) = delete;
33 Hypre& operator= (Hypre const&) = delete;
34
35 void setScalars (Real sa, Real sb);
36 void setACoeffs (const MultiFab& alpha);
37 void setBCoeffs (const Array<const MultiFab*,BL_SPACEDIM>& beta);
38 void setVerbose (int _verbose);
39 void setIsMatrixSingular(bool flag) { is_matrix_singular = flag; }
40 virtual void solve (MultiFab& soln, const MultiFab& rhs, Real rel_tol, Real abs_tol,
41 int max_iter, const BndryData& bndry, int max_bndry_order) = 0;
42
43 static HYPRE_Int ispow2 (HYPRE_Int i)
44 {
45 if (i == 1) {
46 return 1;
47 } else if ((i <= 0) || (i & 1)) {
48 return 0;
49 } else {
50 return ispow2(i/2);
51 }
52 }
53
55 const auto& v = b.loVect();
56 return {AMREX_D_DECL(static_cast<HYPRE_Int>(v[0]),
57 static_cast<HYPRE_Int>(v[1]),
58 static_cast<HYPRE_Int>(v[2]))};
59 }
60
62 const auto& v = b.hiVect();
63 return {AMREX_D_DECL(static_cast<HYPRE_Int>(v[0]),
64 static_cast<HYPRE_Int>(v[1]),
65 static_cast<HYPRE_Int>(v[2]))};
66 }
67
68
69 void setHypreOptionsNamespace (const std::string& ns) noexcept
70 { options_namespace = ns; }
71 void setHypreOldDefault (bool l) noexcept {old_default = l;}
72 void setHypreRelaxType (int n) noexcept {relax_type = n;}
73 void setHypreRelaxOrder (int n) noexcept {relax_order = n;}
74 void setHypreNumSweeps (int n) noexcept {num_sweeps = n;}
76
77 static constexpr HYPRE_Int regular_stencil_size = 2*AMREX_SPACEDIM + 1;
78 static constexpr HYPRE_Int eb_stencil_size = AMREX_D_TERM(3, *3, *3);
79
80protected:
81
84
85 int verbose = 0;
86 bool old_default = true; // Falgout coarsening with modified classical interpolation
87 int relax_type = 6; // G-S/Jacobi hybrid relaxation
88 int relax_order = 1; // uses C/F relaxation
89 int num_sweeps = 2; // Sweeeps on each level
90 Real strong_threshold = Real(0.25); // Hypre default is 0.25
91
92 std::string options_namespace{"hypre"};
93
97
99
101 BndryData const* m_bndry = nullptr;
102 int m_maxorder = -1;
103
104 bool is_matrix_singular { false };
105};
106
107[[nodiscard]] std::unique_ptr<Hypre>
108makeHypre (const BoxArray& grids, const DistributionMapping& dmap,
109 const Geometry& geom, MPI_Comm comm_, Hypre::Interface interface,
110 const iMultiFab* overset_mask = nullptr);
111
112}
113
114#endif
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
#define BL_SPACEDIM
Definition AMReX_SPACE.H:15
A BndryData stores and manipulates boundary data information on each side of each box in a BoxArray.
Definition AMReX_BndryData.H:41
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:568
__host__ __device__ const int * hiVect() const &noexcept
Return a constant pointer the array of high end coordinates. Useful for calls to FORTRAN.
Definition AMReX_Box.H:191
__host__ __device__ const int * loVect() const &noexcept
Return a constant pointer the array of low end coordinates. Useful for calls to FORTRAN.
Definition AMReX_Box.H:186
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
Definition AMReX_FabFactory.H:50
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
Definition AMReX_Hypre.H:18
static Array< HYPRE_Int, 3 > hiV(const Box &b)
Definition AMReX_Hypre.H:61
bool is_matrix_singular
Definition AMReX_Hypre.H:104
void setBCoeffs(const Array< const MultiFab *, 3 > &beta)
Definition AMReX_Hypre.cpp:78
Array< MultiFab, 3 > bcoefs
Definition AMReX_Hypre.H:95
void setHypreOldDefault(bool l) noexcept
Definition AMReX_Hypre.H:71
void setVerbose(int _verbose)
Definition AMReX_Hypre.cpp:87
MultiFab acoefs
Definition AMReX_Hypre.H:94
int verbose
Definition AMReX_Hypre.H:85
void setHypreStrongThreshold(Real t) noexcept
Definition AMReX_Hypre.H:75
Hypre(Hypre &&) noexcept=default
void setHypreRelaxType(int n) noexcept
Definition AMReX_Hypre.H:72
static HYPRE_Int ispow2(HYPRE_Int i)
Definition AMReX_Hypre.H:43
static constexpr HYPRE_Int eb_stencil_size
Definition AMReX_Hypre.H:78
MPI_Comm comm
Definition AMReX_Hypre.H:82
Real scalar_a
Definition AMReX_Hypre.H:96
BndryData const * m_bndry
Definition AMReX_Hypre.H:101
void setHypreOptionsNamespace(const std::string &ns) noexcept
Definition AMReX_Hypre.H:69
MultiFab diaginv
Definition AMReX_Hypre.H:98
int m_maxorder
Definition AMReX_Hypre.H:102
FabFactory< FArrayBox > const * m_factory
Definition AMReX_Hypre.H:100
Real scalar_b
Definition AMReX_Hypre.H:96
Geometry geom
Definition AMReX_Hypre.H:83
std::string options_namespace
Definition AMReX_Hypre.H:92
void setHypreNumSweeps(int n) noexcept
Definition AMReX_Hypre.H:74
int relax_order
Definition AMReX_Hypre.H:88
static Array< HYPRE_Int, 3 > loV(const Box &b)
Definition AMReX_Hypre.H:54
int relax_type
Definition AMReX_Hypre.H:87
int num_sweeps
Definition AMReX_Hypre.H:89
static constexpr HYPRE_Int regular_stencil_size
Definition AMReX_Hypre.H:77
void setScalars(Real sa, Real sb)
Definition AMReX_Hypre.cpp:65
Real strong_threshold
Definition AMReX_Hypre.H:90
virtual void solve(MultiFab &soln, const MultiFab &rhs, Real rel_tol, Real abs_tol, int max_iter, const BndryData &bndry, int max_bndry_order)=0
void setIsMatrixSingular(bool flag)
Definition AMReX_Hypre.H:39
void setACoeffs(const MultiFab &alpha)
Definition AMReX_Hypre.cpp:72
void setHypreRelaxOrder(int n) noexcept
Definition AMReX_Hypre.H:73
Interface
Definition AMReX_Hypre.H:21
bool old_default
Definition AMReX_Hypre.H:86
virtual ~Hypre()
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
std::array< T, N > Array
Definition AMReX_Array.H:26
int MPI_Comm
Definition AMReX_ccse-mpi.H:51
static constexpr int MPI_COMM_NULL
Definition AMReX_ccse-mpi.H:59
Definition AMReX_Amr.cpp:49
std::unique_ptr< Hypre > makeHypre(const BoxArray &grids, const DistributionMapping &dmap, const Geometry &geom, MPI_Comm comm_, Hypre::Interface interface, const iMultiFab *overset_mask)
Definition AMReX_Hypre.cpp:12