33 using container_type = std::vector<std::shared_ptr<EKSpecies>>;
42 std::shared_ptr<walberla::PoissonSolver> m_poisson_solver;
43 container_type m_ekcontainer;
52 void sanity_checks(std::shared_ptr<EKSpecies>
const &new_ek_species)
const {
53 if (not lattice_equal(new_ek_species->get_lattice(),
54 m_poisson_solver->get_lattice())) {
55 throw std::runtime_error(
"EKSpecies lattice incompatible with existing "
56 "Poisson solver lattice");
58 if (new_ek_species->is_gpu() != m_poisson_solver->is_gpu()) {
59 throw std::runtime_error(
"The EK species and the EK solver need to all "
60 "be on either the CPU or GPU");
65 std::shared_ptr<walberla::PoissonSolver>
const &new_ek_solver)
const {
66 if (not m_ekcontainer.empty()) {
67 auto const &old_ek_species = m_ekcontainer.front();
68 if (not lattice_equal(new_ek_solver->get_lattice(),
69 old_ek_species->get_lattice())) {
70 throw std::runtime_error(
"Poisson solver lattice incompatible with "
71 "existing EKSpecies lattice");
73 if (new_ek_solver->is_gpu() != old_ek_species->is_gpu()) {
74 throw std::runtime_error(
"The EK species and the EK solver need to all "
75 "be on either the CPU or GPU");
81 EKContainer(
double tau, std::shared_ptr<walberla::PoissonSolver> solver)
82 : m_tau{tau}, m_poisson_solver{
std::move(solver)}, m_ekcontainer{} {}
84 bool contains(std::shared_ptr<EKSpecies>
const &ek_species)
const noexcept {
85 return std::ranges::find(m_ekcontainer, ek_species) != m_ekcontainer.end();
88 void add(std::shared_ptr<EKSpecies>
const &ek_species) {
90 sanity_checks(ek_species);
91 m_ekcontainer.emplace_back(ek_species);
94 void remove(std::shared_ptr<EKSpecies>
const &ek_species) {
96 std::erase(m_ekcontainer, ek_species);
103 [[nodiscard]]
bool empty() const noexcept {
return m_ekcontainer.empty(); }
107 assert(solver !=
nullptr);
108 sanity_checks(solver);
109 m_poisson_solver = solver;
112 [[nodiscard]]
bool is_gpu() const noexcept {
113 return m_poisson_solver->is_gpu();
116 [[nodiscard]]
double get_tau() const noexcept {
return m_tau; }
118 void set_tau(
double tau)
noexcept { m_tau = tau; }
122 void add_charge(std::size_t
const id,
double valency)
const {
123 m_poisson_solver->add_charge_to_field(
id, valency);
129 return m_poisson_solver->get_potential_field_id();
133 return m_poisson_solver->get_lattice();