25#ifndef PARTICLE_SYSTEM_H
26#define PARTICLE_SYSTEM_H
34template<
typename T,
typename PARTICLETYPE>
41 std::vector<std::shared_ptr<dynamics::ParticleDynamics<T,PARTICLETYPE>>> _dynamicsVector;
44 std::vector<std::unique_ptr<SmoothIndicatorF2D<T,T,true>>>,
45 std::vector<std::unique_ptr<SmoothIndicatorF3D<T,T,true>>>
47 typename associatedTypes::template decompose_into<std::tuple> _associatedData;
49 const std::size_t _serialSize;
54 using iterator_category = std::random_access_iterator_tag;
58 : _pSystemPtr(pSystemPtr), _iParticle(iParticle) {}
60 pType operator*() {
return _pSystemPtr->get(_iParticle); }
62 Iterator& operator++() { _iParticle++;
return *
this; }
64 Iterator operator++(
int) { Iterator tmp = *
this; ++(*this);
return tmp; }
66 friend bool operator== (
const Iterator& a,
const Iterator& b) {
return a._iParticle == b._iParticle; };
67 friend bool operator!= (
const Iterator& a,
const Iterator& b) {
return a._iParticle != b._iParticle; };
70 std::size_t _iParticle;
74 static_assert(PARTICLETYPE::d == 2 || PARTICLETYPE::d == 3,
"Only D=2 and D=3 are supported");
84 typename associatedTypes::template decompose_into<std::tuple> associatedData );
87 Iterator
begin() {
return Iterator(
this,0); }
88 Iterator
end() {
return Iterator(
this,
size()); }
91 template<
typename PCONDITION=conditions::all_particles>
92 constexpr std::size_t
size();
95 template<
typename PCONDITION=conditions::all_particles>
96 constexpr std::size_t
size(
int globiC);
99 template<
bool boundsCheck=false>
106 template <
typename DYNAMICS,
typename ...Args>
116 void process( std::size_t p0, std::size_t p1, T timeStepSize,
unsigned iDyn=0 );
119 void process(T timeStepSize,
unsigned iDyn=0);
128 std::vector<std::shared_ptr<dynamics::ParticleDynamics<T,PARTICLETYPE>>>&
getDynamicsVector();
131 template<
bool boundsCheck=false>
138 template <
typename GROUP,
typename FIELD>
142 template <
typename GROUP,
typename FIELD>
146 template<
typename TYPE>
Container is a std::vector inspired data wrapper that allows for simple content manipulation of its o...
Storage for dynamic field groups (Prototype for ParticleSystem)
void process(std::size_t p0, std::size_t p1, T timeStepSize, unsigned iDyn=0)
Upate/process particle quantities on a subset (mostly local equivalent to collide)
auto & get()
Expose container.
Particle< T, PARTICLETYPE > operator[](std::size_t iParticle)
Create and return particle with operator[].
void swapParticles(std::size_t iP, std::size_t jP)
Swap particles by index.
std::vector< std::shared_ptr< dynamics::ParticleDynamics< T, PARTICLETYPE > > > & getDynamicsVector()
Expose dynamics vector.
dynamics::ParticleDynamics< T, PARTICLETYPE > * getDynamics(unsigned iDyn=0)
Get specific dynamics (optional boundsCheck via .at())
void checkForErrors()
Check for erroes.
void update()
Update particles (equivalent to stream())
constexpr std::size_t size()
Size of ParticleSystem.
void print()
Print relevant infos.
void defineDynamics(Args &&...args)
Define dynamics (factory method)
auto & getAssociatedData()
Get associated data by specifying data type.
void extend()
Extend particle system by one particle.
void addDynamics(std::shared_ptr< dynamics::ParticleDynamics< T, PARTICLETYPE > > &dynamicsSPtr)
Add dynamics (from shared_pointer of dynamics)
ParticleSystem()
Default constructor.
auto getFieldPointer(std::size_t iParticle)
Get FieldPointer by GROUP (or base of GROUP) and FIELD for specific iParticle.
std::size_t getSerialSize() const
Get serial size of dynamic fields group.
auto & getFieldD()
Get whole Field by GROUP (or base of GROUP) and FIELD.
Top level namespace for all of OpenLB.