39 using namespace Utilities;
45 min_depth(NaN::
DSNAN),
49 this->
name =
"oceanic plate";
78 Pointer((path +
"/body").c_str()).Set(declarations,
"object");
79 Pointer((path +
"/body/model").c_str()).Set(declarations,
"oceanic plate");
80 Pointer((path +
"/body/name").c_str()).Set(declarations,
"${1:My Oceanic Plate}");
81 Pointer((path +
"/body/coordinates").c_str()).Create(declarations).SetArray();
82 Pointer((path +
"/body/temperature models").c_str()).Create(declarations).SetArray();
83 Pointer((path +
"/body/composition models").c_str()).Create(declarations).SetArray();
91 const std::vector<std::string> &required_entries)
93 prm.
declare_entry(
"",
Types::Object(required_entries),
"Oceanic plate object. Requires properties `model` and `coordinates`.");
96 "The depth from which this feature is present");
98 "The depth to which this feature is present");
101 "A list of temperature models.");
104 "A list of composition models.");
107 "A list of grains models.");
110 "A list of velocity models.");
119 this->
name = prm.
get<std::string>(
"name");
121 std::string tag = prm.
get<std::string>(
"tag");
124 tag =
"oceanic plate";
205 const std::vector<std::array<unsigned int,3>> &
properties,
206 const double gravity_norm,
207 const std::vector<size_t> &entry_in_output,
208 std::vector<double> &output)
const 210 if (depth <= max_depth && depth >=
min_depth &&
216 if (depth <= max_depth_local && depth >= min_depth_local)
218 for (
unsigned int i_property = 0; i_property <
properties.size(); ++i_property)
226 output[entry_in_output[i_property]] = temperature_model->get_temperature(position_in_cartesian_coordinates,
227 position_in_natural_coordinates,
230 output[entry_in_output[i_property]],
234 WBAssert(!std::isnan(output[entry_in_output[i_property]]),
"Temperature is not a number: " << output[entry_in_output[i_property]]
235 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->
name);
236 WBAssert(std::isfinite(output[entry_in_output[i_property]]),
"Temperature is not a finite: " << output[entry_in_output[i_property]]
237 <<
", based on a temperature model with the name " << temperature_model->get_name() <<
", in feature " << this->
name);
246 output[entry_in_output[i_property]] = composition_model->get_composition(position_in_cartesian_coordinates,
247 position_in_natural_coordinates,
250 output[entry_in_output[i_property]],
254 WBAssert(!std::isnan(output[entry_in_output[i_property]]),
"Composition is not a number: " << output[entry_in_output[i_property]]
255 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->
name);
256 WBAssert(std::isfinite(output[entry_in_output[i_property]]),
"Composition is not a finite: " << output[entry_in_output[i_property]]
257 <<
", based on a composition model with the name " << composition_model->get_name() <<
", in feature " << this->
name);
268 grains = grains_model->get_grains(position_in_cartesian_coordinates,
269 position_in_natural_coordinates,
277 grains.
unroll_into(output,entry_in_output[i_property]);
282 output[entry_in_output[i_property]] =
static_cast<double>(
tag_index);
287 std::array<double, 3> velocity = {{0,0,0}};
290 velocity = velocity_model->get_velocity(position_in_cartesian_coordinates,
291 position_in_natural_coordinates,
304 output[entry_in_output[i_property]] = velocity[0];
305 output[entry_in_output[i_property]+1] = velocity[1];
306 output[entry_in_output[i_property]+2] = velocity[2];
313 "Internal error: Unimplemented property provided. " <<
314 "Only temperature (1), composition (2), grains (3), tag (4) or velocity (5) are allowed. " 315 "Provided property number was: " <<
properties[i_property][0]);
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
Objects::Surface max_depth_surface
std::array< double, 2 > get_surface_coordinates() const
std::vector< std::unique_ptr< Features::OceanicPlateModels::Velocity::Interface > > velocity_models
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)
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
std::vector< std::unique_ptr< Features::OceanicPlateModels::Composition::Interface > > composition_models
#define WBAssert(condition, message)
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)
std::vector< std::unique_ptr< Features::OceanicPlateModels::Grains::Interface > > grains_models
static void make_snippet(Parameters &prm)
static void declare_entries(Parameters &prm, const std::string &parent_name="", const std::vector< std::string > &required_entries={})
Objects::Surface min_depth_surface
Point< 2 > get_surface_point() const
~OceanicPlate() override final
void parse_entries(Parameters &prm) override final
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)
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
SurfaceValueInfo local_value(const Point< 2 > &check_point) const
std::unique_ptr< WorldBuilder::CoordinateSystems::Interface > coordinate_system
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
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
std::vector< std::unique_ptr< Features::OceanicPlateModels::Temperature::Interface > > temperature_models
static void declare_entries(Parameters &prm, const std::string &parent_name, const std::vector< std::string > &required_entries)
std::vector< Point< 2 > > coordinates