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,
Namespace Tpetra contains the class and methods constituting the Tpetra library.
static bool debug()
Whether Tpetra is in debug mode.
Implementation details of Tpetra.
static bool assumeMpiIsCudaAware()
Whether to assume that MPI is CUDA aware.
static bool verbose()
Whether Tpetra is in verbose mode.
Declaration of Tpetra::Details::Behavior, a class that describes Tpetra's behavior.