25#ifndef PARTICLE_SYSTEM_HH
26#define PARTICLE_SYSTEM_HH
33template<
typename T,
typename PARTICLETYPE>
36 _serialSize(
DATA(0).getSerializableSize())
39template<
typename T,
typename PARTICLETYPE>
41 : _fieldGroupsContainer(
Container<T,PARTICLETYPE,
DATA>(count) ),
42 _serialSize(
DATA(0).getSerializableSize())
45template<
typename T,
typename PARTICLETYPE>
47 typename associatedTypes::template decompose_into<std::tuple> associatedData )
48 : _associatedData( associatedData ),
49 _fieldGroupsContainer(
Container<T,PARTICLETYPE,
DATA>(count) ),
50 _serialSize(
DATA(0).getSerializableSize())
53template<
typename T,
typename PARTICLETYPE>
54template<
typename PCONDITION>
58 if constexpr(std::is_same_v<PCONDITION,conditions::all_particles>){
59 return _fieldGroupsContainer.size();
63 for (std::size_t iP=0; iP<_fieldGroupsContainer.size(); ++iP) {
64 auto particle = get(iP);
65 doWhenMeetingCondition<T,PARTICLETYPE,PCONDITION>( particle,
72template<
typename T,
typename PARTICLETYPE>
73template<
typename PCONDITION>
77 if constexpr(std::is_same_v<PCONDITION,conditions::all_particles>){
78 return _fieldGroupsContainer.size();
82 for (std::size_t iP=0; iP<_fieldGroupsContainer.size(); ++iP) {
83 auto particle = get(iP);
84 doWhenMeetingCondition<T,PARTICLETYPE,PCONDITION>( particle,
91template<
typename T,
typename PARTICLETYPE>
92template<
bool boundsCheck>
96 if constexpr(boundsCheck){
97 return _dynamicsVector.at(iDyn).get();
99 return _dynamicsVector[iDyn].get();
103template<
typename T,
typename PARTICLETYPE>
107 _dynamicsVector.push_back( dynamicsSPtr );
110template<
typename T,
typename PARTICLETYPE>
111template <
typename DYNAMICS,
typename ...Args>
113 _dynamicsVector.push_back( std::make_shared<DYNAMICS>(std::forward<Args>(args)...) );
116template<
typename T,
typename PARTICLETYPE>
119 _fieldGroupsContainer.push_back();
123template<
typename T,
typename PARTICLETYPE>
126 _fieldGroupsContainer.swapElements(iP,jP);
130template<
typename T,
typename PARTICLETYPE>
132 std::size_t iP0, std::size_t iPmax, T timeStepSize,
unsigned iDyn )
134 auto particle = get(iP0);
135 for (std::size_t iP=iP0; iP<iPmax; ++iP) {
136 particle.process(timeStepSize,iDyn);
137 particle.advanceId();
141template<
typename T,
typename PARTICLETYPE>
144 process(0, size(), timeStepSize, iDyn);
148template<
typename T,
typename PARTICLETYPE>
151 return _fieldGroupsContainer;
154template<
typename T,
typename PARTICLETYPE>
157 return _dynamicsVector;
160template<
typename T,
typename PARTICLETYPE>
161template<
bool boundsCheck>
164 if constexpr(boundsCheck){
165 if (iParticle>_fieldGroupsContainer.size()){
166 throw std::out_of_range(
"Particle does not exist in Particlesystem!");
169 _dynamicsVector, iParticle );
172 _dynamicsVector, iParticle );
176template<
typename T,
typename PARTICLETYPE>
179 return get(iParticle);
182template<
typename T,
typename PARTICLETYPE>
183template <
typename GROUP,
typename FIELD>
186 using GROUP_EVAL =
typename PARTICLETYPE::template derivedField<GROUP>;
187 using FIELD_EVAL =
typename GROUP_EVAL::template derivedField<FIELD>;
188 return _fieldGroupsContainer.data().template get<GROUP_EVAL>()
189 .template get<FIELD_EVAL>();
192template<
typename T,
typename PARTICLETYPE>
193template <
typename GROUP,
typename FIELD>
196 using GROUP_EVAL =
typename PARTICLETYPE::template derivedField<GROUP>;
197 using FIELD_EVAL =
typename GROUP_EVAL::template derivedField<FIELD>;
198 return _fieldGroupsContainer.data().template get<GROUP_EVAL>()
199 .template get<FIELD_EVAL>()
200 .getRowPointer( iParticle );
203template<
typename T,
typename PARTICLETYPE>
204template<
typename TYPE>
207 const std::size_t idx = associatedTypes::template index<TYPE>();
208 return std::get<idx>(_associatedData);
212template<
typename T,
typename PARTICLETYPE>
218template<
typename T,
typename PARTICLETYPE>
222 clout <<
"-----ParticleSystem------" << std::endl;
223 clout <<
"nop=" << size() << std::endl;
224 clout <<
"-------------------------" << std::endl;
227template<
typename T,
typename PARTICLETYPE>
231 if ( _dynamicsVector.size()==0 ){
232 throw std::logic_error(
"No ParticleDynamics set!");
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)
class for marking output with some text
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.
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.