Reference documentation for deal.II version 9.3.2
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
property_pool.cc
Go to the documentation of this file.
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2017 - 2021 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 
18 
20 
22 
23 namespace Particles
24 {
25  template <int dim, int spacedim>
27  PropertyPool<dim, spacedim>::invalid_handle = static_cast<Handle>(-1);
28 
29 
30 
31  template <int dim, int spacedim>
33  const unsigned int n_properties_per_slot)
34  : n_properties(n_properties_per_slot)
35  {}
36 
37 
38 
39  template <int dim, int spacedim>
41  {
42  clear();
43  }
44 
45 
46 
47  template <int dim, int spacedim>
48  void
50  {
51  if (n_properties > 0)
52  {
53  const unsigned int n_open_handles =
54  properties.size() / n_properties - currently_available_handles.size();
55  (void)n_open_handles;
56  AssertThrow(n_open_handles == 0,
57  ExcMessage("This property pool currently still holds " +
58  std::to_string(n_open_handles) +
59  " open handles to memory that was allocated "
60  "via allocate_properties_array() but that has "
61  "not been returned via "
62  "deallocate_properties_array()."));
63  }
64 
65  // Clear vectors and ensure deallocation of memory
66  locations.clear();
67  locations.shrink_to_fit();
68 
69  reference_locations.clear();
70  reference_locations.shrink_to_fit();
71 
72  ids.clear();
73  ids.shrink_to_fit();
74 
75  properties.clear();
76  properties.shrink_to_fit();
77 
78  currently_available_handles.clear();
79  currently_available_handles.shrink_to_fit();
80  }
81 
82 
83 
84  template <int dim, int spacedim>
87  {
88  Handle handle = invalid_handle;
89  if (currently_available_handles.size() > 0)
90  {
91  handle = currently_available_handles.back();
92  currently_available_handles.pop_back();
93  }
94  else
95  {
96  handle = locations.size();
97 
98  locations.resize(locations.size() + 1);
99  reference_locations.resize(reference_locations.size() + 1);
100  ids.resize(ids.size() + 1);
101  properties.resize(properties.size() + n_properties);
102  }
103 
104  // Then initialize whatever slot we have taken with invalid locations,
105  // but initialize properties with zero.
106  set_location(handle, numbers::signaling_nan<Point<spacedim>>());
107  set_reference_location(handle, numbers::signaling_nan<Point<dim>>());
108  set_id(handle, numbers::invalid_unsigned_int);
109  for (double &x : get_properties(handle))
110  x = 0;
111 
112  return handle;
113  }
114 
115 
116 
117  template <int dim, int spacedim>
118  void
120  {
121  Assert(
122  handle != invalid_handle,
123  ExcMessage(
124  "This handle is invalid and cannot be deallocated. This can happen if the "
125  "handle was deallocated already before calling this function."));
126  currently_available_handles.push_back(handle);
127  handle = invalid_handle;
128 
129  // If this was the last handle, resize containers to 0.
130  // This guarantees that all future properties
131  // are allocated in a sorted way without requiring reallocation.
132  if (currently_available_handles.size() == locations.size())
133  {
134  currently_available_handles.clear();
135  properties.clear();
136  locations.clear();
137  reference_locations.clear();
138  ids.clear();
139  }
140  }
141 
142 
143 
144  template <int dim, int spacedim>
145  void
146  PropertyPool<dim, spacedim>::reserve(const std::size_t size)
147  {
148  locations.reserve(size);
149  reference_locations.reserve(size);
150  properties.reserve(size * n_properties);
151  ids.reserve(size);
152  }
153 
154 
155 
156  template <int dim, int spacedim>
157  unsigned int
159  {
160  return n_properties;
161  }
162 
163 
164  // Instantiate the class for all reasonable template arguments
165  template class PropertyPool<1, 1>;
166  template class PropertyPool<1, 2>;
167  template class PropertyPool<1, 3>;
168  template class PropertyPool<2, 2>;
169  template class PropertyPool<2, 3>;
170  template class PropertyPool<3, 3>;
171 } // namespace Particles
unsigned int n_properties_per_slot() const
void deregister_particle(Handle &handle)
void reserve(const std::size_t size)
PropertyPool(const unsigned int n_properties_per_slot)
static const Handle invalid_handle
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:396
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:397
#define Assert(cond, exc)
Definition: exceptions.h:1465
std::string to_string(const T &t)
Definition: patterns.h:2329
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
Definition: exceptions.h:1575
static const unsigned int invalid_unsigned_int
Definition: types.h:196
T signaling_nan()