WarpX
Loading...
Searching...
No Matches
ProjectionDivCleaner.H
Go to the documentation of this file.
1 /* Copyright 2024 The WarpX Community
2 *
3 * This file is part of WarpX.
4 *
5 * Authors: S. Eric Clark (Helion Energy, Inc.)
6 *
7 * License: BSD-3-Clause-LBNL
8 */
9#ifndef WARPX_PROJECTION_DIV_CLEANER_H_
10#define WARPX_PROJECTION_DIV_CLEANER_H_
11
12#include <AMReX_Array.H>
13#include <AMReX_Array4.H>
14#include <AMReX_BLassert.H>
15#include <AMReX_Box.H>
16#include <AMReX_BoxArray.H>
17#include <AMReX_Config.H>
19#include <AMReX_FArrayBox.H>
20#include <AMReX_FabArray.H>
21#include <AMReX_Geometry.H>
22#include <AMReX_GpuControl.H>
23#include <AMReX_GpuLaunch.H>
24#include <AMReX_GpuQualifiers.H>
25#include <AMReX_IndexType.H>
26#include <AMReX_IntVect.H>
27#include <AMReX_LO_BCTYPES.H>
28#include <AMReX_MFIter.H>
29#include <AMReX_MFInterp_C.H>
30#include <AMReX_MLLinOp.H>
31#include <AMReX_MLMG.H>
32#include <AMReX_MultiFab.H>
33#include <AMReX_Parser.H>
34#include <AMReX_REAL.H>
35#include <AMReX_SPACE.H>
36#include <AMReX_Vector.H>
37
38#include <ablastr/utils/Enums.H>
39
40#include "Fields.H"
42
43namespace warpx::initialization {
44
46{
47protected:
48 int m_levels = 1; // Hard coded to 1 for now, will only clean first level
49
50 int m_ref_ratio = 1;
51
52 // For MLMG solver
53 int m_verbose = 2;
55 int m_max_iter = 5000;
56 int m_max_fmg_iter = 1000;
58 bool m_agglomeration = false;
59 bool m_consolidation = false;
60 bool m_semicoarsening = true;
63 amrex::BottomSolver m_bottom_solver = amrex::BottomSolver::bicgstab;
64
65
68
69 std::string m_field_name;
71
73
74private:
75 // Helper template for executing the MLMG solver with cell and node based solvers
76 template <typename T>
78 T &linop,
81 int lev
82 )
83 {
84 linop.setMaxOrder(m_linop_maxorder);
85 linop.setDomainBC(lobc, hibc);
86
87 if (lev > 0) {
88 linop.setCoarseFineBC(m_solution[lev-1].get(), m_ref_ratio);
89 }
90
91 linop.setLevelBC(lev, m_solution[lev].get());
92
93 amrex::MLMG mlmg(linop);
99 mlmg.setConvergenceNormType(amrex::MLMGNormType::greater);
100 mlmg.solve({m_solution[lev].get()}, {m_source[lev].get()}, m_rtol, m_atol);
101 }
102
103public:
106
110
114
115 // Default Constructor
116 explicit ProjectionDivCleaner (std::string const& a_field_name, bool a_vector_potential=false);
117
118 void ReadParameters ();
119
120 void solve ();
121 void setSourceFromField ();
122 void correctField ();
123
124};
125
126} // end namespace warpx::initialization
127
128#endif // WARPX_PROJECTION_DIV_CLEANER_H_
#define AMREX_FORCE_INLINE
void setBottomVerbose(int v) noexcept
void setMaxFmgIter(int n) noexcept
void setVerbose(int v) noexcept
void setBottomSolver(BottomSolver s) noexcept
void setConvergenceNormType(MLMGNormType norm) noexcept
RT solve(const Vector< AMF * > &a_sol, const Vector< AMF const * > &a_rhs, RT a_tol_rel, RT a_tol_abs, const char *checkpoint_file=nullptr)
void setMaxIter(int n) noexcept
bool m_agglomeration
Definition ProjectionDivCleaner.H:58
int m_ref_ratio
Definition ProjectionDivCleaner.H:50
amrex::Vector< amrex::Real > m_h_stencil_coefs_y
Definition ProjectionDivCleaner.H:108
bool m_vector_potential
Definition ProjectionDivCleaner.H:72
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_y
Definition ProjectionDivCleaner.H:112
int m_max_iter
Definition ProjectionDivCleaner.H:55
AMREX_FORCE_INLINE void runMLMG(T &linop, amrex::Array< amrex::LinOpBCType, 3 > const &lobc, amrex::Array< amrex::LinOpBCType, 3 > const &hibc, int lev)
Definition ProjectionDivCleaner.H:77
bool m_semicoarsening
Definition ProjectionDivCleaner.H:60
amrex::Real m_atol
Definition ProjectionDivCleaner.H:67
bool m_consolidation
Definition ProjectionDivCleaner.H:59
int m_levels
Definition ProjectionDivCleaner.H:48
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_source
Definition ProjectionDivCleaner.H:105
std::string m_field_name
Definition ProjectionDivCleaner.H:69
amrex::Vector< amrex::Real > m_h_stencil_coefs_z
Definition ProjectionDivCleaner.H:109
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_x
Definition ProjectionDivCleaner.H:111
void correctField()
Definition ProjectionDivCleaner.cpp:304
int m_max_fmg_iter
Definition ProjectionDivCleaner.H:56
ablastr::utils::enums::GridType m_grid_type
Definition ProjectionDivCleaner.H:70
int m_bottom_verbose
Definition ProjectionDivCleaner.H:54
int m_verbose
Definition ProjectionDivCleaner.H:53
amrex::Real m_rtol
Definition ProjectionDivCleaner.H:66
int m_linop_maxorder
Definition ProjectionDivCleaner.H:57
ProjectionDivCleaner(std::string const &a_field_name, bool a_vector_potential=false)
Definition ProjectionDivCleaner.cpp:36
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_solution
Definition ProjectionDivCleaner.H:104
int m_max_semicoarsening_level
Definition ProjectionDivCleaner.H:62
void ReadParameters()
Definition ProjectionDivCleaner.cpp:126
void solve()
Definition ProjectionDivCleaner.cpp:146
amrex::Vector< amrex::Real > m_h_stencil_coefs_x
Definition ProjectionDivCleaner.H:107
int m_max_coarsening_level
Definition ProjectionDivCleaner.H:61
void setSourceFromField()
Definition ProjectionDivCleaner.cpp:219
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_z
Definition ProjectionDivCleaner.H:113
amrex::BottomSolver m_bottom_solver
Definition ProjectionDivCleaner.H:63
amrex_real Real
PODVector< T, ArenaAllocator< T > > DeviceVector
std::array< T, N > Array
MLMGT< MultiFab > MLMG
GridType
Definition Enums.H:23
Definition ProjectionDivCleaner.cpp:34