IPPL API Reference
Independent Parallel Particle Layer C++ API
Loading...
Searching...
No Matches
PicManager.h
1#ifndef IPPL_PIC_MANAGER
2#define IPPL_PIC_MANAGER
3
4#include <memory>
5#include <stdexcept>
6#include <vector>
7
8#include "Decomposition/OrthogonalRecursiveBisection.h"
9#include "Manager/BaseManager.h"
10#include "Manager/FieldSolverBase.h"
11
12namespace ippl {
13
31 template <typename T, unsigned Dim, class pc, class fc, class orb>
32 class PicManager : public BaseManager {
33 public:
35 : BaseManager()
36 , fcontainer_m(nullptr)
37 , pcontainer_m(nullptr)
38 , loadbalancer_m(nullptr) {}
39
40 virtual ~PicManager() = default;
41
48 virtual void par2grid() = 0;
49
56 virtual void grid2par() = 0;
57
63 std::shared_ptr<pc> getParticleContainer() { return pcontainer_m; }
64
65
72 std::shared_ptr<pc> getParticleContainer(size_t i) {
73 if (i >= pcontainers_m.size()) {
74 throw std::out_of_range("PicManager::getParticleContainer: index out of range");
75 }
76 return pcontainers_m[i];
77 }
78
85 void setParticleContainer(std::shared_ptr<pc> pcontainer) {
86 pcontainer_m = pcontainer;
87 if (pcontainers_m.empty()) {
88 pcontainers_m.push_back(pcontainer);
89 } else {
90 pcontainers_m[0] = pcontainer;
91 }
92 }
93
99 size_t addParticleContainer(std::shared_ptr<pc> pcontainer) {
100 pcontainers_m.push_back(pcontainer);
101 // If this is the first container being added, also set pcontainer_m
102 if (pcontainers_m.size() == 1) {
103 pcontainer_m = pcontainer;
104 }
105 return pcontainers_m.size() - 1;
106 }
107
112 size_t getNumParticleContainers() const { return pcontainers_m.size(); }
113
118 const std::vector<std::shared_ptr<pc>>& getParticleContainers() const {
119 return pcontainers_m;
120 }
121
122 std::shared_ptr<fc> getFieldContainer() { return fcontainer_m; }
123
124 void setFieldContainer(std::shared_ptr<fc> fcontainer) { fcontainer_m = fcontainer; }
125
126 std::shared_ptr<ippl::FieldSolverBase<T, Dim>> getFieldSolver() { return fsolver_m; }
127
128 void setFieldSolver(std::shared_ptr<ippl::FieldSolverBase<T, Dim>> fsolver) {
129 fsolver_m = fsolver;
130 }
131
132 std::shared_ptr<orb> getLoadBalancer() { return loadbalancer_m; }
133
134 void setLoadBalancer(std::shared_ptr<orb> loadbalancer) { loadbalancer_m = loadbalancer; }
135
136 protected:
137 std::shared_ptr<fc> fcontainer_m;
138
143 std::shared_ptr<pc> pcontainer_m;
144
150 std::vector<std::shared_ptr<pc>> pcontainers_m;
151
152 std::shared_ptr<orb> loadbalancer_m;
153
154 std::shared_ptr<ippl::FieldSolverBase<T, Dim>> fsolver_m;
155 };
156} // namespace ippl
157
158#endif
A base class for managing simulations using IPPL.
Definition BaseManager.h:14
Definition FieldSolverBase.h:12
A template class for managing Particle-in-Cell (PIC) simulations.
Definition PicManager.h:32
std::vector< std::shared_ptr< pc > > pcontainers_m
All particle containers managed by this PIC manager. the first entry (index 0) is the same as the one...
Definition PicManager.h:150
std::shared_ptr< pc > getParticleContainer(size_t i)
Get a particle container by index.
Definition PicManager.h:72
virtual void grid2par()=0
Grid-to-particle operation.
std::shared_ptr< pc > pcontainer_m
Default (first) particle container, kept for backward compatibility.
Definition PicManager.h:143
void setParticleContainer(std::shared_ptr< pc > pcontainer)
Set the default (first) particle container.
Definition PicManager.h:85
virtual void par2grid()=0
Particle-to-grid operation.
const std::vector< std::shared_ptr< pc > > & getParticleContainers() const
Get a const reference to the vector of all particle containers.
Definition PicManager.h:118
std::shared_ptr< pc > getParticleContainer()
Get the default (first) particle container.
Definition PicManager.h:63
size_t getNumParticleContainers() const
Get the number of particle containers (bunches).
Definition PicManager.h:112
size_t addParticleContainer(std::shared_ptr< pc > pcontainer)
Add an additional particle container (bunch).
Definition PicManager.h:99
Definition Archive.h:20