From 793144a5011fde3e8303f0f6c6358df035227894 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sun, 5 Apr 2020 11:14:13 -0400 Subject: [PATCH 1/7] Add SolverSettings --- src/CMakeLists.txt | 2 + src/inputs.hpp | 30 ++++++++++++ src/inputs_file.cpp | 47 ++++++++++++++++++ src/solver.cpp | 46 ++++++++++++++++++ src/tests/CMakeLists.txt | 8 +++- src/tests/inputs.t.cpp | 46 ++++++++++++++++++ src/tests/{parser => }/main.cpp | 0 .../{parser/inputs.t.cpp => parser.t.cpp} | 28 +++++++++++ src/tests/solver.t.cpp | 48 +++++++++++++++++++ 9 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 src/inputs_file.cpp create mode 100644 src/solver.cpp create mode 100644 src/tests/inputs.t.cpp rename src/tests/{parser => }/main.cpp (100%) rename src/tests/{parser/inputs.t.cpp => parser.t.cpp} (89%) create mode 100644 src/tests/solver.t.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d5adbfc..1b4d8ff 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,7 +3,9 @@ ################################################################################ add_library(parser + inputs_file.cpp parser.cpp + solver.cpp ) target_include_directories(parser PRIVATE diff --git a/src/inputs.hpp b/src/inputs.hpp index 0f91fb6..195db39 100644 --- a/src/inputs.hpp +++ b/src/inputs.hpp @@ -18,4 +18,34 @@ std::optional parse_inputs(std::string); } // namespace parser +namespace solver_settings { + +struct GeometryAxis { + double low; + double high; + bool periodic; +}; +struct GeometrySettings { + std::tuple axes; +}; +struct SolverSettings { + GeometrySettings geometry; +}; + +std::optional make_solver(parser::InputInfo); +} // namespace solver_settings + +namespace inputs_file { +class InputsFile { +public: + InputsFile(std::string inputs_path) : m_path(inputs_path) {} + solver_settings::SolverSettings load(); + void save(solver_settings::SolverSettings); + +protected: + std::string m_path; +}; + +} // namespace inputs_file + #endif diff --git a/src/inputs_file.cpp b/src/inputs_file.cpp new file mode 100644 index 0000000..e050926 --- /dev/null +++ b/src/inputs_file.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include + +#include "inputs.hpp" + +template struct overloaded : Ts... { using Ts::operator()...; }; +template +overloaded(Ts...)->overloaded; // not needed as of C++20 + +namespace inputs_file { + +solver_settings::SolverSettings InputsFile::load() { + + std::ifstream infile(m_path); + std::stringstream buffer; + buffer << infile.rdbuf(); + infile.close(); + + auto maybe_inputinfo = parser::parse_inputs(buffer.str()); + assert(maybe_inputinfo.has_value()); + + auto asdf = maybe_inputinfo.value(); + + for (auto it = asdf.begin(); it != asdf.end(); ++it) { + std::visit( + overloaded{ + [](std::string ss) { std::cout << ss << std::endl; }, + [](parser::InputArray aa) { std::cout << aa.size() << std::endl; }, + }, + it->second); + } + + auto maybe_solversettings = solver_settings::make_solver(asdf); + assert(maybe_solversettings.has_value()); + return maybe_solversettings.value(); + + solver_settings::SolverSettings ss; + return ss; +}; + +void InputsFile::save(solver_settings::SolverSettings settings){}; + +} // namespace inputs_file diff --git a/src/solver.cpp b/src/solver.cpp new file mode 100644 index 0000000..c2ab10d --- /dev/null +++ b/src/solver.cpp @@ -0,0 +1,46 @@ +#include +#include + +#include + +namespace { + +void require(parser::InputInfo ii, std::string key) { + if (!ii.count(key)) { + std::cout << "missing required key: " << key << std::endl; + } +} + +std::optional +do_make_solver(parser::InputInfo ii) { + solver_settings::SolverSettings ss; + require(ii, "geometry.prob_lo"); + require(ii, "geometry.prob_hi"); + require(ii, "geometry.is_periodic"); + auto lows = std::get(ii["geometry.prob_lo"]); + auto highs = std::get(ii["geometry.prob_hi"]); + auto is_periodic = std::get(ii["geometry.is_periodic"]); + std::get<0>(ss.geometry.axes).high = highs[0]; + std::get<0>(ss.geometry.axes).low = lows[0]; + std::get<0>(ss.geometry.axes).periodic = is_periodic[0]; + std::get<1>(ss.geometry.axes).high = highs[1]; + std::get<1>(ss.geometry.axes).low = lows[1]; + std::get<1>(ss.geometry.axes).periodic = is_periodic[1]; + std::get<2>(ss.geometry.axes).high = highs[2]; + std::get<2>(ss.geometry.axes).low = lows[2]; + std::get<2>(ss.geometry.axes).periodic = is_periodic[2]; + return ss; +} +} // namespace + +namespace solver_settings { + +std::optional +make_solver(parser::InputInfo ii) { + auto maybe_state = do_make_solver(ii); + if (!maybe_state.has_value()) { + return std::nullopt; + } + return maybe_state.value(); +} +} // namespace solver_settings diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt index efe4fd1..355c820 100644 --- a/src/tests/CMakeLists.txt +++ b/src/tests/CMakeLists.txt @@ -3,9 +3,13 @@ ################################################################################ add_executable(unit_tests EXCLUDE_FROM_ALL + ../inputs_file.cpp ../parser.cpp - parser/main.cpp - parser/inputs.t.cpp + ../solver.cpp + inputs.t.cpp + parser.t.cpp + main.cpp + solver.t.cpp ) target_include_directories(unit_tests PRIVATE diff --git a/src/tests/inputs.t.cpp b/src/tests/inputs.t.cpp new file mode 100644 index 0000000..423ba39 --- /dev/null +++ b/src/tests/inputs.t.cpp @@ -0,0 +1,46 @@ +// tests + +#include "catch2/catch.hpp" + +#include +#include +#include +#include + +TEST_CASE("load_save_file", "[.]") { + std::string test_path("abc"); + std::ofstream outfile(test_path); + + // std::string data(R"( + // geometry.is_periodic = 0 0 0 # Is periodic in each + // direction? geometry.prob_lo = 0. 0. 0. # lo corner of + // physical domain geometry.prob_hi = 0.004 0.001 0.001 # hi corner + // of physical domain + // )"); + + std::string data(R"( +geometry.prob_lo = 0. 0. 0. +geometry.prob_hi = 0.004 0.001 0.001 +geometry.is_periodic = 0 0 0 +)"); + + outfile << data; + outfile.close(); + + inputs_file::InputsFile test_file(test_path); + auto solver_setup = test_file.load(); + + std::get<1>(solver_setup.geometry.axes).periodic = 1; + test_file.save(solver_setup); + + std::ifstream infile(test_path); + std::stringstream buffer; + buffer << infile.rdbuf(); + infile.close(); + CHECK(buffer.str() == R"( + geometry.is_periodic = 0 0 0 # Is periodic in each + direction? geometry.prob_lo = 0. 0. 0. # lo corner of + physical domain geometry.prob_hi = 0.004 0.001 0.001 # hi corner + of physical domain + )"); +} diff --git a/src/tests/parser/main.cpp b/src/tests/main.cpp similarity index 100% rename from src/tests/parser/main.cpp rename to src/tests/main.cpp diff --git a/src/tests/parser/inputs.t.cpp b/src/tests/parser.t.cpp similarity index 89% rename from src/tests/parser/inputs.t.cpp rename to src/tests/parser.t.cpp index dad519c..daab4ae 100644 --- a/src/tests/parser/inputs.t.cpp +++ b/src/tests/parser.t.cpp @@ -70,6 +70,34 @@ TEST_CASE("array", "[]") { CHECK(aa[2] == 0.0); } +TEST_CASE("multiple arrays", "[.]") { + auto maybe_st = parser::parse_inputs(R"( +geometry.is_periodic = 1 0 1 +geometry.prob_lo = 7. 2. 4. +geometry.prob_hi = 0.004 0.001 0.001 +)"); + + REQUIRE(maybe_st.has_value()); + auto info = maybe_st.value(); + CHECK(info.count("geometry.is_periodic")); + CHECK(info.count("geometry.prob_hi")); + CHECK(info.count("geometry.prob_lo")); + auto lows = info["geometry.prob_hi"]; + auto aa = std::get(lows); + + CHECK(aa.size() == 3); + CHECK(aa[0] == 0.004); + CHECK(aa[1] == 0.001); + CHECK(aa[2] == 0.001); + + auto pers = info["geometry.is_periodic"]; + auto bb = std::get(lows); + CHECK(bb.size() == 3); + CHECK(bb[0] == 1); + CHECK(bb[1] == 0); + CHECK(bb[2] == 1); +} + TEST_CASE("whole_file", "[]") { auto maybe_st = parser::parse_inputs(R"( diff --git a/src/tests/solver.t.cpp b/src/tests/solver.t.cpp new file mode 100644 index 0000000..7322f58 --- /dev/null +++ b/src/tests/solver.t.cpp @@ -0,0 +1,48 @@ +// tests + +#include "catch2/catch.hpp" + +#include + +TEST_CASE("from_origin", "[]") { + parser::InputInfo ii; + ii["geometry.prob_lo"] = parser::InputArray({0, 0, 0}); + ii["geometry.prob_hi"] = parser::InputArray({0.004, 0.001, 0.001}); + ii["geometry.is_periodic"] = parser::InputArray({0, 0, 0}); + auto maybe_sv = solver_settings::make_solver(ii); + + REQUIRE(maybe_sv.has_value()); + auto sv = maybe_sv.value(); + auto [xx, yy, zz] = sv.geometry.axes; + CHECK(xx.high == 0.004); + CHECK(xx.low == 0); + CHECK(yy.high == 0.001); + CHECK(yy.low == 0); + CHECK(zz.high == 0.001); + CHECK(zz.low == 0); + CHECK_FALSE(xx.periodic); + CHECK_FALSE(yy.periodic); + CHECK_FALSE(zz.periodic); +} + +TEST_CASE("negative_positive", "[]") { + parser::InputInfo ii; + ii["geometry.prob_lo"] = std::vector({-4, -5, -6}); + ii["geometry.prob_hi"] = std::vector({11.1, 22.2, 33.3}); + ii["geometry.is_periodic"] = parser::InputArray({1, 0, 1}); + + auto maybe_sv = solver_settings::make_solver(ii); + + REQUIRE(maybe_sv.has_value()); + auto sv = maybe_sv.value(); + auto [xx, yy, zz] = sv.geometry.axes; + CHECK(xx.high == 11.1); + CHECK(xx.low == -4); + CHECK(xx.periodic); + CHECK(yy.high == 22.2); + CHECK(yy.low == -5); + CHECK(zz.high == 33.3); + CHECK(zz.low == -6); + CHECK(zz.periodic); + CHECK_FALSE(yy.periodic); +} -- GitLab From 77ab0c6fa218d5144f249d658a0e279c37a5ad88 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sun, 5 Apr 2020 11:24:46 -0400 Subject: [PATCH 2/7] Remove double.hpp --- src/double.hpp | 44 -------------------------------------------- src/parser.cpp | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 47 deletions(-) delete mode 100644 src/double.hpp diff --git a/src/double.hpp b/src/double.hpp deleted file mode 100644 index 80e8115..0000000 --- a/src/double.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2014-2019 Dr. Colin Hirsch and Daniel Frey -// Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/ - -#ifndef TAO_PEGTL_SRC_EXAMPLES_PEGTL_DOUBLE_HPP -#define TAO_PEGTL_SRC_EXAMPLES_PEGTL_DOUBLE_HPP - -#include - -namespace double_ { -// A grammar for doubles suitable for std::stod without locale support. -// See also: http://en.cppreference.com/w/cpp/string/basic_string/stof - -using namespace TAO_PEGTL_NAMESPACE; - -// clang-format off - struct plus_minus : opt< one< '+', '-' > > {}; - struct dot : one< '.' > {}; - - struct inf : seq< istring< 'i', 'n', 'f' >, - opt< istring< 'i', 'n', 'i', 't', 'y' > > > {}; - - struct nan : seq< istring< 'n', 'a', 'n' >, - opt< one< '(' >, - plus< alnum >, - one< ')' > > > {}; - - template< typename D > - struct number : if_then_else< dot, - plus< D >, - seq< plus< D >, opt< dot, star< D > > > > {}; - - struct e : one< 'e', 'E' > {}; - struct p : one< 'p', 'P' > {}; - struct exponent : seq< plus_minus, plus< digit > > {}; - - struct decimal : seq< number< digit >, opt< e, exponent > > {}; - struct hexadecimal : seq< one< '0' >, one< 'x', 'X' >, number< xdigit >, opt< p, exponent > > {}; - - struct grammar : seq< plus_minus, sor< hexadecimal, decimal, inf, nan > > {}; -// clang-format on - -} // namespace double_ - -#endif diff --git a/src/parser.cpp b/src/parser.cpp index 10ac228..d921b60 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6,7 +6,6 @@ #include // includes -#include "double.hpp" #include "inputs.hpp" using namespace TAO_PEGTL_NAMESPACE; @@ -37,7 +36,18 @@ struct character struct string_literal : if_must, until, character>> {}; struct implicit_string : if_must> {}; -struct whitespace_delimited_array : list>> {}; +struct plus_minus : opt> {}; +struct dot : one<'.'> {}; + +struct decimal + : if_then_else, seq, opt>>> { +}; +struct e : one<'e', 'E'> {}; +struct p : one<'p', 'P'> {}; +struct exponent : seq> {}; +struct double_ : seq> {}; + +struct whitespace_delimited_array : list>> {}; struct L_FUN : pad, space> {}; struct R_FUN : pad, space> {}; @@ -88,7 +98,7 @@ template <> struct action { } }; -template <> struct action { +template <> struct action { template static void apply(const Input &in, parser_state &st) { std::stringstream ss(in.string()); -- GitLab From 6569cd2d9b5b66f2cea5794abc8d406316947a02 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Sun, 5 Apr 2020 11:25:52 -0400 Subject: [PATCH 3/7] cleanup --- src/parser.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index d921b60..b5f52d1 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -49,14 +49,6 @@ struct double_ : seq> {}; struct whitespace_delimited_array : list>> {}; -struct L_FUN : pad, space> {}; -struct R_FUN : pad, space> {}; -struct L_ARR : pad, space> {}; -struct R_ARR : pad, space> {}; -struct L_BLK : pad, space> {}; -struct R_BLK : pad, space> {}; -struct S_CLN : pad, space> {}; - struct name : identifier {}; struct value -- GitLab From 4d1882fa301ab26076c12ea8b61e785ea551a6fb Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Mon, 6 Apr 2020 17:30:27 -0400 Subject: [PATCH 4/7] Use PEGTL 2.8.2 --- src/inputs.hpp | 6 ++-- src/inputs_file.cpp | 3 +- src/parser.cpp | 63 ++++++++++++++++++++++++-------------- src/solver.cpp | 6 ++-- src/tests/parser.t.cpp | 69 ++++++++++++++++++++++++++++-------------- src/tests/solver.t.cpp | 8 ++--- subprojects/PEGTL | 2 +- 7 files changed, 99 insertions(+), 58 deletions(-) diff --git a/src/inputs.hpp b/src/inputs.hpp index 195db39..cffd5e4 100644 --- a/src/inputs.hpp +++ b/src/inputs.hpp @@ -10,9 +10,9 @@ namespace parser { -using InputArray = std::vector; -using InputValue = std::variant; -using InputInfo = std::map; +using NumberArray = std::vector; +using StringArray = std::vector; +using InputInfo = std::map>; std::optional parse_inputs(std::string); diff --git a/src/inputs_file.cpp b/src/inputs_file.cpp index e050926..ac4a1d8 100644 --- a/src/inputs_file.cpp +++ b/src/inputs_file.cpp @@ -29,7 +29,8 @@ solver_settings::SolverSettings InputsFile::load() { std::visit( overloaded{ [](std::string ss) { std::cout << ss << std::endl; }, - [](parser::InputArray aa) { std::cout << aa.size() << std::endl; }, + [](parser::NumberArray aa) { std::cout << aa.size() << std::endl; }, + [](parser::StringArray aa) { std::cout << aa.size() << std::endl; }, }, it->second); } diff --git a/src/parser.cpp b/src/parser.cpp index b5f52d1..5d7bcca 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -8,14 +8,15 @@ // includes #include "inputs.hpp" -using namespace TAO_PEGTL_NAMESPACE; +using namespace tao::pegtl; namespace { struct parser_state { std::string current_key; - std::vector current_vec; - parser::InputValue current_value; + std::variant, std::vector> current_value; + std::vector current_num_vec; + std::vector current_str_vec; parser::InputInfo info; }; @@ -31,10 +32,13 @@ struct escaped_c struct escaped : sor {}; +struct key : plus, one<'_'>, one<'-'>, one<'.'>>> {}; + struct character : if_must_else, escaped, utf8::range<0x20, 0x10FFFF>> {}; -struct string_literal : if_must, until, character>> {}; -struct implicit_string : if_must> {}; +struct quoted_string : if_must, until, character>> {}; +struct unquoted_string : key {}; +struct string_literal : sor {}; struct plus_minus : opt> {}; struct dot : one<'.'> {}; @@ -47,18 +51,20 @@ struct p : one<'p', 'P'> {}; struct exponent : seq> {}; struct double_ : seq> {}; -struct whitespace_delimited_array : list>> {}; - -struct name : identifier {}; - -struct value - : sor {}; +struct num_array : list>> {}; +struct str_array : list>> {}; +struct value : sor {}; struct comment : if_must, until> {}; -struct key : list> {}; -struct keyval : seq, string<'='>, pad> {}; -struct grammar : pad, space> {}; +struct value_item : pad {}; +struct value_list : list_must> {}; +struct keyval_line + : if_must, string<'='>, value_list, sor> {}; +struct comment_line : seq, until> {}; +struct blank_line : seq>, until> {}; +struct line : sor {}; +struct grammar : until {}; template struct action {}; @@ -70,23 +76,24 @@ template <> struct action { } }; -template <> struct action { +template <> struct action { template static void apply(const Input &in, parser_state &st) { std::stringstream ss(in.string()); std::string v; ss >> v; - st.current_value = v.substr(1, v.length() - 2); // strip quotes + auto str_val = v.substr(1, v.length() - 2); // strip quotes + st.current_str_vec.push_back(str_val); } }; -template <> struct action { +template <> struct action { template static void apply(const Input &in, parser_state &st) { std::stringstream ss(in.string()); std::string v; ss >> v; - st.current_value = v; + st.current_str_vec.push_back(v); } }; @@ -96,19 +103,29 @@ template <> struct action { std::stringstream ss(in.string()); double v; ss >> v; - st.current_vec.push_back(v); + st.current_num_vec.push_back(v); + } +}; + +template <> struct action { + template + static void apply(const Input &in, parser_state &st) { + std::stringstream ss(in.string()); + st.current_value = st.current_num_vec; + st.current_num_vec.clear(); } }; -template <> struct action { + +template <> struct action { template static void apply(const Input &in, parser_state &st) { std::stringstream ss(in.string()); - st.current_value = st.current_vec; - st.current_vec.clear(); + st.current_value = st.current_str_vec; + st.current_str_vec.clear(); } }; -template <> struct action { +template <> struct action { template static void apply(const Input &in, parser_state &st) { st.info[st.current_key] = st.current_value; diff --git a/src/solver.cpp b/src/solver.cpp index c2ab10d..c0479c7 100644 --- a/src/solver.cpp +++ b/src/solver.cpp @@ -17,9 +17,9 @@ do_make_solver(parser::InputInfo ii) { require(ii, "geometry.prob_lo"); require(ii, "geometry.prob_hi"); require(ii, "geometry.is_periodic"); - auto lows = std::get(ii["geometry.prob_lo"]); - auto highs = std::get(ii["geometry.prob_hi"]); - auto is_periodic = std::get(ii["geometry.is_periodic"]); + auto lows = std::get(ii["geometry.prob_lo"]); + auto highs = std::get(ii["geometry.prob_hi"]); + auto is_periodic = std::get(ii["geometry.is_periodic"]); std::get<0>(ss.geometry.axes).high = highs[0]; std::get<0>(ss.geometry.axes).low = lows[0]; std::get<0>(ss.geometry.axes).periodic = is_periodic[0]; diff --git a/src/tests/parser.t.cpp b/src/tests/parser.t.cpp index daab4ae..cada1ec 100644 --- a/src/tests/parser.t.cpp +++ b/src/tests/parser.t.cpp @@ -9,14 +9,14 @@ TEST_CASE("comment", "[]") { CHECK(maybe_st.has_value()); } -TEST_CASE("double_int", "[]") { +TEST_CASE("integer", "[]") { auto maybe_st = parser::parse_inputs(R"( mfix.max_step = 100 )"); REQUIRE(maybe_st.has_value()); auto info = maybe_st.value(); auto value = info["mfix.max_step"]; - auto aa = std::get(value); + auto aa = std::get(value); CHECK(aa.size() == 1); CHECK(aa[0] == 100); } @@ -28,7 +28,7 @@ mfix.stop_time = 0.20 REQUIRE(maybe_st.has_value()); auto info = maybe_st.value(); auto value = info["mfix.stop_time"]; - auto aa = std::get(value); + auto aa = std::get(value); CHECK(aa.size() == 1); CHECK(aa[0] == 0.2); } @@ -40,8 +40,9 @@ TEST_CASE("string", "[]") { REQUIRE(maybe_st.has_value()); auto info = maybe_st.value(); auto value = info["mfix.particle_init_type"]; - auto ss = std::get(value); - CHECK(ss == "Auto"); + auto ss = std::get(value); + CHECK(ss.size() == 1); + CHECK(ss[0] == "Auto"); } TEST_CASE("implicit string", "[]") { @@ -51,11 +52,12 @@ fluid.solve = fluid REQUIRE(maybe_st.has_value()); auto info = maybe_st.value(); auto value = info["fluid.solve"]; - auto ss = std::get(value); - CHECK(ss == "fluid"); + auto ss = std::get(value); + CHECK(ss.size() == 1); + CHECK(ss[0] == "fluid"); } -TEST_CASE("array", "[]") { +TEST_CASE("double array", "[]") { auto maybe_st = parser::parse_inputs(R"( mfix.gravity = -9.81 0.0 0.0 )"); @@ -63,39 +65,60 @@ TEST_CASE("array", "[]") { REQUIRE(maybe_st.has_value()); auto info = maybe_st.value(); auto value = info["mfix.gravity"]; - auto aa = std::get(value); + auto aa = std::get(value); CHECK(aa.size() == 3); CHECK(aa[0] == -9.81); CHECK(aa[1] == 0.0); CHECK(aa[2] == 0.0); } +TEST_CASE("string array", "[]") { + auto maybe_st = parser::parse_inputs(R"( + mfix.regions = abc ijk xyz +)"); + + REQUIRE(maybe_st.has_value()); + auto info = maybe_st.value(); + auto value = info["mfix.regions"]; + auto aa = std::get(value); + CHECK(aa.size() == 3); + CHECK(aa[0] == "abc"); + CHECK(aa[1] == "ijk"); + CHECK(aa[2] == "xyz"); +} -TEST_CASE("multiple arrays", "[.]") { +TEST_CASE("multiple arrays", "[]") { auto maybe_st = parser::parse_inputs(R"( -geometry.is_periodic = 1 0 1 -geometry.prob_lo = 7. 2. 4. +geometry.prob_lo = -4 -1 -2 geometry.prob_hi = 0.004 0.001 0.001 +geometry.is_periodic = 1 0 1 )"); REQUIRE(maybe_st.has_value()); auto info = maybe_st.value(); - CHECK(info.count("geometry.is_periodic")); CHECK(info.count("geometry.prob_hi")); CHECK(info.count("geometry.prob_lo")); - auto lows = info["geometry.prob_hi"]; - auto aa = std::get(lows); + CHECK(info.count("geometry.is_periodic")); + auto highs = info["geometry.prob_lo"]; + auto aa = std::get(highs); CHECK(aa.size() == 3); - CHECK(aa[0] == 0.004); - CHECK(aa[1] == 0.001); - CHECK(aa[2] == 0.001); + CHECK(aa[0] == -4); + CHECK(aa[1] == -1); + CHECK(aa[2] == -2); - auto pers = info["geometry.is_periodic"]; - auto bb = std::get(lows); + auto lows = info["geometry.prob_hi"]; + auto bb = std::get(lows); CHECK(bb.size() == 3); - CHECK(bb[0] == 1); - CHECK(bb[1] == 0); - CHECK(bb[2] == 1); + CHECK(bb[0] == 0.004); + CHECK(bb[1] == 0.001); + CHECK(bb[2] == 0.001); + + auto pers = info["geometry.is_periodic"]; + auto cc = std::get(pers); + CHECK(cc.size() == 3); + CHECK(cc[0] == 1); + CHECK(cc[1] == 0); + CHECK(cc[2] == 1); } TEST_CASE("whole_file", "[]") { diff --git a/src/tests/solver.t.cpp b/src/tests/solver.t.cpp index 7322f58..104110b 100644 --- a/src/tests/solver.t.cpp +++ b/src/tests/solver.t.cpp @@ -6,9 +6,9 @@ TEST_CASE("from_origin", "[]") { parser::InputInfo ii; - ii["geometry.prob_lo"] = parser::InputArray({0, 0, 0}); - ii["geometry.prob_hi"] = parser::InputArray({0.004, 0.001, 0.001}); - ii["geometry.is_periodic"] = parser::InputArray({0, 0, 0}); + ii["geometry.prob_lo"] = parser::NumberArray({0, 0, 0}); + ii["geometry.prob_hi"] = parser::NumberArray({0.004, 0.001, 0.001}); + ii["geometry.is_periodic"] = parser::NumberArray({0, 0, 0}); auto maybe_sv = solver_settings::make_solver(ii); REQUIRE(maybe_sv.has_value()); @@ -29,7 +29,7 @@ TEST_CASE("negative_positive", "[]") { parser::InputInfo ii; ii["geometry.prob_lo"] = std::vector({-4, -5, -6}); ii["geometry.prob_hi"] = std::vector({11.1, 22.2, 33.3}); - ii["geometry.is_periodic"] = parser::InputArray({1, 0, 1}); + ii["geometry.is_periodic"] = parser::NumberArray({1, 0, 1}); auto maybe_sv = solver_settings::make_solver(ii); diff --git a/subprojects/PEGTL b/subprojects/PEGTL index 054e446..ede3ce1 160000 --- a/subprojects/PEGTL +++ b/subprojects/PEGTL @@ -1 +1 @@ -Subproject commit 054e44694f6c8cd24259b70f48cc09d84a9af395 +Subproject commit ede3ce17aef7da27648b195dc77814cb1d3c313d -- GitLab From e8bb618bc4e0a278ba045f689f9951f74d45b62c Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Mon, 6 Apr 2020 17:45:34 -0400 Subject: [PATCH 5/7] Enable inputs file test --- src/inputs_file.cpp | 18 +++++++++++++++++- src/tests/inputs.t.cpp | 25 ++++++++----------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/inputs_file.cpp b/src/inputs_file.cpp index ac4a1d8..7dcd6c8 100644 --- a/src/inputs_file.cpp +++ b/src/inputs_file.cpp @@ -43,6 +43,22 @@ solver_settings::SolverSettings InputsFile::load() { return ss; }; -void InputsFile::save(solver_settings::SolverSettings settings){}; +void InputsFile::save(solver_settings::SolverSettings settings) { + + std::ofstream out(m_path); + + auto [xx, yy, zz] = settings.geometry.axes; + out << std::endl; + out << " geometry.is_periodic = " << xx.periodic << " " << yy.periodic << " " + << zz.periodic << std::endl; + ; + out << " geometry.prob_lo = " << xx.low << " " << yy.low << " " << zz.low + << std::endl; + ; + out << " geometry.prob_hi = " << xx.high << " " << yy.high << " " + << zz.high; + ; + out.close(); +}; } // namespace inputs_file diff --git a/src/tests/inputs.t.cpp b/src/tests/inputs.t.cpp index 423ba39..250a93f 100644 --- a/src/tests/inputs.t.cpp +++ b/src/tests/inputs.t.cpp @@ -7,22 +7,15 @@ #include #include -TEST_CASE("load_save_file", "[.]") { +TEST_CASE("load_save_file", "[]") { std::string test_path("abc"); std::ofstream outfile(test_path); - // std::string data(R"( - // geometry.is_periodic = 0 0 0 # Is periodic in each - // direction? geometry.prob_lo = 0. 0. 0. # lo corner of - // physical domain geometry.prob_hi = 0.004 0.001 0.001 # hi corner - // of physical domain - // )"); - std::string data(R"( -geometry.prob_lo = 0. 0. 0. -geometry.prob_hi = 0.004 0.001 0.001 -geometry.is_periodic = 0 0 0 -)"); + geometry.is_periodic = 0 0 0 # Is periodic in each direction? + geometry.prob_lo = 0. 0. 0. # lo corner of physical domain + geometry.prob_hi = 0.004 0.001 0.001 # hi corner of physical domain + )"); outfile << data; outfile.close(); @@ -38,9 +31,7 @@ geometry.is_periodic = 0 0 0 buffer << infile.rdbuf(); infile.close(); CHECK(buffer.str() == R"( - geometry.is_periodic = 0 0 0 # Is periodic in each - direction? geometry.prob_lo = 0. 0. 0. # lo corner of - physical domain geometry.prob_hi = 0.004 0.001 0.001 # hi corner - of physical domain - )"); + geometry.is_periodic = 0 1 0 + geometry.prob_lo = 0 0 0 + geometry.prob_hi = 0.004 0.001 0.001)"); } -- GitLab From a79baa2e7a63ec4cf73173db237c51a596d61572 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Mon, 6 Apr 2020 17:48:24 -0400 Subject: [PATCH 6/7] Fix includes --- src/inputs_file.cpp | 25 +++++++++++++------------ src/solver.cpp | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/inputs_file.cpp b/src/inputs_file.cpp index 7dcd6c8..4117db3 100644 --- a/src/inputs_file.cpp +++ b/src/inputs_file.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -23,19 +22,21 @@ solver_settings::SolverSettings InputsFile::load() { auto maybe_inputinfo = parser::parse_inputs(buffer.str()); assert(maybe_inputinfo.has_value()); - auto asdf = maybe_inputinfo.value(); + auto inputinfo = maybe_inputinfo.value(); - for (auto it = asdf.begin(); it != asdf.end(); ++it) { - std::visit( - overloaded{ - [](std::string ss) { std::cout << ss << std::endl; }, - [](parser::NumberArray aa) { std::cout << aa.size() << std::endl; }, - [](parser::StringArray aa) { std::cout << aa.size() << std::endl; }, - }, - it->second); - } + // for (auto it = inputinfo.begin(); it != inputinfo.end(); ++it) { + // std::visit( + // overloaded{ + // [](std::string ss) { std::cout << ss << std::endl; }, + // [](parser::NumberArray aa) { std::cout << aa.size() << std::endl; + // }, + // [](parser::StringArray aa) { std::cout << aa.size() << std::endl; + // }, + // }, + // it->second); + // } - auto maybe_solversettings = solver_settings::make_solver(asdf); + auto maybe_solversettings = solver_settings::make_solver(inputinfo); assert(maybe_solversettings.has_value()); return maybe_solversettings.value(); diff --git a/src/solver.cpp b/src/solver.cpp index c0479c7..a95db81 100644 --- a/src/solver.cpp +++ b/src/solver.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include "inputs.hpp" namespace { -- GitLab From b317f4ab15d2b5fcc7c412e753cd4d103cd2b283 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Mon, 6 Apr 2020 17:50:11 -0400 Subject: [PATCH 7/7] Disable for now --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a841b77..c1bfe8e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,7 +14,7 @@ test:all: - cmake --build build --target unit_tests - ./build/src/tests/unit_tests - cmake --build build --target mfix-parser - - find -name inputs - - find -name inputs |xargs -l ./build/mfix-parser + # - find -name inputs + # - find -name inputs |xargs -l ./build/mfix-parser tags: - mfix-exa -- GitLab