2 #include "TpetraCore_config.h"
16 namespace BehaviorDetails {
17 std::map<std::string, std::map<std::string, bool> > namedVariableMap_;
22 enum EnvironmentVariableState
24 EnvironmentVariableIsSet_ON,
25 EnvironmentVariableIsSet_OFF,
26 EnvironmentVariableIsSet,
27 EnvironmentVariableIsNotSet
33 std::string stringToUpper (std::string s)
35 std::transform (s.begin (), s.end (), s.begin (),
36 [] (
unsigned char c) {
return std::toupper (c); });
41 split(
const std::string& s,
42 std::function<
void(
const std::string&)> f,
45 typedef std::string::size_type size_type;
46 size_type cur_pos, last_pos=0, length=s.length();
47 while(last_pos < length + 1)
49 cur_pos = s.find_first_of(sep, last_pos);
50 if(cur_pos == std::string::npos)
54 if(cur_pos!=last_pos) {
55 auto token = std::string(s.data()+last_pos, (size_type)cur_pos-last_pos);
58 last_pos = cur_pos + 1;
63 EnvironmentVariableState
64 environmentVariableState(
const std::string& environmentVariableValue)
66 std::string v = stringToUpper(environmentVariableValue);
67 if (v ==
"1" || v ==
"YES" || v ==
"TRUE" || v ==
"ON")
69 return EnvironmentVariableIsSet_ON;
70 else if (v ==
"0" || v ==
"NO" || v ==
"FALSE" || v ==
"OFF")
72 return EnvironmentVariableIsSet_OFF;
74 return EnvironmentVariableIsSet;
78 setEnvironmentVariableMap (
const char environmentVariableName[],
79 std::map<std::string,std::map<std::string, bool> >& valsMap,
80 const bool defaultValue)
88 valsMap[environmentVariableName] = map<string,bool>{{
"DEFAULT", defaultValue}};
90 const char* varVal = getenv (environmentVariableName);
98 const string varStr(varVal);
100 split(varStr, [&](
const string& x){names.push_back(x);});
101 for (
auto const& name: names) {
102 auto state = environmentVariableState(name);
103 if (state == EnvironmentVariableIsSet_ON) {
106 valsMap[environmentVariableName][
"DEFAULT"] =
true;
108 else if (state == EnvironmentVariableIsSet_OFF) {
111 valsMap[environmentVariableName][
"DEFAULT"] =
false;
116 valsMap[environmentVariableName][name] =
true;
123 getEnvironmentVariableAsBool (
const char environmentVariableName[],
124 const bool defaultValue)
126 const char* varVal = std::getenv (environmentVariableName);
128 bool retVal = defaultValue;
129 if (varVal != NULL) {
130 auto state = environmentVariableState(std::string(varVal));
131 if (state == EnvironmentVariableIsSet_ON) retVal =
true;
132 else if (state == EnvironmentVariableIsSet_OFF) retVal =
false;
138 idempotentlyGetEnvironmentVariableAsBool (std::once_flag& once_flag,
141 const char environmentVariableName[],
142 const bool defaultValue)
149 std::call_once (once_flag, [&] () {
150 value = getEnvironmentVariableAsBool (environmentVariableName,
170 std::atomic_thread_fence (std::memory_order_release);
179 idempotentlyGetNamedEnvironmentVariableAsBool (
const char name[],
180 std::once_flag& once_flag,
182 const char environmentVariableName[],
183 const bool defaultValue)
185 using BehaviorDetails::namedVariableMap_;
191 std::call_once (once_flag, [&] () {
192 setEnvironmentVariableMap (environmentVariableName,
211 std::atomic_thread_fence (std::memory_order_release);
216 auto thisEnvironmentVariableMap = namedVariableMap_[environmentVariableName];
217 auto thisEnvironmentVariable = thisEnvironmentVariableMap.find(name);
218 if (thisEnvironmentVariable != thisEnvironmentVariableMap.end())
219 return thisEnvironmentVariable->second;
220 return thisEnvironmentVariableMap[
"DEFAULT"];
223 constexpr
bool debugDefault () {
224 #ifdef HAVE_TPETRA_DEBUG
228 #endif // HAVE_TPETRA_DEBUG
231 constexpr
bool verboseDefault () {
235 constexpr
bool assumeMpiIsCudaAwareDefault () {
236 #ifdef TPETRA_ASSUME_CUDA_AWARE_MPI
240 #endif // TPETRA_ASSUME_CUDA_AWARE_MPI
247 constexpr
char envVarName[] =
"TPETRA_DEBUG";
248 constexpr
bool defaultValue = debugDefault ();
250 static std::once_flag flag_;
251 static bool value_ = defaultValue;
252 static bool initialized_ =
false;
253 return idempotentlyGetEnvironmentVariableAsBool (flag_,
262 constexpr
char envVarName[] =
"TPETRA_VERBOSE";
263 constexpr
bool defaultValue = verboseDefault ();
265 static std::once_flag flag_;
266 static bool value_ = defaultValue;
267 static bool initialized_ =
false;
268 return idempotentlyGetEnvironmentVariableAsBool (flag_,
277 constexpr
char envVarName[] =
"TPETRA_ASSUME_CUDA_AWARE_MPI";
278 constexpr
bool defaultValue = assumeMpiIsCudaAwareDefault ();
280 static std::once_flag flag_;
281 static bool value_ = defaultValue;
282 static bool initialized_ =
false;
283 return idempotentlyGetEnvironmentVariableAsBool (flag_,
292 constexpr
char envVarName[] =
"TPETRA_DEBUG";
293 constexpr
bool defaultValue =
false;
295 static std::once_flag flag_;
296 static bool initialized_ =
false;
297 return idempotentlyGetNamedEnvironmentVariableAsBool (name,
306 constexpr
char envVarName[] =
"TPETRA_VERBOSE";
307 constexpr
bool defaultValue =
false;
309 static std::once_flag flag_;
310 static bool initialized_ =
false;
311 return idempotentlyGetNamedEnvironmentVariableAsBool (name,