ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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  amrex::MultiFab const* z_phys_nd);
25 
26  void apply(amrex::MultiFab& lhs, amrex::MultiFab const& rhs);
27 
28  void apply_bcs(amrex::MultiFab& phi);
29 
30  void usePrecond(bool precond_flag);
31 
32  void getFluxes(amrex::MultiFab& phi, amrex::Array<amrex::MultiFab,AMREX_SPACEDIM>& fluxes);
33 
34  void assign(amrex::MultiFab& lhs, amrex::MultiFab const& rhs);
35 
36  void scale(amrex::MultiFab& lhs, amrex::Real fac);
37 
38  amrex::Real dotProduct(amrex::MultiFab const& v1, amrex::MultiFab const& v2);
39 
40  void increment(amrex::MultiFab& lhs, amrex::MultiFab const& rhs, amrex::Real a);
41 
42  void linComb(amrex::MultiFab& lhs, amrex::Real a, amrex::MultiFab const& rhs_a,
43  amrex::Real b, amrex::MultiFab const& rhs_b);
44 
45  amrex::MultiFab makeVecRHS();
46 
47  amrex::MultiFab makeVecLHS();
48 
49  amrex::Real norm2(amrex::MultiFab const& v);
50 
51  void precond(amrex::MultiFab& lhs, amrex::MultiFab const& rhs);
52 
53  void setToZero(amrex::MultiFab& v);
54 
55 private:
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;
65 
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;
68 };
69 
70 #endif
71 #endif
auto apply_bcs
Definition: ERF_TI_utils.H:71