OpenLB 1.7
Loading...
Searching...
No Matches
particle.h
Go to the documentation of this file.
1/* This file is part of the OpenLB library
2 *
3 * Copyright (C) 2021 Nicolas Hafen, Mathias J. Krause
4 * E-mail contact: info@openlb.net
5 * The most recent release of OpenLB can be downloaded at
6 * <http://www.openlb.net/>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301, USA.
22*/
23
24#ifndef PARTICLE_H
25#define PARTICLE_H
26
27#include "core/fieldArrayD.h"
29
30namespace olb {
31
32namespace particles{
33
34//Forward declaration
35namespace dynamics {
36template<typename T, typename PARTICLETYPE> struct ParticleDynamics;
37}
38
39
40//Particle interface as pendent to cell interface
41template <typename T, typename PARTICLETYPE>
42class Particle {
43private:
45 DATA& _dynamicFieldGroupsD;
46 std::vector<std::shared_ptr<dynamics::ParticleDynamics<T,PARTICLETYPE>>>& _dynamicsVector;
47 std::size_t _iParticle;
48public:
49 Particle( DATA& dynamicFieldGroupsD,
50 std::vector<std::shared_ptr<dynamics::ParticleDynamics<T,PARTICLETYPE>>>& dynamicsVector,
51 std::size_t iParticle );
52
54 void init();
55
57 template<bool multiOutput=PARTICLETYPE::template providesNested<descriptors::PARALLELIZATION>()>
58 void print(std::size_t iParticle);
59 template<bool multiOutput=PARTICLETYPE::template providesNested<descriptors::PARALLELIZATION>()>
60 void print();
61
63 std::size_t getId() const;
64
66 void setId( std::size_t iParticle );
67
69 void advanceId();
70
72 void addDynamics(std::shared_ptr<dynamics::ParticleDynamics<T,PARTICLETYPE>>& dynamicsSPtr );
73
75 template <typename DYNAMICS, typename ...Args>
76 void defineDynamics(Args&& ...args);
77
79 template<bool boundsCheck=false>
81
83 void process(T timeStepSize, unsigned short iDyn=0);
84
86
88 template <typename GROUP, typename FIELD>
89 std::enable_if_t<(
90 PARTICLETYPE::template size<
91 typename PARTICLETYPE::template derivedField<GROUP>::template derivedField<FIELD>
92 >() > 1),
93 FieldD<T,PARTICLETYPE,
94 typename PARTICLETYPE::template derivedField<GROUP>::template derivedField<FIELD>>>
96
98 template <typename GROUP, typename FIELD>
99 std::enable_if_t<(
100 PARTICLETYPE::template size<
101 typename PARTICLETYPE::template derivedField<GROUP>::template derivedField<FIELD>
102 >() == 1),
103 typename PARTICLETYPE::template derivedField<GROUP>::template derivedField<FIELD>::template value_type<T>>
105
107 template <typename GROUP, typename FIELD>
108 std::enable_if_t<(
109 PARTICLETYPE::template size<
110 typename PARTICLETYPE::template derivedField<GROUP>::template derivedField<FIELD>
111 >() > 1),
112 void>
113 setField(const FieldD<T,PARTICLETYPE,
114 typename PARTICLETYPE::template derivedField<GROUP>
115 ::template derivedField<FIELD>>& v);
116
118 template <typename GROUP, typename FIELD>
119 std::enable_if_t<(
120 PARTICLETYPE::template size<
121 typename PARTICLETYPE::template derivedField<GROUP>::template derivedField<FIELD>
122 >() == 1),
123 void>
124 setField( typename PARTICLETYPE::template derivedField<GROUP>
125 ::template derivedField<FIELD>
126 ::template value_type<T> value );
127
128
133 return Communicatable(_dynamicFieldGroupsD);
134 }
136 std::size_t getSerialSize() const {
137 const std::vector<unsigned int> indices{static_cast<unsigned int>(_iParticle)};
138 return Communicatable(_dynamicFieldGroupsD).size(indices);
139 }
141 std::size_t serialize(std::uint8_t* buffer) const {
142 const std::vector<unsigned int> indices{static_cast<unsigned int>(_iParticle)};
143 return Communicatable(_dynamicFieldGroupsD).serialize(indices, buffer);
144 }
146 std::size_t deserialize(const std::uint8_t* buffer){
147 const std::vector<unsigned int> indices{static_cast<unsigned int>(_iParticle)};
148 return Communicatable(_dynamicFieldGroupsD).deserialize(indices, buffer);
149 }
150
151};
152
153} //namespace particles
154
155} //namespace olb
156
157#endif
Storage for dynamic field groups (Prototype for ParticleSystem)
Plain old scalar vector.
Definition vector.h:47
void init()
Initialize.
Definition particle.hh:47
std::enable_if_t<(PARTICLETYPE::template size< typename PARTICLETYPE::template derivedField< GROUP >::template derivedField< FIELD > >() > 1), void > setField(const FieldD< T, PARTICLETYPE, typename PARTICLETYPE::template derivedField< GROUP > ::template derivedField< FIELD > > &v)
Set descriptor-declared FIELD.
Definition particle.hh:164
std::size_t getId() const
Return memory ID of the currently represented particle.
Definition particle.hh:67
std::size_t deserialize(const std::uint8_t *buffer)
Deserialize data.
Definition particle.h:146
void addDynamics(std::shared_ptr< dynamics::ParticleDynamics< T, PARTICLETYPE > > &dynamicsSPtr)
Add dynamics.
Definition particle.hh:85
std::size_t getSerialSize() const
Get serialized size.
Definition particle.h:136
void advanceId()
Jump to next particle in linearization sequence.
Definition particle.hh:79
typename GroupedDataCommunicatableHelper< DATA, PARTICLETYPE >::type Communicatable
Define Communicatable.
Definition particle.h:130
dynamics::ParticleDynamics< T, PARTICLETYPE > * getDynamics(unsigned iDyn=0)
Get a pointer to specific dynamics.
Definition particle.hh:99
void defineDynamics(Args &&...args)
Define dynamics (factory method)
Definition particle.hh:93
Particle(DATA &dynamicFieldGroupsD, std::vector< std::shared_ptr< dynamics::ParticleDynamics< T, PARTICLETYPE > > > &dynamicsVector, std::size_t iParticle)
Definition particle.hh:37
std::enable_if_t<(PARTICLETYPE::template size< typename PARTICLETYPE::template derivedField< GROUP >::template derivedField< FIELD > >() > 1), FieldD< T, PARTICLETYPE, typename PARTICLETYPE::template derivedField< GROUP >::template derivedField< FIELD > > getField()
Return copy of descriptor-declared FIELD as a vector.
std::enable_if_t<(PARTICLETYPE::templatesize< typenamePARTICLETYPE::templatederivedField< GROUP >::templatederivedField< FIELD > >()==1), typenamePARTICLETYPE::templatederivedField< GROUP >::template derivedField< FIELD >::template value_type< T > getField()
Return copy of descriptor-declared FIELD as a scalar (more specifically as value type of FIELD)
void process(T timeStepSize, unsigned short iDyn=0)
Apply processing to the particle according to dynamics at iDyn.
Definition particle.hh:110
void setId(std::size_t iParticle)
Jump to arbitrary particle memory ID.
Definition particle.hh:73
Communicatable getCommunicatable()
Get communicatable necessary for serialization.
Definition particle.h:132
std::size_t serialize(std::uint8_t *buffer) const
Serialize data.
Definition particle.h:141
Top level namespace for all of OpenLB.
typename DESCRIPTOR::template decompose_into< CurriedFieldGroupsCommunicatable > type