20 #ifndef WORLD_BUILDER_UTILITIES_H 21 #define WORLD_BUILDER_UTILITIES_H 34 namespace CoordinateSystems
48 inline bool approx(
double a,
double b,
double error_factor=1e4)
50 return std::abs(a-b)<std::abs(std::min(a,b))*std::numeric_limits<double>::epsilon()*
81 const double semi_major_axis,
82 const double eccentricity,
83 const double rotation_angle,
121 const double semi_major_axis_a,
122 const double eccentricity);
130 const double semi_major_axis_a,
131 const double eccentricity);
145 template<
unsigned int dim>
196 void set_points(
const std::vector<double> &y);
203 double operator() (
const double x)
const 205 if (x >= 0. && x <= static_cast<double>(mx_size_min))
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];
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];
218 double operator() (
const double x,
const size_t idx,
const double h)
const 220 return (x >= 0. && x <= static_cast<double>(mx_size_min))
222 ((m[idx][0]*h + m[idx][1])*h + m[idx][2])*h + m[idx][3]
224 (m[idx][1]*h + m[idx][2])*h + m[idx][3];
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];
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];
265 std::vector<std::array<double,4>>
m;
294 distance_from_plane(NaN::
DSNAN),
295 distance_along_plane(NaN::
DSNAN),
296 fraction_of_section(NaN::
DSNAN),
297 fraction_of_segment(NaN::
DSNAN),
300 average_angle(NaN::
DSNAN),
301 depth_reference_surface(NaN::
DSNAN),
302 closest_trench_point(
Point<3>(coordinate_system))
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,
427 const double angle_2,
428 const double fraction);
439 std::array<std::array<double,3>,3>
473 std::vector<std::vector<double>> mid_oceanic_spreading_velocities,
474 const std::unique_ptr<WorldBuilder::CoordinateSystems::Interface> &coordinate_system,
476 const std::vector<std::vector<double>> &subducting_plate_velocities,
477 const std::vector<double> &ridge_migration_times);
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);
bool polygon_contains_point_implementation(const std::vector< Point< 2 > > &point_list, const Point< 2 > &point)
std::array< double, dim > convert_point_to_array(const Point< dim > &point_)
Class for circle line/spline, including interpolation on it.
std::array< double, 3 > cartesian_to_spherical_coordinates(const Point< 3 > &position)
std::vector< std::array< double, 4 > > m
bool approx(double a, double b, double error_factor=1e4)
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)
int string_to_int(const std::string &string)
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)
PointDistanceFromCurvedPlanes(CoordinateSystem coordinate_system)
Point< 3 > cross_product(const Point< 3 > &a, const Point< 3 > &b)
std::string read_and_distribute_file_content(const std::string &filename)
double fraction_of_section
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)
#define WBAssert(condition, message)
double distance_from_plane
double value_outside(const size_t idx, const double h) const
double distance_along_plane
Point< 3 > closest_trench_point
double depth_reference_surface
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)
double wrap_angle(const double angle)
double string_to_double(const std::string &string)
double value_inside(const size_t idx, const double h) const
unsigned int string_to_unsigned_int(const std::string &string)
std::vector< double > calculate_effective_trench_and_plate_ages(std::vector< double > ridge_parameters, double distance_along_plane)
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)
std::array< std::array< double, 3 >, 3 > euler_angles_to_rotation_matrix(double phi1_d, double theta_d, double phi2_d)
double fraction_of_segment
bool polygon_contains_point(const std::vector< Point< 2 > > &point_list, const Point< 2 > &point)
std::array< double, 3 > euler_angles_from_rotation_matrix(const std::array< std::array< double, 3 >, 3 > &rotation_matrix)
CoordinateSystem string_to_coordinate_system(const std::string &coordinate_system)
double signed_distance_to_polygon(const std::vector< Point< 2 > > &point_list, const Point< 2 > &point)
double interpolate_angle_across_zero(const double angle_1, const double angle_2, const double fraction)