From f435375fd0fbdb08ad91a0fce0485e08c86623b2 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Fri, 8 May 2020 10:56:07 -0400 Subject: [PATCH 1/5] Catch parse errors better --- src/csg/impl/levelset_3d.cpp | 6 ++++-- src/inputs/geometry.cpp | 19 +++++++++---------- src/inputs/mesh.cpp | 2 +- src/inputs/parser.cpp | 14 ++++++++++++-- src/inputs/solver.cpp | 26 ++++++++------------------ src/inputs/solver.hpp | 6 ++---- src/inputs/solver_impl.hpp | 7 +++++++ src/inputs/tests/solver.t.cpp | 10 +--------- src/inputs/time.cpp | 2 +- subprojects/PEGTL | 2 +- 10 files changed, 46 insertions(+), 48 deletions(-) create mode 100644 src/inputs/solver_impl.hpp diff --git a/src/csg/impl/levelset_3d.cpp b/src/csg/impl/levelset_3d.cpp index 8f6821d..e3498d3 100644 --- a/src/csg/impl/levelset_3d.cpp +++ b/src/csg/impl/levelset_3d.cpp @@ -131,8 +131,10 @@ double signed_distance_3d(const Cylinder &cyl, double xx, double yy, double signed_distance_3d(const LinearExtrude &lin_ext, double xx, double yy, double zz) { // TODO: support height, center and twist - double sign_z = (0 <= zz && zz <= lin_ext.height) ? 1.0 : 1.0; // unused zz warning workaround - return sign_z*signed_distance_2d(lin_ext.group, xx, yy); + double sign_z = (0 <= zz && zz <= lin_ext.height) + ? 1.0 + : 1.0; // unused zz warning workaround + return sign_z * signed_distance_2d(lin_ext.group, xx, yy); } double signed_distance_3d(const RotateExtrude &rot_ext, double xx, double yy, diff --git a/src/inputs/geometry.cpp b/src/inputs/geometry.cpp index 7f48246..25ab51f 100644 --- a/src/inputs/geometry.cpp +++ b/src/inputs/geometry.cpp @@ -1,20 +1,20 @@ #include -#include "solver.hpp" +#include "solver_impl.hpp" namespace solver { std::optional make_geometry(solver::InputInfo ii) { solver::GeometrySettings geo; - if (!ii.count(CSG_FILENAME)) { - require(CSG_FILENAME); - return std::nullopt; - } - auto csg_filename = std::get(ii[CSG_FILENAME]); - if (csg_filename.size() != 1) { - std::cout << CSG_FILENAME << " should only have 1 element" << std::endl; - return std::nullopt; + if (ii.count(CSG_FILENAME)) { + auto csg_filename = std::get(ii[CSG_FILENAME]); + if (csg_filename.size() != 1) { + std::cout << CSG_FILENAME << " should only have 1 element" << std::endl; + return std::nullopt; + } + } else { + geo.csg_filename = ""; } if (!ii.count(PROB_LO)) { @@ -45,7 +45,6 @@ std::optional make_geometry(solver::InputInfo ii) { return std::nullopt; } - geo.csg_filename = csg_filename[0]; std::get<0>(geo.axes).high = highs[0]; std::get<0>(geo.axes).low = lows[0]; std::get<0>(geo.axes).periodic = is_periodic[0]; diff --git a/src/inputs/mesh.cpp b/src/inputs/mesh.cpp index 76fdb76..26eaecd 100644 --- a/src/inputs/mesh.cpp +++ b/src/inputs/mesh.cpp @@ -1,6 +1,6 @@ #include -#include "solver.hpp" +#include "solver_impl.hpp" namespace solver { diff --git a/src/inputs/parser.cpp b/src/inputs/parser.cpp index 2a4c78b..68a65c2 100644 --- a/src/inputs/parser.cpp +++ b/src/inputs/parser.cpp @@ -1,5 +1,6 @@ // standard includes #include +#include #include // subproject includes @@ -136,9 +137,18 @@ template <> struct action { std::optional do_parse(std::string str) { parser_state st; memory_input in(str, "std::cin"); - if (!parse(in, st)) { - return std::nullopt; + + try { + if (!parse(in, st)) { + return std::nullopt; + } + } catch (const parse_error &e) { + const auto p = e.positions.front(); + std::cerr << e.what() << std::endl + << in.line_at(p) << std::endl + << std::string(p.byte_in_line, ' ') << '^' << std::endl; } + return st; } diff --git a/src/inputs/solver.cpp b/src/inputs/solver.cpp index 02a506d..fc1a46f 100644 --- a/src/inputs/solver.cpp +++ b/src/inputs/solver.cpp @@ -1,8 +1,7 @@ #include -#include #include -#include "solver.hpp" +#include "solver_impl.hpp" namespace solver { @@ -10,35 +9,26 @@ void require(std::string key) { std::cout << "missing required key: " << key << std::endl; } -std::optional do_make_solver(solver::InputInfo ii) { +std::pair> +make_solver(solver::InputInfo ii) { + std::vector messages; solver::SolverSettings ss; auto new_geo = make_geometry(ii); if (!new_geo.has_value()) { - std::cout << "Problem making geometry" << std::endl; - return std::nullopt; + messages.push_back("Problem making geometry"); } auto new_mesh = make_mesh(ii); if (!new_mesh.has_value()) { - std::cout << "Problem making mesh" << std::endl; - return std::nullopt; + messages.push_back("Problem making mesh"); } auto new_time = make_time(ii); if (!new_time.has_value()) { - std::cout << "Problem making time" << std::endl; - return std::nullopt; + messages.push_back("Problem making time"); } ss.geometry = new_geo.value(); ss.time = new_time.value(); ss.mesh = new_mesh.value(); - return ss; -} - -std::optional make_solver(solver::InputInfo ii) { - auto maybe_state = do_make_solver(ii); - if (!maybe_state.has_value()) { - return std::nullopt; - } - return maybe_state.value(); + return std::make_pair(ss, messages); } std::string serialize(solver::SolverSettings settings) { diff --git a/src/inputs/solver.hpp b/src/inputs/solver.hpp index 8136360..0d9aa33 100644 --- a/src/inputs/solver.hpp +++ b/src/inputs/solver.hpp @@ -57,10 +57,8 @@ struct SolverSettings { TimeSettings time; }; -std::optional make_solver(solver::InputInfo); -std::optional make_geometry(solver::InputInfo); -std::optional make_mesh(solver::InputInfo); -std::optional make_time(solver::InputInfo); +std::pair> + make_solver(solver::InputInfo); std::string serialize(solver::SolverSettings); void require(std::string); diff --git a/src/inputs/solver_impl.hpp b/src/inputs/solver_impl.hpp new file mode 100644 index 0000000..5cd67e7 --- /dev/null +++ b/src/inputs/solver_impl.hpp @@ -0,0 +1,7 @@ +#include + +namespace solver { +std::optional make_geometry(solver::InputInfo); +std::optional make_mesh(solver::InputInfo); +std::optional make_time(solver::InputInfo); +} // namespace solver diff --git a/src/inputs/tests/solver.t.cpp b/src/inputs/tests/solver.t.cpp index f160a05..e0ed6f7 100644 --- a/src/inputs/tests/solver.t.cpp +++ b/src/inputs/tests/solver.t.cpp @@ -5,12 +5,6 @@ #include #include -TEST_CASE("empty (invalid) map", "[]") { - solver::InputInfo ii; - auto maybe_sv = solver::make_solver(ii); - CHECK_FALSE(maybe_sv.has_value()); -} - TEST_CASE("from_origin", "[]") { solver::InputInfo ii; @@ -42,9 +36,7 @@ TEST_CASE("from_origin", "[]") { ii[CFL] = solver::NumberArray({0.77}); ii[TCOLL_RATIO] = solver::NumberArray({49.2}); - auto maybe_sv = solver::make_solver(ii); - REQUIRE(maybe_sv.has_value()); - auto sv = maybe_sv.value(); + auto [sv, messages] = solver::make_solver(ii); SECTION(" Geometry fields ") { auto [xx, yy, zz] = sv.geometry.axes; diff --git a/src/inputs/time.cpp b/src/inputs/time.cpp index 483a001..bd6601e 100644 --- a/src/inputs/time.cpp +++ b/src/inputs/time.cpp @@ -1,6 +1,6 @@ #include -#include "solver.hpp" +#include "solver_impl.hpp" namespace solver { diff --git a/subprojects/PEGTL b/subprojects/PEGTL index ede3ce1..47e878a 160000 --- a/subprojects/PEGTL +++ b/subprojects/PEGTL @@ -1 +1 @@ -Subproject commit ede3ce17aef7da27648b195dc77814cb1d3c313d +Subproject commit 47e878ad4fd72c91253c9d47b6f17e001ca2dfcf -- GitLab From 82b4ed19be046ce9742f5cc2ddfbd4eabf6bda43 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Fri, 8 May 2020 11:52:22 -0400 Subject: [PATCH 2/5] Better messages --- src/inputs/geometry.cpp | 49 +++++++++++++++++-------------------- src/inputs/mesh.cpp | 50 +++++++++++++++++++------------------- src/inputs/solver.cpp | 36 ++++++++++++--------------- src/inputs/solver.hpp | 6 +++-- src/inputs/solver_impl.hpp | 8 +++--- src/inputs/time.cpp | 22 ++++++++--------- 6 files changed, 82 insertions(+), 89 deletions(-) diff --git a/src/inputs/geometry.cpp b/src/inputs/geometry.cpp index 25ab51f..5cb26f0 100644 --- a/src/inputs/geometry.cpp +++ b/src/inputs/geometry.cpp @@ -1,59 +1,54 @@ -#include - #include "solver_impl.hpp" namespace solver { -std::optional make_geometry(solver::InputInfo ii) { +solver::GeometrySettings make_geometry(solver::InputInfo ii, + std::vector messages) { solver::GeometrySettings geo; if (ii.count(CSG_FILENAME)) { auto csg_filename = std::get(ii[CSG_FILENAME]); if (csg_filename.size() != 1) { - std::cout << CSG_FILENAME << " should only have 1 element" << std::endl; - return std::nullopt; + messages.push_back( + InputsMessage{"geometry.filename should only have 1 element"}); } } else { geo.csg_filename = ""; } if (!ii.count(PROB_LO)) { - require(PROB_LO); - return std::nullopt; + require(PROB_LO, messages, 0); } if (!ii.count(PROB_HI)) { - require(PROB_HI); - return std::nullopt; + require(PROB_HI, messages, 0); } if (!ii.count(PERIODIC)) { - require(PERIODIC); - return std::nullopt; + require(PERIODIC, messages, 0); } auto lows = std::get(ii[PROB_LO]); auto highs = std::get(ii[PROB_HI]); auto is_periodic = std::get(ii[PERIODIC]); if (lows.size() != 3) { - std::cout << "prob_lo needs 3 elements " << std::endl; - return std::nullopt; + require(PROB_LO, messages, 3); + } else { + std::get<0>(geo.axes).low = lows[0]; + std::get<1>(geo.axes).low = lows[1]; + std::get<2>(geo.axes).low = lows[2]; } if (highs.size() != 3) { - std::cout << "prob_hi needs 3 elements " << std::endl; - return std::nullopt; + require(PROB_HI, messages, 3); + } else { + std::get<0>(geo.axes).high = highs[0]; + std::get<1>(geo.axes).high = highs[1]; + std::get<2>(geo.axes).high = highs[2]; } if (is_periodic.size() != 3) { - std::cout << "periodic needs 3 elements " << std::endl; - return std::nullopt; + require(PERIODIC, messages, 3); + } else { + std::get<0>(geo.axes).periodic = is_periodic[0]; + std::get<1>(geo.axes).periodic = is_periodic[1]; + std::get<2>(geo.axes).periodic = is_periodic[2]; } - - std::get<0>(geo.axes).high = highs[0]; - std::get<0>(geo.axes).low = lows[0]; - std::get<0>(geo.axes).periodic = is_periodic[0]; - std::get<1>(geo.axes).high = highs[1]; - std::get<1>(geo.axes).low = lows[1]; - std::get<1>(geo.axes).periodic = is_periodic[1]; - std::get<2>(geo.axes).high = highs[2]; - std::get<2>(geo.axes).low = lows[2]; - std::get<2>(geo.axes).periodic = is_periodic[2]; return geo; } } // namespace solver diff --git a/src/inputs/mesh.cpp b/src/inputs/mesh.cpp index 26eaecd..be69dc6 100644 --- a/src/inputs/mesh.cpp +++ b/src/inputs/mesh.cpp @@ -1,29 +1,29 @@ -#include - #include "solver_impl.hpp" namespace solver { -std::optional make_mesh(solver::InputInfo ii) { +solver::MeshSettings make_mesh(solver::InputInfo ii, + std::vector messages) { solver::MeshSettings mesh; + auto [mx, my, mz] = mesh.axes; + if (!ii.count(N_CELL)) { - require(N_CELL); - return std::nullopt; - } - auto n_cell = std::get(ii[N_CELL]); - if (n_cell.size() != 3) { - std::cout << N_CELL << " needs 3 elements " << std::endl; - return std::nullopt; - } + require(N_CELL, messages, 0); + } else { - auto [mx, my, mz] = mesh.axes; - mx.n_cell = n_cell[0]; - my.n_cell = n_cell[1]; - mz.n_cell = n_cell[2]; + auto n_cell = std::get(ii[N_CELL]); + if (n_cell.size() != 3) { + require(N_CELL, messages, 3); + } else { + mx.n_cell = n_cell[0]; + my.n_cell = n_cell[1]; + mz.n_cell = n_cell[2]; + } + } auto fabarray_size = std::get(ii[FABARRAY_TILE_SZ]); if (fabarray_size.size() != 3) { - std::cout << FABARRAY_TILE_SZ << " needs 3 elements " << std::endl; + require(FABARRAY_TILE_SZ, messages, 3); } else { mx.fluid_max_tile_size = fabarray_size[0]; my.fluid_max_tile_size = fabarray_size[1]; @@ -32,7 +32,7 @@ std::optional make_mesh(solver::InputInfo ii) { auto part_grid_size = std::get(ii[PARTICLE_TILE_SZ]); if (part_grid_size.size() != 3) { - std::cout << PARTICLE_TILE_SZ << " needs 3 elements " << std::endl; + require(PARTICLE_TILE_SZ, messages, 3); } else { mx.particle_max_tile_size = part_grid_size[0]; my.particle_max_tile_size = part_grid_size[1]; @@ -41,19 +41,19 @@ std::optional make_mesh(solver::InputInfo ii) { auto grid_size_x = std::get(ii[GRID_SIZE_X]); if (grid_size_x.size() != 1) { - std::cout << GRID_SIZE_X << " is a scalar " << std::endl; + require(GRID_SIZE_X, messages, 1); } else { mx.max_grid_size = grid_size_x[0]; } auto grid_size_y = std::get(ii[GRID_SIZE_Y]); if (grid_size_y.size() != 1) { - std::cout << GRID_SIZE_Y << " is a scalar " << std::endl; + require(GRID_SIZE_Y, messages, 1); } else { my.max_grid_size = grid_size_y[0]; } auto grid_size_z = std::get(ii[GRID_SIZE_Z]); if (grid_size_z.size() != 1) { - std::cout << GRID_SIZE_Z << " is a scalar " << std::endl; + require(GRID_SIZE_Z, messages, 1); } else { mz.max_grid_size = grid_size_z[0]; } @@ -61,35 +61,35 @@ std::optional make_mesh(solver::InputInfo ii) { auto particle_grid_size_x = std::get(ii[PARTICLE_GRID_SIZE_X]); if (particle_grid_size_x.size() != 1) { - std::cout << PARTICLE_GRID_SIZE_X << " is a scalar " << std::endl; + require(PARTICLE_GRID_SIZE_X, messages, 1); } else { mx.particle_max_grid_size = particle_grid_size_x[0]; } auto particle_grid_size_y = std::get(ii[PARTICLE_GRID_SIZE_Y]); if (particle_grid_size_y.size() != 1) { - std::cout << PARTICLE_GRID_SIZE_Y << " is a scalar " << std::endl; + require(PARTICLE_GRID_SIZE_Y, messages, 1); } else { my.particle_max_grid_size = particle_grid_size_y[0]; } auto particle_grid_size_z = std::get(ii[PARTICLE_GRID_SIZE_Z]); if (particle_grid_size_z.size() != 1) { - std::cout << PARTICLE_GRID_SIZE_Z << " is a scalar " << std::endl; + require(PARTICLE_GRID_SIZE_Z, messages, 1); } else { mz.particle_max_grid_size = particle_grid_size_z[0]; } auto bf = std::get(ii[BLOCKING_FACTOR]); if (bf.size() != 1) { - std::cout << BLOCKING_FACTOR << " is a scalar" << std::endl; + require(BLOCKING_FACTOR, messages, 1); } else { mesh.blocking_factor = bf[0]; } auto volfrac = std::get(ii[SMALL_VOLFRAC]); if (volfrac.size() != 1) { - std::cout << SMALL_VOLFRAC << " is a scalar" << std::endl; + require(SMALL_VOLFRAC, messages, 1); } else { mesh.small_volfrac = volfrac[0]; } diff --git a/src/inputs/solver.cpp b/src/inputs/solver.cpp index fc1a46f..3705a05 100644 --- a/src/inputs/solver.cpp +++ b/src/inputs/solver.cpp @@ -1,33 +1,29 @@ -#include #include #include "solver_impl.hpp" namespace solver { -void require(std::string key) { - std::cout << "missing required key: " << key << std::endl; +void require(std::string key, std::vector messages, int size) { + std::ostringstream oss; + + if (size == 0) { + oss << "missing required key: " << key; + } else if (size == 1) { + oss << key << " is a scalar"; + } else if (size == 1) { + oss << key << " requires " << size << " elements"; + } + messages.push_back(InputsMessage{oss.str()}); } -std::pair> +std::pair> make_solver(solver::InputInfo ii) { - std::vector messages; + std::vector messages; solver::SolverSettings ss; - auto new_geo = make_geometry(ii); - if (!new_geo.has_value()) { - messages.push_back("Problem making geometry"); - } - auto new_mesh = make_mesh(ii); - if (!new_mesh.has_value()) { - messages.push_back("Problem making mesh"); - } - auto new_time = make_time(ii); - if (!new_time.has_value()) { - messages.push_back("Problem making time"); - } - ss.geometry = new_geo.value(); - ss.time = new_time.value(); - ss.mesh = new_mesh.value(); + ss.geometry = make_geometry(ii, messages); + ss.mesh = make_mesh(ii, messages); + ss.time = make_time(ii, messages); return std::make_pair(ss, messages); } diff --git a/src/inputs/solver.hpp b/src/inputs/solver.hpp index 0d9aa33..4b4ad0a 100644 --- a/src/inputs/solver.hpp +++ b/src/inputs/solver.hpp @@ -57,11 +57,13 @@ struct SolverSettings { TimeSettings time; }; -std::pair> +struct InputsMessage { + std::string message; +}; +std::pair> make_solver(solver::InputInfo); std::string serialize(solver::SolverSettings); -void require(std::string); } // namespace solver #endif diff --git a/src/inputs/solver_impl.hpp b/src/inputs/solver_impl.hpp index 5cd67e7..4ab313f 100644 --- a/src/inputs/solver_impl.hpp +++ b/src/inputs/solver_impl.hpp @@ -1,7 +1,9 @@ #include namespace solver { -std::optional make_geometry(solver::InputInfo); -std::optional make_mesh(solver::InputInfo); -std::optional make_time(solver::InputInfo); +GeometrySettings make_geometry(solver::InputInfo, + std::vector messages); +MeshSettings make_mesh(solver::InputInfo, std::vector messages); +TimeSettings make_time(solver::InputInfo, std::vector messages); +void require(std::string, std::vector, int); } // namespace solver diff --git a/src/inputs/time.cpp b/src/inputs/time.cpp index bd6601e..202f362 100644 --- a/src/inputs/time.cpp +++ b/src/inputs/time.cpp @@ -1,61 +1,59 @@ -#include - #include "solver_impl.hpp" namespace solver { -std::optional make_time(solver::InputInfo ii) { +solver::TimeSettings make_time(solver::InputInfo ii, + std::vector messages) { solver::TimeSettings time; auto dt_max = std::get(ii[DT_MAX]); if (dt_max.size() != 1) { - std::cout << "dt_max is a scalar: " << dt_max.size() << std::endl; + require(DT_MAX, messages, 1); } else { time.dt_max = dt_max[0]; } auto dt_min = std::get(ii[DT_MIN]); if (dt_min.size() != 1) { - std::cout << "dt_min is a scalar" << std::endl; + require(DT_MIN, messages, 1); } else { time.dt_min = dt_min[0]; } auto maxstep = std::get(ii[MAXSTEP]); if (maxstep.size() != 1) { - std::cout << "max_step is a scalar" << std::endl; + require(MAXSTEP, messages, 1); } else { time.max_step = maxstep[0]; } if (!ii.count(TSTOP)) { - require(TSTOP); - return std::nullopt; + require(TSTOP, messages, 0); } auto tstop = std::get(ii[TSTOP]); if (tstop.size() != 1) { - std::cout << "tstop is a scalar" << std::endl; + require(TSTOP, messages, 1); } else { time.tstop = tstop[0]; } auto fixed_dt = std::get(ii[FIXED_DT]); if (fixed_dt.size() != 1) { - std::cout << "fixed_dt is a scalar" << std::endl; + require(FIXED_DT, messages, 1); } else { time.fixed_dt = (fixed_dt[0] != 0); } auto cfl = std::get(ii[CFL]); if (cfl.size() != 1) { - std::cout << "cfl is a scalar" << std::endl; + require(CFL, messages, 1); } else { time.cfl = cfl[0]; } auto tcoll_ratio = std::get(ii[TCOLL_RATIO]); if (tcoll_ratio.size() != 1) { - std::cout << "tcoll_ratio is a scalar" << std::endl; + require(TCOLL_RATIO, messages, 1); } else { time.tcoll_ratio = tcoll_ratio[0]; } -- GitLab From 8fecf9e7b6af9d5eae19c06a6c19b2638a700a06 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Fri, 8 May 2020 11:59:34 -0400 Subject: [PATCH 3/5] by reference --- src/inputs/geometry.cpp | 2 +- src/inputs/mesh.cpp | 2 +- src/inputs/solver.cpp | 2 +- src/inputs/solver_impl.hpp | 9 ++++----- src/inputs/time.cpp | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/inputs/geometry.cpp b/src/inputs/geometry.cpp index 5cb26f0..09cc521 100644 --- a/src/inputs/geometry.cpp +++ b/src/inputs/geometry.cpp @@ -3,7 +3,7 @@ namespace solver { solver::GeometrySettings make_geometry(solver::InputInfo ii, - std::vector messages) { + std::vector &messages) { solver::GeometrySettings geo; if (ii.count(CSG_FILENAME)) { diff --git a/src/inputs/mesh.cpp b/src/inputs/mesh.cpp index be69dc6..7f9d028 100644 --- a/src/inputs/mesh.cpp +++ b/src/inputs/mesh.cpp @@ -3,7 +3,7 @@ namespace solver { solver::MeshSettings make_mesh(solver::InputInfo ii, - std::vector messages) { + std::vector &messages) { solver::MeshSettings mesh; auto [mx, my, mz] = mesh.axes; diff --git a/src/inputs/solver.cpp b/src/inputs/solver.cpp index 3705a05..45d6e32 100644 --- a/src/inputs/solver.cpp +++ b/src/inputs/solver.cpp @@ -4,7 +4,7 @@ namespace solver { -void require(std::string key, std::vector messages, int size) { +void require(std::string key, std::vector &messages, int size) { std::ostringstream oss; if (size == 0) { diff --git a/src/inputs/solver_impl.hpp b/src/inputs/solver_impl.hpp index 4ab313f..31d6956 100644 --- a/src/inputs/solver_impl.hpp +++ b/src/inputs/solver_impl.hpp @@ -1,9 +1,8 @@ #include namespace solver { -GeometrySettings make_geometry(solver::InputInfo, - std::vector messages); -MeshSettings make_mesh(solver::InputInfo, std::vector messages); -TimeSettings make_time(solver::InputInfo, std::vector messages); -void require(std::string, std::vector, int); +GeometrySettings make_geometry(solver::InputInfo, std::vector &); +MeshSettings make_mesh(solver::InputInfo, std::vector &); +TimeSettings make_time(solver::InputInfo, std::vector &); +void require(std::string, std::vector &, int); } // namespace solver diff --git a/src/inputs/time.cpp b/src/inputs/time.cpp index 202f362..2604ed4 100644 --- a/src/inputs/time.cpp +++ b/src/inputs/time.cpp @@ -3,7 +3,7 @@ namespace solver { solver::TimeSettings make_time(solver::InputInfo ii, - std::vector messages) { + std::vector &messages) { solver::TimeSettings time; auto dt_max = std::get(ii[DT_MAX]); -- GitLab From 0b2441a3061444a40db88cc36b96a000b6061523 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Fri, 8 May 2020 15:38:36 -0400 Subject: [PATCH 4/5] WIP --- src/inputs/geometry.cpp | 92 +++++++++++++++++++------------------- src/inputs/mesh.cpp | 25 ++++++----- src/inputs/solver.cpp | 7 ++- src/inputs/solver.hpp | 3 +- src/inputs/solver_impl.hpp | 2 +- src/inputs/time.cpp | 7 +-- 6 files changed, 73 insertions(+), 63 deletions(-) diff --git a/src/inputs/geometry.cpp b/src/inputs/geometry.cpp index 09cc521..5910b9f 100644 --- a/src/inputs/geometry.cpp +++ b/src/inputs/geometry.cpp @@ -2,53 +2,55 @@ namespace solver { -solver::GeometrySettings make_geometry(solver::InputInfo ii, - std::vector &messages) { - solver::GeometrySettings geo; + solver::GeometrySettings make_geometry(solver::InputInfo ii, + std::vector &messages) { + solver::GeometrySettings geo; - if (ii.count(CSG_FILENAME)) { - auto csg_filename = std::get(ii[CSG_FILENAME]); - if (csg_filename.size() != 1) { - messages.push_back( - InputsMessage{"geometry.filename should only have 1 element"}); - } - } else { geo.csg_filename = ""; - } + if (!ii.count(CSG_FILENAME)) { + require(CSG_FILENAME, messages, std::vector {""}); + } else { + auto csg_filename = std::get(ii[CSG_FILENAME]); + if (csg_filename.size() != 1) { + // messages.push_back(CSG_FILENAME, messages, 1, geo.csg_filename); + } else { + geo.csg_filename = csg_filename[0]; + } + } - if (!ii.count(PROB_LO)) { - require(PROB_LO, messages, 0); - } - if (!ii.count(PROB_HI)) { - require(PROB_HI, messages, 0); - } - if (!ii.count(PERIODIC)) { - require(PERIODIC, messages, 0); - } - auto lows = std::get(ii[PROB_LO]); - auto highs = std::get(ii[PROB_HI]); - auto is_periodic = std::get(ii[PERIODIC]); - if (lows.size() != 3) { - require(PROB_LO, messages, 3); - } else { - std::get<0>(geo.axes).low = lows[0]; - std::get<1>(geo.axes).low = lows[1]; - std::get<2>(geo.axes).low = lows[2]; - } - if (highs.size() != 3) { - require(PROB_HI, messages, 3); - } else { - std::get<0>(geo.axes).high = highs[0]; - std::get<1>(geo.axes).high = highs[1]; - std::get<2>(geo.axes).high = highs[2]; - } - if (is_periodic.size() != 3) { - require(PERIODIC, messages, 3); - } else { - std::get<0>(geo.axes).periodic = is_periodic[0]; - std::get<1>(geo.axes).periodic = is_periodic[1]; - std::get<2>(geo.axes).periodic = is_periodic[2]; + if (!ii.count(PROB_LO)) { + require(PROB_LO, messages, 0); + } + if (!ii.count(PROB_HI)) { + require(PROB_HI, messages, 0); + } + if (!ii.count(PERIODIC)) { + require(PERIODIC, messages, 0); + } + auto lows = std::get(ii[PROB_LO]); + auto highs = std::get(ii[PROB_HI]); + auto is_periodic = std::get(ii[PERIODIC]); + if (lows.size() != 3) { + require(PROB_LO, messages, 3); + } else { + std::get<0>(geo.axes).low = lows[0]; + std::get<1>(geo.axes).low = lows[1]; + std::get<2>(geo.axes).low = lows[2]; + } + if (highs.size() != 3) { + require(PROB_HI, messages, 3); + } else { + std::get<0>(geo.axes).high = highs[0]; + std::get<1>(geo.axes).high = highs[1]; + std::get<2>(geo.axes).high = highs[2]; + } + if (is_periodic.size() != 3) { + require(PERIODIC, messages, 3); + } else { + std::get<0>(geo.axes).periodic = is_periodic[0]; + std::get<1>(geo.axes).periodic = is_periodic[1]; + std::get<2>(geo.axes).periodic = is_periodic[2]; + } + return geo; } - return geo; -} } // namespace solver diff --git a/src/inputs/mesh.cpp b/src/inputs/mesh.cpp index 7f9d028..7be8c44 100644 --- a/src/inputs/mesh.cpp +++ b/src/inputs/mesh.cpp @@ -8,12 +8,13 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto [mx, my, mz] = mesh.axes; if (!ii.count(N_CELL)) { - require(N_CELL, messages, 0); + // NumberArray defaults = std::vector {0}; + require(N_CELL, messages, 0, std::vector {0}); } else { auto n_cell = std::get(ii[N_CELL]); if (n_cell.size() != 3) { - require(N_CELL, messages, 3); + require(N_CELL, messages, 3, std::vector {0}); } else { mx.n_cell = n_cell[0]; my.n_cell = n_cell[1]; @@ -23,7 +24,7 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto fabarray_size = std::get(ii[FABARRAY_TILE_SZ]); if (fabarray_size.size() != 3) { - require(FABARRAY_TILE_SZ, messages, 3); + require(FABARRAY_TILE_SZ, messages, 3, std::vector {0}); } else { mx.fluid_max_tile_size = fabarray_size[0]; my.fluid_max_tile_size = fabarray_size[1]; @@ -32,7 +33,7 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto part_grid_size = std::get(ii[PARTICLE_TILE_SZ]); if (part_grid_size.size() != 3) { - require(PARTICLE_TILE_SZ, messages, 3); + require(PARTICLE_TILE_SZ, messages, 3, std::vector {0}); } else { mx.particle_max_tile_size = part_grid_size[0]; my.particle_max_tile_size = part_grid_size[1]; @@ -41,19 +42,19 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto grid_size_x = std::get(ii[GRID_SIZE_X]); if (grid_size_x.size() != 1) { - require(GRID_SIZE_X, messages, 1); + require(GRID_SIZE_X, messages, 1, std::vector {0}); } else { mx.max_grid_size = grid_size_x[0]; } auto grid_size_y = std::get(ii[GRID_SIZE_Y]); if (grid_size_y.size() != 1) { - require(GRID_SIZE_Y, messages, 1); + require(GRID_SIZE_Y, messages, 1, std::vector {0}); } else { my.max_grid_size = grid_size_y[0]; } auto grid_size_z = std::get(ii[GRID_SIZE_Z]); if (grid_size_z.size() != 1) { - require(GRID_SIZE_Z, messages, 1); + require(GRID_SIZE_Z, messages, 1, std::vector {0}); } else { mz.max_grid_size = grid_size_z[0]; } @@ -61,35 +62,35 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto particle_grid_size_x = std::get(ii[PARTICLE_GRID_SIZE_X]); if (particle_grid_size_x.size() != 1) { - require(PARTICLE_GRID_SIZE_X, messages, 1); + require(PARTICLE_GRID_SIZE_X, messages, std::vector {0}); } else { mx.particle_max_grid_size = particle_grid_size_x[0]; } auto particle_grid_size_y = std::get(ii[PARTICLE_GRID_SIZE_Y]); if (particle_grid_size_y.size() != 1) { - require(PARTICLE_GRID_SIZE_Y, messages, 1); + require(PARTICLE_GRID_SIZE_Y, messages, std::vector {0}); } else { my.particle_max_grid_size = particle_grid_size_y[0]; } auto particle_grid_size_z = std::get(ii[PARTICLE_GRID_SIZE_Z]); if (particle_grid_size_z.size() != 1) { - require(PARTICLE_GRID_SIZE_Z, messages, 1); + require(PARTICLE_GRID_SIZE_Z, messages, std::vector {0}); } else { mz.particle_max_grid_size = particle_grid_size_z[0]; } auto bf = std::get(ii[BLOCKING_FACTOR]); if (bf.size() != 1) { - require(BLOCKING_FACTOR, messages, 1); + require(BLOCKING_FACTOR, messages, std::vector {0}); } else { mesh.blocking_factor = bf[0]; } auto volfrac = std::get(ii[SMALL_VOLFRAC]); if (volfrac.size() != 1) { - require(SMALL_VOLFRAC, messages, 1); + require(SMALL_VOLFRAC, messages, std::vector {0}); } else { mesh.small_volfrac = volfrac[0]; } diff --git a/src/inputs/solver.cpp b/src/inputs/solver.cpp index 45d6e32..6b53f3a 100644 --- a/src/inputs/solver.cpp +++ b/src/inputs/solver.cpp @@ -4,19 +4,24 @@ namespace solver { -void require(std::string key, std::vector &messages, int size) { + void require(std::string key, std::vector &messages, int size, Array defaults) { std::ostringstream oss; if (size == 0) { oss << "missing required key: " << key; + } else if (size == 1) { oss << key << " is a scalar"; + } else if (size == 1) { oss << key << " requires " << size << " elements"; + } messages.push_back(InputsMessage{oss.str()}); } + + std::pair> make_solver(solver::InputInfo ii) { std::vector messages; diff --git a/src/inputs/solver.hpp b/src/inputs/solver.hpp index 4b4ad0a..8acd97c 100644 --- a/src/inputs/solver.hpp +++ b/src/inputs/solver.hpp @@ -15,7 +15,8 @@ namespace solver { using NumberArray = std::vector; using StringArray = std::vector; -using InputInfo = std::map>; +using Array = std::variant; +using InputInfo = std::map; std::optional parse_inputs(std::string); diff --git a/src/inputs/solver_impl.hpp b/src/inputs/solver_impl.hpp index 31d6956..7a02793 100644 --- a/src/inputs/solver_impl.hpp +++ b/src/inputs/solver_impl.hpp @@ -4,5 +4,5 @@ namespace solver { GeometrySettings make_geometry(solver::InputInfo, std::vector &); MeshSettings make_mesh(solver::InputInfo, std::vector &); TimeSettings make_time(solver::InputInfo, std::vector &); -void require(std::string, std::vector &, int); + void require(std::string key, std::vector &messages, int, Array); } // namespace solver diff --git a/src/inputs/time.cpp b/src/inputs/time.cpp index 2604ed4..23fdcf4 100644 --- a/src/inputs/time.cpp +++ b/src/inputs/time.cpp @@ -8,21 +8,22 @@ solver::TimeSettings make_time(solver::InputInfo ii, auto dt_max = std::get(ii[DT_MAX]); if (dt_max.size() != 1) { - require(DT_MAX, messages, 1); + NumberArray defaults = std::vector {0}; + require(DT_MAX, messages, 1, defaults); } else { time.dt_max = dt_max[0]; } auto dt_min = std::get(ii[DT_MIN]); if (dt_min.size() != 1) { - require(DT_MIN, messages, 1); + require(DT_MIN, messages, 1, std::vector {0}); } else { time.dt_min = dt_min[0]; } auto maxstep = std::get(ii[MAXSTEP]); if (maxstep.size() != 1) { - require(MAXSTEP, messages, 1); + require(MAXSTEP, messages, 1, std::vector {0}); } else { time.max_step = maxstep[0]; } -- GitLab From e513693b600cb8c575997aa3b619ff2317d12261 Mon Sep 17 00:00:00 2001 From: Mark Meredith Date: Fri, 8 May 2020 16:44:15 -0400 Subject: [PATCH 5/5] Mention default values --- src/inputs/geometry.cpp | 92 +++++++++++++++++++------------------- src/inputs/mesh.cpp | 24 +++++----- src/inputs/solver.cpp | 45 +++++++++++++++---- src/inputs/solver.hpp | 2 +- src/inputs/solver_impl.hpp | 3 +- src/inputs/time.cpp | 17 ++++--- 6 files changed, 105 insertions(+), 78 deletions(-) diff --git a/src/inputs/geometry.cpp b/src/inputs/geometry.cpp index 5910b9f..97cdc75 100644 --- a/src/inputs/geometry.cpp +++ b/src/inputs/geometry.cpp @@ -2,55 +2,55 @@ namespace solver { - solver::GeometrySettings make_geometry(solver::InputInfo ii, - std::vector &messages) { - solver::GeometrySettings geo; +solver::GeometrySettings make_geometry(solver::InputInfo ii, + std::vector &messages) { + solver::GeometrySettings geo; - geo.csg_filename = ""; - if (!ii.count(CSG_FILENAME)) { - require(CSG_FILENAME, messages, std::vector {""}); + geo.csg_filename = ""; + if (!ii.count(CSG_FILENAME)) { + add_missing_msg(CSG_FILENAME, messages, std::vector{""}); + } else { + auto csg_filename = std::get(ii[CSG_FILENAME]); + if (csg_filename.size() != 1) { + add_msg(CSG_FILENAME, messages, std::vector{""}); } else { - auto csg_filename = std::get(ii[CSG_FILENAME]); - if (csg_filename.size() != 1) { - // messages.push_back(CSG_FILENAME, messages, 1, geo.csg_filename); - } else { - geo.csg_filename = csg_filename[0]; - } + geo.csg_filename = csg_filename[0]; } + } - if (!ii.count(PROB_LO)) { - require(PROB_LO, messages, 0); - } - if (!ii.count(PROB_HI)) { - require(PROB_HI, messages, 0); - } - if (!ii.count(PERIODIC)) { - require(PERIODIC, messages, 0); - } - auto lows = std::get(ii[PROB_LO]); - auto highs = std::get(ii[PROB_HI]); - auto is_periodic = std::get(ii[PERIODIC]); - if (lows.size() != 3) { - require(PROB_LO, messages, 3); - } else { - std::get<0>(geo.axes).low = lows[0]; - std::get<1>(geo.axes).low = lows[1]; - std::get<2>(geo.axes).low = lows[2]; - } - if (highs.size() != 3) { - require(PROB_HI, messages, 3); - } else { - std::get<0>(geo.axes).high = highs[0]; - std::get<1>(geo.axes).high = highs[1]; - std::get<2>(geo.axes).high = highs[2]; - } - if (is_periodic.size() != 3) { - require(PERIODIC, messages, 3); - } else { - std::get<0>(geo.axes).periodic = is_periodic[0]; - std::get<1>(geo.axes).periodic = is_periodic[1]; - std::get<2>(geo.axes).periodic = is_periodic[2]; - } - return geo; + if (!ii.count(PROB_LO)) { + add_missing_msg(PROB_LO, messages, std::vector{}); + } + if (!ii.count(PROB_HI)) { + add_missing_msg(PROB_HI, messages, std::vector{}); + } + if (!ii.count(PERIODIC)) { + add_missing_msg(PERIODIC, messages, std::vector{0, 0, 0}); + } + auto lows = std::get(ii[PROB_LO]); + auto highs = std::get(ii[PROB_HI]); + auto is_periodic = std::get(ii[PERIODIC]); + if (lows.size() != 3) { + add_msg(PROB_LO, messages, std::vector{0, 0, 0}); + } else { + std::get<0>(geo.axes).low = lows[0]; + std::get<1>(geo.axes).low = lows[1]; + std::get<2>(geo.axes).low = lows[2]; + } + if (highs.size() != 3) { + add_msg(PROB_HI, messages, std::vector{0, 0, 0}); + } else { + std::get<0>(geo.axes).high = highs[0]; + std::get<1>(geo.axes).high = highs[1]; + std::get<2>(geo.axes).high = highs[2]; + } + if (is_periodic.size() != 3) { + add_msg(PERIODIC, messages, std::vector{0, 0, 0}); + } else { + std::get<0>(geo.axes).periodic = is_periodic[0]; + std::get<1>(geo.axes).periodic = is_periodic[1]; + std::get<2>(geo.axes).periodic = is_periodic[2]; } + return geo; +} } // namespace solver diff --git a/src/inputs/mesh.cpp b/src/inputs/mesh.cpp index 7be8c44..d507fda 100644 --- a/src/inputs/mesh.cpp +++ b/src/inputs/mesh.cpp @@ -9,12 +9,12 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, if (!ii.count(N_CELL)) { // NumberArray defaults = std::vector {0}; - require(N_CELL, messages, 0, std::vector {0}); + add_msg(N_CELL, messages, std::vector{}); } else { auto n_cell = std::get(ii[N_CELL]); if (n_cell.size() != 3) { - require(N_CELL, messages, 3, std::vector {0}); + add_msg(N_CELL, messages, std::vector{0, 0, 0}); } else { mx.n_cell = n_cell[0]; my.n_cell = n_cell[1]; @@ -24,7 +24,7 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto fabarray_size = std::get(ii[FABARRAY_TILE_SZ]); if (fabarray_size.size() != 3) { - require(FABARRAY_TILE_SZ, messages, 3, std::vector {0}); + add_msg(FABARRAY_TILE_SZ, messages, std::vector{0, 0, 0}); } else { mx.fluid_max_tile_size = fabarray_size[0]; my.fluid_max_tile_size = fabarray_size[1]; @@ -33,7 +33,7 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto part_grid_size = std::get(ii[PARTICLE_TILE_SZ]); if (part_grid_size.size() != 3) { - require(PARTICLE_TILE_SZ, messages, 3, std::vector {0}); + add_msg(PARTICLE_TILE_SZ, messages, std::vector{0, 0, 0}); } else { mx.particle_max_tile_size = part_grid_size[0]; my.particle_max_tile_size = part_grid_size[1]; @@ -42,19 +42,19 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto grid_size_x = std::get(ii[GRID_SIZE_X]); if (grid_size_x.size() != 1) { - require(GRID_SIZE_X, messages, 1, std::vector {0}); + add_msg(GRID_SIZE_X, messages, std::vector{0}); } else { mx.max_grid_size = grid_size_x[0]; } auto grid_size_y = std::get(ii[GRID_SIZE_Y]); if (grid_size_y.size() != 1) { - require(GRID_SIZE_Y, messages, 1, std::vector {0}); + add_msg(GRID_SIZE_Y, messages, std::vector{0}); } else { my.max_grid_size = grid_size_y[0]; } auto grid_size_z = std::get(ii[GRID_SIZE_Z]); if (grid_size_z.size() != 1) { - require(GRID_SIZE_Z, messages, 1, std::vector {0}); + add_msg(GRID_SIZE_Z, messages, std::vector{0}); } else { mz.max_grid_size = grid_size_z[0]; } @@ -62,35 +62,35 @@ solver::MeshSettings make_mesh(solver::InputInfo ii, auto particle_grid_size_x = std::get(ii[PARTICLE_GRID_SIZE_X]); if (particle_grid_size_x.size() != 1) { - require(PARTICLE_GRID_SIZE_X, messages, std::vector {0}); + add_msg(PARTICLE_GRID_SIZE_X, messages, std::vector{0}); } else { mx.particle_max_grid_size = particle_grid_size_x[0]; } auto particle_grid_size_y = std::get(ii[PARTICLE_GRID_SIZE_Y]); if (particle_grid_size_y.size() != 1) { - require(PARTICLE_GRID_SIZE_Y, messages, std::vector {0}); + add_msg(PARTICLE_GRID_SIZE_Y, messages, std::vector{0}); } else { my.particle_max_grid_size = particle_grid_size_y[0]; } auto particle_grid_size_z = std::get(ii[PARTICLE_GRID_SIZE_Z]); if (particle_grid_size_z.size() != 1) { - require(PARTICLE_GRID_SIZE_Z, messages, std::vector {0}); + add_msg(PARTICLE_GRID_SIZE_Z, messages, std::vector{0}); } else { mz.particle_max_grid_size = particle_grid_size_z[0]; } auto bf = std::get(ii[BLOCKING_FACTOR]); if (bf.size() != 1) { - require(BLOCKING_FACTOR, messages, std::vector {0}); + add_msg(BLOCKING_FACTOR, messages, std::vector{0}); } else { mesh.blocking_factor = bf[0]; } auto volfrac = std::get(ii[SMALL_VOLFRAC]); if (volfrac.size() != 1) { - require(SMALL_VOLFRAC, messages, std::vector {0}); + add_msg(SMALL_VOLFRAC, messages, std::vector{0}); } else { mesh.small_volfrac = volfrac[0]; } diff --git a/src/inputs/solver.cpp b/src/inputs/solver.cpp index 6b53f3a..c80a919 100644 --- a/src/inputs/solver.cpp +++ b/src/inputs/solver.cpp @@ -1,27 +1,54 @@ #include +#include "solver.hpp" #include "solver_impl.hpp" namespace solver { - void require(std::string key, std::vector &messages, int size, Array defaults) { +void add_missing_msg(std::string key, std::vector &messages, + Array defaults) { std::ostringstream oss; - if (size == 0) { - oss << "missing required key: " << key; + oss << key << " is missing; using defaults: "; + if (auto sarray = std::get_if(&defaults)) { + for (auto def : *sarray) { + oss << def << " "; + } + } else if (auto narray = std::get_if(&defaults)) { + for (auto def : *narray) { + oss << def << " "; + } + } + messages.push_back(InputsMessage{oss.str()}); +} - } else if (size == 1) { - oss << key << " is a scalar"; +void add_msg(std::string key, std::vector &messages, + Array defaults) { + std::ostringstream oss; + std::ostringstream defs; + int size = 0; - } else if (size == 1) { - oss << key << " requires " << size << " elements"; + if (auto sarray = std::get_if(&defaults)) { + size = sarray->size(); + for (auto def : *sarray) { + defs << def << " "; + } + } else if (auto narray = std::get_if(&defaults)) { + size = narray->size(); + for (auto def : *narray) { + defs << def << " "; + } + } + if (size == 1) { + oss << key << " should be a scalar; using defaults: "; + } else { + oss << key << " should have " << size << " elements; using defaults"; } + oss << defs.str(); messages.push_back(InputsMessage{oss.str()}); } - - std::pair> make_solver(solver::InputInfo ii) { std::vector messages; diff --git a/src/inputs/solver.hpp b/src/inputs/solver.hpp index 8acd97c..0245e1d 100644 --- a/src/inputs/solver.hpp +++ b/src/inputs/solver.hpp @@ -16,7 +16,7 @@ namespace solver { using NumberArray = std::vector; using StringArray = std::vector; using Array = std::variant; -using InputInfo = std::map; +using InputInfo = std::map; std::optional parse_inputs(std::string); diff --git a/src/inputs/solver_impl.hpp b/src/inputs/solver_impl.hpp index 7a02793..b7e0c0a 100644 --- a/src/inputs/solver_impl.hpp +++ b/src/inputs/solver_impl.hpp @@ -4,5 +4,6 @@ namespace solver { GeometrySettings make_geometry(solver::InputInfo, std::vector &); MeshSettings make_mesh(solver::InputInfo, std::vector &); TimeSettings make_time(solver::InputInfo, std::vector &); - void require(std::string key, std::vector &messages, int, Array); +void add_missing_msg(std::string key, std::vector &, Array); +void add_msg(std::string key, std::vector &, Array); } // namespace solver diff --git a/src/inputs/time.cpp b/src/inputs/time.cpp index 23fdcf4..3748610 100644 --- a/src/inputs/time.cpp +++ b/src/inputs/time.cpp @@ -8,53 +8,52 @@ solver::TimeSettings make_time(solver::InputInfo ii, auto dt_max = std::get(ii[DT_MAX]); if (dt_max.size() != 1) { - NumberArray defaults = std::vector {0}; - require(DT_MAX, messages, 1, defaults); + add_msg(DT_MAX, messages, std::vector{0}); } else { time.dt_max = dt_max[0]; } auto dt_min = std::get(ii[DT_MIN]); if (dt_min.size() != 1) { - require(DT_MIN, messages, 1, std::vector {0}); + add_msg(DT_MIN, messages, std::vector{0}); } else { time.dt_min = dt_min[0]; } auto maxstep = std::get(ii[MAXSTEP]); if (maxstep.size() != 1) { - require(MAXSTEP, messages, 1, std::vector {0}); + add_msg(MAXSTEP, messages, std::vector{0}); } else { time.max_step = maxstep[0]; } if (!ii.count(TSTOP)) { - require(TSTOP, messages, 0); + add_msg(TSTOP, messages, std::vector{0}); } auto tstop = std::get(ii[TSTOP]); if (tstop.size() != 1) { - require(TSTOP, messages, 1); + add_msg(TSTOP, messages, std::vector{0}); } else { time.tstop = tstop[0]; } auto fixed_dt = std::get(ii[FIXED_DT]); if (fixed_dt.size() != 1) { - require(FIXED_DT, messages, 1); + add_msg(FIXED_DT, messages, std::vector{0}); } else { time.fixed_dt = (fixed_dt[0] != 0); } auto cfl = std::get(ii[CFL]); if (cfl.size() != 1) { - require(CFL, messages, 1); + add_msg(CFL, messages, std::vector{0}); } else { time.cfl = cfl[0]; } auto tcoll_ratio = std::get(ii[TCOLL_RATIO]); if (tcoll_ratio.size() != 1) { - require(TCOLL_RATIO, messages, 1); + add_msg(TCOLL_RATIO, messages, std::vector{0}); } else { time.tcoll_ratio = tcoll_ratio[0]; } -- GitLab