Teuchos Package Browser (Single Doxygen Collection)  Version of the Day
YamlParameterList.cpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // Teuchos
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact
39 // Jonathan Hu (jhu@sandia.gov)
40 // Andrey Prokopenko (aprokop@sandia.gov)
41 // Ray Tuminaro (rstumin@sandia.gov)
42 //
43 // ***********************************************************************
44 //
45 // @HEADER
46 
47 
49 #include <Teuchos_ScalarTraits.hpp>
54 #include <Teuchos_RCP.hpp>
55 #include <Teuchos_Exceptions.hpp>
56 #include <Teuchos_TwoDArray.hpp>
57 
58 #include <Teuchos_Parser.hpp>
59 
61 using Teuchos::RCP;
62 
63 namespace TeuchosTests
64 {
65  TEUCHOS_UNIT_TEST(YAML, XmlEquivalence)
66  {
67  using std::string;
68  using std::vector;
69  vector<string> matchStems;
70  matchStems.push_back("Match1");
71  matchStems.push_back("Match2");
72  matchStems.push_back("Match3");
73  matchStems.push_back("Match4");
74  for(size_t i = 0; i < matchStems.size(); i++)
75  {
76  string yamlFile = matchStems[i] + ".yaml";
78  string xmlFile = matchStems[i] + ".xml";
79  RCP<ParameterList> xmlList = Teuchos::getParametersFromXmlFile(xmlFile);
80  TEST_EQUALITY(Teuchos::haveSameValues(*xmlList, *yamlList, true), true);
81  }
82  }
83  TEUCHOS_UNIT_TEST(YAML, IntVsDouble)
84  {
85  //YAML2 has a double param that has the same name/value as an int param in XML2
86  //YAML reader should recognize the double and the param lists should not be equivalent
87  RCP<ParameterList> xmlList = Teuchos::getParametersFromXmlFile("IntVsDouble.xml");
88  RCP<ParameterList> yamlList = Teuchos::getParametersFromYamlFile("IntVsDouble.yaml");
89  TEST_EQUALITY(Teuchos::haveSameValues(*xmlList, *yamlList), false);
90  }
91  TEUCHOS_UNIT_TEST(YAML, IllegalKeyString)
92  {
93  TEST_THROW(Teuchos::getParametersFromYamlFile("IllegalKeyString.yaml");, Teuchos::ParserFail);
94  }
95 
96  TEUCHOS_UNIT_TEST(YAML, Issue1801)
97  {
99  "My Awesome Problem:\n"
100  " Particle Periodic:\n"
101  " X: \"-1.0, 1.0\"\n"
102  " emotions: happy_sad, indifferent\n"
103  "...\n"
104  );
105  }
106 
107  TEUCHOS_UNIT_TEST(YAML, PR1805)
108  {
110  "My Awesome Problem:\n"
111  "\tMesh:\n"
112  "\t\tInline:\n"
113  "\t\t\tType: Quad\n"
114  "\t\t\tElements: [ 10, 10 ]\n"
115  "...\n"
116  );
117  }
118 
119  TEUCHOS_UNIT_TEST(YAML, IntAndDoubleArray)
120  {
121  int correctInts[5] = {2, 3, 5, 7, 11};
122  //the last number with 10 dec digits of precision should test correct double conversion
123  double correctDoubles[5] = {2.718, 3.14159, 1.618, 1.23456789, 42.1337};
125  //Retrieve arrays from a specific sublist (tests the mixed nesting of sequence/map)
126  ParameterList& sublist = params->get<ParameterList>("smoother: params");
127  Teuchos::Array<int>& intArr = sublist.get<Teuchos::Array<int> >("intArray");
128  Teuchos::Array<double>& doubleArr = sublist.get<Teuchos::Array<double> >("doubleArray");
129  TEST_EQUALITY(intArr.size(), 5);
130  TEST_EQUALITY(doubleArr.size(), 5);
131  for(int i = 0; i < 5; i++)
132  {
133  TEST_EQUALITY(correctInts[i], intArr[i]);
134  TEST_EQUALITY(correctDoubles[i], doubleArr[i]);
135  }
136  }
137  TEUCHOS_UNIT_TEST(YAML, InconsistentArrayType)
138  {
139  std::string correctStrings[5] = {"2", "3", "5", "7", "imastring"};
140  double correctDoubles[5] = {2, 3, 1.618, 1.23456789, 42.1337};
141  RCP<ParameterList> plist = Teuchos::getParametersFromYamlFile("InconsistentArray.yaml");
142  //verify that stringArray and doubleArray have the correct types and the correct values
143  const Teuchos::Array<std::string>& stringArr = plist->get<Teuchos::Array<std::string> >("stringArray");
144  const Teuchos::Array<double>& doubleArr = plist->get<Teuchos::Array<double> >("doubleArray");
145  for(int i = 0; i < 5; i++)
146  {
147  if(stringArr[i] != correctStrings[i])
148  {
149  throw std::runtime_error(std::string("stringArray value is incorrect."));
150  }
151  if(doubleArr[i] != correctDoubles[i])
152  {
153  throw std::runtime_error(std::string("doubleArray value is incorrect."));
154  }
155  }
156  }
157  TEUCHOS_UNIT_TEST(YAML, TwoDArrayConvert)
158  {
159  std::string xmlString =
160  " <ParameterList>\n"
161  " <ParameterList name=\"Problem\">\n"
162  " <ParameterList name=\"Neumann BCs\">\n"
163  " <ParameterList name=\"Time Dependent NBC on SS cyl_outside for DOF all set P\">\n"
164  " <Parameter name=\"BC Values\" type=\"TwoDArray(double)\" value=\"3x1:{ 0.0, 10.0, 20.0}\"/>\n"
165  " </ParameterList>\n"
166  " </ParameterList>\n"
167  " </ParameterList>\n"
168  " <ParameterList name=\"Discretization\">\n"
169  " <Parameter name=\"Node Set Associations\" type=\"TwoDArray(string)\" value=\"2x2:{1, 2, top, bottom}\"/>\n"
170  " <Parameter name=\"Bool-looking String\" type=\"string\" value=\"TRUE\"/>\n"
171  " </ParameterList>\n"
172  " </ParameterList>\n";
173  RCP<ParameterList> xmlParams = Teuchos::getParametersFromXmlString(xmlString);
174  std::stringstream yamlOutStream;
175  yamlOutStream << std::showpoint << std::fixed << std::setprecision(1);
176  Teuchos::YAMLParameterList::writeYamlStream(yamlOutStream, *xmlParams);
177  std::string yamlString = yamlOutStream.str();
178  std::string expectedYamlString =
179  "%YAML 1.1\n"
180  "---\n"
181  "ANONYMOUS:\n"
182  " Problem: \n"
183  " Neumann BCs: \n"
184  " Time Dependent NBC on SS cyl_outside for DOF all set P: \n"
185  " BC Values: [[0.0], [10.0], [20.0]]\n"
186  " Discretization: \n"
187  " Node Set Associations: [['1', '2'], [top, bottom]]\n"
188  " Bool-looking String: 'TRUE'\n"
189  "...\n";
190  TEST_EQUALITY(yamlString, expectedYamlString);
191  std::stringstream yamlInStream(yamlString);
192  RCP<ParameterList> yamlParams;
193  yamlParams = Teuchos::YAMLParameterList::parseYamlStream(yamlInStream);
194  std::stringstream yamlOutStream2;
195  yamlOutStream2 << std::showpoint << std::fixed << std::setprecision(1);
196  Teuchos::YAMLParameterList::writeYamlStream(yamlOutStream2, *yamlParams);
197  std::string yamlString2 = yamlOutStream2.str();
198  TEST_EQUALITY(yamlString2, expectedYamlString);
199  }
200 
201  TEUCHOS_UNIT_TEST(YAML, Issue1815)
202  {
204  "Header:\n"
205  " Output:\n"
206  " File Name: electrostatic.exo\n"
207  " Cell Average Quantities:\n"
208  " eblock-0_0: ES_POTENTIAL, E0\n"
209  " \n"
210  " Particle Dump:\n"
211  " File Name: beam_emit2.h5part\n");
212  }
213 
214  TEUCHOS_UNIT_TEST(YAML, Issue1807part2)
215  {
217  "Header:\n"
218  " Particle Dump:\n"
219  " File Name: beam_emit2.h5part\n"
220  "# Stride Time: 5.0e-12\n");
221  }
222 
223  TEUCHOS_UNIT_TEST(YAML, Issue2090)
224  {
226  "Parameter List:\n"
227  " Boundary Conditions:\n"
228  " Bottom:\n"
229  " Dirichlet:\n"
230  " Sideset: bottom\n"
231  " Field: ES_POTENTIAL\n"
232  " Value: |\n"
233  " double r_sq = xin*xin+yin*yin;\n"
234  " double factor = 0.5*1.e8*1.60217662e-19/(2*3.14159265358979323846*8.854187817e-12);\n"
235  " ES_POTENTIAL= factor*log(r_sq) +3*xin-3*yin;\n"
236  " # end Boundary Conditions\n");
238  Teuchos::getParameter<std::string>(
239  params->sublist("Boundary Conditions", true)
240  .sublist("Bottom", true)
241  .sublist("Dirichlet", true)
242  ,"Value"),
243  "double r_sq = xin*xin+yin*yin;\n"
244  "double factor = 0.5*1.e8*1.60217662e-19/(2*3.14159265358979323846*8.854187817e-12);\n"
245  "ES_POTENTIAL= factor*log(r_sq) +3*xin-3*yin;\n");
246  }
247 
248  TEUCHOS_UNIT_TEST(YAML, Issue2306)
249  {
250  // ensure that duplicate names throw an exception
252  "Foo:\n"
253  " Bar:\n"
254  " Value: 1\n"
255  " Bar:\n"
256  " Value: 2\n"),
257  Teuchos::ParserFail);
258  }
259 
260  TEUCHOS_UNIT_TEST(YAML, keep_top_name)
261  {
263  char const * const cstr =
264  "%YAML 1.1\n"
265  "---\n"
266  "Albany:\n"
267  " some param: 5\n"
268  "...\n";
269  Teuchos::updateParametersFromYamlCString(cstr, Teuchos::ptr(&pl), true);
270  std::stringstream ss;
271  ss << std::showpoint;
273  auto s = ss.str();
274  TEST_EQUALITY(s, cstr);
275  }
276 
277  TEUCHOS_UNIT_TEST(YAML, long_long_param)
278  {
280  "List:\n"
281  " small number: 54\n"
282  " big number: 72057594037927936\n");
283  TEST_EQUALITY(pl->isType<int>("small number"), true);
284  TEST_EQUALITY(pl->isType<long long>("big number"), true);
285  TEST_EQUALITY(pl->get<long long>("big number"), 72057594037927936ll);
286  }
287 
288  TEUCHOS_UNIT_TEST(YAML, flow_map)
289  {
291  "List:\n"
292  " Fields: {rho: 0.125, px: 0., py: 0., pz: 0., rho_E: 0.25}\n");
293  auto& field_pl = pl->sublist("Fields");
294  TEST_EQUALITY(field_pl.get<double>("rho"), 0.125);
295  }
296 
297  TEUCHOS_UNIT_TEST(YAML, root_name)
298  {
301  "mycode:\n"
302  " sublist:\n"
303  " param1: foo\n",
304  Teuchos::ptr(&pl),
305  true,
306  "root_name test"
307  );
308  auto& sublist = pl.sublist("sublist");
309  TEST_EQUALITY(sublist.name(), "mycode->sublist");
310  }
311 
312 } //namespace TeuchosTests
313 
Teuchos_ParameterList.hpp
Templated Parameter List class.
Teuchos_RCP.hpp
Reference-counted pointer class and non-member templated function implementations.
Teuchos::Array::size
size_type size() const
Definition: Teuchos_Array.hpp:1017
Teuchos_YamlParameterListCoreHelpers.hpp
Simple helper functions that make it easy to read and write Yaml to and from a parameterlist.
Teuchos::YAMLParameterList::writeYamlStream
void writeYamlStream(std::ostream &yaml, const Teuchos::ParameterList &pl)
Definition: Teuchos_YamlParser.cpp:1104
Teuchos::updateParametersFromYamlCString
TEUCHOSPARAMETERLIST_LIB_DLL_EXPORT void updateParametersFromYamlCString(const char *const data, const Teuchos::Ptr< Teuchos::ParameterList > &paramList, bool overwrite)
Definition: Teuchos_YamlParser.cpp:976
TEST_EQUALITY
#define TEST_EQUALITY(v1, v2)
Assert the equality of v1 and v2.
Definition: Teuchos_LocalTestingHelpers.hpp:87
Teuchos::ParameterList::get
T & get(const std::string &name, T def_value)
Return the parameter's value, or the default value if it is not there.
Definition: Teuchos_ParameterList.hpp:901
Teuchos::writeParameterListToYamlOStream
void writeParameterListToYamlOStream(const ParameterList &paramList, std::ostream &yamlOut)
Definition: Teuchos_YamlParser.cpp:1024
TEST_THROW
#define TEST_THROW(code, ExceptType)
Assert that the statement 'code' throws the exception 'ExceptType' (otherwise the test fails).
Definition: Teuchos_LocalTestingHelpers.hpp:198
Teuchos::RCP
Smart reference counting pointer class for automatic garbage collection.
Definition: Teuchos_RCPDecl.hpp:429
Teuchos::getParametersFromYamlString
Teuchos::RCP< Teuchos::ParameterList > getParametersFromYamlString(const std::string &yamlStr)
Definition: Teuchos_YamlParser.cpp:1018
Teuchos_UnitTestHarness.hpp
Unit testing support.
Teuchos::Array< int >
TeuchosTests
Definition: YamlParameterList.cpp:63
Teuchos_YamlParser_decl.hpp
Functions to convert between ParameterList and YAML.
Teuchos_XMLParameterListCoreHelpers.hpp
Simple helper functions that make it easy to read and write XML to and from a parameterlist.
Teuchos_Exceptions.hpp
TeuchosTests::TEUCHOS_UNIT_TEST
TEUCHOS_UNIT_TEST(YAML, XmlEquivalence)
Definition: YamlParameterList.cpp:65
Teuchos::ParameterList::sublist
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
Creates an empty sublist and returns a reference to the sublist name. If the list already exists,...
Definition: Teuchos_ParameterList.cpp:239
Teuchos::getParametersFromYamlFile
Teuchos::RCP< Teuchos::ParameterList > getParametersFromYamlFile(const std::string &yamlFileName)
Definition: Teuchos_YamlParser.cpp:1013
Teuchos::YAMLParameterList::parseYamlStream
Teuchos::RCP< Teuchos::ParameterList > parseYamlStream(std::istream &yaml)
Definition: Teuchos_YamlParser.cpp:1095
Teuchos::ParameterList
A list of parameters of arbitrary type.
Definition: Teuchos_ParameterList.hpp:132
Teuchos_TwoDArray.hpp
A thin wrapper around the Teuchos Array class that allows for 2 dimensional arrays.
Teuchos_ScalarTraits.hpp
Defines basic traits for the scalar field type.
Teuchos::updateParametersFromYamlString
void updateParametersFromYamlString(const std::string &yamlData, const Teuchos::Ptr< Teuchos::ParameterList > &paramList, bool overwrite, const std::string &name)
Definition: Teuchos_YamlParser.cpp:994