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");
61 std::shared_ptr<walberla::PoissonSolver>
const &new_ek_solver)
const {
62 if (not m_ekcontainer.empty()) {
63 auto const &old_ek_species = m_ekcontainer.front();
64 if (not lattice_equal(new_ek_solver->get_lattice(),
65 old_ek_species->get_lattice())) {
66 throw std::runtime_error(
"Poisson solver lattice incompatible with "
67 "existing EKSpecies lattice");
73 EKContainer(
double tau, std::shared_ptr<walberla::PoissonSolver> solver)
74 : m_tau{tau}, m_poisson_solver{
std::move(solver)}, m_ekcontainer{} {}
76 bool contains(std::shared_ptr<EKSpecies>
const &ek_species)
const noexcept {
77 return std::ranges::find(m_ekcontainer, ek_species) != m_ekcontainer.end();
80 void add(std::shared_ptr<EKSpecies>
const &ek_species) {
82 sanity_checks(ek_species);
83 if (!m_ekcontainer.empty()) {
84 if (ek_species->is_gpu() != m_is_gpu) {
85 throw std::runtime_error(
86 "All EK Species need to be on de same device.");
89 m_is_gpu = ek_species->is_gpu();
90 m_ekcontainer.emplace_back(ek_species);
93 void remove(std::shared_ptr<EKSpecies>
const &ek_species) {
95 std::erase(m_ekcontainer, ek_species);
102 [[nodiscard]]
bool empty() const noexcept {
return m_ekcontainer.empty(); }
106 assert(solver !=
nullptr);
107 sanity_checks(solver);
108 m_poisson_solver = solver;
111 [[nodiscard]]
bool is_gpu() const noexcept {
return m_is_gpu; }
113 [[nodiscard]]
double get_tau() const noexcept {
return m_tau; }
115 void set_tau(
double tau)
noexcept { m_tau = tau; }
119 void add_charge(std::size_t
const id,
double valency)
const {
120 m_poisson_solver->add_charge_to_field(
id, valency);
126 return m_poisson_solver->get_potential_field_id();
130 return m_poisson_solver->get_lattice();