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>
30 #include <random>
31 #include <deal.II/base/point.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  namespace MaterialModel
50  {
51  template <int dim> class MeltOutputs;
52  }
53 
54  namespace GeometryModel
55  {
56  template <int dim> class Interface;
57  }
58 
63  namespace Utilities
64  {
79  using namespace ::Utilities;
80 
81 
92  template <typename T>
94  {
95  public:
101  {
102  public:
106  ScopedScratchObject (const ScratchSpace<T> &/*space_*/);
107 
112 
116  operator T &() const;
117 
118  private:
120  T &t;
121  };
122 
126  T &get_object_from_pool() const;
127 
131  ~ScratchSpace() = default;
132 
136  void return_object_to_pool (T &t) const;
137 
138  private:
139  mutable ::Threads::ThreadLocalStorage<std::list<std::pair<T,bool>>> object_list;
140  };
141 
155  template <typename T>
156  std::vector<T>
157  possibly_extend_from_1_to_N (const std::vector<T> &values,
158  const unsigned int N,
159  const std::string &id_text);
160 
168  namespace MapParsing
169  {
174  struct Options
175  {
185  std::vector<std::string> list_of_allowed_keys;
186 
194  std::vector<std::string> list_of_required_keys;
195 
201  std::string property_name;
202 
211 
212  /*
213  * Whether to allow for some keys in list_of_required_keys to be
214  * not set to any values, i.e. they do not appear at all.
215  * This also allows a completely empty map.
216  */
218 
228 
238 
247  std::vector<unsigned int> n_values_per_key;
248 
253  Options() = delete;
254 
265  Options(const std::vector<std::string> &list_of_required_keys,
266  const std::string &property_name)
267  :
268  list_of_allowed_keys(list_of_required_keys),
269  list_of_required_keys(list_of_required_keys),
270  property_name(property_name),
271  allow_multiple_values_per_key(false),
272  allow_missing_keys(false),
273  store_values_per_key(false),
274  check_values_per_key(false),
275  n_values_per_key()
276  {}
277  };
278 
304  std::vector<double>
305  parse_map_to_double_array(const std::string &input_string,
306  Options &options);
307  }
308 
383  std::vector<double>
384  parse_map_to_double_array (const std::string &key_value_map,
385  const std::vector<std::string> &list_of_keys,
386  const bool expects_background_field,
387  const std::string &property_name,
388  const bool allow_multiple_values_per_key = false,
389  const std::unique_ptr<std::vector<unsigned int>> &n_values_per_key = nullptr,
390  const bool allow_missing_keys = false);
391 
405  template <typename T>
406  Table<2,T>
407  parse_input_table (const std::string &input_string,
408  const unsigned int n_rows,
409  const unsigned int n_columns,
410  const std::string &property_name);
411 
424  template <int dim>
425  std::vector<std::string>
426  expand_dimensional_variable_names (const std::vector<std::string> &var_declarations);
427 
428 
429  template <int dim>
433  const std::shared_ptr<const MaterialModel::MeltOutputs<dim>> fluid_out,
434  const Tensor<1, dim> &solid_velocity,
435  const Tensor<1, dim> &gravity,
436  const unsigned int porosity_idx,
437  const unsigned int q,
438  const bool use_pressure_gradient_for_darcy_field);
445  template <int dim>
447  const ComponentMask &component_mask);
448 
458  template <int dim>
459  std::vector<Point<dim>> get_unit_support_points(const SimulatorAccess<dim> &simulator_access);
460 
461 
462 
468  template <int dim>
469  bool
472  const Point<dim> &point,
473  const MPI_Comm mpi_communicator);
474 
475 
476  namespace Coordinates
477  {
478 
484  template <int dim>
485  std::array<double,dim>
486  WGS84_coordinates(const ::Point<dim> &position);
487 
498  template <int dim>
499  std::array<double,dim>
500  cartesian_to_spherical_coordinates(const ::Point<dim> &position);
501 
507  template <int dim>
509  spherical_to_cartesian_coordinates(const std::array<double,dim> &scoord);
510 
516  template <int dim>
518  spherical_to_cartesian_vector(const Tensor<1,dim> &spherical_vector,
519  const ::Point<dim> &position);
520 
521 
527  template <int dim>
528  std::array<double,3>
529  cartesian_to_ellipsoidal_coordinates(const ::Point<3> &position,
530  const double semi_major_axis_a,
531  const double eccentricity);
532 
537  template <int dim>
538  ::Point<3>
539  ellipsoidal_to_cartesian_coordinates(const std::array<double,3> &phi_theta_d,
540  const double semi_major_axis_a,
541  const double eccentricity);
542 
543 
550  string_to_coordinate_system (const std::string &);
551  }
552 
553 
558  template <int dim>
559  bool
560  polygon_contains_point(const std::vector<Point<2>> &point_list,
561  const ::Point<2> &point);
562 
568  template <int dim>
569  double
570  signed_distance_to_polygon(const std::vector<Point<2>> &point_list,
571  const ::Point<2> &point);
572 
573 
580  double
581  distance_to_line(const std::array<::Point<2>,2> &point_list,
582  const ::Point<2> &point);
583 
591  template <int dim>
592  std::array<Tensor<1,dim>,dim-1>
594 
600  rotation_matrix_from_axis (const Tensor<1,3> &rotation_axis,
601  const double rotation_angle);
602 
611  const Tensor<1,3> &point_two);
612 
649  std::pair<double,double> real_spherical_harmonic( unsigned int l, // degree
650  unsigned int m, // order
651  double theta, // colatitude (radians)
652  double phi ); // longitude (radians)
653 
657  struct ThousandSep : std::numpunct<char>
658  {
659  protected:
660  char do_thousands_sep() const override
661  {
662  return ',';
663  }
664 
665  std::string do_grouping() const override
666  {
667  return "\003"; // groups of 3 digits (this string is in octal format)
668  }
669 
670  };
671 
684  bool fexists(const std::string &filename);
685 
699  bool fexists(const std::string &filename,
700  const MPI_Comm comm);
701 
707  bool filename_is_url(const std::string &filename);
708 
728  std::string
729  read_and_distribute_file_content(const std::string &filename,
730  const MPI_Comm comm);
731 
744  void
745  collect_and_write_file_content(const std::string &filename,
746  const std::string &file_content,
747  const MPI_Comm comm);
748 
762  int
763  mkdirp(std::string pathname, const mode_t mode = 0755);
764 
776  void create_directory(const std::string &pathname,
777  const MPI_Comm comm,
778  const bool silent);
779 
784  namespace tk
785  {
789  class spline
790  {
791  public:
801  void set_points(const std::vector<double> &x,
802  const std::vector<double> &y,
803  const bool cubic_spline = true,
804  const bool monotone_spline = false);
808  double operator() (double x) const;
809 
810  private:
814  std::vector<double> m_x;
815 
822  std::vector<double> m_a, m_b, m_c, m_y;
823  };
824  }
825 
833  inline
834  void
835  extract_composition_values_at_q_point (const std::vector<std::vector<double>> &composition_values,
836  const unsigned int q,
837  std::vector<double> &composition_values_at_q_point);
838 
843  std::string
844  expand_ASPECT_SOURCE_DIR (const std::string &location);
845 
850  std::string parenthesize_if_nonempty (const std::string &s);
851 
855  bool
856  string_to_bool(const std::string &s);
857 
861  std::vector<bool>
862  string_to_bool(const std::vector<std::string> &s);
863 
867  unsigned int
868  string_to_unsigned_int(const std::string &s);
869 
873  std::vector<unsigned int>
874  string_to_unsigned_int(const std::vector<std::string> &s);
875 
880  bool has_unique_entries (const std::vector<std::string> &strings);
881 
882 
883 
905  double weighted_p_norm_average (const std::vector<double> &weights,
906  const std::vector<double> &values,
907  const double p);
908 
909 
935  template <typename T>
936  T derivative_of_weighted_p_norm_average (const double averaged_parameter,
937  const std::vector<double> &weights,
938  const std::vector<double> &values,
939  const std::vector<T> &derivatives,
940  const double p);
972  template <int dim>
973  double compute_spd_factor(const double eta,
975  const SymmetricTensor<2,dim> &dviscosities_dstrain_rate,
976  const double SPD_safety_factor);
977 
981  template <int dim>
982  Point<dim> convert_array_to_point(const std::array<double,dim> &array);
983 
987  template <int dim>
988  std::array<double,dim> convert_point_to_array(const Point<dim> &point);
989 
997  class Operator
998  {
999  public:
1004  {
1010  replace_if_valid
1011  };
1012 
1017  Operator();
1018 
1022  Operator(const operation op);
1023 
1028  double operator() (const double x, const double y) const;
1029 
1034  bool operator== (const operation op) const;
1035 
1036  private:
1041  };
1042 
1047  std::vector<Operator> create_model_operator_list(const std::vector<std::string> &operator_names);
1048 
1052  const std::string get_model_operator_options();
1053 
1059  template <int dim>
1061 
1065  template <int dim>
1067  {
1068  public:
1072  NaturalCoordinate(Point<dim> &position,
1073  const GeometryModel::Interface<dim> &geometry_model);
1074 
1079  NaturalCoordinate(const std::array<double, dim> &coord,
1080  const Utilities::Coordinates::CoordinateSystem &coord_system);
1081 
1086  std::array<double,dim> &get_coordinates();
1087 
1092  const std::array<double,dim> &get_coordinates() const;
1093 
1098  std::array<double,dim-1> get_surface_coordinates() const;
1099 
1104  double get_depth_coordinate() const;
1105 
1106  private:
1112 
1116  std::array<double,dim> coordinates;
1117  };
1118 
1119 
1138  template <int dim, typename VectorType>
1139  void
1140  project_cellwise(const Mapping<dim> &mapping,
1141  const DoFHandler<dim> &dof_handler,
1142  const unsigned int component_index,
1143  const Quadrature<dim> &quadrature,
1144  const std::function<void(
1145  const typename DoFHandler<dim>::active_cell_iterator &,
1146  const typename std_cxx20::type_identity<std::vector<Point<dim>>>::type &,
1147  std::vector<double> &)> &function,
1148  VectorType &vec_result);
1149 
1173  void throw_linear_solver_failure_exception(const std::string &solver_name,
1174  const std::string &function_name,
1175  const std::vector<SolverControl> &solver_controls,
1176  const std::exception &exc,
1177  const MPI_Comm mpi_communicator,
1178  const std::string &output_filename = "");
1179 
1190  template <int dim>
1192  {
1193  public:
1203  VectorFunctionFromVelocityFunctionObject (const unsigned int n_components,
1204  const std::function<Tensor<1,dim> (const Point<dim> &)> &function_object);
1205  };
1206 
1213  template <typename T>
1214  inline
1215  std::vector<std::size_t>
1216  compute_sorting_permutation(const std::vector<T> &vector);
1217 
1225  template <typename T>
1226  inline
1227  std::vector<T>
1229  const std::vector<T> &vector,
1230  const std::vector<std::size_t> &permutation_vector);
1231 
1244  std::vector<Tensor<2,3>>
1245  rotation_matrices_random_draw_volume_weighting(const std::vector<double> &volume_fractions,
1246  const std::vector<Tensor<2,3>> &rotation_matrices,
1247  const unsigned int n_output_matrices,
1248  std::mt19937 &random_number_generator);
1249 
1253  double wrap_angle(const double angle);
1254 
1259  std::array<double,3> zxz_euler_angles_from_rotation_matrix(const Tensor<2,3> &rotation_matrix);
1260 
1266  const double theta,
1267  const double phi2);
1268 
1269  }
1270 
1271 
1272 // inline implementations:
1273 #ifndef DOXYGEN
1274  namespace Utilities
1275  {
1276  template<typename T>
1278  {
1279  for (auto &pair : object_list.get())
1280  if (pair.second == false)
1281  {
1282  pair.second = true;
1283  return pair.first;
1284  }
1285 
1286  object_list.get().emplace_back (T(), true);
1287  return object_list.get().back().first;
1288  }
1289 
1290  template<typename T>
1291  void ScratchSpace<T>::return_object_to_pool (T &t) const
1292  {
1293  for (auto &pair : object_list.get())
1294  if (&pair.first == &t)
1295  {
1296  pair.second = false;
1297  return;
1298  }
1299  AssertThrow(false, ExcMessage("You are tying to return an object to the pool which has apparently not been allocated by this pool."));
1300  }
1301 
1302  template<typename T>
1304  : space (space_),
1305  t (space.get_object_from_pool())
1306  {}
1307 
1308  template<typename T>
1310  {
1311  space.return_object_to_pool(t);
1312  }
1313 
1314  template<typename T>
1316  {
1317  return t;
1318  }
1319 
1320  template <typename T>
1321  inline
1322  std::vector<T>
1323  possibly_extend_from_1_to_N (const std::vector<T> &values,
1324  const unsigned int N,
1325  const std::string &id_text)
1326  {
1327  if (values.size() == 1)
1328  {
1329  return std::vector<T> (N, values[0]);
1330  }
1331  else if (values.size() == N)
1332  {
1333  return values;
1334  }
1335  else
1336  {
1337  // Non-specified behavior
1338  AssertThrow(false,
1339  ExcMessage("Length of " + id_text + " list must be " +
1340  "either one or " + Utilities::to_string(N) +
1341  ". Currently it is " + Utilities::to_string(values.size()) + "."));
1342  }
1343 
1344  // This should never happen, but return an empty vector so the compiler
1345  // will be happy
1346  return std::vector<T> ();
1347  }
1348 
1349  inline
1350  void
1351  extract_composition_values_at_q_point (const std::vector<std::vector<double>> &composition_values,
1352  const unsigned int q,
1353  std::vector<double> &composition_values_at_q_point)
1354  {
1355  Assert(q<composition_values.size(), ExcInternalError());
1356  Assert(composition_values_at_q_point.size() > 0,
1357  ExcInternalError());
1358 
1359  for (unsigned int k=0; k < composition_values_at_q_point.size(); ++k)
1360  {
1361  Assert(composition_values[k].size() == composition_values_at_q_point.size(),
1362  ExcInternalError());
1363  composition_values_at_q_point[k] = composition_values[k][q];
1364  }
1365  }
1366 
1367  template <typename T>
1368  inline
1369  std::vector<std::size_t>
1370  compute_sorting_permutation(const std::vector<T> &vector)
1371  {
1372  std::vector<std::size_t> p(vector.size());
1373  std::iota(p.begin(), p.end(), 0);
1374  std::sort(p.begin(), p.end(),
1375  [&](std::size_t i, std::size_t j)
1376  {
1377  return vector[i] < vector[j];
1378  });
1379  return p;
1380  }
1381 
1382  template <typename T>
1383  inline
1384  std::vector<T>
1386  const std::vector<T> &vector,
1387  const std::vector<std::size_t> &permutation_vector)
1388  {
1389  std::vector<T> sorted_vec(vector.size());
1390  std::transform(permutation_vector.begin(), permutation_vector.end(), sorted_vec.begin(),
1391  [&](std::size_t i)
1392  {
1393  return vector[i];
1394  });
1395  return sorted_vec;
1396  }
1397 
1401  namespace Tensors
1402  {
1408  template <int dim, class Iterator>
1409  inline
1411  to_symmetric_tensor(const Iterator begin,
1412  const Iterator end)
1413  {
1415  (void) end;
1416 
1417  SymmetricTensor<2,dim> output;
1418 
1419  Iterator next = begin;
1420  for (unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1422 
1423  return output;
1424  }
1425 
1430  template <int dim, class Iterator>
1431  inline
1432  void
1433  unroll_symmetric_tensor_into_array(const SymmetricTensor<2,dim> &tensor,
1434  const Iterator begin,
1435  const Iterator end)
1436  {
1438  (void) end;
1439 
1440  Iterator next = begin;
1441  for (unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1443  }
1444 
1449  rotate_full_stiffness_tensor(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<4,3> &input_tensor);
1450 
1456  rotate_voigt_stiffness_matrix(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<2,6> &input_tensor);
1457 
1462  rotate_kelvin_tensor(const Tensor<2,3> &rotation_tensor, const SymmetricTensor<2,6> &input_tensor);
1463 
1469  to_voigt_stiffness_matrix(const SymmetricTensor<4,3> &input_tensor);
1470 
1476  to_full_stiffness_tensor(const SymmetricTensor<2,6> &input_tensor);
1477 
1482  Tensor<1,21>
1483  to_voigt_stiffness_vector(const SymmetricTensor<2,6> &input_tensor);
1484 
1490  to_voigt_stiffness_matrix(const Tensor<1,21> &input_tensor);
1491 
1496  Tensor<1,21>
1497  to_voigt_stiffness_vector(const SymmetricTensor<4,3> &input);
1498 
1499 
1504  template <int dim>
1505  const Tensor<dim,dim> &levi_civita();
1506 
1507  // Declare the existence of a specialization:
1508  template <>
1509  const Tensor<3,3> &levi_civita<3>();
1510 
1522  template <int dim>
1524  consistent_deviator(const SymmetricTensor<2,dim> &input);
1525 
1539  template <int dim>
1540  double
1541  consistent_second_invariant_of_deviatoric_tensor(const SymmetricTensor<2,dim> &input);
1542  }
1543 
1544  }
1545 #endif
1546 }
1547 
1548 #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:822
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:194
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:1116
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:814
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:1111
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:665
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:265
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)
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:247
*  *  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:139
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:660
std::vector< std::string > list_of_allowed_keys
Definition: utilities.h:185
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)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation
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)