World Builder  1.1.0-pre
A geodynamic initial conditions generator
utilities.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2018-2024 by the authors of the World Builder code.
3 
4  This file is part of the World Builder.
5 
6  This program is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published
8  by the Free Software Foundation, either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program 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 Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19 
20 #ifndef WORLD_BUILDER_UTILITIES_H
21 #define WORLD_BUILDER_UTILITIES_H
22 
23 
24 #include "world_builder/nan.h"
28 #include <iostream>
29 
30 
31 namespace WorldBuilder
32 {
33 
34  namespace CoordinateSystems
35  {
36  class Interface;
37  } // namespace CoordinateSystems
38  namespace Utilities
39  {
40 
48  inline bool approx(double a, double b, double error_factor=1e4)
49  {
50  return std::abs(a-b)<std::abs(std::min(a,b))*std::numeric_limits<double>::epsilon()*
51  error_factor;
52  }
53 
61  bool
62  polygon_contains_point(const std::vector<Point<2> > &point_list,
63  const Point<2> &point);
64 
69  bool
70  polygon_contains_point_implementation(const std::vector<Point<2> > &point_list,
71  const Point<2> &point);
72 
73 
79  double
80  fraction_from_ellipse_center (const Point<2> &ellipse_center,
81  const double semi_major_axis,
82  const double eccentricity,
83  const double rotation_angle,
84  const Point<2> &point);
85 
86 
92  double
93  signed_distance_to_polygon(const std::vector<Point<2> > &point_list_,
94  const Point<2> &point_);
95 
96 
103  std::array<double,3>
105 
111  Point<3>
112  spherical_to_cartesian_coordinates(const std::array<double,3> &scoord);
113 
119  std::array<double,3>
121  const double semi_major_axis_a,
122  const double eccentricity);
123 
128  Point<3>
129  ellipsoidal_to_cartesian_coordinates(const std::array<double,3> &phi_theta_d,
130  const double semi_major_axis_a,
131  const double eccentricity);
132 
139  string_to_coordinate_system (const std::string & /*coordinate_system*/);
140 
141 
145  template<unsigned int dim>
146  std::array<double,dim> convert_point_to_array(const Point<dim> &point);
147 
151  double
152  string_to_double(const std::string &string);
153 
157  int
158  string_to_int(const std::string &string);
159 
160 
164  unsigned int
165  string_to_unsigned_int(const std::string &string);
166 
167 
171  Point<3> cross_product(const Point<3> &a, const Point<3> &b);
172 
176  enum class InterpolationType
177  {
178  None,
179  Linear,
182  Invalid,
183  };
184 
189  {
190  public:
196  void set_points(const std::vector<double> &y);
197 
198 
202  inline
203  double operator() (const double x) const
204  {
205  if (x >= 0. && x <= static_cast<double>(mx_size_min))
206  {
207  const size_t idx = static_cast<size_t>(x);
208  const double h = x-static_cast<double>(idx);
209  return ((m[idx][0]*h + m[idx][1])*h + m[idx][2])*h + m[idx][3];
210  }
211  const size_t idx = std::min(static_cast<size_t>(std::max( static_cast<int>(x), static_cast<int>(0))),mx_size_min);
212  const double h = x-static_cast<double>(idx);
213  return (m[idx][1]*h + m[idx][2])*h + m[idx][3];
214  }
215 
216 
217  inline
218  double operator() (const double x, const size_t idx, const double h) const
219  {
220  return (x >= 0. && x <= static_cast<double>(mx_size_min))
221  ?
222  ((m[idx][0]*h + m[idx][1])*h + m[idx][2])*h + m[idx][3]
223  :
224  (m[idx][1]*h + m[idx][2])*h + m[idx][3];
225  }
226 
227 
232  inline
233  double value_inside (const size_t idx, const double h) const
234  {
235  WBAssert(idx <= mx_size_min, "Internal error: using value_inside outside the range of 0 to " << mx_size_min << ", but value was outside of this range: " << idx << ".");
236  WBAssert(h >= 0 && h <= 1., "Internal error: using value_inside outside the range of 0 to " << mx_size_min << ", but value was outside of this range: " << h << ".");
237  return ((m[idx][0]*h + m[idx][1])*h + m[idx][2])*h + m[idx][3];
238  }
239 
240 
245  inline
246  double value_outside (const size_t idx, const double h) const
247  {
248  WBAssert(idx <= mx_size_min, "Internal error: using value_inside outside the range of 0 to " << mx_size_min << ", but value was outside of this range: " << idx << ".");
249  WBAssert(!(static_cast<double>(idx) + h >= 0 && static_cast<double>(idx) + h <= 1.), "Internal error: using value_inside outside the range of 0 to " << mx_size_min << ", but value was outside of this range: " << static_cast<double>(idx) + h << " (h=" << h << ", idx = " << idx << ").");
250  return (m[idx][1]*h + m[idx][2])*h + m[idx][3];
251  }
252 
253 
257  size_t mx_size_min;
258 
265  std::vector<std::array<double,4>> m; //m_a, m_b, m_c, m_y;
266 
267  private:
268  };
269 
288  {
293  :
294  distance_from_plane(NaN::DSNAN),
295  distance_along_plane(NaN::DSNAN),
296  fraction_of_section(NaN::DSNAN),
297  fraction_of_segment(NaN::DSNAN),
298  section(NaN::ISNAN),
299  segment(NaN::ISNAN),
300  average_angle(NaN::DSNAN),
301  depth_reference_surface(NaN::DSNAN),
302  closest_trench_point(Point<3>(coordinate_system))
303  {}
304 
309 
315 
321 
327 
331  size_t section;
332 
336  size_t segment;
337 
343 
348 
353  };
354 
404  const Objects::NaturalCoordinate &check_point_natural,
405  const Point<2> &reference_point,
406  const std::vector<Point<2> > &point_list,
407  const std::vector<std::vector<double> > &plane_segment_lengths,
408  const std::vector<std::vector<Point<2> > > &plane_segment_angles,
409  const double start_radius,
410  const std::unique_ptr<CoordinateSystems::Interface> &coordinate_system,
411  const bool only_positive,
412  const Objects::BezierCurve &bezier_curve);
413 
414 
415 
419  double wrap_angle(const double angle);
420 
426  double interpolate_angle_across_zero(const double angle_1,
427  const double angle_2,
428  const double fraction);
429 
433  std::array<double,3>
434  euler_angles_from_rotation_matrix(const std::array<std::array<double,3>,3> &rotation_matrix);
435 
439  std::array<std::array<double,3>,3>
440  euler_angles_to_rotation_matrix(double phi1, double theta, double phi2);
441 
449  std::string
450  read_and_distribute_file_content(const std::string &filename);
451 
471  std::vector<double>
472  calculate_ridge_distance_and_spreading(std::vector<std::vector<Point<2>>> mid_oceanic_ridges,
473  std::vector<std::vector<double>> mid_oceanic_spreading_velocities,
474  const std::unique_ptr<WorldBuilder::CoordinateSystems::Interface> &coordinate_system,
475  const Objects::NaturalCoordinate &position_in_natural_coordinates_at_min_depth,
476  const std::vector<std::vector<double>> &subducting_plate_velocities,
477  const std::vector<double> &ridge_migration_times);
478 
479  // todo_effective
487  std::vector<double>
488  calculate_effective_trench_and_plate_ages(std::vector<double> ridge_parameters, double distance_along_plane);
489 
490  /*
491  * Returns the result of the multiplication of two 3*3 matrix,
492  * used in applying the random uniform distribution rotation matrix
493  * to a given orientation (rotation matrix)
494  */
495  std::array<std::array<double,3>,3>
496  multiply_3x3_matrices(const std::array<std::array<double,3>,3> mat1, std::array<std::array<double,3>,3> const mat2);
497 
498  } // namespace Utilities
499 } // namespace WorldBuilder
500 
501 
502 #endif
bool polygon_contains_point_implementation(const std::vector< Point< 2 > > &point_list, const Point< 2 > &point)
Definition: utilities.cc:63
std::array< double, dim > convert_point_to_array(const Point< dim > &point_)
Definition: utilities.cc:301
Class for circle line/spline, including interpolation on it.
Definition: bezier_curve.h:37
std::array< double, 3 > cartesian_to_spherical_coordinates(const Point< 3 > &position)
Definition: utilities.cc:255
std::vector< std::array< double, 4 > > m
Definition: utilities.h:265
const double DSNAN
Definition: nan.h:41
bool approx(double a, double b, double error_factor=1e4)
Definition: utilities.h:48
Point< 3 > ellipsoidal_to_cartesian_coordinates(const std::array< double, 3 > &phi_theta_d, const double semi_major_axis_a, const double eccentricity)
std::array< std::array< double, 3 >, 3 > multiply_3x3_matrices(const std::array< std::array< double, 3 >, 3 > mat1, const std::array< std::array< double, 3 >, 3 > mat2)
Definition: utilities.cc:1510
int string_to_int(const std::string &string)
Definition: utilities.cc:329
std::array< double, 3 > cartesian_to_ellipsoidal_coordinates(const Point< 3 > &position, const double semi_major_axis_a, const double eccentricity)
Point< 3 > spherical_to_cartesian_coordinates(const std::array< double, 3 > &scoord)
Definition: utilities.cc:274
PointDistanceFromCurvedPlanes(CoordinateSystem coordinate_system)
Definition: utilities.h:292
const unsigned int ISNAN
Definition: nan.h:46
Point< 3 > cross_product(const Point< 3 > &a, const Point< 3 > &b)
Definition: utilities.cc:370
std::string read_and_distribute_file_content(const std::string &filename)
Definition: utilities.cc:1172
std::vector< double > calculate_ridge_distance_and_spreading(std::vector< std::vector< Point< 2 >>> mid_oceanic_ridges, std::vector< std::vector< double >> mid_oceanic_spreading_velocities, const std::unique_ptr< WorldBuilder::CoordinateSystems::Interface > &coordinate_system, const Objects::NaturalCoordinate &position_in_natural_coordinates_at_min_depth, const std::vector< std::vector< double >> &subducting_plate_velocities, const std::vector< double > &ridge_migration_times)
Definition: utilities.cc:1290
#define WBAssert(condition, message)
Definition: assert.h:27
double value_outside(const size_t idx, const double h) const
Definition: utilities.h:246
PointDistanceFromCurvedPlanes distance_point_from_curved_planes(const Point< 3 > &check_point, const Objects::NaturalCoordinate &natural_coordinate, const Point< 2 > &reference_point, const std::vector< Point< 2 > > &point_list, const std::vector< std::vector< double > > &plane_segment_lengths, const std::vector< std::vector< Point< 2 > > > &plane_segment_angles, const double start_radius, const std::unique_ptr< CoordinateSystems::Interface > &coordinate_system, const bool only_positive, const Objects::BezierCurve &bezier_curve)
Definition: utilities.cc:380
double wrap_angle(const double angle)
Definition: utilities.cc:1090
double string_to_double(const std::string &string)
Definition: utilities.cc:310
double value_inside(const size_t idx, const double h) const
Definition: utilities.h:233
unsigned int string_to_unsigned_int(const std::string &string)
Definition: utilities.cc:349
std::vector< double > calculate_effective_trench_and_plate_ages(std::vector< double > ridge_parameters, double distance_along_plane)
Definition: utilities.cc:1483
double fraction_from_ellipse_center(const Point< 2 > &ellipse_center, const double semi_major_axis, const double eccentricity, const double theta, const Point< 2 > &point)
Definition: utilities.cc:167
std::array< std::array< double, 3 >, 3 > euler_angles_to_rotation_matrix(double phi1_d, double theta_d, double phi2_d)
Definition: utilities.cc:1147
bool polygon_contains_point(const std::vector< Point< 2 > > &point_list, const Point< 2 > &point)
Definition: utilities.cc:46
std::array< double, 3 > euler_angles_from_rotation_matrix(const std::array< std::array< double, 3 >, 3 > &rotation_matrix)
Definition: utilities.cc:1119
CoordinateSystem string_to_coordinate_system(const std::string &coordinate_system)
Definition: utilities.cc:287
double signed_distance_to_polygon(const std::vector< Point< 2 > > &point_list, const Point< 2 > &point)
Definition: utilities.cc:191
double interpolate_angle_across_zero(const double angle_1, const double angle_2, const double fraction)
Definition: utilities.cc:1095