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
74 // Component of the field to clean. Some external fields (e.g. applied particle fields)
75 // are stored as several stacked, independent field maps -- one component per map, each
76 // with its own time dependence -- so each map must be cleaned separately. Defaults to 0,
77 // which is the only component for ordinary single-component fields and preserves the
78 // existing interface for callers that do not load stacked field maps.
79 int m_comp = 0;
80
81private:
82 // Helper template for executing the MLMG solver with cell and node based solvers
83 template <typename T>
85 T &linop,
88 int lev
89 )
90 {
91 linop.setMaxOrder(m_linop_maxorder);
92 linop.setDomainBC(lobc, hibc);
93
94 if (lev > 0) {
95 linop.setCoarseFineBC(m_solution[lev-1].get(), m_ref_ratio);
96 }
97
98 linop.setLevelBC(lev, m_solution[lev].get());
99
100 amrex::MLMG mlmg(linop);
104 mlmg.setVerbose(m_verbose);
106 mlmg.setConvergenceNormType(amrex::MLMGNormType::greater);
107 mlmg.solve({m_solution[lev].get()}, {m_source[lev].get()}, m_rtol, m_atol);
108 }
109
110public:
113
117
121
122 // Default Constructor
123 explicit ProjectionDivCleaner (std::string const& a_field_name, bool a_vector_potential=false,
124 int a_comp=0);
125
126 void ReadParameters ();
127
128 void solve ();
129 void setSourceFromField ();
130 void correctField ();
131
132};
133
134} // end namespace warpx::initialization
135
136#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:115
bool m_vector_potential
Definition ProjectionDivCleaner.H:72
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_y
Definition ProjectionDivCleaner.H:119
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:84
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:112
std::string m_field_name
Definition ProjectionDivCleaner.H:69
amrex::Vector< amrex::Real > m_h_stencil_coefs_z
Definition ProjectionDivCleaner.H:116
ProjectionDivCleaner(std::string const &a_field_name, bool a_vector_potential=false, int a_comp=0)
Definition ProjectionDivCleaner.cpp:36
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_x
Definition ProjectionDivCleaner.H:118
void correctField()
Definition ProjectionDivCleaner.cpp:314
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
int m_comp
Definition ProjectionDivCleaner.H:79
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_solution
Definition ProjectionDivCleaner.H:111
int m_max_semicoarsening_level
Definition ProjectionDivCleaner.H:62
void ReadParameters()
Definition ProjectionDivCleaner.cpp:128
void solve()
Definition ProjectionDivCleaner.cpp:148
amrex::Vector< amrex::Real > m_h_stencil_coefs_x
Definition ProjectionDivCleaner.H:114
int m_max_coarsening_level
Definition ProjectionDivCleaner.H:61
void setSourceFromField()
Definition ProjectionDivCleaner.cpp:221
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_z
Definition ProjectionDivCleaner.H:120
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