ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_TerrainPoisson.H
Go to the documentation of this file.
1 #ifndef ERF_TERRAIN_POISSON_H_
2 #define ERF_TERRAIN_POISSON_H_
3 
4 #include <AMReX_Geometry.H>
5 #include <AMReX_MultiFab.H>
6 #include <AMReX_BCRec.H>
7 
8 #ifdef ERF_USE_FFT
9 
11 #include <AMReX_FFT_Poisson.H>
12 
13 class TerrainPoisson
14 {
15 public:
16 
17  using RT = amrex::Real;
18 
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  const amrex::MultiFab& az, const amrex::MultiFab& dJ,
25  amrex::MultiFab const* z_phys_nd,
26  bool use_real_bcs);
27 
28  void apply(amrex::MultiFab& lhs, amrex::MultiFab const& rhs);
29 
30  void apply_bcs(amrex::MultiFab& phi);
31 
32  void usePrecond(bool precond_flag);
33 
34  void getFluxes(amrex::MultiFab& phi, amrex::Array<amrex::MultiFab,AMREX_SPACEDIM>& fluxes);
35 
36  void assign(amrex::MultiFab& lhs, amrex::MultiFab const& rhs);
37 
38  void scale(amrex::MultiFab& lhs, amrex::Real fac);
39 
40  amrex::Real dotProduct(amrex::MultiFab const& v1, amrex::MultiFab const& v2);
41 
42  void increment(amrex::MultiFab& lhs, amrex::MultiFab const& rhs, amrex::Real a);
43 
44  void linComb(amrex::MultiFab& lhs, amrex::Real a, amrex::MultiFab const& rhs_a,
45  amrex::Real b, amrex::MultiFab const& rhs_b);
46 
47  amrex::MultiFab makeVecRHS();
48 
49  amrex::MultiFab makeVecLHS();
50 
51  amrex::Real norm2(amrex::MultiFab const& v);
52 
53  void precond(amrex::MultiFab& lhs, amrex::MultiFab const& rhs);
54 
55  void setToZero(amrex::MultiFab& v);
56 
57 private:
58  bool m_use_precond = false;
59  amrex::Geometry m_geom;
60  amrex::BoxArray m_grids;
61  amrex::DistributionMapping m_dmap;
62  amrex::Array<std::string,2*AMREX_SPACEDIM> m_domain_bcs_type;
63  amrex::Gpu::DeviceVector<amrex::Real> m_stretched_dz_d;
64  const amrex::MultiFab& m_ax;
65  const amrex::MultiFab& m_ay;
66  const amrex::MultiFab& m_az;
67  const amrex::MultiFab& m_dJ;
68  const amrex::MultiFab* m_zphys;
69 
70  std::unique_ptr<amrex::FFT::PoissonHybrid<amrex::MultiFab>> m_2D_fft_precond;
71  amrex::Array<std::pair<amrex::FFT::Boundary,amrex::FFT::Boundary>,AMREX_SPACEDIM> bc_fft;
72 };
73 
74 #endif
75 #endif
amrex::Real Real
Definition: ERF_ShocInterface.H:19
auto apply_bcs
Definition: ERF_TI_utils.H:73