ASPECT
utilities.h
Go to the documentation of this file.
1 // ------------------------------------------------------
2 //
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 //
5 // SPDX-FileCopyrightText: Copyright (C) 2014-2026 by the ASPECT authors.
6 //
7 // This file is part of ASPECT.
8 //
9 // Detailed license information governing the source code and
10 // contributions can be found in the folder LICENSES and in
11 // LICENSE and CONTRIBUTING.md at the top level directory.
12 //
13 // ------------------------------------------------------
14 
15 
16 #ifndef _aspect_utilities_h
17 #define _aspect_utilities_h
18 
19 #include <aspect/global.h>
20 
21 #include <array>
24 #include <random>
25 #include <deal.II/base/point.h>
33 
35 #include <aspect/structured_data.h>
36 
37 #include <mpi.h>
38 
39 
40 namespace aspect
41 {
42  template <int dim> class SimulatorAccess;
43  namespace MaterialModel
44  {
45  template <int dim> class MeltOutputs;
46  }
47 
48  namespace GeometryModel
49  {
50  template <int dim> class Interface;
51  }
52 
57  namespace Utilities
58  {
73  using namespace ::Utilities;
74 
75 
86  template <typename T>
88  {
89  public:
95  {
96  public:
100  ScopedScratchObject (const ScratchSpace<T> &/*space_*/);
101 
106 
110  operator T &() const;
111 
112  private:
114  T &t;
115  };
116 
120  T &get_object_from_pool() const;
121 
125  ~ScratchSpace() = default;
126 
130  void return_object_to_pool (T &t) const;
131 
132  private:
133  mutable ::Threads::ThreadLocalStorage<std::list<std::pair<T,bool>>> object_list;
134  };
135 
149  template <typename T>
150  std::vector<T>
151  possibly_extend_from_1_to_N (const std::vector<T> &values,
152  const unsigned int N,
153  const std::string &id_text);
154 
162  namespace MapParsing
163  {
168  struct Options
169  {
179  std::vector<std::string> list_of_allowed_keys;
180 
188  std::vector<std::string> list_of_required_keys;
189 
195  std::string property_name;
196 
205 
206  /*
207  * Whether to allow for some keys in list_of_required_keys to be
208  * not set to any values, i.e. they do not appear at all.
209  * This also allows a completely empty map.
210  */
212 
222 
232 
241  std::vector<unsigned int> n_values_per_key;
242 
247  Options() = delete;
248 
259  Options(const std::vector<std::string> &list_of_required_keys,
260  const std::string &property_name)
261  :
262  list_of_allowed_keys(list_of_required_keys),
263  list_of_required_keys(list_of_required_keys),
264  property_name(property_name),
265  allow_multiple_values_per_key(false),
266  allow_missing_keys(false),
267  store_values_per_key(false),
268  check_values_per_key(false),
269  n_values_per_key()
270  {}
271  };
272 
298  std::vector<double>
299  parse_map_to_double_array(const std::string &input_string,
300  Options &options);
301  }
302 
377  std::vector<double>
378  parse_map_to_double_array (const std::string &key_value_map,
379  const std::vector<std::string> &list_of_keys,
380  const bool expects_background_field,
381  const std::string &property_name,
382  const bool allow_multiple_values_per_key = false,
383  const std::unique_ptr<std::vector<unsigned int>> &n_values_per_key = nullptr,
384  const bool allow_missing_keys = false);
385 
399  template <typename T>
400  Table<2,T>
401  parse_input_table (const std::string &input_string,
402  const unsigned int n_rows,
403  const unsigned int n_columns,
404  const std::string &property_name);
405 
418  template <int dim>
419  std::vector<std::string>
420  expand_dimensional_variable_names (const std::vector<std::string> &var_declarations);
421 
422 
423  template <int dim>
427  const std::shared_ptr<const MaterialModel::MeltOutputs<dim>> fluid_out,
428  const Tensor<1, dim> &solid_velocity,
429  const Tensor<1, dim> &gravity,
430  const unsigned int porosity_idx,
431  const unsigned int q,
432  const bool use_pressure_gradient_for_darcy_field);
439  template <int dim>
441  const ComponentMask &component_mask);
442 
452  template <int dim>
453  std::vector<Point<dim>> get_unit_support_points(const SimulatorAccess<dim> &simulator_access);
454 
455 
456 
462  template <int dim>
463  bool
465  const parallel::distributed::Triangulation<dim> &triangulation,
466  const Point<dim> &point,
467  const MPI_Comm mpi_communicator);
468 
469 
470  namespace Coordinates
471  {
472 
478  template <int dim>
479  std::array<double,dim>
480  WGS84_coordinates(const ::Point<dim> &position);
481 
492  template <int dim>
493  std::array<double,dim>
494  cartesian_to_spherical_coordinates(const ::Point<dim> &position);
495 
501  template <int dim>
503  spherical_to_cartesian_coordinates(const std::array<double,dim> &scoord);
504 
510  template <int dim>
512  spherical_to_cartesian_vector(const Tensor<1,dim> &spherical_vector,
513  const ::Point<dim> &position);
514 
515 
521  template <int dim>
522  std::array<double,3>
523  cartesian_to_ellipsoidal_coordinates(const ::Point<3> &position,
524  const double semi_major_axis_a,
525  const double eccentricity);
526 
531  template <int dim>
532  ::Point<3>
533  ellipsoidal_to_cartesian_coordinates(const std::array<double,3> &phi_theta_d,
534  const double semi_major_axis_a,
535  const double eccentricity);
536 
537 
544  string_to_coordinate_system (const std::string &);
545  }
546 
547 
552  template <int dim>
553  bool
554  polygon_contains_point(const std::vector<Point<2>> &point_list,
555  const ::Point<2> &point);
556 
562  template <int dim>
563  double
564  signed_distance_to_polygon(const std::vector<Point<2>> &point_list,
565  const ::Point<2> &point);
566 
567 
574  double
575  distance_to_line(const std::array<::Point<2>,2> &point_list,
576  const ::Point<2> &point);
577 
585  template <int dim>
586  std::array<Tensor<1,dim>,dim-1>
588 
594  rotation_matrix_from_axis (const Tensor<1,3> &rotation_axis,
595  const double rotation_angle);
596 
605  const Tensor<1,3> &point_two);
606 
643  std::pair<double,double> real_spherical_harmonic( unsigned int l, // degree
644  unsigned int m, // order
645  double theta, // colatitude (radians)
646  double phi ); // longitude (radians)
647 
651  struct ThousandSep : std::numpunct<char>
652  {
653  protected:
654  char do_thousands_sep() const override
655  {
656  return ',';
657  }
658 
659  std::string do_grouping() const override
660  {
661  return "\003"; // groups of 3 digits (this string is in octal format)
662  }
663 
664  };
665 
678  bool fexists(const std::string &filename);
679 
693  bool fexists(const std::string &filename,
694  const MPI_Comm comm);
695 
701  bool filename_is_url(const std::string &filename);
702 
722  std::string
723  read_and_distribute_file_content(const std::string &filename,
724  const MPI_Comm comm);
725 
738  void
739  collect_and_write_file_content(const std::string &filename,
740  const std::string &file_content,
741  const MPI_Comm comm);
742 
756  int
757  mkdirp(std::string pathname, const mode_t mode = 0755);
758 
770  void create_directory(const std::string &pathname,
771  const MPI_Comm comm,
772  const bool silent);
773 
778  namespace tk
779  {
783  class spline
784  {
785  public:
795  void set_points(const std::vector<double> &x,
796  const std::vector<double> &y,
797  const bool cubic_spline = true,
798  const bool monotone_spline = false);
802  double operator() (double x) const;
803 
804  private:
808  std::vector<double> m_x;
809 
816  std::vector<double> m_a, m_b, m_c, m_y;
817  };
818  }
819 
827  inline
828  void
829  extract_composition_values_at_q_point (const std::vector<std::vector<double>> &composition_values,
830  const unsigned int q,
831  std::vector<double> &composition_values_at_q_point);
832 
837  std::string
838  expand_ASPECT_SOURCE_DIR (const std::string &location);
839 
844  std::string parenthesize_if_nonempty (const std::string &s);
845 
849  bool
850  string_to_bool(const std::string &s);
851 
855  std::vector<bool>
856  string_to_bool(const std::vector<std::string> &s);
857 
861  unsigned int
862  string_to_unsigned_int(const std::string &s);
863 
867  std::vector<unsigned int>
868  string_to_unsigned_int(const std::vector<std::string> &s);
869 
874  bool has_unique_entries (const std::vector<std::string> &strings);
875 
876 
877 
899  double weighted_p_norm_average (const std::vector<double> &weights,
900  const std::vector<double> &values,
901  const double p);
902 
903 
929  template <typename T>
930  T derivative_of_weighted_p_norm_average (const double averaged_parameter,
931  const std::vector<double> &weights,
932  const std::vector<double> &values,
933  const std::vector<T> &derivatives,
934  const double p);
966  template <int dim>
967  double compute_spd_factor(const double eta,
969  const SymmetricTensor<2,dim> &dviscosities_dstrain_rate,
970  const double SPD_safety_factor);
971 
975  template <int dim>
976  Point<dim> convert_array_to_point(const std::array<double,dim> &array);
977 
981  template <int dim>
982  std::array<double,dim> convert_point_to_array(const Point<dim> &point);
983 
991  class Operator
992  {
993  public:
998  {
1004  replace_if_valid
1005  };
1006 
1011  Operator();
1012 
1016  Operator(const operation op);
1017 
1022  double operator() (const double x, const double y) const;
1023 
1028  bool operator== (const operation op) const;
1029 
1030  private:
1035  };
1036 
1041  std::vector<Operator> create_model_operator_list(const std::vector<std::string> &operator_names);
1042 
1046  const std::string get_model_operator_options();
1047 
1053  template <int dim>
1055 
1059  template <int dim>
1061  {
1062  public:
1066  NaturalCoordinate(Point<dim> &position,
1067  const GeometryModel::Interface<dim> &geometry_model);
1068 
1073  NaturalCoordinate(const std::array<double, dim> &coord,
1074  const Utilities::Coordinates::CoordinateSystem &coord_system);
1075 
1080  std::array<double,dim> &get_coordinates();
1081 
1086  const std::array<double,dim> &get_coordinates() const;
1087 
1092  std::array<double,dim-1> get_surface_coordinates() const;
1093 
1098  double get_depth_coordinate() const;
1099 
1100  private:
1106 
1110  std::array<double,dim> coordinates;
1111  };
1112 
1113 
1132  template <int dim, typename VectorType>
1133  void
1134  project_cellwise(const Mapping<dim> &mapping,
1135  const DoFHandler<dim> &dof_handler,
1136  const unsigned int component_index,
1137  const Quadrature<dim> &quadrature,
1138  const std::function<void(
1139  const typename DoFHandler<dim>::active_cell_iterator &,
1140  const typename std_cxx20::type_identity<std::vector<Point<dim>>>::type &,
1141  std::vector<double> &)> &function,
1142  VectorType &vec_result);
1143 
1167  void throw_linear_solver_failure_exception(const std::string &solver_name,
1168  const std::string &function_name,
1169  const std::vector<SolverControl> &solver_controls,
1170  const std::exception &exc,
1171  const MPI_Comm mpi_communicator,
1172  const std::string &output_filename = "");
1173 
1184  template <int dim>
1186  {
1187  public:
1197  VectorFunctionFromVelocityFunctionObject (const unsigned int n_components,
1198  const std::function<Tensor<1,dim> (const Point<dim> &)> &function_object);
1199  };
1200 
1207  template <typename T>
1208  inline
1209  std::vector<std::size_t>
1210  compute_sorting_permutation(const std::vector<T> &vector);
1211 
1219  template <typename T>
1220  inline
1221  std::vector<T>
1223  const std::vector<T> &vector,
1224  const std::vector<std::size_t> &permutation_vector);
1225 
1238  std::vector<Tensor<2,3>>
1239  rotation_matrices_random_draw_volume_weighting(const std::vector<double> &volume_fractions,
1240  const std::vector<Tensor<2,3>> &rotation_matrices,
1241  const unsigned int n_output_matrices,
1242  std::mt19937 &random_number_generator);
1243 
1247  double wrap_angle(const double angle);
1248 
1253  std::array<double,3> zxz_euler_angles_from_rotation_matrix(const Tensor<2,3> &rotation_matrix);
1254 
1260  const double theta,
1261  const double phi2);
1262 
1263  }
1264 
1265 
1266 // inline implementations:
1267 #ifndef DOXYGEN
1268  namespace Utilities
1269  {
1270  template<typename T>
1272  {
1273  for (auto &pair : object_list.get())
1274  if (pair.second == false)
1275  {
1276  pair.second = true;
1277  return pair.first;
1278  }
1279 
1280  object_list.get().emplace_back (T(), true);
1281  return object_list.get().back().first;
1282  }
1283 
1284  template<typename T>
1285  void ScratchSpace<T>::return_object_to_pool (T &t) const
1286  {
1287  for (auto &pair : object_list.get())
1288  if (&pair.first == &t)
1289  {
1290  pair.second = false;
1291  return;
1292  }
1293  AssertThrow(false, ExcMessage("You are tying to return an object to the pool which has apparently not been allocated by this pool."));
1294  }
1295 
1296  template<typename T>
1298  : space (space_),
1299  t (space.get_object_from_pool())
1300  {}
1301 
1302  template<typename T>
1304  {
1305  space.return_object_to_pool(t);
1306  }
1307 
1308  template<typename T>
1310  {
1311  return t;
1312  }
1313 
1314  template <typename T>
1315  inline
1316  std::vector<T>
1317  possibly_extend_from_1_to_N (const std::vector<T> &values,
1318  const unsigned int N,
1319  const std::string &id_text)
1320  {
1321  if (values.size() == 1)
1322  {
1323  return std::vector<T> (N, values[0]);
1324  }
1325  else if (values.size() == N)
1326  {
1327  return values;
1328  }
1329  else
1330  {
1331  // Non-specified behavior
1332  AssertThrow(false,
1333  ExcMessage("Length of " + id_text + " list must be " +
1334  "either one or " + Utilities::to_string(N) +
1335  ". Currently it is " + Utilities::to_string(values.size()) + "."));
1336  }
1337 
1338  // This should never happen, but return an empty vector so the compiler
1339  // will be happy
1340  return std::vector<T> ();
1341  }
1342 
1343  inline
1344  void
1345  extract_composition_values_at_q_point (const std::vector<std::vector<double>> &composition_values,
1346  const unsigned int q,
1347  std::vector<double> &composition_values_at_q_point)
1348  {
1349  Assert(q<composition_values.size(), ExcInternalError());
1350  Assert(composition_values_at_q_point.size() > 0,
1351  ExcInternalError());
1352 
1353  for (unsigned int k=0; k < composition_values_at_q_point.size(); ++k)
1354  {
1355  Assert(composition_values[k].size() == composition_values_at_q_point.size(),
1356  ExcInternalError());
1357  composition_values_at_q_point[k] = composition_values[k][q];
1358  }
1359  }
1360 
1361  template <typename T>
1362  inline
1363  std::vector<std::size_t>
1364  compute_sorting_permutation(const std::vector<T> &vector)
1365  {
1366  std::vector<std::size_t> p(vector.size());
1367  std::iota(p.begin(), p.end(), 0);
1368  std::sort(p.begin(), p.end(),
1369  [&](std::size_t i, std::size_t j)
1370  {
1371  return vector[i] < vector[j];
1372  });
1373  return p;
1374  }
1375 
1376  template <typename T>
1377  inline
1378  std::vector<T>
1380  const std::vector<T> &vector,
1381  const std::vector<std::size_t> &permutation_vector)
1382  {
1383  std::vector<T> sorted_vec(vector.size());
1384  std::transform(permutation_vector.begin(), permutation_vector.end(), sorted_vec.begin(),
1385  [&](std::size_t i)
1386  {
1387  return vector[i];
1388  });
1389  return sorted_vec;
1390  }
1391 
1395  namespace Tensors
1396  {
1402  template <int dim, class Iterator>
1403  inline
1405  to_symmetric_tensor(const Iterator begin,
1406  const Iterator end)
1407  {
1409  (void) end;
1410 
1411  SymmetricTensor<2,dim> output;
1412 
1413  Iterator next = begin;
1414  for (unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1416 
1417  return output;
1418  }
1419 
1424  template <int dim, class Iterator>
1425  inline
1426  void
1427  unroll_symmetric_tensor_into_array(const SymmetricTensor<2,dim> &tensor,
1428  const Iterator begin,
1429  const Iterator end)
1430  {
1432  (void) end;
1433 
1434  Iterator next = begin;
1435  for (unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1437  }
1438 
1443  rotate_full_stiffness_tensor(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<4,3> &input_tensor);
1444 
1450  rotate_voigt_stiffness_matrix(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<2,6> &input_tensor);
1451 
1456  rotate_kelvin_tensor(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<2,6> &input_tensor);
1457 
1463  to_voigt_stiffness_matrix(const SymmetricTensor<4,3> &input_tensor);
1464 
1470  to_full_stiffness_tensor(const SymmetricTensor<2,6> &input_tensor);
1471 
1476  Tensor<1,21>
1477  to_voigt_stiffness_vector(const SymmetricTensor<2,6> &input_tensor);
1478 
1484  to_voigt_stiffness_matrix(const Tensor<1,21> &input_tensor);
1485 
1490  Tensor<1,21>
1491  to_voigt_stiffness_vector(const SymmetricTensor<4,3> &input);
1492 
1493 
1498  template <int dim>
1499  const Tensor<dim,dim> &levi_civita();
1500 
1501  // Declare the existence of a specialization:
1502  template <>
1503  const Tensor<3,3> &levi_civita<3>();
1504 
1516  template <int dim>
1518  consistent_deviator(const SymmetricTensor<2,dim> &input);
1519 
1533  template <int dim>
1534  double
1535  consistent_second_invariant_of_deviatoric_tensor(const SymmetricTensor<2,dim> &input);
1536  }
1537 
1538  namespace Quaternions
1539  {
1558  std::array<double,4> rotation_matrix_to_quaternion(const Tensor<2,3> &rotation_matrix,
1559  const double tolerance=1e-12);
1560 
1567  Tensor<2,3> quaternion_to_rotation_matrix(const std::array<double,4> &quaternion);
1568  }
1569 
1570  }
1571 #endif
1572 }
1573 
1574 #endif
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
Definition: utilities.h:816
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)
#define AssertDimension(dim1, dim2)
std::vector< std::string > list_of_required_keys
Definition: utilities.h:188
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
Definition: utilities.h:1110
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
Definition: utilities.h:808
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::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)
void return_object_to_pool(T &t) const
int mkdirp(std::string pathname, const mode_t mode=0755)
Utilities::Coordinates::CoordinateSystem coordinate_system
Definition: utilities.h:1105
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)
#define AssertThrow(cond, exc)
std::string do_grouping() const override
Definition: utilities.h:659
std::vector< T > possibly_extend_from_1_to_N(const std::vector< T > &values, const unsigned int N, const std::string &id_text)
std::size_t size
std::array< double, 3 > cartesian_to_ellipsoidal_coordinates(const ::Point< 3 > &position, const double semi_major_axis_a, const double eccentricity)
std::string to_string(const number value, const unsigned int digits=numbers::invalid_unsigned_int)
Options(const std::vector< std::string > &list_of_required_keys, const std::string &property_name)
Definition: utilities.h:259
std::array< double, dim > convert_point_to_array(const Point< dim > &point)
static ::ExceptionBase & ExcInternalError()
Tensor< 1, dim > calculate_approximate_darcy_velocity(const MaterialModel::MaterialModelInputs< dim > &in, const MaterialModel::MaterialModelOutputs< dim > &out, const std::shared_ptr< const MaterialModel::MeltOutputs< dim >> fluid_out, const Tensor< 1, dim > &solid_velocity, const Tensor< 1, dim > &gravity, const unsigned int porosity_idx, const unsigned int q, const bool use_pressure_gradient_for_darcy_field)
std::vector< bool > string_to_bool(const std::vector< std::string > &s)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
std::vector< Point< dim > > get_unit_support_points(const SimulatorAccess< dim > &simulator_access)
#define Assert(cond, exc)
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
Definition: utilities.h:241
*  *  iterator begin()
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)
mutable ::Threads::ThreadLocalStorage< std::list< std::pair< T, bool > > > object_list
Definition: utilities.h:133
double wrap_angle(const double angle)
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
bool fexists(const std::string &filename, const MPI_Comm comm)
std::vector< Operator > create_model_operator_list(const std::vector< std::string > &operator_names)
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)
static ::ExceptionBase & ExcMessage(std::string arg1)
const std::string get_model_operator_options()
*braid_SplitCommworld & comm
char do_thousands_sep() const override
Definition: utilities.h:654
std::vector< std::string > list_of_allowed_keys
Definition: utilities.h:179
bool filename_is_url(const std::string &filename)
*  iterator end()
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)
#define DEAL_II_DEPRECATED
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)