98#include "AMReX_ParmParse.H"
101#define pp_query_required(...) pp.query_required(__VA_ARGS__)
102#define pp_query_default(...) pp.query_default(__VA_ARGS__)
103#define pp_query_validate(...) pp.query_validate(__VA_ARGS__)
104#define pp_query_file(...) pp.query_file(__VA_ARGS__)
105#define pp_queryarr(...) pp.queryarr(__VA_ARGS__)
106#define pp_queryarr_required(...) pp.queryarr_required(__VA_ARGS__)
107#define pp_queryarr_default(...) pp.queryarr_default(__VA_ARGS__)
108#define pp_query(...) pp.query(__VA_ARGS__)
109#define pp_queryclass(...) pp.queryclass(__VA_ARGS__)
110#define pp_forbid(...) pp.forbid(__VA_ARGS__)
122 std::string inputfile =
"";
123 while (this->querykth(
"input",k,inputfile))
126 this->addfile(inputfile);
139 (void)amrex::ParmParse::contains(name.c_str());
144 if (m_prefix.length())
145 m_prefix = m_prefix +
"." +
prefix;
152 size_t pos = m_prefix.rfind(
'.');
153 if (pos == std::string::npos)
156 m_prefix = m_prefix.substr(0, pos);
160 void forbid(std::string name, std::string explanation)
162 if (amrex::ParmParse::contains(
full(name).c_str()))
166 std::set<std::string> subs = amrex::ParmParse::getEntries(
full(name));
175 if (amrex::ParmParse::contains(name.c_str()))
177 if (amrex::ParmParse::contains(
full(name).c_str()))
180 std::set<std::string> subs = amrex::ParmParse::getEntries(name.c_str());
185 std::set<std::string> subs = amrex::ParmParse::getEntries(
full(name).c_str());
196 std::string strvalue;
197 int retval = amrex::ParmParse::query(name.c_str(),strvalue);
202 catch (std::runtime_error & e)
241 catch (std::runtime_error &e)
257 return query(name.c_str(),value);
259 catch (std::runtime_error & e)
279 return queryunit(name.c_str(), value, type);
281 catch (std::runtime_error & e)
299 add(name.c_str(),defaultvalue);
301 return query(name.c_str(),value);
303 catch (std::runtime_error & e)
321 add(name.c_str(),defaultvalue);
323 return queryunit(name.c_str(),value,type);
325 catch (std::runtime_error & e)
336 int query_validate( std::string name,
int & value, std::vector<int> possibleintvals)
345 add(name.c_str(), possibleintvals[0]);
349 int retval = query(name.c_str(),value);
353 for (
unsigned int i = 0; i < possibleintvals.size(); i++)
355 if (value == possibleintvals[i]) ok =
true;
358 if (ok)
return retval;
360 std::stringstream ss;
361 ss << possibleintvals[0];
362 for (
unsigned int i = 1; i < possibleintvals.size(); i++)
363 ss <<
"," << possibleintvals[i];
367 catch (std::runtime_error & e)
379 int query_validate( std::string name, std::string & value, std::vector<const char *> possiblecharvals,
bool firstbydefault)
386 if (!amrex::ParmParse::contains(name.c_str()))
393 if (!amrex::ParmParse::contains(name.c_str()))
395 add(name.c_str(), std::string(possiblecharvals[0]));
399 int retval = amrex::ParmParse::query(name.c_str(),value);
403 for (
unsigned int i = 0; i < possiblecharvals.size(); i++)
405 if (value == std::string(possiblecharvals[i])) ok =
true;
408 if (ok)
return retval;
410 std::stringstream ss;
411 ss << possiblecharvals[0];
412 for (
unsigned int i = 1; i < possiblecharvals.size(); i++)
413 ss <<
"," << possiblecharvals[i];
417 catch (std::runtime_error & e)
429 int query_validate( std::string name, std::string & value, std::vector<const char *> possiblecharvals)
435 catch (std::runtime_error & e)
448 int query_default( std::string name, std::string & value,
const char *defaultvalue)
452 return query_default(name, value, std::string(defaultvalue));
454 catch (std::runtime_error & e)
470 if (defaultvalue) defaultint = 1;
473 catch (std::runtime_error & e)
486 int query_file( std::string name, std::string & value,
bool copyfile,
bool checkfile)
495 int retval = query(name.c_str(),value);
497 if (amrex::ParallelDescriptor::IOProcessor())
499 if ( checkfile && ! std::filesystem::exists(value))
503 if ( checkfile && !std::filesystem::is_regular_file(value))
514 catch (std::runtime_error & e)
524 int query_file( std::string name, std::string & value,
bool copyfile)
535 int queryarr( std::string name, std::vector<T> & value)
539 return amrex::ParmParse::queryarr(name.c_str(),value);
553 return amrex::ParmParse::queryarr(name.c_str(),value);
558 std::vector<std::string> valstrings;
559 int retval = amrex::ParmParse::queryarr(name.c_str(), valstrings);
560 for (
unsigned int i = 0; i < valstrings.size(); i++)
574 catch (std::runtime_error &e)
588 std::vector<Set::Scalar> vals;
590 if (vals.size() < AMREX_SPACEDIM)
593 " requires at least ", AMREX_SPACEDIM,
594 " arguments, got ",vals.size());
596 for (
int i = 0; i < AMREX_SPACEDIM; i++) value(i) = vals[i];
607 std::vector<Set::Scalar> vals;
609 if (vals.size() == 9)
612 Util::Warning(
INFO,
"Reading a 3D matrix (",
full(name),
")into a 2D code - some values will be ignored.");
613 value(0,0) = vals[0]; value(0,1)= vals[1];
614 value(1,0) = vals[3]; value(1,1)= vals[4];
617 value(0,0) = vals[0]; value(0,1)= vals[1]; value(0,2)= vals[2];
618 value(1,0) = vals[3]; value(1,1)= vals[4]; value(1,2)= vals[5];
619 value(2,0) = vals[6]; value(2,1)= vals[7]; value(2,2)= vals[8];
622 else if (vals.size() == 4)
625 value(0,0) = vals[0]; value(0,1)= vals[1];
626 value(1,0) = vals[2]; value(1,1)= vals[3];
629 Util::Warning(
INFO,
"Reading a 2D matrix (",
full(name),
")into a 3D code - remaining values will be set to zero.");
630 value(0,0) = vals[0]; value(0,1)= vals[1]; value(0,2)= 0.0;
631 value(1,0) = vals[2]; value(1,1)= vals[3]; value(1,2)= 0.0;
632 value(2,0) = 0.0; value(2,1)= 0.0; value(2,2)= 0.0;
649 return queryarr<T>(name,value);
660 int queryarr_default( std::string name, std::vector<std::string> & value, std::vector<std::string> defaultvalue)
664 addarr(name.c_str(),defaultvalue);
666 return amrex::ParmParse::queryarr(name.c_str(),value);
677 return queryarr(name.c_str(),value,unit);
679 catch (std::runtime_error &e)
695 std::vector<Set::Scalar> def_data(AMREX_SPACEDIM);
696 for (
unsigned int i = 0; i < def_data.size(); i++)
697 def_data[i] = defaultvalue[i];
700 value = defaultvalue;
703 return queryarr(name.c_str(),value);
718 std::vector<Set::Scalar> def_data(AMREX_SPACEDIM*AMREX_SPACEDIM);
719 for (
unsigned int i = 0; i < def_data.size(); i++)
720 def_data[i] = def.data()[i];
726 return queryarr(name.c_str(),value);
735 int queryarr_default( std::string name, std::vector<double> & value, std::vector<double> defaultvalue)
741 addarr(name.c_str(),defaultvalue);
743 return queryarr(name.c_str(),value);
752 int queryarr_default( std::string name, std::vector<double> & value, std::vector<std::string> defaultvalue,
Unit unit)
758 addarr(name.c_str(),defaultvalue);
770 template <
typename T>
780 std::string name = a_name;
783 for (
int n = 0; n < number; n++)
786 this->queryclass<T>(name, tmp);
787 value.push_back(tmp);
800 std::string name0 = a_name + std::to_string(0);
801 std::string name1 = a_name + std::to_string(1);
807 else if (this->
contains(name1.c_str()))
821 for (
int cntr = start; this->
contains(name.c_str()); cntr++)
826 this->queryclass<T>(name, tmp);
827 value.push_back(tmp);
829 name = a_name + std::to_string(cntr+1);
836 template <
typename T>
846 std::string name = a_name;
849 for (
int n = 0; n < number; n++)
853 value.push_back(tmp);
866 std::string name0 = a_name + std::to_string(0);
867 std::string name1 = a_name + std::to_string(1);
873 else if (this->
contains(name1.c_str()))
887 for (
int cntr = start; this->
contains(name.c_str()); cntr++)
893 value.push_back(tmp);
895 name = a_name + std::to_string(cntr+1);
906 for (
auto li = m_table->begin(), End = m_table->end(); li != End; ++li)
908 if (!li->second.m_count)
912 if (li->first.rfind(
getPrefix()+
".",0) != std::string::npos)
930 std::vector<std::string> ret;
931 for (
auto li = m_table->begin(), End = m_table->end(); li != End; ++li)
933 if (!li->second.m_count && li->first.rfind(
getPrefix()+
".",0) != std::string::npos)
935 ret.push_back(li->first);
945 for (
auto li = pp.m_table->begin(), End = pp.m_table->end(); li != End; ++li)
947 if (!li->second.m_count)
959 std::string
full (std::string name)
970 auto old_prefix = m_prefix;
973 if (old_prefix.empty()) m_prefix = name;
974 else m_prefix.append(
".").append(name);
975 T::Parse(*value, *
this);
977 if (unused_inputs.size())
979 std::stringstream ss;
980 for (
unsigned int i=0; i < unused_inputs.size(); i++)
981 ss <<
"\n\t" << unused_inputs[i];
987 m_prefix = old_prefix;
990 m_prefix = old_prefix;
995 auto old_prefix = m_prefix;
998 if (old_prefix.empty()) m_prefix = name;
999 else m_prefix.append(
".").append(name);
1000 T::Parse(value, *
this);
1002 if (unused_inputs.size())
1004 std::stringstream ss;
1005 for (
unsigned int i=0; i < unused_inputs.size(); i++)
1006 ss <<
"\n\t" << unused_inputs[i];
1010 catch (std::runtime_error &e)
1016 m_prefix = old_prefix;
1019 m_prefix = old_prefix;
1027 T::Parse(*value, *
this);
1029 catch (std::runtime_error &e)
1043 T::Parse(value, *
this);
1045 catch (std::runtime_error &e)
1063 template<
typename...
IC,
typename... Args,
typename PTRTYPE>
1064 void select (std::string name, PTRTYPE *& ic_eta, Args&&... args)
1070 if constexpr (
sizeof...(IC) == 0)
1072 using first_IC = std::tuple_element_t<0, std::tuple<
IC...>>;
1073 ic_eta =
new first_IC(std::forward<Args>(args)..., (*
this), name +
"." + std::string(first_IC::name));
1078 std::string type =
"";
1080 bool matched = (( type == IC::name
1081 ? (ic_eta =
new IC(std::forward<Args>(args)..., (*
this), name +
"." + std::string(IC::name))),
1088 catch (std::runtime_error &e)
1102 template<
typename FirstIC,
typename...
IC,
typename... Args,
typename PTRTYPE>
1105 std::string type =
"";
1110 (( type == FirstIC::name
1111 ? (ic_eta =
new FirstIC(std::forward<Args>(args)..., (*
this), name +
"." + std::string(FirstIC::name))),
1115 ? (ic_eta =
new IC(std::forward<Args>(args)..., (*
this), name +
"." + std::string(IC::name))),
1116 true :
false) || ...);
1126 template<
typename...
IC,
typename... Args,
typename PTRTYPE>
1136 std::string name = a_name;
1140 this->
select<
IC...>(a_name, tmp, args...);
1141 value.push_back(tmp);
1153 std::string name0 = a_name + std::to_string(0);
1154 std::string name1 = a_name + std::to_string(1);
1160 else if (this->
contains(name1.c_str()))
1174 for (
int cntr = start; this->
contains(name.c_str()); cntr++)
1179 this->
select<
IC...>(name, tmp, args...);
1180 value.push_back(tmp);
1182 name = a_name + std::to_string(cntr+1);
1191 template<
typename... INTEGRATOR,
typename... Args,
typename PTRTYPE>
1194 std::string type =
"";
1198 bool matched = ((type == INTEGRATOR::name
1199 ? (ic_eta =
new INTEGRATOR(std::forward<Args>(args)..., (*
this))),
1212 template<
typename INTEGRATOR,
typename Args,
typename PTRTYPE>
1215 ic_eta =
new INTEGRATOR(std::forward<Args>(args), (*
this));
1218 template<
typename INTEGRATOR,
typename PTRTYPE>
1221 ic_eta =
new INTEGRATOR((*
this));
1230 template <
typename... OBJ,
typename CLASS,
typename... Args>
1231 void select(std::string name, CLASS& value, Args&&... args)
1249 template <
typename CLASS,
int N,
typename... OBJ,
typename... Args>
1252 if constexpr (N == 0)
1257 for (
unsigned int i = 0; i <
sizeof...(OBJ); i++)
1258 if (type == value.names[i])
1261 if (value.selected < 0)
1264 ", invalid type " + type);
1270 if constexpr (N <
sizeof...(OBJ))
1272 if (value.selected == N)
1274 std::get<N>(value.obj).Parse(
1275 std::get<N>(value.obj), *
this, std::forward<Args>(args)...);
1281 value, std::forward<Args>(args)...);
1289 void query_exactly( std::vector<std::string> names, std::pair<std::string, Set::Scalar> values[N],
1290 std::vector<Unit> units = std::vector<Unit>())
1295 "# of units must be 0, 1, or ", names.size(),
" but got ", units.size());
1298 std::vector<std::string> read;
1299 for (
unsigned int n = 0; n < names.size(); n++)
1301 if (amrex::ParmParse::contains(names[n].c_str()))
1303 read.push_back(names[n]);
1308 " Incorrect number of values specified: only ", N,
1309 " values are allowed, but received ",
1314 for (
unsigned int n = 0; n < names.size(); n++)
1316 if (amrex::ParmParse::contains(names[n].c_str()))
1318 values[cnt].first = names[n];
1320 if (units.size() == 0)
1322 else if (units.size() == 1)
1332 std::string names_str =
"[";
1333 for (
unsigned int i = 0; i < names.size(); i++)
1335 names_str +=
full(names[i]);
1336 if (i < names.size()-1) names_str +=
", ";
int queryarr_default(std::string name, std::vector< double > &value, std::vector< std::string > defaultvalue, Unit unit)
bool contains(std::string name)
int queryunit(std::string name, Unit &value)
int queryarr_default(std::string name, std::vector< std::string > &value, std::vector< std::string > defaultvalue)
int queryarr_required(std::string name, std::vector< Set::Scalar > &value, Unit unit=Unit::Less())
int queryarr(std::string name, std::vector< T > &value)
void forbid(std::string name, std::string explanation)
int query_enumerate(std::string a_name, std::vector< T > &value, int number=1)
int queryarr(std::string name, std::vector< Set::Scalar > &value, Unit unit=Unit::Less())
void pushPrefix(const std::string prefix)
int query_validate(std::string name, std::string &value, std::vector< const char * > possiblecharvals, bool firstbydefault)
int query_file(std::string name, std::string &value)
int queryarr(std::string name, Set::Vector &value, Unit unit=Unit::Less())
int queryarr_default(std::string name, Set::Vector &value, std::string defaultvalue, Unit unit)
int query_file(std::string name, std::string &value, bool copyfile, bool checkfile)
int AnyUnusedInputs(bool inscopeonly=true, bool verbose=false)
int queryarr(std::string name, Set::Matrix &value, Unit unit=Unit::Less())
std::vector< std::string > GetUnusedInputs()
void queryclass(std::string name, T &value)
std::string getPrefix() const
static bool checked_for_input_files
void select(std::string name, PTRTYPE *&ic_eta, Args &&... args)
void queryclass(std::string name, T *value)
int queryclass_enumerate(std::string a_name, std::vector< T > &value, int number=1)
int query_required(std::string name, T &value)
int query_default(std::string name, T &value, std::string defaultvalue, const Unit type)
void select_default(std::string name, PTRTYPE *&ic_eta, Args &&... args)
int queryarr_default(std::string name, Set::Vector &value, Set::Vector defaultvalue)
int queryunit(std::string name, Unit &value, const Unit type)
int query_default(std::string name, int &value, bool defaultvalue)
void static_polymorphism_parser(CLASS &value, Args &&... args)
int query_file(std::string name, std::string &value, bool copyfile)
void select_enumerate(std::string a_name, std::vector< PTRTYPE * > &value, Args &&... args)
void queryclass(T &value)
static int AllUnusedInputs()
int query_validate(std::string name, std::string &value, std::vector< const char * > possiblecharvals)
void queryclass(T *value)
int queryarr_required(std::string name, std::vector< T > &value)
int query_required(std::string name, T &value, const Unit type)
void select_only(PTRTYPE *&ic_eta, Args &&args)
void select_main(PTRTYPE *&ic_eta, Args &&... args)
int queryunit(std::string name, Set::Scalar &value, const Unit type)
int query_default(std::string name, T &value, T defaultvalue)
void select_only(PTRTYPE *&ic_eta)
void ignore(std::string name)
std::string full(std::string name)
int query_validate(std::string name, int &value, std::vector< int > possibleintvals)
int queryarr_default(std::string name, Set::Matrix &value, Set::Matrix def)
void select(std::string name, CLASS &value, Args &&... args)
int queryarr_default(std::string name, std::vector< double > &value, std::vector< double > defaultvalue)
void query_exactly(std::vector< std::string > names, std::pair< std::string, Set::Scalar > values[N], std::vector< Unit > units=std::vector< Unit >())
int query_default(std::string name, std::string &value, const char *defaultvalue)
ParmParse(std::string arg)
Initialize a spherical inclusion.
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
AMREX_FORCE_INLINE std::string Join(const std::vector< std::string > &vec, std::string separator="_")
AMREX_FORCE_INLINE std::vector< std::string > Split(std::string &str, const char delim=' ')
void DebugMessage(std::string, std::string, int, Args const &...)
AMREX_FORCE_INLINE void AssertException(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
void Abort(const char *msg)
void CopyFileToOutputDir(std::string a_path, bool fullpath, std::string prefix)
void Warning(std::string file, std::string func, int line, Args const &... args)
void Message(std::string file, std::string func, int line, Args const &... args)
void ParmParseException(std::string file, std::string func, int line, std::string fullname, Args const &... args)
void Exception(std::string file, std::string func, int line, Args const &... args)
bool isType(const Unit &test) const
std::string normalized_unitstring() const
static Unit Parse(double val, std::string unitstring, bool verbose=false)
double normalized_value() const