SPHinXsys  alpha version
regression_test_base.hpp
1 
5 #pragma once
6 
7 #include "regression_test_base.h"
8 
9  //=================================================================================================//
10 namespace SPH
11 {
12  //=================================================================================================//
13  template <class ObserveMethodType>
14  void RegressionTestBase<ObserveMethodType>::writeToXml(ObservedQuantityRecording<VariableType>* observe_method, size_t iteration)
15  {
16  this->parallel_exec();
17  std::string element_name_ = "Snapshot_" + std::to_string(iteration);
18  SimTK::Xml::Element &element_ = observe_xml_engine_.root_element_;
19  observe_xml_engine_.addElementToXmlDoc(element_name_);
20  for (size_t i = 0; i != this->base_particles_->total_real_particles_; ++i)
21  {
22  xmlmemory_io_.writeDataToXmlMemory(observe_xml_engine_, element_,
23  element_name_, i, (*this->interpolated_quantities_)[i], this->quantity_name_);
24  };
25  };
26  //=================================================================================================//
27  template <class ObserveMethodType>
28  template <typename ReduceType>
29  void RegressionTestBase<ObserveMethodType>::writeToXml(BodyReducedQuantityRecording<ReduceType>* reduce_method, size_t iteration)
30  {
31  std::string element_name_ = "Snapshot_" + std::to_string(iteration);
32  SimTK::Xml::Element &element_ = observe_xml_engine_.root_element_;
33  observe_xml_engine_.addElementToXmlDoc(element_name_);
34  xmlmemory_io_.writeDataToXmlMemory(observe_xml_engine_, element_,
35  element_name_, 0, this->reduce_method_.parallel_exec(), this->quantity_name_);
36  };
37  //=================================================================================================//
38  template <class ObserveMethodType>
39  void RegressionTestBase<ObserveMethodType>::readFromXml(ObservedQuantityRecording<VariableType>* observe_method)
40  {
41  observe_xml_engine_.loadXmlFile(in_output_filefullpath_);
42  size_t number_of_particle_ = this->base_particles_->total_real_particles_;
43  size_t number_of_snapshot_ = std::distance(observe_xml_engine_.root_element_.element_begin(),
44  observe_xml_engine_.root_element_.element_end());
45  DoubleVec<VariableType> current_result_temp_(number_of_snapshot_, StdVec<VariableType>(number_of_particle_));
46  StdVec<std::string> element_tag_temp_(number_of_snapshot_);
47  current_result_ = current_result_temp_;
48  element_tag_ = element_tag_temp_;
49  SimTK::Xml::Element &element_ = observe_xml_engine_.root_element_;
50  for (size_t j = 0; j != number_of_particle_; ++j)
51  {
52  xmlmemory_io_.readDataFromXmlMemory(observe_xml_engine_, element_, j, current_result_, this->quantity_name_);
53  xmlmemory_io_.readTagFromXmlMemory(element_, element_tag_);
54  }
55  };
56  //=================================================================================================//
57  template <class ObserveMethodType>
58  template <typename ReduceType>
59  void RegressionTestBase<ObserveMethodType>::readFromXml(BodyReducedQuantityRecording<ReduceType>* reduce_method)
60  {
61  observe_xml_engine_.loadXmlFile(in_output_filefullpath_);
62  size_t number_of_particle_ = 1;
63  size_t number_of_snapshot_ = std::distance(observe_xml_engine_.root_element_.element_begin(),
64  observe_xml_engine_.root_element_.element_end());
65  DoubleVec<VariableType> current_result_temp_(number_of_snapshot_, StdVec<VariableType>(number_of_particle_));
66  StdVec<std::string> element_tag_temp_(number_of_snapshot_);
67  current_result_ = current_result_temp_;
68  element_tag_ = element_tag_temp_;
69  SimTK::Xml::Element &element_ = observe_xml_engine_.root_element_;
70  for (size_t j = 0; j != number_of_particle_; ++j)
71  {
72  xmlmemory_io_.readDataFromXmlMemory(observe_xml_engine_, element_, j, current_result_, this->quantity_name_);
73  xmlmemory_io_.readTagFromXmlMemory(element_, element_tag_);
74  }
75  };
76  //=================================================================================================//
77  template<class ObserveMethodType>
78  void RegressionTestBase<ObserveMethodType>::transposeTheIndex()
79  {
80  int number_of_snapshot = this->current_result_.size();
81  int number_of_observation = this->current_result_[0].size();
82  DoubleVec<VariableType> temp(number_of_observation, StdVec<VariableType>(number_of_snapshot));
83  current_result_trans_ = temp;
84  for (int snapshot_index = 0; snapshot_index != number_of_snapshot; ++snapshot_index)
85  for (int observation_index = 0; observation_index != number_of_observation; ++observation_index)
86  current_result_trans_[observation_index][snapshot_index] = this->current_result_[snapshot_index][observation_index];
87  };
88  //=================================================================================================//
89  template<class ObserveMethodType>
91  {
92  if (number_of_run_ > 1) /*only read the result from the 2nd run, because the 1st run doesn't have previous results. */
93  {
94  /*Here result_in is a temporary container that reloads each previous result.*/
95  DoubleVec<VariableType> result_in_(SMAX(snapshot_, number_of_snapshot_old_), StdVec<VariableType>(observation_));
96  for (int run_index_ = 0; run_index_ != number_of_run_ - 1; ++run_index_)
97  {
98  std::string node_name_ = "Round_" + std::to_string(run_index_);
99  SimTK::Xml::Element father_element_ = result_xml_engine_in_.getChildElement(node_name_);
100  for (int observation_index_ = 0; observation_index_ != observation_; ++observation_index_)
101  xmlmemory_io_.readDataFromXmlMemory(result_xml_engine_in_, father_element_, observation_index_, result_in_, this->quantity_name_);
102  DoubleVec<VariableType> result_temp_ = result_in_;
103  for (int delete_ = 0; delete_ != difference_; ++delete_)
104  result_temp_.pop_back(); /* trim the new reading result to unify the length of all results. (number of snapshots) */
105  result_.push_back(result_temp_);
106  }
107  result_.push_back(this->current_result_); /* Finally, push back the current result into the result vector. */
108  }
109  };
110  //=================================================================================================//
111  template<class ObserveMethodType>
113  {
114  for (int run_index_ = 0; run_index_ != number_of_run_; ++run_index_)
115  {
116  std::string node_name_ = "Round_" + std::to_string(run_index_);
117  result_xml_engine_out_.addElementToXmlDoc(node_name_);
118  SimTK::Xml::Element father_element_ =
119  result_xml_engine_out_.getChildElement(node_name_);
120  xmlmemory_io_.writeDataToXmlMemory(result_xml_engine_out_, father_element_, result_[run_index_],
121  SMIN(snapshot_, number_of_snapshot_old_), observation_, this->quantity_name_, this->element_tag_);
122  }
123  result_xml_engine_out_.writeToXmlFile(result_filefullpath_);
124  };
125  //=================================================================================================//
126  template<class ObserveMethodType>
128  {
129  if (number_of_run_ > 1) /*only read the result from the 2nd run, because the 1st run doesn't have previous results. */
130  {
131  result_filefullpath_ = input_folder_path_ + "/" + this->body_name_ + "_" + this->quantity_name_ +
132  "_Run_" + std::to_string(index_of_run_) + "_result.xml";
133 
134  /* To identify the database generation or new result test. */
135  if (converged == "false")
136  {
137  if (!fs::exists(result_filefullpath_))
138  {
139  std::cout << "\n Error: the input file:" << result_filefullpath_ << " is not exists" << std::endl;
140  std::cout << __FILE__ << ':' << __LINE__ << std::endl;
141  exit(1);
142  }
143  }
144 
145  /*Each result has two elements, one records the length of this result, and the other one is itself.*/
146  result_xml_engine_in_.loadXmlFile(result_filefullpath_);
147  SimTK::Xml::Element snapshot_element_ = result_xml_engine_in_.getChildElement("Snapshot_Element");
148  SimTK::Xml::element_iterator ele_ite = snapshot_element_.element_begin();
149  result_xml_engine_in_.getRequiredAttributeValue(ele_ite, "number_of_snapshot_for_local_result_", snapshot_);
150 
151  DoubleVec<VariableType> result_temp_(observation_, StdVec<VariableType>(snapshot_));
152  result_in_ = result_temp_;
153  SimTK::Xml::Element result_element_ = result_xml_engine_in_.getChildElement("Result_Element");
154  for (int snapshot_index = 0; snapshot_index != snapshot_; ++snapshot_index)
155  {
156  int observation_index = 0;
157  SimTK::Xml::element_iterator ele_ite = result_element_.element_begin();
158  for (; ele_ite != result_element_.element_end(); ++ele_ite)
159  {
160  std::string attribute_name_ = "snapshot_" + std::to_string(snapshot_index);
161  result_xml_engine_in_.getRequiredAttributeValue(ele_ite, attribute_name_, result_in_[observation_index][snapshot_index]);
162  observation_index++;
163  }
164  };
165  }
166  };
167  //=================================================================================================//
168  template<class ObserveMethodType>
170  {
173  int total_snapshot_ = current_result_trans_[0].size();
174  result_filefullpath_ = input_folder_path_ + "/" + this->body_name_ + "_" + this->quantity_name_ +
175  "_Run_" + std::to_string(index_of_run_) + "_result.xml";
176  result_xml_engine_out_.addElementToXmlDoc("Snapshot_Element");
177  SimTK::Xml::Element snapshot_element_ = result_xml_engine_out_.getChildElement("Snapshot_Element");
178  result_xml_engine_out_.addChildToElement(snapshot_element_, "Snapshot");
179  SimTK::Xml::element_iterator ele_ite = snapshot_element_.element_begin();
180  result_xml_engine_out_.setAttributeToElement(ele_ite, "number_of_snapshot_for_local_result_", total_snapshot_);
181 
182  result_xml_engine_out_.addElementToXmlDoc("Result_Element");
183  SimTK::Xml::Element result_element_ = result_xml_engine_out_.getChildElement("Result_Element");
184  for (int observation_index = 0; observation_index != observation_; ++observation_index)
185  {
186  std::string element_name_ = "Particle_" + std::to_string(observation_index);
187  result_xml_engine_out_.addChildToElement(result_element_, element_name_);
188  for (int snapshot_index = 0; snapshot_index != total_snapshot_; ++snapshot_index)
189  {
190  SimTK::Xml::element_iterator ele_ite = result_element_.element_begin(element_name_);
191  std::string attribute_name_ = "snapshot_" + std::to_string(snapshot_index);
192  result_xml_engine_out_.setAttributeToElement(ele_ite, attribute_name_, current_result_trans_[observation_index][snapshot_index]);
193  }
194  }
195  result_xml_engine_out_.writeToXmlFile(result_filefullpath_);
196  };
197  //=================================================================================================//
198  template<class ObserveMethodType>
200  {
201  if (converged == "false")
202  {
203  number_of_run_ += 1;
204  }
205  if (fs::exists(runtimes_filefullpath_))
206  {
207  fs::remove(runtimes_filefullpath_);
208  }
209  std::ofstream out_file(runtimes_filefullpath_.c_str());
210  out_file << converged;
211  out_file << "\n";
212  out_file << number_of_run_;
213  out_file << "\n";
214  out_file << label_for_repeat_;
215  out_file.close();
216  };
217  //=================================================================================================//
218 }
void writeResultToXml()
Definition: regression_test_base.hpp:112
Base classes for comparisons between validated and tested results.
void readResultFromXml()
Definition: regression_test_base.hpp:90
The base of regression test for various method (time-averaged, ensemble-averaged, dynamic time warpin...
Definition: regression_test_base.h:45
Definition: solid_body_supplementary.cpp:9