]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add ParticleAccessor::get_local_index
authorMartin Kronbichler <kronbichler@lnm.mw.tum.de>
Sun, 4 Jul 2021 20:48:05 +0000 (22:48 +0200)
committerMartin Kronbichler <kronbichler@lnm.mw.tum.de>
Mon, 5 Jul 2021 17:06:10 +0000 (19:06 +0200)
include/deal.II/particles/particle_accessor.h
include/deal.II/particles/particle_handler.h
include/deal.II/particles/property_pool.h
source/particles/particle_handler.cc

index b90fe459e48e5ae6d9aaab17d408984b800d4621..70103e3754a061d757519502a09cf287a01c1dd9 100644 (file)
@@ -130,6 +130,22 @@ namespace Particles
     types::particle_index
     get_id() const;
 
+    /**
+     * Return a particle ID number local to each MPI process. This number
+     * enables the direct array access (similar to
+     * LinearAlgebra::distributed::Vector::local_element()) to quantities used
+     * for local computations. Use
+     * ParticleHandler::get_max_local_particle_index() to query the largest
+     * index for suitable array sizes.
+     *
+     * @note The number returned by this function is not stable between calls
+     * of ParticleHandler::sort_particles_into_subdomains_and_cells() and
+     * therefore it cannot be used to track quantities across those calls. Use
+     * particle properties for storing persistent information.
+     */
+    types::particle_index
+    get_local_index() const;
+
     /**
      * Return whether this particle has a valid property pool and a valid
      * handle to properties.
@@ -579,6 +595,17 @@ namespace Particles
 
 
 
+  template <int dim, int spacedim>
+  inline types::particle_index
+  ParticleAccessor<dim, spacedim>::get_local_index() const
+  {
+    Assert(state() == IteratorState::valid, ExcInternalError());
+
+    return get_handle();
+  }
+
+
+
   template <int dim, int spacedim>
   inline void
   ParticleAccessor<dim, spacedim>::set_id(const types::particle_index &new_id)
index d3ed4cab452246057956aa9cc0b8a1650356a219..2fe3ec54a36e3be4265ad6ec8045acfc7f047a60 100644 (file)
@@ -660,6 +660,17 @@ namespace Particles
     unsigned int
     n_properties_per_particle() const;
 
+    /**
+     * Return the maximal local index (in MPI-local index space) returned by
+     * ParticleAccessor::get_local_index(). More precisely, the returned value
+     * is one larger than the largest index that will be returned, which makes
+     * this value useful for resizing vectors. This number can be larger than
+     * locally_owned_particle_ids().n_elements(), because local indices can
+     * contain gaps in the range 0 to get_max_local_particle_index().
+     */
+    types::particle_index
+    get_max_local_particle_index() const;
+
     /**
      * Return a reference to the property pool that owns all particle
      * properties, and organizes them physically.
index 944d2ca6432e177eeed00b8784e319cf6060f0ea..576effac947c97203e42f86abddf8c4ecba585a2 100644 (file)
@@ -137,7 +137,7 @@ namespace Particles
 
     /**
      * Return a new handle that allows a particle to store information such as
-     * properties and locations. This also allocated memory in this PropertyPool
+     * properties and locations. This also allocates memory in this PropertyPool
      * variable.
      */
     Handle
@@ -211,6 +211,13 @@ namespace Particles
     unsigned int
     n_properties_per_slot() const;
 
+    /**
+     * Return the total number of slots in the pool, including both registered
+     * and unregistered ones.
+     */
+    unsigned int
+    n_slots() const;
+
     /**
      * Return how many slots are currently registered in the pool.
      */
@@ -440,6 +447,15 @@ namespace Particles
   }
 
 
+
+  template <int dim, int spacedim>
+  inline unsigned int
+  PropertyPool<dim, spacedim>::n_slots() const
+  {
+    return locations.size();
+  }
+
+
 } // namespace Particles
 
 DEAL_II_NAMESPACE_CLOSE
index 5426e9e6bd6274f3c9e400a53fc52db1f07fb77d..2f12ce3e91c62f42a8c0de1b9e725822f2050360 100644 (file)
@@ -919,15 +919,27 @@ namespace Particles
   IndexSet
   ParticleHandler<dim, spacedim>::locally_owned_particle_ids() const
   {
-    IndexSet set(get_next_free_particle_index());
+    IndexSet                           set(get_next_free_particle_index());
+    std::vector<types::particle_index> indices;
+    indices.reserve(n_locally_owned_particles());
     for (const auto &p : *this)
-      set.add_index(p.get_id());
+      indices.push_back(p.get_id());
+    set.add_indices(indices.begin(), indices.end());
     set.compress();
     return set;
   }
 
 
 
+  template <int dim, int spacedim>
+  types::particle_index
+  ParticleHandler<dim, spacedim>::get_max_local_particle_index() const
+  {
+    return property_pool->n_slots();
+  }
+
+
+
   template <int dim, int spacedim>
   void
   ParticleHandler<dim, spacedim>::get_particle_positions(

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.