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 cuboidGeometry, periodicity, position, globiCcentre);
59 std::cerr <<
"ERROR: Particle added outside domain!" << std::endl;
61 if constexpr (access::providesContactMaterial<PARTICLETYPE>()) {
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::unordered_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.,
209 Vector<T,3> (0.), radius, epsilon).getCircumRadius();
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.,
259 extend[0], extend[1], extend[2],
Vector<T,3>(0.), epsilon ).getCircumRadius();
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.,
402 Vector<T,2> (0.), radius, epsilon).getCircumRadius();
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 bool inDomain = cuboidGeometry.getC( position, globiCcentre );
456 if (!inDomain){ std::cerr <<
"ERROR: Particle added outside domain!" << std::endl; }
459 std::size_t localID=0;
464 if (globiC == globiCcentre){
467 position, radius, density, velocity );
469 auto particle = particleSystem.
get(particleSystem.
size()-1);
470 particle.template setField<PARALLELIZATION,ID>( globID );
472 localID=particle.getId();
481template<
typename T,
typename PARTICLETYPE>
484 const Vector<T,3>& position, T radius, T density=0.,
486 const int species=0 )
488 using namespace descriptors;
492 std::size_t globID = sParticleSystem.
getGlobID();
495 bool inDomain = cuboidGeometry.getC( position, globiCcentre );
496 if (!inDomain){ std::cerr <<
"ERROR: Particle added outside domain!" << std::endl; }
499 std::size_t localID=0;
504 if (globiC == globiCcentre){
507 position, radius, density, velocity );
509 auto particle = particleSystem.
get(particleSystem.
size()-1);
510 particle.template setField<PARALLELIZATION,ID>( globID );
512 if constexpr( access::providesSpecies<PARTICLETYPE>() ){
513 particle.template setField<PHYSPROPERTIES,SPECIES>( species );
516 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.
implements a smooth sphere in 3D with an _epsilon sector
CuboidGeometry< T, D > & getCuboidGeometry()
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()
void forSystemsInSuperParticleSystem(SuperParticleSystem< T, PARTICLETYPE > &sParticleSystem, F f)
std::unordered_set< int > getSurfaceTouchingICs(CuboidGeometry< T, D > &cuboidGeometry, 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 CuboidGeometry< T, D > &cuboidGeometry, 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))
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))
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))
std::unordered_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 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)
bool assignParallelResolvedParticle(ParticleSystem< T, PARTICLETYPE > &particleSystem, std::unordered_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 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)
cpu::simd::Pack< T > sqrt(cpu::simd::Pack< T > value)
cpu::simd::Pack< T > max(cpu::simd::Pack< T > rhs, cpu::simd::Pack< T > lhs)
Top level namespace for all of OpenLB.
std::conditional_t< D==2, SmoothIndicatorF2D< T, T, PARTICLE >, SmoothIndicatorF3D< T, T, PARTICLE > > SmoothIndicatorF
Converts dimensions by deriving from given cartesian dimension D.