1#ifndef IPPL_FIELD_SOLVER_H
2#define IPPL_FIELD_SOLVER_H
10template <
typename T,
unsigned Dim>
20 std::vector<std::string> preconditioner_params = {})
44 }
else if (this->
getStype() ==
"CG") {
46 }
else if (this->
getStype() ==
"TG") {
48 }
else if (this->
getStype() ==
"PCG") {
50 }
else if (this->
getStype() ==
"OPEN") {
53 m <<
"No solver matches the argument" <<
endl;
63 for (
unsigned int i = 0; i < 2 *
Dim; ++i) {
64 allPeriodic[i] = std::make_shared<ippl::PeriodicFace<Field<T, Dim>>>(i);
66 phi_m->setFieldBC(allPeriodic);
76 std::stringstream fname;
78 fname <<
"data_CG/CG_";
92 if (iterations == 0) {
93 log <<
"residue,iterations" <<
endl;
101 }
else if (this->
getStype() ==
"FFT") {
102 if constexpr (
Dim == 2 ||
Dim == 3) {
105 }
else if (this->
getStype() ==
"TG") {
106 if constexpr (
Dim == 3) {
109 }
else if (this->
getStype() ==
"OPEN") {
110 if constexpr (
Dim == 3) {
114 throw std::runtime_error(
"Unknown solver type");
118 template <
typename Solver>
120 this->
getSolver().template emplace<Solver>();
123 solver.mergeParameters(sp);
125 solver.setRhs(*
rho_m);
127 if constexpr (std::is_same_v<Solver, CGSolver_t<T, Dim>>) {
130 solver.setLhs(*
phi_m);
131 solver.setGradient(*
E_m);
140 if constexpr (
Dim == 2 ||
Dim == 3) {
143 sp.
add(
"use_heffte_defaults",
false);
144 sp.
add(
"use_pencils",
true);
145 sp.
add(
"use_reorder",
false);
146 sp.
add(
"use_gpu_aware",
true);
148 sp.
add(
"r2c_direction", 0);
152 throw std::runtime_error(
"Unsupported dimensionality for FFT solver");
160 sp.
add(
"tolerance", 1e-10);
167 sp.
add(
"solver",
"preconditioned");
170 sp.
add(
"tolerance", 1e-10);
174 int gauss_seidel_inner_iterations;
175 int gauss_seidel_outer_iterations;
177 int chebyshev_degree;
178 int richardson_iterations;
179 int communication = 0;
181 std::string preconditioner_type =
"";
184 if (preconditioner_type ==
"newton") {
186 }
else if (preconditioner_type ==
"chebyshev") {
188 }
else if (preconditioner_type ==
"richardson") {
191 }
else if (preconditioner_type ==
"gauss-seidel") {
195 }
else if (preconditioner_type ==
"ssor") {
201 sp.
add(
"preconditioner_type", preconditioner_type);
202 sp.
add(
"gauss_seidel_inner_iterations", gauss_seidel_inner_iterations);
203 sp.
add(
"gauss_seidel_outer_iterations", gauss_seidel_outer_iterations);
204 sp.
add(
"newton_level", newton_level);
205 sp.
add(
"chebyshev_degree", chebyshev_degree);
206 sp.
add(
"richardson_iterations", richardson_iterations);
207 sp.
add(
"communication", communication);
208 sp.
add(
"ssor_omega", ssor_omega);
214 if constexpr (
Dim == 3) {
217 sp.
add(
"use_heffte_defaults",
false);
218 sp.
add(
"use_pencils",
true);
219 sp.
add(
"use_reorder",
false);
220 sp.
add(
"use_gpu_aware",
true);
222 sp.
add(
"r2c_direction", 0);
226 throw std::runtime_error(
"Unsupported dimensionality for TG solver");
231 if constexpr (
Dim == 3) {
234 sp.
add(
"use_heffte_defaults",
false);
235 sp.
add(
"use_pencils",
true);
236 sp.
add(
"use_reorder",
false);
237 sp.
add(
"use_gpu_aware",
true);
239 sp.
add(
"r2c_direction", 0);
244 throw std::runtime_error(
"Unsupported dimensionality for OPEN solver");
Field< Vector_t< T, Dim >, Dim, ViewArgs... > VField_t
Field< double, Dim, ViewArgs... > Field_t
ConditionalType< Dim==3, ippl::FFTOpenPoissonSolver< VField_t< T, Dim >, Field_t< Dim > > > OpenSolver_t
ippl::Field< T, Dim, Mesh_t< Dim >, Centering_t< Dim >, ViewArgs... > Field
ConditionalType< Dim==2||Dim==3, ippl::FFTPeriodicPoissonSolver< VField_t< T, Dim >, Field_t< Dim > > > FFTSolver_t
ippl::PoissonCG< Field< T, Dim >, Field_t< Dim > > CGSolver_t
ConditionalType< Dim==3, ippl::FFTTruncatedGreenPeriodicPoissonSolver< VField_t< T, Dim >, Field_t< Dim > > > FFTTruncatedGreenSolver_t
Inform & endl(Inform &inf)
KOKKOS_INLINE_FUNCTION auto & get(::ippl::Tuple< Ts... > &t)
std::unique_ptr< mpi::Communicator > Comm
Solver_t< T, Dim > & getSolver()
FieldSolverBase(std::string solver)
void add(const std::string &key, const T &value)
VField_t< T, Dim > * getE() const
FieldSolver(std::string solver, Field_t< Dim > *rho, VField_t< T, Dim > *E, Field< T, Dim > *phi, std::vector< std::string > preconditioner_params={})
void setRho(Field_t< Dim > *rho)
void setPhi(Field< T, Dim > *phi)
void initSolver() override
void runSolver() override
void initSolverWithParams(const ippl::ParameterList &sp)
Field< T, Dim > * getPhi() const
void setE(VField_t< T, Dim > *E)
std::vector< std::string > preconditioner_params_m
Field_t< Dim > * getRho() const