ASPECT
utilities.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2014 - 2024 by the authors of the ASPECT code.
3 
4  This file is part of ASPECT.
5 
6  ASPECT is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
11  ASPECT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with ASPECT; see the file LICENSE. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #ifndef _aspect_utilities_h
23 #define _aspect_utilities_h
24 
25 #include <aspect/global.h>
26 
27 #include <array>
28 #include <deal.II/base/exceptions.h>
29 #include <deal.II/base/thread_local_storage.h>
30 #include <random>
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>
39 
41 #include <aspect/structured_data.h>
42 
43 #include <mpi.h>
44 
45 
46 namespace aspect
47 {
48  template <int dim> class SimulatorAccess;
49 
50  namespace GeometryModel
51  {
52  template <int dim> class Interface;
53  }
54 
59  namespace Utilities
60  {
75  using namespace ::Utilities;
76 
77 
88  template <typename T>
90  {
91  public:
97  {
98  public:
102  ScopedScratchObject (ScratchSpace<T> &/*space_*/);
103 
108 
112  operator T &();
113 
114  private:
116  T &t;
117  };
118 
122  T &get_object_from_pool();
123 
127  ~ScratchSpace();
128 
132  void return_object_to_pool (T &t);
133 
134  private:
135  ::Threads::ThreadLocalStorage<std::list<std::pair<T,bool>>> object_list;
136  };
137 
138  //template<typename T> thread_local std::list<std::pair<T,bool>> ScratchSpace<T>::object_list = {};
139 
153  template <typename T>
154  std::vector<T>
155  possibly_extend_from_1_to_N (const std::vector<T> &values,
156  const unsigned int N,
157  const std::string &id_text);
158 
166  namespace MapParsing
167  {
172  struct Options
173  {
183  std::vector<std::string> list_of_allowed_keys;
184 
192  std::vector<std::string> list_of_required_keys;
193 
199  std::string property_name;
200 
209 
210  /*
211  * Whether to allow for some keys in list_of_required_keys to be
212  * not set to any values, i.e. they do not appear at all.
213  * This also allows a completely empty map.
214  */
216 
226 
236 
245  std::vector<unsigned int> n_values_per_key;
246 
251  Options() = delete;
252 
263  Options(const std::vector<std::string> &list_of_required_keys,
264  const std::string &property_name)
265  :
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),
273  n_values_per_key()
274  {}
275  };
276 
302  std::vector<double>
303  parse_map_to_double_array(const std::string &input_string,
304  Options &options);
305  }
306 
380  DEAL_II_DEPRECATED
381  std::vector<double>
382  parse_map_to_double_array (const std::string &key_value_map,
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);
389 
403  template <typename T>
404  Table<2,T>
405  parse_input_table (const std::string &input_string,
406  const unsigned int n_rows,
407  const unsigned int n_columns,
408  const std::string &property_name);
409 
422  template <int dim>
423  std::vector<std::string>
424  expand_dimensional_variable_names (const std::vector<std::string> &var_declarations);
425 
432  template <int dim>
433  IndexSet extract_locally_active_dofs_with_component(const DoFHandler<dim> &dof_handler,
434  const ComponentMask &component_mask);
435 
445  template <int dim>
446  std::vector<Point<dim>> get_unit_support_points(const SimulatorAccess<dim> &simulator_access);
447 
448 
449 
455  template <int dim>
456  bool
457  point_is_in_triangulation(const Mapping<dim> &mapping,
458  const parallel::distributed::Triangulation<dim> &triangulation,
459  const Point<dim> &point,
460  const MPI_Comm mpi_communicator);
461 
462 
463  namespace Coordinates
464  {
465 
471  template <int dim>
472  std::array<double,dim>
473  WGS84_coordinates(const ::Point<dim> &position);
474 
485  template <int dim>
486  std::array<double,dim>
487  cartesian_to_spherical_coordinates(const ::Point<dim> &position);
488 
494  template <int dim>
495  ::Point<dim>
496  spherical_to_cartesian_coordinates(const std::array<double,dim> &scoord);
497 
503  template <int dim>
504  Tensor<1,dim>
505  spherical_to_cartesian_vector(const Tensor<1,dim> &spherical_vector,
506  const ::Point<dim> &position);
507 
508 
514  template <int dim>
515  std::array<double,3>
516  cartesian_to_ellipsoidal_coordinates(const ::Point<3> &position,
517  const double semi_major_axis_a,
518  const double eccentricity);
519 
524  template <int dim>
525  ::Point<3>
526  ellipsoidal_to_cartesian_coordinates(const std::array<double,3> &phi_theta_d,
527  const double semi_major_axis_a,
528  const double eccentricity);
529 
530 
537  string_to_coordinate_system (const std::string &);
538  }
539 
540 
545  template <int dim>
546  bool
547  polygon_contains_point(const std::vector<Point<2>> &point_list,
548  const ::Point<2> &point);
549 
555  template <int dim>
556  double
557  signed_distance_to_polygon(const std::vector<Point<2>> &point_list,
558  const ::Point<2> &point);
559 
560 
567  double
568  distance_to_line(const std::array<::Point<2>,2> &point_list,
569  const ::Point<2> &point);
570 
578  template <int dim>
579  std::array<Tensor<1,dim>,dim-1>
580  orthogonal_vectors (const Tensor<1,dim> &v);
581 
586  Tensor<2,3>
587  rotation_matrix_from_axis (const Tensor<1,3> &rotation_axis,
588  const double rotation_angle);
589 
596  Tensor<2,3>
597  compute_rotation_matrix_for_slice (const Tensor<1,3> &point_one,
598  const Tensor<1,3> &point_two);
599 
636  std::pair<double,double> real_spherical_harmonic( unsigned int l, // degree
637  unsigned int m, // order
638  double theta, // colatitude (radians)
639  double phi ); // longitude (radians)
640 
644  struct ThousandSep : std::numpunct<char>
645  {
646  protected:
647  char do_thousands_sep() const override
648  {
649  return ',';
650  }
651 
652  std::string do_grouping() const override
653  {
654  return "\003"; // groups of 3 digits (this string is in octal format)
655  }
656 
657  };
658 
671  bool fexists(const std::string &filename);
672 
686  bool fexists(const std::string &filename,
687  const MPI_Comm comm);
688 
694  bool filename_is_url(const std::string &filename);
695 
715  std::string
716  read_and_distribute_file_content(const std::string &filename,
717  const MPI_Comm comm);
718 
731  void
732  collect_and_write_file_content(const std::string &filename,
733  const std::string &file_content,
734  const MPI_Comm comm);
735 
749  int
750  mkdirp(std::string pathname, const mode_t mode = 0755);
751 
763  void create_directory(const std::string &pathname,
764  const MPI_Comm comm,
765  const bool silent);
766 
771  namespace tk
772  {
776  class spline
777  {
778  public:
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;
796 
797  private:
801  std::vector<double> m_x;
802 
809  std::vector<double> m_a, m_b, m_c, m_y;
810  };
811  }
812 
820  inline
821  void
822  extract_composition_values_at_q_point (const std::vector<std::vector<double>> &composition_values,
823  const unsigned int q,
824  std::vector<double> &composition_values_at_q_point);
825 
830  std::string
831  expand_ASPECT_SOURCE_DIR (const std::string &location);
832 
837  std::string parenthesize_if_nonempty (const std::string &s);
838 
842  bool
843  string_to_bool(const std::string &s);
844 
848  std::vector<bool>
849  string_to_bool(const std::vector<std::string> &s);
850 
854  unsigned int
855  string_to_unsigned_int(const std::string &s);
856 
860  std::vector<unsigned int>
861  string_to_unsigned_int(const std::vector<std::string> &s);
862 
867  bool has_unique_entries (const std::vector<std::string> &strings);
868 
869 
870 
892  double weighted_p_norm_average (const std::vector<double> &weights,
893  const std::vector<double> &values,
894  const double p);
895 
896 
922  template <typename T>
923  T derivative_of_weighted_p_norm_average (const double averaged_parameter,
924  const std::vector<double> &weights,
925  const std::vector<double> &values,
926  const std::vector<T> &derivatives,
927  const double p);
959  template <int dim>
960  double compute_spd_factor(const double eta,
961  const SymmetricTensor<2,dim> &strain_rate,
962  const SymmetricTensor<2,dim> &dviscosities_dstrain_rate,
963  const double SPD_safety_factor);
964 
968  template <int dim>
969  Point<dim> convert_array_to_point(const std::array<double,dim> &array);
970 
974  template <int dim>
975  std::array<double,dim> convert_point_to_array(const Point<dim> &point);
976 
984  class Operator
985  {
986  public:
991  {
997  replace_if_valid
998  };
999 
1004  Operator();
1005 
1009  Operator(const operation op);
1010 
1015  double operator() (const double x, const double y) const;
1016 
1021  bool operator== (const operation op) const;
1022 
1023  private:
1028  };
1029 
1034  std::vector<Operator> create_model_operator_list(const std::vector<std::string> &operator_names);
1035 
1039  const std::string get_model_operator_options();
1040 
1046  template <int dim>
1047  SymmetricTensor<2,dim> nth_basis_for_symmetric_tensors (const unsigned int k);
1048 
1052  template <int dim>
1054  {
1055  public:
1059  NaturalCoordinate(Point<dim> &position,
1060  const GeometryModel::Interface<dim> &geometry_model);
1061 
1066  NaturalCoordinate(const std::array<double, dim> &coord,
1067  const Utilities::Coordinates::CoordinateSystem &coord_system);
1068 
1073  std::array<double,dim> &get_coordinates();
1074 
1079  const std::array<double,dim> &get_coordinates() const;
1080 
1085  std::array<double,dim-1> get_surface_coordinates() const;
1086 
1091  double get_depth_coordinate() const;
1092 
1093  private:
1099 
1103  std::array<double,dim> coordinates;
1104  };
1105 
1106 
1125  template <int dim, typename VectorType>
1126  void
1127  project_cellwise(const Mapping<dim> &mapping,
1128  const DoFHandler<dim> &dof_handler,
1129  const unsigned int component_index,
1130  const Quadrature<dim> &quadrature,
1131  const std::function<void(
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);
1136 
1160  void throw_linear_solver_failure_exception(const std::string &solver_name,
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 = "");
1166 
1177  template <int dim>
1179  {
1180  public:
1190  VectorFunctionFromVelocityFunctionObject (const unsigned int n_components,
1191  const std::function<Tensor<1,dim> (const Point<dim> &)> &function_object);
1192  };
1193 
1200  template <typename T>
1201  inline
1202  std::vector<std::size_t>
1203  compute_sorting_permutation(const std::vector<T> &vector);
1204 
1212  template <typename T>
1213  inline
1214  std::vector<T>
1216  const std::vector<T> &vector,
1217  const std::vector<std::size_t> &permutation_vector);
1218 
1231  std::vector<Tensor<2,3>>
1232  rotation_matrices_random_draw_volume_weighting(const std::vector<double> &volume_fractions,
1233  const std::vector<Tensor<2,3>> &rotation_matrices,
1234  const unsigned int n_output_matrices,
1235  std::mt19937 &random_number_generator);
1236 
1240  double wrap_angle(const double angle);
1241 
1246  std::array<double,3> zxz_euler_angles_from_rotation_matrix(const Tensor<2,3> &rotation_matrix);
1247 
1252  Tensor<2,3> zxz_euler_angles_to_rotation_matrix(const double phi1,
1253  const double theta,
1254  const double phi2);
1255 
1256  }
1257 
1258 
1259 // inline implementations:
1260 #ifndef DOXYGEN
1261  namespace Utilities
1262  {
1263  template<typename T>
1265  {
1266  for (auto &pair : object_list.get())
1267  if (pair.second == false)
1268  {
1269  pair.second = true;
1270  return pair.first;
1271  }
1272 
1273  object_list.get().emplace_back (T(), true);
1274  return object_list.get().back().first;
1275  }
1276 
1277  template<typename T>
1279  {
1280  for (auto &pair : object_list.get())
1281  if (&pair.first == &t)
1282  {
1283  pair.second = false;
1284  return;
1285  }
1286  AssertThrow(false, ExcMessage("You are tying to return an object to the pool which has apparently not been allocated by this pool."));
1287  }
1288 
1289  template<typename T>
1291  {
1292 
1293  for (auto &pair : object_list.get())
1294  pair.first.clear();
1295  }
1296 
1297  template<typename T>
1299  : space (space_),
1300  t (space.get_object_from_pool())
1301  {}
1302 
1303  template<typename T>
1305  {
1306  space.return_object_to_pool(t);
1307  }
1308 
1309  template<typename T>
1311  {
1312  return t;
1313  }
1314 
1315  template <typename T>
1316  inline
1317  std::vector<T>
1318  possibly_extend_from_1_to_N (const std::vector<T> &values,
1319  const unsigned int N,
1320  const std::string &id_text)
1321  {
1322  if (values.size() == 1)
1323  {
1324  return std::vector<T> (N, values[0]);
1325  }
1326  else if (values.size() == N)
1327  {
1328  return values;
1329  }
1330  else
1331  {
1332  // Non-specified behavior
1333  AssertThrow(false,
1334  ExcMessage("Length of " + id_text + " list must be " +
1335  "either one or " + Utilities::to_string(N) +
1336  ". Currently it is " + Utilities::to_string(values.size()) + "."));
1337  }
1338 
1339  // This should never happen, but return an empty vector so the compiler
1340  // will be happy
1341  return std::vector<T> ();
1342  }
1343 
1344  inline
1345  void
1346  extract_composition_values_at_q_point (const std::vector<std::vector<double>> &composition_values,
1347  const unsigned int q,
1348  std::vector<double> &composition_values_at_q_point)
1349  {
1350  Assert(q<composition_values.size(), ExcInternalError());
1351  Assert(composition_values_at_q_point.size() > 0,
1352  ExcInternalError());
1353 
1354  for (unsigned int k=0; k < composition_values_at_q_point.size(); ++k)
1355  {
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];
1359  }
1360  }
1361 
1362  template <typename T>
1363  inline
1364  std::vector<std::size_t>
1365  compute_sorting_permutation(const std::vector<T> &vector)
1366  {
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)
1371  {
1372  return vector[i] < vector[j];
1373  });
1374  return p;
1375  }
1376 
1377  template <typename T>
1378  inline
1379  std::vector<T>
1381  const std::vector<T> &vector,
1382  const std::vector<std::size_t> &permutation_vector)
1383  {
1384  std::vector<T> sorted_vec(vector.size());
1385  std::transform(permutation_vector.begin(), permutation_vector.end(), sorted_vec.begin(),
1386  [&](std::size_t i)
1387  {
1388  return vector[i];
1389  });
1390  return sorted_vec;
1391  }
1392 
1396  namespace Tensors
1397  {
1403  template <int dim, class Iterator>
1404  inline
1405  SymmetricTensor<2,dim>
1406  to_symmetric_tensor(const Iterator begin,
1407  const Iterator end)
1408  {
1409  AssertDimension(std::distance(begin, end), (SymmetricTensor<2,dim>::n_independent_components));
1410  (void) end;
1411 
1412  SymmetricTensor<2,dim> output;
1413 
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;
1417 
1418  return output;
1419  }
1420 
1425  template <int dim, class Iterator>
1426  inline
1427  void
1428  unroll_symmetric_tensor_into_array(const SymmetricTensor<2,dim> &tensor,
1429  const Iterator begin,
1430  const Iterator end)
1431  {
1432  AssertDimension(std::distance(begin, end), (SymmetricTensor<2,dim>::n_independent_components));
1433  (void) end;
1434 
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)];
1438  }
1439 
1443  SymmetricTensor<4,3>
1444  rotate_full_stiffness_tensor(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<4,3> &input_tensor);
1445 
1450  SymmetricTensor<2,6>
1451  rotate_voigt_stiffness_matrix(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<2,6> &input_tensor);
1452 
1456  SymmetricTensor<2,6>
1457  rotate_kelvin_tensor(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<2,6> &input_tensor);
1458 
1463  SymmetricTensor<2,6>
1464  to_voigt_stiffness_matrix(const SymmetricTensor<4,3> &input_tensor);
1465 
1470  SymmetricTensor<4,3>
1471  to_full_stiffness_tensor(const SymmetricTensor<2,6> &input_tensor);
1472 
1477  Tensor<1,21>
1478  to_voigt_stiffness_vector(const SymmetricTensor<2,6> &input_tensor);
1479 
1484  SymmetricTensor<2,6>
1485  to_voigt_stiffness_matrix(const Tensor<1,21> &input_tensor);
1486 
1491  Tensor<1,21>
1492  to_voigt_stiffness_vector(const SymmetricTensor<4,3> &input);
1493 
1494 
1499  template <int dim>
1500  const Tensor<dim,dim> &levi_civita();
1501 
1502  // Declare the existence of a specialization:
1503  template <>
1504  const Tensor<3,3> &levi_civita<3>();
1505 
1517  template <int dim>
1518  SymmetricTensor<2,dim>
1519  consistent_deviator(const SymmetricTensor<2,dim> &input);
1520 
1534  template <int dim>
1535  double
1536  consistent_second_invariant_of_deviatoric_tensor(const SymmetricTensor<2,dim> &input);
1537  }
1538 
1539  }
1540 #endif
1541 }
1542 
1543 #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:809
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
Definition: utilities.h:135
std::vector< std::string > list_of_required_keys
Definition: utilities.h:192
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:1103
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:801
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)
int mkdirp(std::string pathname, const mode_t mode=0755)
Utilities::Coordinates::CoordinateSystem coordinate_system
Definition: utilities.h:1098
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
Definition: utilities.h:652
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)
Options(const std::vector< std::string > &list_of_required_keys, const std::string &property_name)
Definition: utilities.h:263
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
Definition: utilities.h:245
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)
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
Definition: utilities.h:647
std::vector< std::string > list_of_allowed_keys
Definition: utilities.h:183
bool filename_is_url(const std::string &filename)
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)