25#ifndef PARTICLE_PARALLEL_CREATOR_FUNCTIONS_3D_H
26#define PARTICLE_PARALLEL_CREATOR_FUNCTIONS_3D_H
45template<
typename T,
typename PARTICLETYPE>
49 const T epsilon,
int& globiCcentre,
const T physDeltaX,
56 cuboidDecomposition, periodicity, position, globiCcentre);
59 std::cerr <<
"ERROR: Particle added outside domain!" << std::endl;
63 const T detectionDistance = T{0.5} *
util::sqrt(PARTICLETYPE::d) * physDeltaX;
64 const T halfEpsilon = T{0.5} * epsilon;
65 circumRadius = circumRadius - halfEpsilon +
util::max(halfEpsilon, detectionDistance);
70 position, circumRadius, periodicity, globiCcentre );
72 setOfICs.insert(globiCcentre);
78template<
typename T,
typename PARTICLETYPE>
81 std::size_t idxSurface, std::size_t globID,
int globiCcentre,
87 using namespace descriptors;
90 position, density, angleInDegree, velocity );
92 particle.template setField<PARALLELIZATION,ID>( globID );
93 particle.template setField<PARALLELIZATION,IC>( globiCcentre );
94 particle.template setField<SURFACE,SURFACE_ID>( idxSurface );
101template<
typename T,
typename PARTICLETYPE>
104 std::set<int>& setOfICs,
int globiC,
105 std::size_t idxSurface, std::size_t globID, std::size_t& localID,
int globiCcentre,
113 if( setOfICs.find(globiC) != setOfICs.end() ) {
116 globID, globiCcentre, position, density, angleInDegree, velocity );
120 localID = particle.getId();
128template<
typename T,
typename PARTICLETYPE>
131 std::size_t idxSurface,
139 constexpr unsigned D = PARTICLETYPE::d;
142 auto& particleSystem = *bParticleSystems[0];
143 auto& vectorOfIndicators = particleSystem.template getAssociatedData<
144 std::vector<std::unique_ptr<SIndicatorBaseType>>>();
145 T circumRadius = vectorOfIndicators[idxSurface]->getCircumRadius();
147 std::size_t globID = sParticleSystem.
getGlobID();
151 position, circumRadius, vectorOfIndicators[idxSurface].get()->getEpsilon(), globiCcentre,
156 std::size_t localIDcentre=0;
160 std::size_t localID=0;
162 idxSurface, globID, localID, globiCcentre,
163 position, density, angleInDegree, velocity );
165 if (globiC==globiCcentre){ localIDcentre=localID; }
173template<
typename T,
typename PARTICLETYPE,
typename F>
175 F createUniqueIndicatorPtr )
178 std::size_t idxSurface = 0;
180 std::vector<olb::particles::ParticleSystem<T, PARTICLETYPE>*>&
184 for (
unsigned i = 0; i < blockParticleSystems.size(); ++i) {
185 auto& particleSystem = *blockParticleSystems[i];
186 auto& vectorOfIndicators = particleSystem.template getAssociatedData<
187 std::vector<std::unique_ptr<SIndicatorBaseType>>>();
188 if(i > 0 && idxSurface != vectorOfIndicators.size()) {
189 std::cerr <<
"ERROR: Number of particle surfaces don't match." << std::endl;
192 idxSurface = vectorOfIndicators.
size();
193 vectorOfIndicators.push_back( createUniqueIndicatorPtr() );
200template<
typename T,
typename PARTICLETYPE>
203 const Vector<T,3>& position, T radius, T epsilon, T density=0.,
214 std::size_t globID = sParticleSystem.
getGlobID();
219 position, circumRadius, epsilon, globiCcentre,
223 std::size_t idxSurface =
addSurface(sParticleSystem,
225 return std::make_unique<SmoothIndicatorSphere3D<T, T, true>>(
Vector<T,3> (0.), radius, epsilon );
229 std::size_t localIDcentre=0;
235 std::size_t localID=0;
237 idxSurface, globID, localID, globiCcentre,
238 position, density, angleInDegree, velocity );
240 if (globiC==globiCcentre){ localIDcentre=localID; }
248template<
typename T,
typename PARTICLETYPE>
252 T epsilon, T density=0.,
262 std::size_t globID = sParticleSystem.
getGlobID();
267 position, circumRadius, epsilon, globiCcentre,
271 std::size_t idxSurface =
addSurface(sParticleSystem,
273 return std::make_unique<SmoothIndicatorCuboid3D<T, T, true>>(
274 extend[0], extend[1], extend[2],
Vector<T,3>(0.), epsilon );
278 std::size_t localIDcentre=0;
284 std::size_t localID=0;
286 idxSurface, globID, localID, globiCcentre,
287 position, density, angleInDegree, velocity );
289 if (globiC==globiCcentre){ localIDcentre=localID; }
297template<
typename T,
typename PARTICLETYPE>
301 T height, T radius, T epsilon, T density=0.,
310 std::size_t globID = sParticleSystem.
getGlobID();
315 position, circumRadius, epsilon, globiCcentre,
319 std::size_t idxSurface =
addSurface(sParticleSystem,
321 return std::make_unique<SmoothIndicatorCylinder3D<T, T, true>>(
322 Vector<T,3>(0.), normal, radius, height, epsilon );
326 std::size_t localIDcentre=0;
332 std::size_t localID=0;
334 idxSurface, globID, localID, globiCcentre,
335 position, density, angleInDegree, velocity );
337 if (globiC==globiCcentre){ localIDcentre=localID; }
344template<
typename T,
typename PARTICLETYPE>
349 T epsilon, T density=0.,
356 latticeSpacing, indPtr,
PhysR<T, 3>(T {}), epsilon, angleInDegree).getCircumRadius();
359 std::size_t globID = sParticleSystem.
getGlobID();
364 position, circumRadius, epsilon, globiCcentre,
368 std::size_t idxSurface =
addSurface(sParticleSystem,
370 return std::make_unique<SmoothIndicatorCustom3D<T, T, true>>(
371 latticeSpacing, indPtr,
PhysR<T, 3>(T {}), epsilon, angleInDegree);
375 std::size_t localIDcentre=0;
381 std::size_t localID=0;
383 idxSurface, globID, localID, globiCcentre,
384 position, density, angleInDegree, velocity );
386 if (globiC==globiCcentre){ localIDcentre=localID; }
393template<
typename T,
typename PARTICLETYPE>
396 const Vector<T,2>& position, T radius, T epsilon, T density=0.,
407 std::size_t globID = sParticleSystem.
getGlobID();
412 position, circumRadius, epsilon, globiCcentre,
416 std::size_t idxSurface =
addSurface(sParticleSystem,
418 return std::make_unique<SmoothIndicatorCircle2D<T, T, true>>(
Vector<T,2> (0.), radius, epsilon );
422 std::size_t localIDcentre=0;
428 std::size_t localID=0;
430 idxSurface, globID, localID, globiCcentre,
431 position, density, angleInDegree, velocity );
433 if (globiC==globiCcentre){ localIDcentre=localID; }
442template<
typename T,
typename PARTICLETYPE>
445 const Vector<T,3>& position, T radius, T density=0.,
448 using namespace descriptors;
452 std::size_t globID = sParticleSystem.
getGlobID();
455 if (
auto iC = cuboidDecomposition.getC(position)) {
458 std::cerr <<
"ERROR: Particle added outside domain!" << std::endl;
462 std::size_t localID=0;
467 if (globiC == globiCcentre){
470 position, radius, density, velocity );
472 auto particle = particleSystem.
get(particleSystem.
size()-1);
473 particle.template setField<PARALLELIZATION,ID>( globID );
475 localID=particle.getId();
484template<
typename T,
typename PARTICLETYPE>
487 const Vector<T,3>& position, T radius, T density=0.,
489 const int species=0 )
491 using namespace descriptors;
495 std::size_t globID = sParticleSystem.
getGlobID();
498 if (
auto iC = cuboidDecomposition.getC(position)) {
501 std::cerr <<
"ERROR: Particle added outside domain!" << std::endl;
505 std::size_t localID=0;
510 if (globiC == globiCcentre){
513 position, radius, density, velocity );
515 auto particle = particleSystem.
get(particleSystem.
size()-1);
516 particle.template setField<PARALLELIZATION,ID>( globID );
519 particle.template setField<PHYSPROPERTIES,SPECIES>( species );
522 localID=particle.getId();
IndicatorF3D is an application from .
implements a smooth circle in 2D with an _epsilon sector
implements a smooth particle cuboid in 3D with an _epsilon sector.
implements a smooth particle cylinder in 3D with an _epsilon sector.
const S & getCircumRadius() const
const S & getCircumRadius() const
implements a smooth sphere in 3D with an _epsilon sector
CuboidDecomposition< T, D > & getCuboidDecomposition()
Read and write access to cuboid geometry.
auto & get()
Expose container.
constexpr std::size_t size()
Size of ParticleSystem.
SuperStructure< T, PARTICLETYPE::d > & getSuperStructure()
void updateOffsetFromCircumRadius(T circumRadius)
std::vector< ParticleSystem< T, PARTICLETYPE > * > & getBlockParticleSystems()
constexpr bool providesSpecies()
constexpr bool providesContactMaterial()
void forSystemsInSuperParticleSystem(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, F f)
std::set< int > getSurfaceTouchingICs(CuboidDecomposition< T, D > &cuboidDecomposition, Vector< T, D > position, T circumRadius, const Vector< bool, D > &periodicity, int globiC, F f=[](int){})
Get a set of surface touching iCs (that are not globiC) Allows to run an optional function per unique...
bool getCuboid(const CuboidDecomposition< T, D > &cuboidDecomposition, const Vector< bool, D > &periodicity, const PhysR< T, D > &position, int &iC)
Function returns true if cuboid was found and gives iC.
ParallelParticleLocator addResolvedObject(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, std::size_t idxSurface, const Vector< T, PARTICLETYPE::d > &position, T density=0., const Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > &angleInDegree=Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation >(0.), const Vector< T, PARTICLETYPE::d > &velocity=Vector< T, PARTICLETYPE::d >(0.), const Vector< bool, PARTICLETYPE::d > &periodicity=Vector< T, PARTICLETYPE::d >(false))
bool assignParallelResolvedParticle(ParticleSystem< T, PARTICLETYPE > &particleSystem, std::set< int > &setOfICs, int globiC, std::size_t idxSurface, std::size_t globID, std::size_t &localID, int globiCcentre, const Vector< T, PARTICLETYPE::d > &position, T density=0., const Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > &angleInDegree=Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation >(0.), const Vector< T, PARTICLETYPE::d > &velocity=Vector< T, PARTICLETYPE::d >(0.))
ParallelParticleLocator addResolvedCylinder3D(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, const Vector< T, 3 > &position, const Vector< T, 3 > &normal, T height, T radius, T epsilon, T density=0., const Vector< T, 3 > &angleInDegree=Vector< T, 3 >(0.), const Vector< T, 3 > &velocity=Vector< T, 3 >(0.), const Vector< bool, 3 > &periodicity=Vector< bool, 3 >(false))
std::set< int > prepareParallelResolvedParticle(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, Vector< T, PARTICLETYPE::d > position, T circumRadius, const T epsilon, int &globiCcentre, const T physDeltaX, const Vector< bool, PARTICLETYPE::d > &periodicity)
ParallelParticleLocator addResolvedCuboid3D(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, const Vector< T, 3 > &position, const Vector< T, 3 > &extend, T epsilon, T density=0., const Vector< T, 3 > &angleInDegree=Vector< T, 3 >(0.), const Vector< T, 3 > &velocity=Vector< T, 3 >(0.), const Vector< bool, 3 > &periodicity=Vector< bool, 3 >(false))
ParallelParticleLocator addResolvedCircle2D(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, const Vector< T, 2 > &position, T radius, T epsilon, T density=0., const Vector< T, 2 > &velocity=Vector< T, 2 >(0.), const Vector< bool, 2 > &periodicity=Vector< bool, 2 >(false))
ParallelParticleLocator addResolvedSphere3D(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, const Vector< T, 3 > &position, T radius, T epsilon, T density=0., const Vector< T, 3 > &velocity=Vector< T, 3 >(0.), const Vector< bool, 3 > &periodicity=Vector< bool, 3 >(false))
ParallelParticleLocator addSubgridSphere3D(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, const Vector< T, 3 > &position, T radius, T density=0., const Vector< T, 3 > &velocity=Vector< T, 3 >(0.))
std::size_t addSurface(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, F createUniqueIndicatorPtr)
Adds surface (SmoothIndicator) to all block particle systems.
Particle< T, PARTICLETYPE > assignParallelResolvedParticleToiC(ParticleSystem< T, PARTICLETYPE > &particleSystem, std::size_t idxSurface, std::size_t globID, int globiCcentre, const Vector< T, PARTICLETYPE::d > &position, T density=0., const Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation > &angleInDegree=Vector< T, utilities::dimensions::convert< PARTICLETYPE::d >::rotation >(0.), const Vector< T, PARTICLETYPE::d > &velocity=Vector< T, PARTICLETYPE::d >(0.))
ParallelParticleLocator addResolvedArbitraryShape3D(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, const Vector< T, 3 > &position, T latticeSpacing, std::shared_ptr< IndicatorF3D< T > > indPtr, T epsilon, T density=0., const Vector< T, 3 > &angleInDegree=Vector< T, 3 >(0.), const Vector< T, 3 > &velocity=Vector< T, 3 >(0.), const Vector< bool, 3 > &periodicity=Vector< bool, 3 >(false))
Particle< T, PARTICLETYPE > addSubgridObject(ParticleSystem< T, PARTICLETYPE > &particleSystem, const Vector< T, PARTICLETYPE::d > &position, T radius, T density=0., const Vector< T, PARTICLETYPE::d > &velocity=Vector< T, PARTICLETYPE::d >(0.))
Add subgrid object as new particle (and return particle object)
ParallelParticleLocator addSubgridSphereWithSpecies3D(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, const Vector< T, 3 > &position, T radius, T density=0., const Vector< T, 3 > &velocity=Vector< T, 3 >(0.), const int species=0)
Top level namespace for all of OpenLB.
std::conditional_t< D==2, SmoothIndicatorF2D< T, T, PARTICLE >, SmoothIndicatorF3D< T, T, PARTICLE > > SmoothIndicatorF
Vector< T, D > PhysR
Type for spatial (physical) coordinates.
Converts dimensions by deriving from given cartesian dimension D.