13#ifndef dealii_particles_particle_accessor_h
14#define dealii_particles_particle_accessor_h
26#include <boost/geometry/index/indexable.hpp>
27#include <boost/serialization/array_wrapper.hpp>
47 template <
int dim,
int spacedim = dim>
105 std::vector<typename PropertyPool<dim, spacedim>::Handle>
particles;
376 template <
class Archive>
378 save(Archive &ar,
const unsigned int version)
const;
385 template <
class Archive>
387 load(Archive &ar,
const unsigned int version);
395 template <
class Archive>
397 serialize(Archive &archive,
const unsigned int version);
401 BOOST_SERIALIZATION_SPLIT_MEMBER()
491 template <
int dim,
int spacedim>
492 template <
class Archive>
496 unsigned int n_properties = 0;
501 ar &location &reference_location &
id &n_properties;
507 if (n_properties > 0)
511 properties.
size() == n_properties,
513 "This particle was serialized with " +
514 std::to_string(n_properties) +
515 " properties, but the new property handler provides space for " +
516 std::to_string(properties.
size()) +
517 " properties. Deserializing a particle only works for matching property sizes."));
519 ar &boost::serialization::make_array(properties.
data(), n_properties);
525 template <
int dim,
int spacedim>
526 template <
class Archive>
530 unsigned int n_properties = 0;
539 ar &location &reference_location &
id &n_properties;
541 if (n_properties > 0)
549 template <
int dim,
int spacedim>
558 template <
int dim,
int spacedim>
570 template <
int dim,
int spacedim>
580 const double *pdata =
reinterpret_cast<const double *
>(id_data);
583 for (
unsigned int i = 0; i < spacedim; ++i)
584 location[i] = *pdata++;
588 for (
unsigned int i = 0; i < dim; ++i)
589 reference_location[i] = *pdata++;
597 const unsigned int size = particle_properties.
size();
598 for (
unsigned int i = 0; i < size; ++i)
599 particle_properties[i] = *pdata++;
602 return static_cast<const void *
>(pdata);
607 template <
int dim,
int spacedim>
617 double *pdata =
reinterpret_cast<double *
>(id_data);
620 for (
unsigned int i = 0; i < spacedim; ++i, ++pdata)
624 for (
unsigned int i = 0; i < dim; ++i, ++pdata)
632 for (
unsigned int i = 0; i < particle_properties.
size(); ++i, ++pdata)
633 *pdata = particle_properties[i];
636 return static_cast<void *
>(pdata);
641 template <
int dim,
int spacedim>
652 template <
int dim,
int spacedim>
663 template <
int dim,
int spacedim>
674 template <
int dim,
int spacedim>
686 template <
int dim,
int spacedim>
697 template <
int dim,
int spacedim>
708 template <
int dim,
int spacedim>
719 template <
int dim,
int spacedim>
730 template <
int dim,
int spacedim>
748 template <
int dim,
int spacedim>
751 const std::vector<double> &new_properties)
761 template <
int dim,
int spacedim>
773 "You are trying to assign properties with an incompatible length. "
774 "The particle has space to store " +
775 std::to_string(property_values.
size()) +
776 " properties, but you are trying to assign " +
777 std::to_string(new_properties.
size()) +
778 " properties. This is not allowed."));
780 if (property_values.
size() > 0)
781 std::copy(new_properties.
begin(),
782 new_properties.
end(),
783 property_values.
begin());
788 template <
int dim,
int spacedim>
799 for (
unsigned int d = 0; d < dim; ++d)
800 array[d] = new_properties[d];
807 template <
int dim,
int spacedim>
818 template <
int dim,
int spacedim>
837 template <
int dim,
int spacedim>
843 std::size_t size =
sizeof(
get_id()) +
844 sizeof(
double) * spacedim +
845 sizeof(double) * dim;
856 template <
int dim,
int spacedim>
873 template <
int dim,
int spacedim>
892 template <
int dim,
int spacedim>
897 return !(*
this == other);
902 template <
int dim,
int spacedim>
914 template <
int dim,
int spacedim>
920 particle_index_within_cell < particles_in_cell->particles.size())
934 template <
int dim,
int spacedim>
943 template <
int dim,
int spacedim>
964 template <
int dim,
int spacedim>
974 operator()(const ::Particles::ParticleAccessor<dim, spacedim>
977 return accessor.get_location();
ArrayView< std::remove_reference_t< typename std::iterator_traits< Iterator >::reference >, MemorySpaceType > make_array_view(const Iterator begin, const Iterator end)
value_type * data() const noexcept
particle_container::iterator particles_in_cell
const Point< spacedim > & get_location() const
types::particle_index get_id() const
void save(Archive &ar, const unsigned int version) const
unsigned int particle_index_within_cell
types::particle_index get_local_index() const
std::list< ParticlesInCell > particle_container
friend class ParticleIterator
const void * read_particle_data_from_memory(const void *data)
void load(Archive &ar, const unsigned int version)
const Triangulation< dim, spacedim >::cell_iterator & get_surrounding_cell() const
IteratorState::IteratorStates state() const
bool operator!=(const ParticleAccessor< dim, spacedim > &other) const
void set_properties(const Tensor< 1, dim > &new_properties)
friend class ParticleHandler
void set_location(const Point< spacedim > &new_location)
PropertyPool< dim, spacedim >::Handle & get_handle()
void serialize(Archive &archive, const unsigned int version)
ArrayView< double > get_properties()
void set_reference_location(const Point< dim > &new_reference_location)
const Point< dim > & get_reference_location() const
std::size_t serialized_size_in_bytes() const
const PropertyPool< dim, spacedim >::Handle & get_handle() const
void set_properties(const std::vector< double > &new_properties)
Point< spacedim > & get_location()
ParticleAccessor(const typename particle_container::iterator particles_in_cell, const PropertyPool< dim, spacedim > &property_pool, const unsigned int particle_index_within_cell)
bool has_properties() const
PropertyPool< dim, spacedim > * property_pool
void * write_particle_data_to_memory(void *data) const
void set_properties(const ArrayView< const double > &new_properties)
ArrayView< const double > get_properties() const
bool operator==(const ParticleAccessor< dim, spacedim > &other) const
void set_id(const types::particle_index &new_id)
static const Handle invalid_handle
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
TriaActiveIterator< CellAccessor< dim, spacedim > > active_cell_iterator
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
@ past_the_end
Iterator reached end of container.
@ valid
Iterator points to a valid object.
@ invalid
Iterator is invalid, probably due to an error.
unsigned int particle_index
Triangulation< dim, spacedim >::active_cell_iterator cell
ParticlesInCell()=default
ParticlesInCell(const std::vector< typename PropertyPool< dim, spacedim >::Handle > &particles, const typename Triangulation< dim, spacedim >::active_cell_iterator &cell)
std::vector< typename PropertyPool< dim, spacedim >::Handle > particles
const ::Point< spacedim > & result_type
result_type operator()(const ::Particles::ParticleAccessor< dim, spacedim > &accessor) const