39 using namespace Utilities;
46 this->name =
"mantle layer";
49 MantleLayer::~MantleLayer()
61 Pointer((path +
"/body").c_str()).Set(declarations,
"object");
62 Pointer((path +
"/body/model").c_str()).Set(declarations,
"mantle layer");
63 Pointer((path +
"/body/name").c_str()).Set(declarations,
"${1:My Mantle Layer}");
64 Pointer((path +
"/body/coordinates").c_str()).Create(declarations).SetArray();
65 Pointer((path +
"/body/temperature models").c_str()).Create(declarations).SetArray();
66 Pointer((path +
"/body/composition models").c_str()).Create(declarations).SetArray();
74 const std::vector<std::string> &required_entries)
79 "The depth from which this feature is present");
81 "The depth to which this feature is present");
84 "A list of temperature models.");
87 "A list of composition models.");
90 "A list of grains models.");
93 "A list of velocity models.");
101 this->name = prm.
get<std::string>(
"name");
103 std::string tag = prm.
get<std::string>(
"tag");
106 tag =
"mantle layer";
110 this->get_coordinates(
"coordinates", prm, coordinate_system);
113 min_depth = min_depth_surface.
minimum;
116 max_depth = max_depth_surface.
maximum;
123 for (
unsigned int i = 0; i < temperature_models.size(); ++i)
127 temperature_models[i]->parse_entries(prm,coordinates);
139 for (
unsigned int i = 0; i < composition_models.size(); ++i)
143 composition_models[i]->parse_entries(prm,coordinates);
155 for (
unsigned int i = 0; i < grains_models.size(); ++i)
159 grains_models[i]->parse_entries(prm,coordinates);
170 for (
unsigned int i = 0; i < velocity_models.size(); ++i)
174 velocity_models[i]->parse_entries(prm,coordinates);
184 MantleLayer::properties(
const Point<3> &position_in_cartesian_coordinates,
187 const std::vector<std::array<unsigned int,3>> &properties,
188 const double gravity_norm,
189 const std::vector<size_t> &entry_in_output,
190 std::vector<double> &output)
const 192 if (depth <= max_depth && depth >= min_depth &&
194 world->parameters.coordinate_system->natural_coordinate_system())))
196 const double min_depth_local = min_depth_surface.constant_value ? min_depth : min_depth_surface.local_value(position_in_natural_coordinates.
get_surface_point()).interpolated_value;
197 const double max_depth_local = max_depth_surface.constant_value ? max_depth : max_depth_surface.local_value(position_in_natural_coordinates.
get_surface_point()).interpolated_value;
198 if (depth <= max_depth_local && depth >= min_depth_local)
200 for (
unsigned int i_property = 0; i_property < properties.size(); ++i_property)
202 switch (properties[i_property][0])
206 for (
const auto &temperature_model: temperature_models)
208 output[entry_in_output[i_property]] = temperature_model->get_temperature(position_in_cartesian_coordinates,
209 position_in_natural_coordinates,
212 output[entry_in_output[i_property]],
216 WBAssert(!std::isnan(output[entry_in_output[i_property]]),
"Temperature is not a number: " << output[entry_in_output[i_property]]
217 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->name);
218 WBAssert(std::isfinite(output[entry_in_output[i_property]]),
"Temperature is not a finite: " << output[entry_in_output[i_property]]
219 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->name);
226 for (
const auto &composition_model: composition_models)
228 output[entry_in_output[i_property]] = composition_model->get_composition(position_in_cartesian_coordinates,
229 position_in_natural_coordinates,
231 properties[i_property][1],
232 output[entry_in_output[i_property]],
236 WBAssert(!std::isnan(output[entry_in_output[i_property]]),
"Composition is not a number: " << output[entry_in_output[i_property]]
237 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->name);
238 WBAssert(std::isfinite(output[entry_in_output[i_property]]),
"Composition is not a finite: " << output[entry_in_output[i_property]]
239 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->name);
248 for (
const auto &grains_model: grains_models)
250 grains = grains_model->get_grains(position_in_cartesian_coordinates,
251 position_in_natural_coordinates,
253 properties[i_property][1],
259 grains.
unroll_into(output,entry_in_output[i_property]);
264 output[entry_in_output[i_property]] =
static_cast<double>(tag_index);
269 std::array<double, 3> velocity = {{0,0,0}};
270 for (
const auto &velocity_model: velocity_models)
272 velocity = velocity_model->get_velocity(position_in_cartesian_coordinates,
273 position_in_natural_coordinates,
286 output[entry_in_output[i_property]] = velocity[0];
287 output[entry_in_output[i_property]+1] = velocity[1];
288 output[entry_in_output[i_property]+2] = velocity[2];
295 "Internal error: Unimplemented property provided. " <<
296 "Only temperature (1), composition (2), grains (3) or tag (4) are allowed. " 297 "Provided property number was: " << properties[i_property][0]);
std::array< double, 2 > get_surface_coordinates() const
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
size_t add_vector_unique(std::vector< std::string > &vector, const std::string &add_string)
#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)
#define WBAssert(condition, message)
std::string get_full_json_path(size_t max_size=std::numeric_limits< size_t >::max()) const
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
Point< 2 > get_surface_point() const
#define WBAssertThrow(condition, message)
bool get_unique_pointers(const std::string &name, std::vector< std::unique_ptr< T > > &vector)
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
bool polygon_contains_point(const std::vector< Point< 2 > > &point_list, const Point< 2 > &point)
void declare_entry(const std::string &name, const Types::Interface &type, const std::string &documentation)
T get(const std::string &name)
rapidjson::Document declarations
void unroll_into(std::vector< double > &vector, const size_t start_entry=0) const