diff options
author | 2021-05-13 13:17:12 -0700 | |
---|---|---|
committer | 2021-05-13 13:17:12 -0700 | |
commit | 0f49efc0d32297a0510979850d141c58a3e43c5d (patch) | |
tree | 37d37b02e4c20d63557ff8d467f80a86132867d5 /Source/Utils/WarpXUtil.cpp | |
parent | 9f28da17cdc42efbbe14bb21a3b1ab52ee556f68 (diff) | |
download | WarpX-0f49efc0d32297a0510979850d141c58a3e43c5d.tar.gz WarpX-0f49efc0d32297a0510979850d141c58a3e43c5d.tar.zst WarpX-0f49efc0d32297a0510979850d141c58a3e43c5d.zip |
Implemented query and getArrWithParser (#1936)
* Implemented query and getArrWithParser
* Updated parameters.rst regarding expressions for multiple floats
Diffstat (limited to 'Source/Utils/WarpXUtil.cpp')
-rw-r--r-- | Source/Utils/WarpXUtil.cpp | 82 |
1 files changed, 74 insertions, 8 deletions
diff --git a/Source/Utils/WarpXUtil.cpp b/Source/Utils/WarpXUtil.cpp index ac76b8ce6..d85cd17a4 100644 --- a/Source/Utils/WarpXUtil.cpp +++ b/Source/Utils/WarpXUtil.cpp @@ -20,6 +20,22 @@ using namespace amrex; +void ParseGeometryInput() +{ + ParmParse pp_geometry("geometry"); + + Vector<Real> prob_lo(AMREX_SPACEDIM); + Vector<Real> prob_hi(AMREX_SPACEDIM); + + getArrWithParser(pp_geometry, "prob_lo", prob_lo, 0, AMREX_SPACEDIM); + AMREX_ALWAYS_ASSERT(prob_lo.size() == AMREX_SPACEDIM); + getArrWithParser(pp_geometry, "prob_hi", prob_hi, 0, AMREX_SPACEDIM); + AMREX_ALWAYS_ASSERT(prob_hi.size() == AMREX_SPACEDIM); + + pp_geometry.addarr("prob_lo", prob_lo); + pp_geometry.addarr("prob_hi", prob_hi); +} + void ReadBoostedFrameParameters(Real& gamma_boost, Real& beta_boost, Vector<int>& boost_direction) { @@ -72,21 +88,19 @@ void ConvertLabParamsToBoost() ParmParse pp_amr("amr"); ParmParse pp_slice("slice"); - pp_geometry.getarr("prob_lo",prob_lo,0,AMREX_SPACEDIM); - AMREX_ALWAYS_ASSERT(prob_lo.size() == AMREX_SPACEDIM); - pp_geometry.getarr("prob_hi",prob_hi,0,AMREX_SPACEDIM); - AMREX_ALWAYS_ASSERT(prob_hi.size() == AMREX_SPACEDIM); + getArrWithParser(pp_geometry, "prob_lo", prob_lo, 0, AMREX_SPACEDIM); + getArrWithParser(pp_geometry, "prob_hi", prob_hi, 0, AMREX_SPACEDIM); - pp_slice.queryarr("dom_lo",slice_lo,0,AMREX_SPACEDIM); + queryArrWithParser(pp_slice, "dom_lo", slice_lo, 0, AMREX_SPACEDIM); AMREX_ALWAYS_ASSERT(slice_lo.size() == AMREX_SPACEDIM); - pp_slice.queryarr("dom_hi",slice_hi,0,AMREX_SPACEDIM); + queryArrWithParser(pp_slice, "dom_hi", slice_hi, 0, AMREX_SPACEDIM); AMREX_ALWAYS_ASSERT(slice_hi.size() == AMREX_SPACEDIM); pp_amr.query("max_level", max_level); if (max_level > 0){ - pp_warpx.getarr("fine_tag_lo", fine_tag_lo); - pp_warpx.getarr("fine_tag_hi", fine_tag_hi); + getArrWithParser(pp_warpx, "fine_tag_lo", fine_tag_lo); + getArrWithParser(pp_warpx, "fine_tag_hi", fine_tag_hi); } @@ -273,6 +287,58 @@ getWithParser (const amrex::ParmParse& a_pp, char const * const str, amrex::Real val = parser.eval(); } +int +queryArrWithParser (const amrex::ParmParse& a_pp, char const * const str, std::vector<amrex::Real>& val, + const int start_ix, const int num_val) +{ + // call amrex::ParmParse::query, check if the user specified str. + std::vector<std::string> tmp_str_arr; + int is_specified = a_pp.queryarr(str, tmp_str_arr, start_ix, num_val); + if (is_specified) + { + // If so, create parser objects and apply them to the values provided by the user. + int const n = static_cast<int>(tmp_str_arr.size()); + val.resize(n); + for (int i=0 ; i < n ; i++) { + auto parser = makeParser(tmp_str_arr[i], {}); + val[i] = parser.eval(); + } + } + // return the same output as amrex::ParmParse::query + return is_specified; +} + +void +getArrWithParser (const amrex::ParmParse& a_pp, char const * const str, std::vector<amrex::Real>& val) +{ + // Create parser objects and apply them to the values provided by the user. + std::vector<std::string> tmp_str_arr; + a_pp.getarr(str, tmp_str_arr); + + int const n = static_cast<int>(tmp_str_arr.size()); + val.resize(n); + for (int i=0 ; i < n ; i++) { + auto parser = makeParser(tmp_str_arr[i], {}); + val[i] = parser.eval(); + } +} + +void +getArrWithParser (const amrex::ParmParse& a_pp, char const * const str, std::vector<amrex::Real>& val, + const int start_ix, const int num_val) +{ + // Create parser objects and apply them to the values provided by the user. + std::vector<std::string> tmp_str_arr; + a_pp.getarr(str, tmp_str_arr, start_ix, num_val); + + int const n = static_cast<int>(tmp_str_arr.size()); + val.resize(n); + for (int i=0 ; i < n ; i++) { + auto parser = makeParser(tmp_str_arr[i], {}); + val[i] = parser.eval(); + } +} + /** * \brief Ensures that the blocks are setup correctly for the RZ spectral solver * When using the RZ spectral solver, the Hankel transform cannot be |