Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_PETSc.H
Go to the documentation of this file.
1#ifndef AMREX_PETSC_H_
2#define AMREX_PETSC_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Geometry.H>
6#include <AMReX_MultiFab.H>
7#include <AMReX_LayoutData.H>
8#include <AMReX_BndryData.H>
9
10// Do NOT include any other PETSc headers here. They should be included in
11// .cpp files before AMReX_PETSc.H is included.
12#include <petscsystypes.h>
13
20namespace amrex {
21
22class amrex_KSP;
23class amrex_Mat;
24class amrex_Vec;
25
30{
31public:
32
41 PETScABecLap (const BoxArray& grids, const DistributionMapping& dmap,
42 const Geometry& geom_, MPI_Comm comm_);
43
45
46 PETScABecLap (PETScABecLap const&) = delete;
47 PETScABecLap (PETScABecLap &&) noexcept = delete;
48 PETScABecLap& operator= (PETScABecLap const&) = delete;
49 PETScABecLap& operator= (PETScABecLap &&) noexcept = delete;
50
57 void setScalars (Real sa, Real sb);
63 void setACoeffs (const MultiFab& alpha);
69 void setBCoeffs (const Array<const MultiFab*,BL_SPACEDIM>& beta);
71 void setVerbose (int _verbose);
83 void solve (MultiFab& soln, const MultiFab& rhs, Real rel_tol, Real abs_tol,
84 int max_iter, const BndryData& bndry, int max_bndry_order);
85
86#ifdef AMREX_USE_EB
88 void setEBDirichlet (MultiFab const* beb) { m_eb_b_coeffs = beb; }
89#endif
90
91private:
92
93 static constexpr PetscInt regular_stencil_size = 2*AMREX_SPACEDIM + 1;
94 static constexpr PetscInt eb_stencil_size = AMREX_D_TERM(3, *3, *3);
95
97 Geometry geom;
98
99 int verbose = 0;
100
101 MultiFab acoefs;
103 Real scalar_a, scalar_b;
104
105 MultiFab diaginv;
106
107 FabFactory<FArrayBox> const* m_factory = nullptr;
108 BndryData const* m_bndry = nullptr;
109 int m_maxorder = -1;
110
111 std::unique_ptr<amrex_KSP> solver;
112 std::unique_ptr<amrex_Mat> A;
113 std::unique_ptr<amrex_Vec> b;
114 std::unique_ptr<amrex_Vec> x;
115
116 LayoutData<PetscInt> ncells_grid;
118 FabArray<BaseFab<PetscInt> > cell_id_vec;
119
120 MultiFab const* m_eb_b_coeffs = nullptr;
121
122public: // for cuda
124 void prepareSolver ();
126 void loadVectors (MultiFab& soln, const MultiFab& rhs);
128 void getSolution (MultiFab& soln);
129};
130
140[[nodiscard]] std::unique_ptr<PETScABecLap>
141makePetsc (const BoxArray& grids, const DistributionMapping& dmap,
142 const Geometry& geom, MPI_Comm comm_);
143
144}
145
146#endif
Boundary data container that owns masks, boundary values, and metadata.
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#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:46
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:568
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:349
Definition AMReX_FabFactory.H:50
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
a one-thingy-per-box distributed object
Definition AMReX_LayoutData.H:13
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
PETSc wrapper that assembles/solves (a alpha - b div beta grad) phi = rhs.
Definition AMReX_PETSc.H:30
void loadVectors(MultiFab &soln, const MultiFab &rhs)
Copy AMReX solution guess soln and RHS rhs into PETSc vectors.
Definition AMReX_PETSc.cpp:613
void setEBDirichlet(MultiFab const *beb)
Provide b coefficients stored in beb for embedded-boundary faces.
Definition AMReX_PETSc.H:88
void getSolution(MultiFab &soln)
Copy PETSc's solved solution back into AMReX storage soln.
Definition AMReX_PETSc.cpp:721
void solve(MultiFab &soln, const MultiFab &rhs, Real rel_tol, Real abs_tol, int max_iter, const BndryData &bndry, int max_bndry_order)
Solve the assembled ABec system using PETSc/KSP.
Definition AMReX_PETSc.cpp:137
void setVerbose(int _verbose)
Set PETSc verbosity level forwarded to KSP monitors (_verbose).
Definition AMReX_PETSc.cpp:131
PETScABecLap(PETScABecLap &&) noexcept=delete
~PETScABecLap()
Definition AMReX_PETSc.cpp:96
void setBCoeffs(const Array< const MultiFab *, 3 > &beta)
Install per-direction face-centered b coefficients.
Definition AMReX_PETSc.cpp:122
void prepareSolver()
Build PETSc matrices/vectors and apply runtime parameters.
Definition AMReX_PETSc.cpp:176
PETScABecLap(PETScABecLap const &)=delete
void setScalars(Real sa, Real sb)
Store constant scalars for the diagonal and diffusive terms.
Definition AMReX_PETSc.cpp:109
void setACoeffs(const MultiFab &alpha)
Install cell-centered a coefficients (copied as needed).
Definition AMReX_PETSc.cpp:116
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< PETScABecLap > makePetsc(const BoxArray &grids, const DistributionMapping &dmap, const Geometry &geom, MPI_Comm comm_)
Factory helper that instantiates a PETSc ABec Laplacian on one level.
Definition AMReX_PETSc.cpp:58