12#ifndef DUMUX_PARTICLES_SIMPLE_PARTICLE_CLOUD_HH
13#define DUMUX_PARTICLES_SIMPLE_PARTICLE_CLOUD_HH
45 void resize(std::size_t numParticles)
47 if (numParticles > particles_.size())
49 for (std::size_t pId = particles_.size(); pId < numParticles; ++pId)
50 particles_.emplace_back(pId,
false);
51 if (particles_.size() != numParticles)
52 DUNE_THROW(Dune::Exception,
"");
59 std::size_t
size(
bool onlyActive =
true)
const
62 return std::count_if(particles_.begin(), particles_.end(), [](
const auto& p){ return p.isActive(); });
64 return particles_.size();
77 auto pIt = std::find_if(particles_.begin(), particles_.end(), [](
const auto& p){ return !p.isActive(); });
78 if (pIt == particles_.end())
80 std::cout <<
"-- running out of particles -- adding 10% more particles." << std::endl;
81 const auto oldSize = particles_.size();
82 this->
resize(
static_cast<std::size_t
>(1.1*oldSize));
83 pIt = particles_.begin() + oldSize;
95 particles_[p.id()].deactivate();
104 {
return cloud.particles_ | std::views::filter([](
const auto& p){
return p.isActive(); }); }
114 if (particles_[i].isActive())
131 std::vector<Particle> particles_;
137#ifdef DUMUX_HAVE_GRIDFORMAT
138#include <gridformat/gridformat.hpp>
141namespace GridFormat::Traits {
144struct Cells<
Dumux::Particles::SimpleParticleCloud<P>> {
151struct Points<
Dumux::Particles::SimpleParticleCloud<P>>{
158struct CellPoints<
Dumux::Particles::SimpleParticleCloud<P>, P> {
160 return std::views::single(p);
165struct CellType<
Dumux::Particles::SimpleParticleCloud<P>, P> {
167 return GridFormat::CellType::vertex;
172struct PointCoordinates<
Dumux::Particles::SimpleParticleCloud<P>, P> {
179struct PointId<
Dumux::Particles::SimpleParticleCloud<P>, P> {
186struct NumberOfPoints<
Dumux::Particles::SimpleParticleCloud<P>> {
193struct NumberOfCells<
Dumux::Particles::SimpleParticleCloud<P>> {
200struct NumberOfCellPoints<
Dumux::Particles::SimpleParticleCloud<P>, P> {
206static_assert(GridFormat::Concepts::UnstructuredGrid<Dumux::Particles::SimpleParticleCloud<Dumux::Particles::Particle<1>>>);
207static_assert(GridFormat::Concepts::UnstructuredGrid<Dumux::Particles::SimpleParticleCloud<Dumux::Particles::Particle<2>>>);
208static_assert(GridFormat::Concepts::UnstructuredGrid<Dumux::Particles::SimpleParticleCloud<Dumux::Particles::Particle<3>>>);
A simple implementation of a cloud of particles.
Definition: simpleparticlecloud.hh:36
void forEachParticle(const Func &func)
For each particle apply a function.
Definition: simpleparticlecloud.hh:124
void deactivateParticle(const Particle &p)
Deactivate a given particle.
Definition: simpleparticlecloud.hh:93
friend std::ranges::forward_range auto particles(const SimpleParticleCloud &cloud)
Const range generator for iterating over all active particles.
Definition: simpleparticlecloud.hh:103
Particle & spawnParticle()
Bring one inactive particle to life Activates one particle from the pool of inactive particles.
Definition: simpleparticlecloud.hh:75
void forEachActiveParticle(const Func &func)
For each active particle apply a function.
Definition: simpleparticlecloud.hh:111
void resize(std::size_t numParticles)
Resize the cloud to contain numParticles particles.
Definition: simpleparticlecloud.hh:45
SimpleParticleCloud()=default
P Particle
Definition: simpleparticlecloud.hh:38
std::size_t size(bool onlyActive=true) const
the number of particles in the cloud
Definition: simpleparticlecloud.hh:59
void parallelFor(const std::size_t count, const FunctorType &functor)
A parallel for loop (multithreading)
Definition: parallel_for.hh:160
Definition: fokkerplanck.hh:31
Parallel for loop (multithreading)