6363#include " Parameters.h"
6464#include " consts.h"
6565#include " LinearAlgebra.h"
66+ #include " ustruct.h"
6667
6768#include < iostream>
6869#include < regex>
@@ -165,6 +166,9 @@ void Parameters::read_xml(std::string file_name)
165166 // Set Add_mesh values.
166167 set_mesh_values (root_element);
167168
169+ // Set Precomputed_solution values.
170+ set_precomputed_solution_values (root_element);
171+
168172 // Set mesh projection parameters.
169173 set_projection_values (root_element);
170174
@@ -217,6 +221,16 @@ void Parameters::set_mesh_values(tinyxml2::XMLElement* root_element)
217221 }
218222}
219223
224+ void Parameters::set_precomputed_solution_values (tinyxml2::XMLElement* root_element)
225+ {
226+ auto add_pre_sol_item = root_element->FirstChildElement (PrecomputedSolutionParameters::xml_element_name_.c_str ());
227+ if (add_pre_sol_item == nullptr ) {
228+ return ;
229+ }
230+
231+ precomputed_solution_parameters.set_values (add_pre_sol_item);
232+ }
233+
220234void Parameters::set_projection_values (tinyxml2::XMLElement* root_element)
221235{
222236 auto add_proj_item = root_element->FirstChildElement (ProjectionParameters::xml_element_name_.c_str ());
@@ -791,6 +805,20 @@ void ConstitutiveModelParameters::set_values(tinyxml2::XMLElement* xml_elem)
791805 value_set = true ;
792806}
793807
808+ // / @brief Check if a constitutive model is valid for the given equation.
809+ //
810+ void ConstitutiveModelParameters::check_constitutive_model (const Parameter<std::string>& eq_type_str)
811+ {
812+ auto eq_type = consts::equation_name_to_type.at (eq_type_str.value ());
813+ auto model = consts::constitutive_model_name_to_type.at (type.value ());
814+
815+ if (eq_type == consts::EquationType::phys_ustruct) {
816+ if (! ustruct::constitutive_model_is_valid (model)) {
817+ throw std::runtime_error (" The " + type.value () + " constitutive model is not valid for ustruct equations." );
818+ }
819+ }
820+ }
821+
794822// ////////////////////////////////////////////////////////
795823// CoupleCplBCParameters //
796824// ////////////////////////////////////////////////////////
@@ -1864,7 +1892,6 @@ void EquationParameters::set_values(tinyxml2::XMLElement* eq_elem)
18641892 //
18651893 while (item != nullptr ) {
18661894 auto name = std::string (item->Value ());
1867- // std::cout << "[EquationParameters::set_values] name: " << name << std::endl;
18681895
18691896 if (name == BodyForceParameters::xml_element_name_) {
18701897 auto bf_params = new BodyForceParameters ();
@@ -1878,6 +1905,7 @@ void EquationParameters::set_values(tinyxml2::XMLElement* eq_elem)
18781905
18791906 } else if (name == ConstitutiveModelParameters::xml_element_name_) {
18801907 default_domain->constitutive_model .set_values (item);
1908+ default_domain->constitutive_model .check_constitutive_model (type);
18811909
18821910 } else if (name == CoupleCplBCParameters::xml_element_name_) {
18831911 couple_to_cplBC.set_values (item);
@@ -2004,12 +2032,8 @@ GeneralSimulationParameters::GeneralSimulationParameters()
20042032 set_parameter (" Starting time step" , 0 , !required, starting_time_step);
20052033
20062034 set_parameter (" Time_step_size" , 0.0 , required, time_step_size);
2007- set_parameter (" Precomputed_time_step_size" , 0.0 , !required, precomputed_time_step_size);
20082035 set_parameter (" Verbose" , false , !required, verbose);
20092036 set_parameter (" Warning" , false , !required, warning);
2010- set_parameter (" Use_precomputed_solution" , false , !required, use_precomputed_solution);
2011- set_parameter (" Precomputed_solution_file_path" , " " , !required, precomputed_solution_file_path);
2012- set_parameter (" Precomputed_solution_field_name" , " " , !required, precomputed_solution_field_name);
20132037}
20142038
20152039void GeneralSimulationParameters::print_parameters ()
@@ -2301,6 +2325,40 @@ void MeshParameters::set_values(tinyxml2::XMLElement* mesh_elem)
23012325 }
23022326}
23032327
2328+ // ///////////////////////////////////////////////////////////////////////////
2329+ // P r e c o m p u t e d S o l u t i o n P a r a m e t e r s //
2330+ // ///////////////////////////////////////////////////////////////////////////
2331+
2332+ // The PrecomputedSolutionParameters class stores parameters for the
2333+ // 'Precomputed_solution' XML element used to read in the data from a
2334+ // precomputed solution for the simulation state.
2335+
2336+ const std::string PrecomputedSolutionParameters::xml_element_name_ = " Precomputed_solution" ;
2337+
2338+ PrecomputedSolutionParameters::PrecomputedSolutionParameters ()
2339+ {
2340+ // A parameter that must be defined.
2341+ bool required = true ;
2342+
2343+ set_parameter (" Field_name" , " " , required, field_name);
2344+ set_parameter (" File_path" , " " , required, file_path);
2345+ set_parameter (" Time_step" , 0.0 , !required, time_step);
2346+ set_parameter (" Use_precomputed_solution" , false , !required, use_precomputed_solution);
2347+ }
2348+
2349+ void PrecomputedSolutionParameters::set_values (tinyxml2::XMLElement* xml_elem)
2350+ {
2351+ using namespace tinyxml2 ;
2352+ std::string error_msg = " Unknown " + xml_element_name_ + " XML element '" ;
2353+ using std::placeholders::_1;
2354+ using std::placeholders::_2;
2355+
2356+ std::function<void (const std::string&, const std::string&)> ftpr =
2357+ std::bind ( &PrecomputedSolutionParameters::set_parameter_value, *this , _1, _2);
2358+
2359+ xml_util_set_parameters (ftpr, xml_elem, error_msg);
2360+ }
2361+
23042362// ////////////////////////////////////////////////////////
23052363// P r o j e c t i o n P a r a m e t e r s //
23062364// ////////////////////////////////////////////////////////
0 commit comments