22 #ifndef _aspect_utilities_h
23 #define _aspect_utilities_h
46 template <
int dim>
class SimulatorAccess;
48 namespace GeometryModel
50 template <
int dim>
class Interface;
93 const std::string &id_text);
319 const std::vector<std::string> &list_of_keys,
320 const bool expects_background_field,
321 const std::string &property_name,
322 const bool allow_multiple_values_per_key =
false,
323 const std::unique_ptr<std::vector<unsigned int>> &n_values_per_key =
nullptr,
324 const bool allow_missing_keys =
false);
339 template <
typename T>
342 const unsigned int n_rows,
343 const unsigned int n_columns,
344 const std::string &property_name);
359 std::vector<std::string>
396 const MPI_Comm mpi_communicator);
399 namespace Coordinates
408 std::array<double,dim>
422 std::array<double,dim>
442 const ::Point<dim> &position);
453 const double semi_major_axis_a,
454 const double eccentricity);
463 const double semi_major_axis_a,
464 const double eccentricity);
484 const ::Point<2> &point);
494 const ::Point<2> &point);
505 const ::Point<2> &point);
515 std::array<Tensor<1,dim>,dim-1>
524 const double rotation_angle);
623 const MPI_Comm comm);
653 const MPI_Comm comm);
669 const std::string &file_content,
670 const MPI_Comm comm);
686 mkdirp(std::string pathname,
const mode_t mode = 0755);
725 const std::vector<double> &y,
726 const bool cubic_spline =
true,
727 const bool monotone_spline =
false);
759 const unsigned int q,
760 std::vector<double> &composition_values_at_q_point);
796 std::vector<unsigned int>
829 const std::vector<double> &values,
858 template <
typename T>
860 const std::vector<double> &weights,
861 const std::vector<double> &values,
862 const std::vector<T> &derivatives,
899 const double SPD_safety_factor);
1061 template <
int dim,
typename VectorType>
1065 const unsigned int component_index,
1070 std::vector<double> &)> &
function,
1071 VectorType &vec_result);
1097 const std::string &function_name,
1098 const std::vector<SolverControl> &solver_controls,
1099 const std::exception &exc,
1100 const MPI_Comm mpi_communicator,
1101 const std::string &output_filename =
"");
1136 template <
typename T>
1138 std::vector<std::size_t>
1148 template <
typename T>
1152 const std::vector<T> &vector,
1153 const std::vector<std::size_t> &permutation_vector);
1167 std::vector<Tensor<2,3>>
1169 const std::vector<
Tensor<2,3>> &rotation_matrices,
1170 const unsigned int n_output_matrices,
1171 std::mt19937 &random_number_generator);
1200 template <
typename T>
1204 const unsigned int N,
1205 const std::string &id_text)
1207 if (values.size() == 1)
1209 return std::vector<T> (N, values[0]);
1211 else if (values.size() == N)
1219 ExcMessage(
"Length of " + id_text +
" list must be " +
1226 return std::vector<T> ();
1232 const unsigned int q,
1233 std::vector<double> &composition_values_at_q_point)
1236 Assert(composition_values_at_q_point.size() > 0,
1239 for (
unsigned int k=0; k < composition_values_at_q_point.size(); ++k)
1241 Assert(composition_values[k].
size() == composition_values_at_q_point.size(),
1243 composition_values_at_q_point[k] = composition_values[k][q];
1247 template <
typename T>
1249 std::vector<std::size_t>
1252 std::vector<std::size_t> p(vector.size());
1253 std::iota(p.begin(), p.end(), 0);
1254 std::sort(p.begin(), p.end(),
1255 [&](std::size_t i, std::size_t j)
1257 return vector[i] < vector[j];
1262 template <
typename T>
1266 const std::vector<T> &vector,
1267 const std::vector<std::size_t> &permutation_vector)
1269 std::vector<T> sorted_vec(vector.size());
1270 std::transform(permutation_vector.begin(), permutation_vector.end(), sorted_vec.begin(),
1288 template <
int dim,
class Iterator>
1291 to_symmetric_tensor(
const Iterator begin,
1299 Iterator next =
begin;
1300 for (
unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1310 template <
int dim,
class Iterator>
1314 const Iterator begin,
1320 Iterator next =
begin;
1321 for (
unsigned int i=0; i < SymmetricTensor<2,dim>::n_independent_components; ++i, ++next)
1370 to_voigt_stiffness_matrix(
const Tensor<1,21> &input_tensor);
const unsigned int n_components
NaturalCoordinate(const std::array< double, dim > &coord, const Utilities::Coordinates::CoordinateSystem &coord_system)
Utilities::Coordinates::CoordinateSystem coordinate_system
const std::array< double, dim > & get_coordinates() const
std::array< double, dim > & get_coordinates()
std::array< double, dim > coordinates
NaturalCoordinate(Point< dim > &position, const GeometryModel::Interface< dim > &geometry_model)
double get_depth_coordinate() const
std::array< double, dim-1 > get_surface_coordinates() const
bool operator==(const operation op) const
double operator()(const double x, const double y) const
Operator(const operation op)
VectorFunctionFromVelocityFunctionObject(const unsigned int n_components, const std::function< Tensor< 1, dim >(const Point< dim > &)> &function_object)
std::vector< double > m_x
void set_points(const std::vector< double > &x, const std::vector< double > &y, const bool cubic_spline=true, const bool monotone_spline=false)
std::vector< double > m_a
std::vector< double > m_c
double operator()(double x) const
std::vector< double > m_y
std::vector< double > m_b
#define DEAL_II_DEPRECATED
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
std::string to_string(const number value, const unsigned int digits=numbers::invalid_unsigned_int)
Tensor< 1, dim > spherical_to_cartesian_vector(const Tensor< 1, dim > &spherical_vector, const ::Point< dim > &position)
std::array< double, dim > WGS84_coordinates(const ::Point< dim > &position)
std::array< double, dim > cartesian_to_spherical_coordinates(const ::Point< dim > &position)
std::array< double, 3 > cartesian_to_ellipsoidal_coordinates(const ::Point< 3 > &position, const double semi_major_axis_a, const double eccentricity)
CoordinateSystem string_to_coordinate_system(const std::string &)
::Point< dim > spherical_to_cartesian_coordinates(const std::array< double, dim > &scoord)
::Point< 3 > ellipsoidal_to_cartesian_coordinates(const std::array< double, 3 > &phi_theta_d, const double semi_major_axis_a, const double eccentricity)
std::vector< double > parse_map_to_double_array(const std::string &input_string, Options &options)
Tensor< 2, 3 > rotation_matrix_from_axis(const Tensor< 1, 3 > &rotation_axis, const double rotation_angle)
double wrap_angle(const double angle)
std::array< double, dim > convert_point_to_array(const Point< dim > &point)
std::vector< std::string > expand_dimensional_variable_names(const std::vector< std::string > &var_declarations)
unsigned int string_to_unsigned_int(const std::string &s)
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)
Point< dim > convert_array_to_point(const std::array< double, dim > &array)
bool filename_is_url(const std::string &filename)
bool polygon_contains_point(const std::vector< Point< 2 >> &point_list, const ::Point< 2 > &point)
Tensor< 2, 3 > zxz_euler_angles_to_rotation_matrix(const double phi1, const double theta, const double phi2)
bool fexists(const std::string &filename)
double signed_distance_to_polygon(const std::vector< Point< 2 >> &point_list, const ::Point< 2 > &point)
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)
double distance_to_line(const std::array<::Point< 2 >, 2 > &point_list, const ::Point< 2 > &point)
std::array< Tensor< 1, dim >, dim-1 > orthogonal_vectors(const Tensor< 1, dim > &v)
Tensor< 2, 3 > compute_rotation_matrix_for_slice(const Tensor< 1, 3 > &point_one, const Tensor< 1, 3 > &point_two)
std::pair< double, double > real_spherical_harmonic(unsigned int l, unsigned int m, double theta, double phi)
std::vector< T > possibly_extend_from_1_to_N(const std::vector< T > &values, const unsigned int N, const std::string &id_text)
int mkdirp(std::string pathname, const mode_t mode=0755)
std::string expand_ASPECT_SOURCE_DIR(const std::string &location)
double weighted_p_norm_average(const std::vector< double > &weights, const std::vector< double > &values, const double p)
bool point_is_in_triangulation(const Mapping< dim > &mapping, const parallel::distributed::Triangulation< dim > &triangulation, const Point< dim > &point, const MPI_Comm mpi_communicator)
std::string parenthesize_if_nonempty(const std::string &s)
bool has_unique_entries(const std::vector< std::string > &strings)
IndexSet extract_locally_active_dofs_with_component(const DoFHandler< dim > &dof_handler, const ComponentMask &component_mask)
std::vector< Operator > create_model_operator_list(const std::vector< std::string > &operator_names)
std::array< double, 3 > zxz_euler_angles_from_rotation_matrix(const Tensor< 2, 3 > &rotation_matrix)
bool string_to_bool(const 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)
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 std::vector< Point< dim >> &, std::vector< double > &)> &function, VectorType &vec_result)
const std::string get_model_operator_options()
void create_directory(const std::string &pathname, const MPI_Comm comm, const bool silent)
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)
SymmetricTensor< 2, dim > nth_basis_for_symmetric_tensors(const unsigned int k)
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)
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="")
std::vector< T > apply_permutation(const std::vector< T > &vector, const std::vector< std::size_t > &permutation_vector)
std::string read_and_distribute_file_content(const std::string &filename, const MPI_Comm comm)
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::vector< std::size_t > compute_sorting_permutation(const std::vector< T > &vector)
void collect_and_write_file_content(const std::string &filename, const std::string &file_content, const MPI_Comm comm)
std::vector< Point< dim > > get_unit_support_points(const SimulatorAccess< dim > &simulator_access)
bool store_values_per_key
bool allow_multiple_values_per_key
std::string property_name
std::vector< std::string > list_of_allowed_keys
std::vector< std::string > list_of_required_keys
Options(const std::vector< std::string > &list_of_required_keys, const std::string &property_name)
std::vector< unsigned int > n_values_per_key
bool check_values_per_key
char do_thousands_sep() const override
std::string do_grouping() const override