38 using namespace Utilities;
62 Pointer((path +
"/body").c_str()).Set(declarations,
"object");
63 Pointer((path +
"/body/model").c_str()).Set(declarations,
"fault");
64 Pointer((path +
"/body/name").c_str()).Set(declarations,
"${1:My Fault}");
65 Pointer((path +
"/body/coordinates").c_str()).Create(declarations).SetArray();
66 Pointer((path +
"/body/segments").c_str()).Create(declarations).SetArray();
67 Pointer((path +
"/body/sections").c_str()).Create(declarations).SetArray();
74 const std::string &parent_name,
75 const std::vector<std::string> &required_entries)
80 if (parent_name ==
"items")
89 "The depth to which this feature is present");
91 "The depth to which this feature is present");
93 "The depth to which this feature is present");
95 prm.
declare_entry(
"segments",
Types::Array(
Types::Segment(0,
Point<2>(0,0,
invalid),
Point<2>(0,0,
invalid),
Point<2>(0,0,
invalid),
100 "The depth to which this feature is present");
104 "A list of temperature models.");
107 "A list of composition models.");
110 "A list of grains models.");
113 "A list of velocity models.");
115 if (parent_name !=
"items")
125 "The coordinate which should be overwritten");
136 this->
name = prm.
get<std::string>(
"name");
138 std::string tag = prm.
get<std::string>(
"tag");
185 std::vector<std::unique_ptr<Features::Fault> > sections_vector;
189 for (
unsigned int i_section = 0; i_section < n_sections; ++i_section)
192 for (
unsigned int i_sector = 0; i_sector < sections_vector.size(); ++i_sector)
196 const unsigned int change_coord_number = prm.
get<
unsigned int>(
"coordinate");
199 <<
"', trying to change the section of coordinate " << change_coord_number
200 <<
" while only " <<
segment_vector.size() <<
" coordinates are defined.");
202 std::vector<std::shared_ptr<Features::FaultModels::Temperature::Interface> > local_default_temperature_models;
203 std::vector<std::shared_ptr<Features::FaultModels::Composition::Interface> > local_default_composition_models;
204 std::vector<std::shared_ptr<Features::FaultModels::Grains::Interface> > local_default_grains_models;
205 std::vector<std::shared_ptr<Features::FaultModels::Velocity::Interface> > local_default_velocity_models;
207 if (!prm.
get_shared_pointers<Features::FaultModels::Temperature::Interface>(
"temperature models", local_default_temperature_models))
213 if (!prm.
get_shared_pointers<Features::FaultModels::Composition::Interface>(
"composition models", local_default_composition_models))
219 if (!prm.
get_shared_pointers<Features::FaultModels::Grains::Interface>(
"grains models", local_default_grains_models))
225 if (!prm.
get_shared_pointers<Features::FaultModels::Velocity::Interface>(
"velocity models", local_default_velocity_models))
232 Features::FaultModels::Composition::Interface,
233 Features::FaultModels::Grains::Interface,
234 Features::FaultModels::Velocity::Interface> >(
"segments", local_default_temperature_models, local_default_composition_models, local_default_grains_models, local_default_velocity_models);
237 "Error: There are not the same amount of segments in section with coordinate " << change_coord_number
238 <<
" (" <<
segment_vector[change_coord_number].size() <<
" segments) as in the default segment (" 239 << default_segment_vector.size() <<
" segments). This is not allowed.");
243 for (
unsigned int i = 0; i <
segment_vector[change_coord_number].size(); ++i)
249 for (
unsigned int j = 0; j <
segment_vector[change_coord_number][i].temperature_systems.size(); ++j)
253 segment_vector[change_coord_number][i].temperature_systems[j]->parse_entries(prm);
263 for (
unsigned int j = 0; j <
segment_vector[change_coord_number][i].composition_systems.size(); ++j)
267 segment_vector[change_coord_number][i].composition_systems[j]->parse_entries(prm);
277 for (
unsigned int j = 0; j <
segment_vector[change_coord_number][i].grains_systems.size(); ++j)
281 segment_vector[change_coord_number][i].grains_systems[j]->parse_entries(prm);
290 for (
unsigned int j = 0; j <
segment_vector[change_coord_number][i].velocity_systems.size(); ++j)
294 segment_vector[change_coord_number][i].velocity_systems[j]->parse_entries(prm);
316 for (
unsigned int i = 0; i < default_segment_vector.size(); ++i)
322 for (
unsigned int j = 0; j < default_segment_vector[i].temperature_systems.size(); ++j)
326 default_segment_vector[i].temperature_systems[j]->
parse_entries(prm);
336 for (
unsigned int j = 0; j < default_segment_vector[i].composition_systems.size(); ++j)
340 default_segment_vector[i].composition_systems[j]->
parse_entries(prm);
350 for (
unsigned int j = 0; j < default_segment_vector[i].grains_systems.size(); ++j)
354 default_segment_vector[i].grains_systems[j]->
parse_entries(prm);
363 for (
unsigned int j = 0; j < default_segment_vector[i].velocity_systems.size(); ++j)
367 default_segment_vector[i].velocity_systems[j]->
parse_entries(prm);
390 double local_total_fault_length = 0;
416 auto compare_x_coordinate = [](
auto p1,
auto p2)
425 auto compare_y_coordinate = [](
auto p1,
auto p2)
475 const std::vector<std::array<unsigned int,3>> &
properties,
476 const double gravity_norm,
477 const std::vector<size_t> &entry_in_output,
478 std::vector<double> &output)
const 485 WBAssert(std::abs(starting_radius) > std::numeric_limits<double>::epsilon(),
"World Builder error: starting_radius can not be zero. " 486 <<
"Position = " << position_in_cartesian_coordinates[0] <<
':' << position_in_cartesian_coordinates[1] <<
':' << position_in_cartesian_coordinates[2]
487 <<
", position_in_natural_coordinates.get_depth_coordinate() = " << position_in_natural_coordinates.
get_depth_coordinate()
488 <<
", depth = " << depth
500 position_in_natural_coordinates,
513 const size_t current_section = distance_from_planes.
section;
514 const size_t next_section = current_section + 1;
515 const size_t current_segment = distance_from_planes.
segment;
518 if (abs(distance_from_plane) < std::numeric_limits<double>::infinity() || (distance_along_plane) < std::numeric_limits<double>::infinity())
530 const double thickness_local = thickness_up + segment_fraction * (thickness_down - thickness_up);
534 if (std::fabs(thickness_local) < 2.0 * std::numeric_limits<double>::epsilon())
546 const double top_truncation_local = top_truncation_up + segment_fraction * (top_truncation_down - top_truncation_up);
549 if (thickness_local < top_truncation_local)
561 if (std::fabs(distance_from_plane) <= thickness_local * 0.5 &&
562 distance_along_plane > 0 &&
563 distance_along_plane <= max_fault_length)
565 for (
unsigned int i_property = 0; i_property <
properties.size(); ++i_property)
571 double temperature_current_section = output[entry_in_output[i_property]];
572 double temperature_next_section = output[entry_in_output[i_property]];
574 for (
const auto &temperature_model:
segment_vector[current_section][current_segment].temperature_systems)
576 temperature_current_section = temperature_model->get_temperature(position_in_cartesian_coordinates,
579 temperature_current_section,
582 distance_from_planes,
583 additional_parameters);
585 WBAssert(!std::isnan(temperature_current_section),
"Temperature is not a number: " << temperature_current_section
586 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->
name);
587 WBAssert(std::isfinite(temperature_current_section),
"Temperature is not finite: " << temperature_current_section
588 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->
name);
592 for (
const auto &temperature_model:
segment_vector[next_section][current_segment].temperature_systems)
594 temperature_next_section = temperature_model->get_temperature(position_in_cartesian_coordinates,
597 temperature_next_section,
600 distance_from_planes,
601 additional_parameters);
603 WBAssert(!std::isnan(temperature_next_section),
"Temperature is not a number: " << temperature_next_section
604 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->
name);
605 WBAssert(std::isfinite(temperature_next_section),
"Temperature is not a finite: " << temperature_next_section
606 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->
name);
611 output[entry_in_output[i_property]] = temperature_current_section + section_fraction * (temperature_next_section - temperature_current_section);
616 double composition_current_section = output[entry_in_output[i_property]];
617 double composition_next_section = output[entry_in_output[i_property]];
619 for (
const auto &composition_model:
segment_vector[current_section][current_segment].composition_systems)
621 composition_current_section = composition_model->get_composition(position_in_cartesian_coordinates,
624 composition_current_section,
627 distance_from_planes,
628 additional_parameters);
630 WBAssert(!std::isnan(composition_current_section),
"Composition_current_section is not a number: " << composition_current_section
631 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->
name);
632 WBAssert(std::isfinite(composition_current_section),
"Composition_current_section is not finite: " << composition_current_section
633 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->
name);
637 for (
const auto &composition_model:
segment_vector[next_section][current_segment].composition_systems)
639 composition_next_section = composition_model->get_composition(position_in_cartesian_coordinates,
642 composition_next_section,
645 distance_from_planes,
646 additional_parameters);
648 WBAssert(!std::isnan(composition_next_section),
"Composition_next_section is not a number: " << composition_next_section
649 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->
name);
650 WBAssert(std::isfinite(composition_next_section),
"Composition_next_section is not finite: " << composition_next_section
651 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->
name);
656 output[entry_in_output[i_property]] = composition_current_section + section_fraction * (composition_next_section - composition_current_section);
665 for (
const auto &grains_model:
segment_vector[current_section][current_segment].grains_systems)
667 grains_current_section = grains_model->get_grains(position_in_cartesian_coordinates,
670 grains_current_section,
673 distance_from_planes,
674 additional_parameters);
678 for (
const auto &grains_model:
segment_vector[next_section][current_segment].grains_systems)
680 grains_next_section = grains_model->get_grains(position_in_cartesian_coordinates,
686 distance_from_planes,
687 additional_parameters);
692 for (
size_t i = 0; i < grains.
sizes.size(); i++)
694 grains.
sizes[i] = grains_current_section.
sizes[i] + section_fraction * (grains_next_section.
sizes[i] - grains_current_section.
sizes[i]);
700 const glm::quaternion::quat quat_current = glm::quaternion::quat_cast(grains_current_section.
rotation_matrices[i]);
701 const glm::quaternion::quat quat_next = glm::quaternion::quat_cast(grains_next_section.
rotation_matrices[i]);
703 const glm::quaternion::quat quat_average = glm::quaternion::slerp(quat_current,quat_next,section_fraction);
708 grains.
unroll_into(output,entry_in_output[i_property]);
713 output[entry_in_output[i_property]] =
static_cast<double>(
tag_index);
718 std::array<double,3> velocity_current_section;
719 velocity_current_section[0] = output[entry_in_output[i_property]];
720 velocity_current_section[1] = output[entry_in_output[i_property]+1];
721 velocity_current_section[2] = output[entry_in_output[i_property]]+2;
722 std::array<double,3> velocity_next_section = velocity_current_section;
724 for (
const auto &velocity_model:
segment_vector[current_section][current_segment].velocity_systems)
726 velocity_current_section = velocity_model->get_velocity(position_in_cartesian_coordinates,
729 velocity_current_section,
732 distance_from_planes,
733 additional_parameters);
742 for (
const auto &velocity_model:
segment_vector[next_section][current_segment].velocity_systems)
744 velocity_next_section = velocity_model->get_velocity(position_in_cartesian_coordinates,
747 velocity_next_section,
750 distance_from_planes,
751 additional_parameters);
761 output[entry_in_output[i_property]] = velocity_current_section[0] + section_fraction * (velocity_next_section[0] - velocity_current_section[0]);
762 output[entry_in_output[i_property]+1] = velocity_current_section[1] + section_fraction * (velocity_next_section[1] - velocity_current_section[1]);
763 output[entry_in_output[i_property]+2] = velocity_current_section[2] + section_fraction * (velocity_next_section[2] - velocity_current_section[2]);
769 "Internal error: Unimplemented property provided. " <<
770 "Only temperature (1), composition (2), grains (3) or tag (4) are allowed. " 771 "Provided property number was: " <<
properties[i_property][0]);
785 const double depth)
const 792 WBAssert(std::abs(starting_radius) > std::numeric_limits<double>::epsilon(),
"World Builder error: starting_radius can not be zero. " 793 <<
"Position = " << position_in_cartesian_coordinates[0] <<
':' << position_in_cartesian_coordinates[1] <<
':' << position_in_cartesian_coordinates[2]
794 <<
", natural_coordinate.get_depth_coordinate() = " << position_in_natural_coordinates.
get_depth_coordinate()
795 <<
", depth = " << depth
801 position_in_natural_coordinates,
811 Objects::PlaneDistances plane_distances(distance_from_planes.distance_from_plane, distance_from_planes.distance_along_plane);
812 return plane_distances;
std::vector< std::shared_ptr< Features::FaultModels::Grains::Interface > > default_grains_models
std::vector< std::vector< Point< 2 > > > fault_segment_top_truncation
virtual void parse_entries(Parameters &prm)=0
static void declare_entries(Parameters &prm, const std::string &parent_name="", const std::vector< std::string > &required_entries={})
BoundingBox< 2 > surface_bounding_box
std::array< double, 2 > get_surface_coordinates() const
std::vector< std::vector< Objects::Segment< Features::FaultModels::Temperature::Interface, Features::FaultModels::Composition::Interface, Features::FaultModels::Grains::Interface, Features::FaultModels::Velocity::Interface > > > segment_vector
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
double get_depth_coordinate() const
size_t add_vector_unique(std::vector< std::string > &vector, const std::string &add_string)
WorldBuilder::Point< 2 > reference_point
#define WB_REGISTER_FEATURE(classname, name)
void enter_subsection(const std::string &name)
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
std::vector< std::vector< double > > fault_segment_lengths
bool get_shared_pointers(const std::string &name, std::vector< std::shared_ptr< T > > &)
void properties(const Point< 3 > &position_in_cartesian_coordinates, const Objects::NaturalCoordinate &position_in_natural_coordinates, const double depth, const std::vector< std::array< unsigned int, 3 >> &properties, const double gravity, const std::vector< size_t > &entry_in_output, std::vector< double > &output) const override final
void parse_entries(Parameters &prm) override final
std::vector< double > sizes
double maximum_fault_thickness
const BoundingBox< 2 > & get_surface_bounding_box() const
double fraction_of_section
std::pair< Point< spacedim >, Point< spacedim > > & get_boundary_points()
void extend(const double amount)
#define WBAssert(condition, message)
std::vector< std::shared_ptr< Features::FaultModels::Velocity::Interface > > default_velocity_models
std::string get_full_json_path(size_t max_size=std::numeric_limits< size_t >::max()) const
void get_coordinates(const std::string &name, Parameters &prm, const CoordinateSystem coordinate_system)
Objects::PlaneDistances distance_to_feature_plane(const Point< 3 > &position_in_cartesian_coordinates, const Objects::NaturalCoordinate &position_in_natural_coordinates, const double depth) const override
std::vector< std::shared_ptr< Features::FaultModels::Composition::Interface > > default_composition_models
double cos(const double angle)
double distance_from_plane
double buffer_around_fault_cartesian
double distance_along_plane
std::vector< Objects::Segment< Features::FaultModels::Temperature::Interface, Features::FaultModels::Composition::Interface, Features::FaultModels::Grains::Interface, Features::FaultModels::Velocity::Interface > > default_segment_vector
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)
std::vector< std::string > feature_tags
WorldBuilder::World * world
#define WBAssertThrow(condition, message)
bool get_unique_pointers(const std::string &name, std::vector< std::unique_ptr< T > > &vector)
std::vector< std::vector< Point< 2 > > > fault_segment_thickness
static void make_snippet(Parameters &prm)
double maximum_total_fault_length
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
std::unique_ptr< WorldBuilder::CoordinateSystems::Interface > coordinate_system
double fraction_of_segment
std::size_t original_number_of_coordinates
std::vector< std::array< std::array< double, 3 >, 3 > > rotation_matrices
void declare_entry(const std::string &name, const Types::Interface &type, const std::string &documentation)
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
std::vector< T > get_vector(const std::string &name)
std::vector< std::vector< Point< 2 > > > fault_segment_angles
T get(const std::string &name)
rapidjson::Document declarations
std::vector< double > total_fault_length
void unroll_into(std::vector< double > &vector, const size_t start_entry=0) const
std::vector< std::shared_ptr< Features::FaultModels::Temperature::Interface > > default_temperature_models
std::vector< Point< 2 > > coordinates
bool point_inside(const Point< spacedim > &p, const double tolerance=std::numeric_limits< double >::epsilon()) const