120 const dealii::Point<dim, VectorizedArrayType> &location)
122 Assert(dim == 2 or dim == 3, dealii::ExcMessage(
"Invalid dimension!"));
124 dealii::Point<dim, VectorizedArrayType> vectorized_particle_location;
125 for (
auto i = 0; i < dim; ++i)
126 vectorized_particle_location[i] = VectorizedArrayType(particle.
get_location()[i]);
128 dealii::Tensor<1, dim, VectorizedArrayType> distance_to_center =
129 location - vectorized_particle_location;
131 dealii::Tensor<1, dim, VectorizedArrayType> velocity;
132 for (
unsigned int i = 0; i < dim; ++i)
135 dealii::Tensor<1, dim, VectorizedArrayType> angular_velocity;
136 for (
unsigned int i = 0; i < axial_dim<dim>; ++i)
139 if constexpr (dim == 2)
141 return dealii::cross_product_2d(angular_velocity[0] * distance_to_center) + velocity;
143 if constexpr (dim == 3)
145 return velocity + dealii::cross_product_3d(angular_velocity, distance_to_center);
147 AssertThrow(
false, dealii::ExcInternalError());
170 enum PropertyCSVColumns
185 const auto read_values_from_line = [](
const std::string &line)
186 -> std::optional<std::pair<std::vector<number>, dealii::Point<dim, number>>> {
187 constexpr unsigned int n_expected_columns = dim + 2;
189 std::vector<std::string> parsed_strings;
190 parsed_strings.reserve(n_expected_columns);
192 std::istringstream data_string(line);
195 while (std::getline(data_string, token,
','))
197 parsed_strings.emplace_back(std::move(token));
203 if (parsed_strings.size() == 0 or
204 (parsed_strings.size() == 1 and (parsed_strings[0] ==
"\r" or parsed_strings[0] ==
"\n" or
205 parsed_strings[0] ==
"\t" or parsed_strings[0].empty())))
211 AssertThrow(parsed_strings.size() == n_expected_columns,
212 ExcInvalidCSVInputColumns(n_expected_columns, parsed_strings.size()));
215 std::vector<number> parsed_values;
216 parsed_values.reserve(n_expected_columns);
217 for (std::string &str : parsed_strings)
222 char last_char = str.back();
224 if (last_char ==
'\n' or last_char ==
'\r' or last_char ==
'\t')
230 std::size_t characters_processed = 0;
231 parsed_values.emplace_back(std::stod(str, &characters_processed));
232 AssertThrow(characters_processed == str.size(), ExcFailedToConvertStringToNumber(str));
236 dealii::Point<dim, number> particle_location;
237 for (
unsigned int i = 0; i < dim; ++i)
238 particle_location[i] = parsed_values[PropertyCSVColumns::position + i];
247 dealii::numbers::invalid_unsigned_int );
250 parsed_values[PropertyCSVColumns::radius],
251 parsed_values[PropertyCSVColumns::density]);
253 return std::optional<std::pair<std::vector<number>, dealii::Point<dim, number>>>(
254 {particle_properties, particle_location});
257 std::vector<dealii::Point<dim, number>> particle_locations;
258 std::vector<std::vector<number>> particle_properties;
260 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0)
262 std::fstream file(filename);
263 AssertThrow(!(file.fail()),
264 dealii::ExcMessage(
"Unable to open particle data file \"" + filename +
267 std::getline(file, line);
269 const auto throw_error_with_line_info = [&](
const unsigned int line_number,
270 const std::string &error_message) {
272 dealii::ExcMessage(
"Error parsing line " + std::to_string(line_number) +
273 " in particle data file: " + error_message));
276 unsigned int line_number = 2;
277 while (std::getline(file, line))
281 const std::optional<std::pair<std::vector<number>, dealii::Point<dim, number>>>
282 obstacle_properties = read_values_from_line(line);
283 if (obstacle_properties.has_value())
285 particle_properties.push_back(obstacle_properties.value().first);
286 particle_locations.push_back(obstacle_properties.value().second);
290 catch (
const ExcInvalidCSVInputColumns &e)
292 throw_error_with_line_info(line_number, e.what());
294 catch (
const ExcFailedToConvertStringToNumber &e)
296 throw_error_with_line_info(line_number, e.what());
301 return {std::move(particle_locations), std::move(particle_properties)};
Definition particle_accessor.hpp:20
number & angular_velocity(const unsigned int dimension)
Definition particle_accessor.hpp:455
dealii::Point< dim, number > & get_location()
Definition particle_accessor.hpp:376
dealii::Tensor< 1, dim, number > linear_velocity() const
Definition particle_accessor.hpp:390
number & get_property(const typename SphericalParticle< dim, number >::Properties property)
Definition particle_accessor.hpp:628
Class representing a finite-sized spherical particle, intended for use with the obstacle field class.
Definition particle.hpp:35