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#include <AMReX_LO_BCTYPES.H>
38
39#include <ablastr/utils/Enums.H>
40
41#include "Fields.H"
43
44namespace warpx::initialization {
45
47{
48protected:
49 int m_levels = 1; // Hard coded to 1 for now, will only clean first level
50
51 int m_ref_ratio = 1;
52
53 // For MLMG solver
54 int m_verbose = 2;
56 int m_max_iter = 5000;
57 int m_max_fmg_iter = 1000;
59 bool m_agglomeration = false;
60 bool m_consolidation = false;
61 bool m_semicoarsening = true;
64 amrex::BottomSolver m_bottom_solver = amrex::BottomSolver::bicgstab;
65
66
67 amrex::Real m_rtol;
68 amrex::Real m_atol;
69
70 std::string m_field_name;
72
74
75private:
76 // Helper template for executing the MLMG solver with cell and node based solvers
77 template <typename T>
79 T &linop,
82 int lev
83 )
84 {
85 linop.setMaxOrder(m_linop_maxorder);
86 linop.setDomainBC(lobc, hibc);
87
88 if (lev > 0) {
89 linop.setCoarseFineBC(m_solution[lev-1].get(), m_ref_ratio);
90 }
91
92 linop.setLevelBC(lev, m_solution[lev].get());
93
94 amrex::MLMG mlmg(linop);
100 mlmg.setConvergenceNormType(amrex::MLMGNormType::greater);
101 mlmg.solve({m_solution[lev].get()}, {m_source[lev].get()}, m_rtol, m_atol);
102 }
103
104public:
107
111
115
116 // Default Constructor
117 ProjectionDivCleaner (std::string const& a_field_name, bool a_vector_potential=false);
118
119 void ReadParameters ();
120
121 void solve ();
122 void setSourceFromField ();
123 void correctField ();
124
125};
126
127} // end namespace warpx::initialization
128
129#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:59
int m_ref_ratio
Definition ProjectionDivCleaner.H:51
amrex::Vector< amrex::Real > m_h_stencil_coefs_y
Definition ProjectionDivCleaner.H:109
bool m_vector_potential
Definition ProjectionDivCleaner.H:73
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_y
Definition ProjectionDivCleaner.H:113
int m_max_iter
Definition ProjectionDivCleaner.H:56
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:78
bool m_semicoarsening
Definition ProjectionDivCleaner.H:61
amrex::Real m_atol
Definition ProjectionDivCleaner.H:68
bool m_consolidation
Definition ProjectionDivCleaner.H:60
int m_levels
Definition ProjectionDivCleaner.H:49
amrex::Vector< std::unique_ptr< amrex::MultiFab > > m_source
Definition ProjectionDivCleaner.H:106
std::string m_field_name
Definition ProjectionDivCleaner.H:70
amrex::Vector< amrex::Real > m_h_stencil_coefs_z
Definition ProjectionDivCleaner.H:110
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_x
Definition ProjectionDivCleaner.H:112
void correctField()
Definition ProjectionDivCleaner.cpp:304
int m_max_fmg_iter
Definition ProjectionDivCleaner.H:57
ablastr::utils::enums::GridType m_grid_type
Definition ProjectionDivCleaner.H:71
int m_bottom_verbose
Definition ProjectionDivCleaner.H:55
int m_verbose
Definition ProjectionDivCleaner.H:54
amrex::Real m_rtol
Definition ProjectionDivCleaner.H:67
int m_linop_maxorder
Definition ProjectionDivCleaner.H:58
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:105
int m_max_semicoarsening_level
Definition ProjectionDivCleaner.H:63
void ReadParameters()
Definition ProjectionDivCleaner.cpp:126
void solve()
Definition ProjectionDivCleaner.cpp:146
amrex::Vector< amrex::Real > m_h_stencil_coefs_x
Definition ProjectionDivCleaner.H:108
int m_max_coarsening_level
Definition ProjectionDivCleaner.H:62
void setSourceFromField()
Definition ProjectionDivCleaner.cpp:219
amrex::Gpu::DeviceVector< amrex::Real > m_stencil_coefs_z
Definition ProjectionDivCleaner.H:114
amrex::BottomSolver m_bottom_solver
Definition ProjectionDivCleaner.H:64
GridType
Definition Enums.H:23
PODVector< T, ArenaAllocator< T > > DeviceVector
MLMGT< MultiFab > MLMG
std::array< T, N > Array
Definition ProjectionDivCleaner.cpp:34