diff options
author | 2021-04-06 20:27:49 -0700 | |
---|---|---|
committer | 2021-04-06 20:27:49 -0700 | |
commit | e9c8a17ea3ca193d98d057aa108723e7045a60d8 (patch) | |
tree | c6e512e04c49a7c37fd5c28eca0f822a9dbf1873 /Source/Utils/WarpXUtil.cpp | |
parent | bc38a8fbd654cce8431a0fd720ca57a073ba050d (diff) | |
download | WarpX-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.cpp | 14 |
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) { |