1 #ifndef ERF_TERRAIN_POISSON_H_
2 #define ERF_TERRAIN_POISSON_H_
4 #include <AMReX_Geometry.H>
5 #include <AMReX_MultiFab.H>
6 #include <AMReX_BCRec.H>
11 #include <AMReX_FFT_Poisson.H>
17 using RT = amrex::Real;
19 TerrainPoisson (amrex::Geometry
const& geom, amrex::BoxArray
const& ba,
20 amrex::DistributionMapping
const& dm,
21 amrex::Array<std::string,2*AMREX_SPACEDIM>& domain_bcs_type,
22 amrex::Gpu::DeviceVector<amrex::Real>& stretched_dz_lev_d,
23 const amrex::MultiFab& ax,
const amrex::MultiFab& ay,
24 amrex::MultiFab
const* z_phys_nd);
26 void apply(amrex::MultiFab& lhs, amrex::MultiFab
const& rhs);
30 void usePrecond(
bool precond_flag);
32 void getFluxes(amrex::MultiFab& phi, amrex::Array<amrex::MultiFab,AMREX_SPACEDIM>& fluxes);
34 void assign(amrex::MultiFab& lhs, amrex::MultiFab
const& rhs);
36 void scale(amrex::MultiFab& lhs, amrex::Real fac);
38 amrex::Real dotProduct(amrex::MultiFab
const& v1, amrex::MultiFab
const& v2);
40 void increment(amrex::MultiFab& lhs, amrex::MultiFab
const& rhs, amrex::Real a);
42 void linComb(amrex::MultiFab& lhs, amrex::Real a, amrex::MultiFab
const& rhs_a,
43 amrex::Real b, amrex::MultiFab
const& rhs_b);
45 amrex::MultiFab makeVecRHS();
47 amrex::MultiFab makeVecLHS();
49 amrex::Real norm2(amrex::MultiFab
const& v);
51 void precond(amrex::MultiFab& lhs, amrex::MultiFab
const& rhs);
53 void setToZero(amrex::MultiFab& v);
56 bool m_use_precond =
false;
57 amrex::Geometry m_geom;
58 amrex::BoxArray m_grids;
59 amrex::DistributionMapping m_dmap;
60 amrex::Array<std::string,2*AMREX_SPACEDIM> m_domain_bcs_type;
61 amrex::Gpu::DeviceVector<amrex::Real> m_stretched_dz_d;
62 const amrex::MultiFab& m_ax;
63 const amrex::MultiFab& m_ay;
64 const amrex::MultiFab* m_zphys;
66 std::unique_ptr<amrex::FFT::PoissonHybrid<amrex::MultiFab>> m_2D_fft_precond;
67 amrex::Array<std::pair<amrex::FFT::Boundary,amrex::FFT::Boundary>,AMREX_SPACEDIM> bc_fft;
auto apply_bcs
Definition: ERF_TI_utils.H:71