22 #ifndef _aspect_utilities_h 23 #define _aspect_utilities_h 28 #include <deal.II/base/exceptions.h> 29 #include <deal.II/base/thread_local_storage.h> 31 #include <deal.II/base/point.h> 32 #include <deal.II/base/conditional_ostream.h> 33 #include <deal.II/base/table_indices.h> 34 #include <deal.II/base/function_lib.h> 35 #include <deal.II/dofs/dof_handler.h> 36 #include <deal.II/fe/component_mask.h> 37 #include <deal.II/lac/solver_control.h> 38 #include <deal.II/physics/notation.h> 48 template <
int dim>
class SimulatorAccess;
50 namespace GeometryModel
52 template <
int dim>
class Interface;
75 using namespace ::Utilities;
122 T &get_object_from_pool();
132 void return_object_to_pool (T &t);
135 ::Threads::ThreadLocalStorage<std::list<std::pair<T,bool>>>
object_list;
153 template <
typename T>
156 const unsigned int N,
157 const std::string &id_text);
263 Options(
const std::vector<std::string> &list_of_required_keys,
264 const std::string &property_name)
266 list_of_allowed_keys(list_of_required_keys),
267 list_of_required_keys(list_of_required_keys),
268 property_name(property_name),
269 allow_multiple_values_per_key(false),
270 allow_missing_keys(false),
271 store_values_per_key(false),
272 check_values_per_key(false),
383 const std::vector<std::string> &list_of_keys,
384 const bool expects_background_field,
385 const std::string &property_name,
386 const bool allow_multiple_values_per_key =
false,
387 const std::unique_ptr<std::vector<unsigned int>> &n_values_per_key =
nullptr,
388 const bool allow_missing_keys =
false);
403 template <
typename T>
406 const unsigned int n_rows,
407 const unsigned int n_columns,
408 const std::string &property_name);
423 std::vector<std::string>
434 const ComponentMask &component_mask);
458 const parallel::distributed::Triangulation<dim> &triangulation,
459 const Point<dim> &point,
460 const MPI_Comm mpi_communicator);
463 namespace Coordinates
472 std::array<double,dim>
486 std::array<double,dim>
506 const ::Point<dim> &position);
517 const double semi_major_axis_a,
518 const double eccentricity);
527 const double semi_major_axis_a,
528 const double eccentricity);
548 const ::Point<2> &point);
558 const ::Point<2> &point);
569 const ::Point<2> &point);
579 std::array<Tensor<1,dim>,dim-1>
588 const double rotation_angle);
598 const Tensor<1,3> &point_two);
671 bool fexists(
const std::string &filename);
686 bool fexists(
const std::string &filename,
687 const MPI_Comm comm);
717 const MPI_Comm comm);
733 const std::string &file_content,
734 const MPI_Comm comm);
750 mkdirp(std::string pathname,
const mode_t mode = 0755);
788 void set_points(
const std::vector<double> &x,
789 const std::vector<double> &y,
790 const bool cubic_spline =
true,
791 const bool monotone_spline =
false);
795 double operator() (
double x)
const;
809 std::vector<double> m_a, m_b, m_c,
m_y;
823 const unsigned int q,
824 std::vector<double> &composition_values_at_q_point);
860 std::vector<unsigned int>
893 const std::vector<double> &values,
922 template <
typename T>
924 const std::vector<double> &weights,
925 const std::vector<double> &values,
926 const std::vector<T> &derivatives,
962 const SymmetricTensor<2,dim> &dviscosities_dstrain_rate,
963 const double SPD_safety_factor);
1015 double operator() (
const double x,
const double y)
const;
1021 bool operator== (
const operation op)
const;
1073 std::array<double,dim> &get_coordinates();
1079 const std::array<double,dim> &get_coordinates()
const;
1085 std::array<double,dim-1> get_surface_coordinates()
const;
1091 double get_depth_coordinate()
const;
1125 template <
int dim,
typename VectorType>
1128 const DoFHandler<dim> &dof_handler,
1129 const unsigned int component_index,
1130 const Quadrature<dim> &quadrature,
1132 const typename DoFHandler<dim>::active_cell_iterator &,
1133 const typename std_cxx20::type_identity<std::vector<Point<dim>>>::type &,
1134 std::vector<double> &)> &
function,
1135 VectorType &vec_result);
1161 const std::string &function_name,
1162 const std::vector<SolverControl> &solver_controls,
1163 const std::exception &exc,
1164 const MPI_Comm mpi_communicator,
1165 const std::string &output_filename =
"");
1191 const std::function<Tensor<1,dim> (
const Point<dim> &)> &function_object);
1200 template <
typename T>
1202 std::vector<std::size_t>
1212 template <
typename T>
1216 const std::vector<T> &vector,
1217 const std::vector<std::size_t> &permutation_vector);
1231 std::vector<Tensor<2,3>>
1233 const std::vector<Tensor<2,3>> &rotation_matrices,
1234 const unsigned int n_output_matrices,
1235 std::mt19937 &random_number_generator);
1263 template<
typename T>
1266 for (
auto &pair : object_list.get())
1267 if (pair.second ==
false)
1273 object_list.get().emplace_back (T(),
true);
1274 return object_list.get().back().first;
1277 template<
typename T>
1280 for (
auto &pair : object_list.get())
1281 if (&pair.first == &t)
1283 pair.second =
false;
1286 AssertThrow(
false, ExcMessage(
"You are tying to return an object to the pool which has apparently not been allocated by this pool."));
1289 template<
typename T>
1293 for (
auto &pair : object_list.get())
1297 template<
typename T>
1300 t (space.get_object_from_pool())
1303 template<
typename T>
1309 template<
typename T>
1315 template <
typename T>
1319 const unsigned int N,
1320 const std::string &id_text)
1322 if (values.size() == 1)
1324 return std::vector<T> (N, values[0]);
1326 else if (values.size() == N)
1334 ExcMessage(
"Length of " + id_text +
" list must be " +
1341 return std::vector<T> ();
1347 const unsigned int q,
1348 std::vector<double> &composition_values_at_q_point)
1350 Assert(q<composition_values.size(), ExcInternalError());
1351 Assert(composition_values_at_q_point.size() > 0,
1352 ExcInternalError());
1354 for (
unsigned int k=0; k < composition_values_at_q_point.size(); ++k)
1356 Assert(composition_values[k].size() == composition_values_at_q_point.size(),
1357 ExcInternalError());
1358 composition_values_at_q_point[k] = composition_values[k][q];
1362 template <
typename T>
1364 std::vector<std::size_t>
1367 std::vector<std::size_t> p(vector.size());
1368 std::iota(p.begin(), p.end(), 0);
1369 std::sort(p.begin(), p.end(),
1370 [&](std::size_t i, std::size_t j)
1372 return vector[i] < vector[j];
1377 template <
typename T>
1381 const std::vector<T> &vector,
1382 const std::vector<std::size_t> &permutation_vector)
1384 std::vector<T> sorted_vec(vector.size());
1385 std::transform(permutation_vector.begin(), permutation_vector.end(), sorted_vec.begin(),
1403 template <
int dim,
class Iterator>
1405 SymmetricTensor<2,dim>
1406 to_symmetric_tensor(
const Iterator begin,
1409 AssertDimension(std::distance(begin, end), (SymmetricTensor<2,dim>::n_independent_components));
1412 SymmetricTensor<2,dim> output;
1414 Iterator next = begin;
1415 for (
unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1416 output[SymmetricTensor<2,dim>::unrolled_to_component_indices(i)] = *next;
1425 template <
int dim,
class Iterator>
1428 unroll_symmetric_tensor_into_array(
const SymmetricTensor<2,dim> &tensor,
1429 const Iterator begin,
1432 AssertDimension(std::distance(begin, end), (SymmetricTensor<2,dim>::n_independent_components));
1435 Iterator next = begin;
1436 for (
unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1437 *next = tensor[SymmetricTensor<2,dim>::unrolled_to_component_indices(i)];
1443 SymmetricTensor<4,3>
1444 rotate_full_stiffness_tensor(
const Tensor<2,3> &rotation_tensor,
const SymmetricTensor<4,3> &input_tensor);
1450 SymmetricTensor<2,6>
1451 rotate_voigt_stiffness_matrix(
const Tensor<2,3> &rotation_tensor,
const SymmetricTensor<2,6> &input_tensor);
1456 SymmetricTensor<2,6>
1457 rotate_kelvin_tensor(
const Tensor<2,3> &rotation_tensor,
const SymmetricTensor<2,6> &input_tensor);
1463 SymmetricTensor<2,6>
1464 to_voigt_stiffness_matrix(
const SymmetricTensor<4,3> &input_tensor);
1470 SymmetricTensor<4,3>
1471 to_full_stiffness_tensor(
const SymmetricTensor<2,6> &input_tensor);
1478 to_voigt_stiffness_vector(
const SymmetricTensor<2,6> &input_tensor);
1484 SymmetricTensor<2,6>
1485 to_voigt_stiffness_matrix(
const Tensor<1,21> &input_tensor);
1492 to_voigt_stiffness_vector(
const SymmetricTensor<4,3> &input);
1500 const Tensor<dim,dim> &levi_civita();
1504 const Tensor<3,3> &levi_civita<3>();
1518 SymmetricTensor<2,dim>
1519 consistent_deviator(
const SymmetricTensor<2,dim> &input);
1536 consistent_second_invariant_of_deviatoric_tensor(
const SymmetricTensor<2,dim> &input);
T derivative_of_weighted_p_norm_average(const double averaged_parameter, const std::vector< double > &weights, const std::vector< double > &values, const std::vector< T > &derivatives, const double p)
std::string read_and_distribute_file_content(const std::string &filename, const MPI_Comm comm)
Point< dim > convert_array_to_point(const std::array< double, dim > &array)
std::vector< double > m_y
Tensor< 1, dim > spherical_to_cartesian_vector(const Tensor< 1, dim > &spherical_vector, const ::Point< dim > &position)
Tensor< 2, 3 > compute_rotation_matrix_for_slice(const Tensor< 1, 3 > &point_one, const Tensor< 1, 3 > &point_two)
::Threads::ThreadLocalStorage< std::list< std::pair< T, bool > > > object_list
std::vector< std::string > list_of_required_keys
double weighted_p_norm_average(const std::vector< double > &weights, const std::vector< double > &values, const double p)
double distance_to_line(const std::array<::Point< 2 >, 2 > &point_list, const ::Point< 2 > &point)
std::vector< std::string > expand_dimensional_variable_names(const std::vector< std::string > &var_declarations)
std::array< double, dim > coordinates
void collect_and_write_file_content(const std::string &filename, const std::string &file_content, const MPI_Comm comm)
double compute_spd_factor(const double eta, const SymmetricTensor< 2, dim > &strain_rate, const SymmetricTensor< 2, dim > &dviscosities_dstrain_rate, const double SPD_safety_factor)
Table< 2, T > parse_input_table(const std::string &input_string, const unsigned int n_rows, const unsigned int n_columns, const std::string &property_name)
std::pair< double, double > real_spherical_harmonic(unsigned int l, unsigned int m, double theta, double phi)
std::vector< double > m_x
std::string expand_ASPECT_SOURCE_DIR(const std::string &location)
Tensor< 2, 3 > zxz_euler_angles_to_rotation_matrix(const double phi1, const double theta, const double phi2)
std::array< Tensor< 1, dim >, dim-1 > orthogonal_vectors(const Tensor< 1, dim > &v)
void project_cellwise(const Mapping< dim > &mapping, const DoFHandler< dim > &dof_handler, const unsigned int component_index, const Quadrature< dim > &quadrature, const std::function< void(const typename DoFHandler< dim >::active_cell_iterator &, const typename std_cxx20::type_identity< std::vector< Point< dim >>>::type &, std::vector< double > &)> &function, VectorType &vec_result)
std::vector< Tensor< 2, 3 > > rotation_matrices_random_draw_volume_weighting(const std::vector< double > &volume_fractions, const std::vector< Tensor< 2, 3 >> &rotation_matrices, const unsigned int n_output_matrices, std::mt19937 &random_number_generator)
std::string to_string(const Newton::Parameters::Stabilization preconditioner_stabilization)
std::array< double, dim > WGS84_coordinates(const ::Point< dim > &position)
::Point< 3 > ellipsoidal_to_cartesian_coordinates(const std::array< double, 3 > &phi_theta_d, const double semi_major_axis_a, const double eccentricity)
bool point_is_in_triangulation(const Mapping< dim > &mapping, const parallel::distributed::Triangulation< dim > &triangulation, const Point< dim > &point, const MPI_Comm mpi_communicator)
void throw_linear_solver_failure_exception(const std::string &solver_name, const std::string &function_name, const std::vector< SolverControl > &solver_controls, const std::exception &exc, const MPI_Comm mpi_communicator, const std::string &output_filename="")
bool polygon_contains_point(const std::vector< Point< 2 >> &point_list, const ::Point< 2 > &point)
bool check_values_per_key
int mkdirp(std::string pathname, const mode_t mode=0755)
Utilities::Coordinates::CoordinateSystem coordinate_system
void create_directory(const std::string &pathname, const MPI_Comm comm, const bool silent)
::Point< dim > spherical_to_cartesian_coordinates(const std::array< double, dim > &scoord)
std::string do_grouping() const override
std::vector< T > possibly_extend_from_1_to_N(const std::vector< T > &values, const unsigned int N, const std::string &id_text)
std::array< double, 3 > cartesian_to_ellipsoidal_coordinates(const ::Point< 3 > &position, const double semi_major_axis_a, const double eccentricity)
std::string property_name
Options(const std::vector< std::string > &list_of_required_keys, const std::string &property_name)
std::array< double, dim > convert_point_to_array(const Point< dim > &point)
std::vector< bool > string_to_bool(const std::vector< std::string > &s)
std::vector< Point< dim > > get_unit_support_points(const SimulatorAccess< dim > &simulator_access)
std::vector< T > apply_permutation(const std::vector< T > &vector, const std::vector< std::size_t > &permutation_vector)
IndexSet extract_locally_active_dofs_with_component(const DoFHandler< dim > &dof_handler, const ComponentMask &component_mask)
std::vector< unsigned int > n_values_per_key
std::vector< unsigned int > string_to_unsigned_int(const std::vector< std::string > &s)
DEAL_II_DEPRECATED std::vector< double > parse_map_to_double_array(const std::string &key_value_map, const std::vector< std::string > &list_of_keys, const bool expects_background_field, const std::string &property_name, const bool allow_multiple_values_per_key=false, const std::unique_ptr< std::vector< unsigned int >> &n_values_per_key=nullptr, const bool allow_missing_keys=false)
double wrap_angle(const double angle)
bool fexists(const std::string &filename, const MPI_Comm comm)
std::vector< Operator > create_model_operator_list(const std::vector< std::string > &operator_names)
bool store_values_per_key
double signed_distance_to_polygon(const std::vector< Point< 2 >> &point_list, const ::Point< 2 > &point)
std::string parenthesize_if_nonempty(const std::string &s)
std::array< double, 3 > zxz_euler_angles_from_rotation_matrix(const Tensor< 2, 3 > &rotation_matrix)
void extract_composition_values_at_q_point(const std::vector< std::vector< double >> &composition_values, const unsigned int q, std::vector< double > &composition_values_at_q_point)
const std::string get_model_operator_options()
char do_thousands_sep() const override
void return_object_to_pool(T &t)
std::vector< std::string > list_of_allowed_keys
bool filename_is_url(const std::string &filename)
bool allow_multiple_values_per_key
SymmetricTensor< 2, dim > nth_basis_for_symmetric_tensors(const unsigned int k)
std::vector< std::size_t > compute_sorting_permutation(const std::vector< T > &vector)
CoordinateSystem string_to_coordinate_system(const std::string &)
std::array< double, dim > cartesian_to_spherical_coordinates(const ::Point< dim > &position)
bool has_unique_entries(const std::vector< std::string > &strings)
Tensor< 2, 3 > rotation_matrix_from_axis(const Tensor< 1, 3 > &rotation_axis, const double rotation_angle)