aboutsummaryrefslogtreecommitdiff
path: root/Source/Utils/WarpXUtil.cpp
diff options
context:
space:
mode:
authorGravatar David Grote <grote1@llnl.gov> 2021-04-06 20:27:49 -0700
committerGravatar GitHub <noreply@github.com> 2021-04-06 20:27:49 -0700
commite9c8a17ea3ca193d98d057aa108723e7045a60d8 (patch)
treec6e512e04c49a7c37fd5c28eca0f822a9dbf1873 /Source/Utils/WarpXUtil.cpp
parentbc38a8fbd654cce8431a0fd720ca57a073ba050d (diff)
downloadWarpX-e9c8a17ea3ca193d98d057aa108723e7045a60d8.tar.gz
WarpX-e9c8a17ea3ca193d98d057aa108723e7045a60d8.tar.zst
WarpX-e9c8a17ea3ca193d98d057aa108723e7045a60d8.zip
Allow expressions for my_constants (#1874)
* Allow expressions for my_constants * Update documentation for my_constants * Updates Langmuir input files with nice expressions * Used better example for my_constants * WarpXUtil: Add Includes Add includes for new STL classes used in this file. * Reset Benchmarks: Input Change * Docs: small rewording (no order implied) Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja>
Diffstat (limited to 'Source/Utils/WarpXUtil.cpp')
-rw-r--r--Source/Utils/WarpXUtil.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/Source/Utils/WarpXUtil.cpp b/Source/Utils/WarpXUtil.cpp
index 622a0256e..ae62eb0ca 100644
--- a/Source/Utils/WarpXUtil.cpp
+++ b/Source/Utils/WarpXUtil.cpp
@@ -14,6 +14,8 @@
#include <cmath>
#include <fstream>
+#include <set>
+#include <string>
using namespace amrex;
@@ -193,6 +195,10 @@ void Store_parserString(const amrex::ParmParse& pp, std::string query_string,
WarpXParser makeParser (std::string const& parse_function, std::vector<std::string> const& varnames)
{
+ // Since queryWithParser recursively calls this routine, keep track of symbols
+ // in case an infinite recursion is found (a symbol's value depending on itself).
+ static std::set<std::string> recursive_symbols;
+
WarpXParser parser(parse_function);
parser.registerVariables(varnames);
ParmParse pp_my_constants("my_constants");
@@ -200,7 +206,13 @@ WarpXParser makeParser (std::string const& parse_function, std::vector<std::stri
for (auto const& v : varnames) symbols.erase(v.c_str());
for (auto it = symbols.begin(); it != symbols.end(); ) {
Real v;
- if (pp_my_constants.query(it->c_str(), v)) {
+
+ WarpXUtilMsg::AlwaysAssert(recursive_symbols.count(*it)==0, "Expressions contains recursive symbol "+*it);
+ recursive_symbols.insert(*it);
+ const bool is_input = queryWithParser(pp_my_constants, it->c_str(), v);
+ recursive_symbols.erase(*it);
+
+ if (is_input) {
parser.setConstant(*it, v);
it = symbols.erase(it);
} else if (std::strcmp(it->c_str(), "q_e") == 0) {