From e9c8a17ea3ca193d98d057aa108723e7045a60d8 Mon Sep 17 00:00:00 2001 From: David Grote Date: Tue, 6 Apr 2021 20:27:49 -0700 Subject: 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 --- Source/Utils/WarpXUtil.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'Source/Utils/WarpXUtil.cpp') 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 #include +#include +#include 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 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 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::vectorc_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) { -- cgit v1.2.3