aboutsummaryrefslogtreecommitdiff
path: root/Source/Utils/WarpXUtil.cpp
diff options
context:
space:
mode:
authorGravatar David Grote <grote1@llnl.gov> 2021-05-13 13:17:12 -0700
committerGravatar GitHub <noreply@github.com> 2021-05-13 13:17:12 -0700
commit0f49efc0d32297a0510979850d141c58a3e43c5d (patch)
tree37d37b02e4c20d63557ff8d467f80a86132867d5 /Source/Utils/WarpXUtil.cpp
parent9f28da17cdc42efbbe14bb21a3b1ab52ee556f68 (diff)
downloadWarpX-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.cpp82
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