1#ifndef OPAL_FIELD_SOLVER_H
2#define OPAL_FIELD_SOLVER_H
5#include "Manager/BaseManager.h"
6#include "Manager/FieldSolverBase.h"
9template <
typename T,
unsigned Dim>
57 template <
typename Solver>
59 this->getSolver().template emplace<Solver>();
60 Solver& solver = std::get<Solver>(this->getSolver());
62 solver.mergeParameters(sp);
64 solver.setRhs(*
rho_m);
66 if constexpr (std::is_same_v<Solver, CGSolver_t<T, Dim>>) {
69 solver.setLhs(*
phi_m);
70 solver.setGradient(*
E_m);
71 }
else if constexpr (std::is_same_v<Solver, OpenSolver_t<T, Dim>>) {
83 ippl::ParameterList sp;
85 sp.add(
"use_heffte_defaults",
false);
86 sp.add(
"use_pencils",
true);
87 sp.add(
"use_reorder",
false);
88 sp.add(
"use_gpu_aware",
true);
89 sp.add(
"comm", ippl::p2p_pl);
90 sp.add(
"r2c_direction", 0);
ConditionalType< Dim==2||Dim==3, ippl::FFTPeriodicPoissonSolver< VField_t< T, Dim >, Field_t< Dim > > > FFTSolver_t
ippl::Field< double, Dim, ViewArgs... > Field_t
ippl::Field< ippl::Vector< T, Dim >, Dim, ViewArgs... > VField_t
ippl::Field< T, Dim, Mesh_t< Dim >, Centering_t< Dim >, ViewArgs... > Field
VField_t< T, Dim > * getE() const
void setRho(Field_t< Dim > *rho)
void dumpVectField(std::string what)
void setPhi(Field< T, Dim > *phi)
void initSolver() override
void runSolver() override
void initSolverWithParams(const ippl::ParameterList &sp)
Field_t< Dim > * getRho()
Field< T, Dim > * getPhi() const
void setE(VField_t< T, Dim > *E)
unsigned int call_counter_m
FieldSolver(std::string solver, Field_t< Dim > *rho, VField_t< T, Dim > *E, Field< T, Dim > *phi)
void dumpScalField(std::string what)