https://mooseframework.inl.gov
Classes | Typedefs | Functions
MooseUtils Namespace Reference

Classes

class  Buffer
 Base class for a buffer. More...
 
class  CircularBuffer
 An optimized circular buffer. More...
 
class  DelimitedFileReaderTempl
 Utility class for reading delimited data (e.g., CSV data). More...
 
class  LIFOBuffer
 An optimized LIFO (Last In First Out) buffer. More...
 
class  SharedPool
 Originally From https://stackoverflow.com/a/27837534/2042320. More...
 
class  StaticallyAllocatedSet
 Optimized set with static allocation. More...
 

Typedefs

typedef DelimitedFileReaderTempl< double > DelimitedFileReader
 
typedef DelimitedFileReaderTempl< std::string > DelimitedFileOfStringReader
 

Functions

std::string trim (const std::string &str, const std::string &white_space=" \\\)
 Standard scripting language trim function. More...
 
template<typename T >
void tokenize (const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
 This function will split the passed in string on a set of delimiters appending the substrings to the passed in vector. More...
 
template<class T >
bool convert (const std::string &str, T &value, const bool throw_on_failure)
 Takes the string representation of a value and converts it to the value. More...
 
template<typename T >
bool tokenizeAndConvert (const std::string &str, std::vector< T > &tokenized_vector, const std::string &delimiter=" \\\)
 tokenizeAndConvert splits a string using delimiter and then converts to type T. More...
 
std::string toUpper (std::string name)
 Convert supplied string to upper case. More...
 
std::string toLower (std::string name)
 Convert supplied string to lower case. More...
 
std::string stringJoin (const std::vector< std::string > &values, const std::string &separator=" ")
 Concatenates value into a single string separated by separator. More...
 
template<class T , typename... Args>
auto reset (int, T &obj, Args... args) -> decltype(obj.reset(args...), void())
 
template<class T , typename... Args>
void reset (double, T &, Args...)
 
std::filesystem::path pathjoin (const std::filesystem::path &p)
 
std::string runTestsExecutable ()
 
std::string findTestRoot ()
 
bool parsesToReal (const std::string &input, Real *parsed_real)
 
std::string installedInputsDir (const std::string &app_name, const std::string &dir_name, const std::string &extra_error_msg)
 
std::string docsDir (const std::string &app_name)
 
std::string mooseDocsURL (const std::string &path)
 
std::string replaceAll (std::string str, const std::string &from, const std::string &to)
 
std::string convertLatestCheckpoint (std::string orig)
 
int levenshteinDist (const std::string &s1, const std::string &s2)
 
void escape (std::string &str)
 
std::string removeExtraWhitespace (const std::string &input)
 
bool pathContains (const std::string &expression, const std::string &string_to_find, const std::string &delims)
 
bool pathExists (const std::string &path)
 
bool checkFileReadable (const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
 
bool checkForGitLFSPointer (std::ifstream &file)
 
bool checkFileWriteable (const std::string &filename, bool throw_on_unwritable)
 
void parallelBarrierNotify (const Parallel::Communicator &comm, bool messaging)
 
void serialBegin (const libMesh::Parallel::Communicator &comm, bool warn)
 
void serialEnd (const libMesh::Parallel::Communicator &comm, bool warn)
 
bool hasExtension (const std::string &filename, std::string ext, bool strip_exodus_ext)
 
std::string getExtension (const std::string &filename, const bool rfind)
 
std::string stripExtension (const std::string &s, const bool rfind)
 
std::string getCurrentWorkingDir ()
 
void makedirs (const std::string &dir_name, bool throw_on_failure)
 
void removedirs (const std::string &dir_name, bool throw_on_failure)
 
std::string camelCaseToUnderscore (const std::string &camel_case_name)
 
std::string underscoreToCamelCase (const std::string &underscore_name, bool leading_upper_case)
 
std::string shortName (const std::string &name)
 
std::string baseName (const std::string &name)
 
std::string hostname ()
 
unsigned short getTermWidth (bool use_environment)
 
void MaterialPropertyStorageDump (const HashMap< const libMesh::Elem *, HashMap< unsigned int, MaterialProperties >> &props)
 
std::string & removeColor (std::string &msg)
 
void addLineBreaks (std::string &message, unsigned int line_width)
 
void indentMessage (const std::string &prefix, std::string &message, const char *color, bool indent_first_line, const std::string &post_prefix)
 
std::list< std::string > listDir (const std::string path, bool files_only)
 
std::list< std::string > getFilesInDirs (const std::list< std::string > &directory_list, const bool files_only)
 
std::string getLatestCheckpointFilePrefix (const std::list< std::string > &checkpoint_files)
 
bool wildCardMatch (std::string name, std::string search_string)
 
bool globCompare (const std::string &candidate, const std::string &pattern, std::size_t c, std::size_t p)
 
bool beginsWith (const std::string &value, const std::string &begin_value)
 
ExecFlagEnum getDefaultExecFlagEnum ()
 
int stringToInteger (const std::string &input, bool throw_on_failure)
 
void linearPartitionItems (dof_id_type num_items, dof_id_type num_chunks, dof_id_type chunk_id, dof_id_type &num_local_items, dof_id_type &local_items_begin, dof_id_type &local_items_end)
 
processor_id_type linearPartitionChunk (dof_id_type num_items, dof_id_type num_chunks, dof_id_type item_id)
 
std::vector< std::string > split (const std::string &str, const std::string &delimiter, std::size_t max_count)
 
std::vector< std::string > rsplit (const std::string &str, const std::string &delimiter, std::size_t max_count)
 
void createSymlink (const std::string &target, const std::string &link)
 
void clearSymlink (const std::string &link)
 
std::size_t fileSize (const std::string &filename)
 
std::string realpath (const std::string &path)
 
BoundingBox buildBoundingBox (const Point &p1, const Point &p2)
 
std::string prettyCppType (const std::string &cpp_type)
 
std::string canonicalPath (const std::string &path)
 
bool startsWith (const std::string &string1, const std::string &string2)
 
void replaceStart (std::string &string1, const std::string &string2, const std::string &string3)
 
bool isAllLowercase (const std::string &str)
 
template<typename T >
void swap (std::vector< T > &data, const std::size_t idx0, const std::size_t idx1, const libMesh::Parallel::Communicator &comm)
 Swap function for serial or distributed vector of data. More...
 
template<typename T >
void swap (std::vector< T > &data, const std::size_t idx0, const std::size_t idx1, const libMesh::Parallel::Communicator *comm_ptr=nullptr)
 
template<typename T >
void shuffle (std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
 Shuffle function for serial or distributed vector of data that shuffles in place. More...
 
template<typename T >
void shuffle (std::vector< T > &data, MooseRandom &generator, const libMesh::Parallel::Communicator &comm)
 
template<typename T >
void shuffle (std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index, const libMesh::Parallel::Communicator &comm)
 
template<typename T >
void shuffle (std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index, const libMesh::Parallel::Communicator *comm_ptr)
 
template<typename T >
std::vector< T > resample (const std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
 Randomly resample a vector of data, allowing a value to be repeated. More...
 
template<typename T >
std::vector< T > resample (const std::vector< T > &data, MooseRandom &generator, const libMesh::Parallel::Communicator &comm)
 
template<typename T >
std::vector< T > resample (const std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index, const libMesh::Parallel::Communicator &comm)
 
template<typename T >
std::vector< T > resample (const std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index, const libMesh::Parallel::Communicator *comm_ptr)
 
template<typename T , typename ActionFunctor >
void resampleWithFunctor (const std::vector< T > &data, const ActionFunctor &functor, MooseRandom &generator, const std::size_t seed_index=0)
 Randomly resample a vector of data and apply a functor, allowing a value to be repeated. More...
 
template<typename T , typename ActionFunctor >
void resampleWithFunctor (const std::vector< T > &data, const ActionFunctor &functor, MooseRandom &generator, const libMesh::Parallel::Communicator &comm)
 
template<typename T , typename ActionFunctor >
void resampleWithFunctor (const std::vector< T > &data, const ActionFunctor &functor, MooseRandom &generator, const std::size_t seed_index, const libMesh::Parallel::Communicator &comm)
 
template<typename T , typename ActionFunctor >
void resampleWithFunctor (const std::vector< T > &data, const ActionFunctor &functor, MooseRandom &generator, const std::size_t seed_index, const libMesh::Parallel::Communicator *comm_ptr)
 

Typedef Documentation

◆ DelimitedFileOfStringReader

Definition at line 201 of file DelimitedFileReader.h.

◆ DelimitedFileReader

Definition at line 200 of file DelimitedFileReader.h.

Function Documentation

◆ addLineBreaks()

void MooseUtils::addLineBreaks ( std::string &  message,
unsigned int  line_width 
)

Definition at line 730 of file MooseUtils.C.

732 {
733  for (auto i : make_range(int(message.length() / line_width)))
734  message.insert((i + 1) * (line_width + 2) - 2, "\n");
735 }
IntRange< T > make_range(T beg, T end)

◆ baseName()

std::string MooseUtils::baseName ( const std::string &  name)

Definition at line 618 of file MooseUtils.C.

Referenced by Moose::Builder::walkRaw().

619 {
620  return name.substr(0, name.find_last_of('/') != std::string::npos ? name.find_last_of('/') : 0);
621 }
std::string name(const ElemQuality q)

◆ beginsWith()

bool MooseUtils::beginsWith ( const std::string &  value,
const std::string &  begin_value 
)

Definition at line 955 of file MooseUtils.C.

Referenced by CommandLine::initSubAppCommandLine(), CommandLine::parse(), and CommandLine::setCommandLineParam().

956 {
957  return value.rfind(begin_value, 0) == 0;
958 }
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)

◆ buildBoundingBox()

BoundingBox MooseUtils::buildBoundingBox ( const Point &  p1,
const Point &  p2 
)

Definition at line 1131 of file MooseUtils.C.

Referenced by PropertyReadFile::PropertyReadFile().

1132 {
1133  BoundingBox bb;
1134  bb.union_with(p1);
1135  bb.union_with(p2);
1136  return bb;
1137 }

◆ camelCaseToUnderscore()

std::string MooseUtils::camelCaseToUnderscore ( const std::string &  camel_case_name)

Definition at line 568 of file MooseUtils.C.

Referenced by MooseApp::appNameToLibName().

569 {
570  std::string replaced = camel_case_name;
571  // Put underscores in front of each contiguous set of capital letters
572  pcrecpp::RE("(?!^)(?<![A-Z_])([A-Z]+)").GlobalReplace("_\\1", &replaced);
573 
574  // Convert all capital letters to lower case
575  std::transform(replaced.begin(), replaced.end(), replaced.begin(), ::tolower);
576  return replaced;
577 }

◆ canonicalPath()

std::string MooseUtils::canonicalPath ( const std::string &  path)

Definition at line 1173 of file MooseUtils.C.

Referenced by Registry::determineDataFilePath(), and Moose::DataFileUtils::getPath().

1174 {
1175  return std::filesystem::weakly_canonical(path).c_str();
1176 }

◆ checkFileReadable()

bool MooseUtils::checkFileReadable ( const std::string &  filename,
bool  check_line_endings,
bool  throw_on_unreadable,
bool  check_for_git_lfs_pointer 
)

Definition at line 254 of file MooseUtils.C.

Referenced by MooseServer::addResourcesForDocument(), FileMesh::buildMesh(), Registry::determineDataFilePath(), docsDir(), MooseApp::dynamicRegistration(), ExodusFileTimes::ExodusFileTimes(), findTestRoot(), MooseServer::gatherDocumentDefinitionLocations(), FileMeshGenerator::generate(), Moose::DataFileUtils::getPath(), ExodusTimeSequenceStepper::init(), installedInputsDir(), RestartableDataReader::isAvailable(), ADFParser::JITCompile(), MooseApp::loadLibraryAndDependencies(), Exodus::output(), Parser::parse(), MooseUtils::DelimitedFileReaderTempl< T >::read(), JSONFileReader::read(), MultiApp::readCommandLineArguments(), SolutionUserObjectBase::readXda(), MooseApp::run(), runTestsExecutable(), and ValueCache< T >::ValueCache().

258 {
259  std::ifstream in(filename.c_str(), std::ifstream::in);
260  if (in.fail())
261  {
262  if (throw_on_unreadable)
263  mooseError(
264  (std::string("Unable to open file \"") + filename +
265  std::string("\". Check to make sure that it exists and that you have read permission."))
266  .c_str());
267  else
268  return false;
269  }
270 
271  if (check_line_endings)
272  {
273  std::istream_iterator<char> iter(in);
274  std::istream_iterator<char> eos;
275  in >> std::noskipws;
276  while (iter != eos)
277  if (*iter++ == '\r')
278  mooseError(filename + " contains Windows(DOS) line endings which are not supported.");
279  }
280 
281  if (check_for_git_lfs_pointer && checkForGitLFSPointer(in))
282  mooseError(filename + " appears to be a Git-LFS pointer. Make sure you have \"git-lfs\" "
283  "installed so that you may pull this file.");
284  in.close();
285 
286  return true;
287 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
bool checkForGitLFSPointer(std::ifstream &file)
Definition: MooseUtils.C:290

◆ checkFileWriteable()

bool MooseUtils::checkFileWriteable ( const std::string &  filename,
bool  throw_on_unwritable 
)

Definition at line 307 of file MooseUtils.C.

Referenced by PNGOutput::makePNG().

308 {
309  std::ofstream out(filename.c_str(), std::ios_base::app);
310  if (out.fail())
311  {
312  if (throw_on_unwritable)
313  mooseError(
314  (std::string("Unable to open file \"") + filename +
315  std::string("\". Check to make sure that it exists and that you have write permission."))
316  .c_str());
317  else
318  return false;
319  }
320 
321  out.close();
322 
323  return true;
324 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
OStreamProxy out

◆ checkForGitLFSPointer()

bool MooseUtils::checkForGitLFSPointer ( std::ifstream &  file)

Definition at line 290 of file MooseUtils.C.

Referenced by checkFileReadable().

291 {
292  mooseAssert(file.is_open(), "Passed in file handle is not open");
293 
294  std::string line;
295 
296  // git-lfs pointer files contain several name value pairs. The specification states that the
297  // first name/value pair must be "version {url}". We'll do a simplified check for that.
298  file.seekg(0);
299  std::getline(file, line);
300  if (line.find("version https://") != std::string::npos)
301  return true;
302  else
303  return false;
304 }

◆ clearSymlink()

void MooseUtils::clearSymlink ( const std::string &  link)

Definition at line 1073 of file MooseUtils.C.

Referenced by createSymlink(), and CSV::initialSetup().

1074 {
1075 #ifndef __WIN32__
1076  struct stat sbuf;
1077  if (lstat(link.c_str(), &sbuf) == 0)
1078  {
1079  auto err = unlink(link.c_str());
1080  if (err != 0)
1081  mooseError("Failed to remove symbolic link (via 'unlink') to ", link);
1082  }
1083 #else
1084  auto attr = GetFileAttributesA(link.c_str());
1085  if (attr != INVALID_FILE_ATTRIBUTES)
1086  {
1087  auto err = _unlink(link.c_str());
1088  if (err != 0)
1089  mooseError("Failed to remove link/file (via '_unlink') to ", link);
1090  }
1091 #endif
1092 }
OStreamProxy err
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311

◆ convert()

template<class T >
bool MooseUtils::convert ( const std::string &  str,
T &  value,
const bool  throw_on_failure 
)

Takes the string representation of a value and converts it to the value.

For standard numeric types, this gets around the deficiencies in the STL stoi and stod methods where they might successfully convert part of a string to a number when we'd instead prefer to get a failure.

For string and string-derived types, this does a direct copy and does not utilize a stream.

For all other types, this uses the stringstream >> operator to fill the value.

Parameters
strThe string to convert from
valueThe typed value to fill
throw_on_failureIf true, throw a std::invalid_argument on failure
Returns
Whether or not the conversion succeeded

Definition at line 96 of file MooseStringUtils.h.

Referenced by MooseServer::getDocumentSymbolKind().

97 {
98  // Special case for numeric values, also handling range checking
99  if constexpr (std::is_same_v<short int, T> || std::is_same_v<unsigned short int, T> ||
100  std::is_same_v<int, T> || std::is_same_v<unsigned int, T> ||
101  std::is_same_v<long int, T> || std::is_same_v<unsigned long int, T> ||
102  std::is_same_v<long long int, T> || std::is_same_v<unsigned long long int, T>)
103  {
104  // Try read a double and try to cast it to an int
105  long double double_val;
106  std::stringstream double_ss(str);
107  double_ss >> double_val;
108 
109  if (!double_ss.fail() && double_ss.eof())
110  {
111  // on arm64 the long double does not have sufficient precision
112  std::stringstream int_ss(str);
113  const bool use_int = !(int_ss >> value).fail() && int_ss.eof();
114 
115  // Check to see if it's an integer and thus within range of an integer
116  if (double_val == static_cast<long double>(static_cast<T>(double_val)))
117  {
118  if (!use_int)
119  value = static_cast<T>(double_val);
120  return true;
121  }
122  }
123  }
124  // Non numeric values
125  else
126  {
127  // string or derived string: direct copy
128  if constexpr (std::is_base_of_v<std::string, T>)
129  {
130  value = str;
131  return true;
132  }
133  // non-string or numeric, use stringstream >>
134  else
135  {
136  std::stringstream ss(trim(str));
137  if (!(ss >> value).fail() && ss.eof())
138  return true;
139  }
140  }
141 
142  if (throw_on_failure)
143  {
144  std::string error = "Unable to convert '" + str + "' to type ";
145 #ifdef MOOSESTRINGUTILS_NO_LIBMESH
146  error += typeid(T).name();
147 #else
148  error += libMesh::demangle(typeid(T).name());
149 #endif
150  throw std::invalid_argument(error);
151  }
152 
153  return false;
154 }
std::string name(const ElemQuality q)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::string trim(const std::string &str, const std::string &white_space=" \\\)
Standard scripting language trim function.
std::string demangle(const char *name)

◆ convertLatestCheckpoint()

std::string MooseUtils::convertLatestCheckpoint ( std::string  orig)

Definition at line 157 of file MooseUtils.C.

Referenced by SetupRecoverFileBaseAction::act(), FileMeshGenerator::deduceCheckpointPath(), and FEProblemBase::FEProblemBase().

158 {
159  auto slash_pos = orig.find_last_of("/");
160  auto path = orig.substr(0, slash_pos);
161  auto file = orig.substr(slash_pos + 1);
162  if (file != "LATEST")
163  return orig;
164 
166 
167  if (converted.empty())
168  mooseError("Unable to find suitable recovery file!");
169 
170  return converted;
171 }
std::list< std::string > listDir(const std::string path, bool files_only)
Definition: MooseUtils.C:782
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
std::string getLatestCheckpointFilePrefix(const std::list< std::string > &checkpoint_files)
Definition: MooseUtils.C:819

◆ createSymlink()

void MooseUtils::createSymlink ( const std::string &  target,
const std::string &  link 
)

Definition at line 1060 of file MooseUtils.C.

Referenced by CSV::output().

1061 {
1062  clearSymlink(link);
1063 #ifndef __WIN32__
1064  auto err = symlink(target.c_str(), link.c_str());
1065 #else
1066  auto err = CreateSymbolicLink(target.c_str(), link.c_str(), 0);
1067 #endif
1068  if (err)
1069  mooseError("Failed to create symbolic link (via 'symlink') from ", target, " to ", link);
1070 }
OStreamProxy err
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
void clearSymlink(const std::string &link)
Definition: MooseUtils.C:1073

◆ docsDir()

std::string MooseUtils::docsDir ( const std::string &  app_name)

Definition at line 125 of file MooseUtils.C.

Referenced by MooseApp::run().

126 {
127  // See moose.mk for a detailed explanation of the assumed installed application
128  // layout. Installed docs are expected to be installed in "share/<app_name>/doc".
129  // The binary, which has a defined location will be in "bin", a peer directory to "share".
130  std::string installed_path = pathjoin(Moose::getExecutablePath(), "..", "share", app_name, "doc");
131 
132  auto docfile = pathjoin(installed_path, "css", "moose.css");
133  if (pathExists(docfile) && checkFileReadable(docfile))
134  return installed_path;
135  return "";
136 }
std::string getExecutablePath()
Gets the directory the running executable is on Mac OS X and linux.
std::filesystem::path pathjoin(const std::filesystem::path &p)
Definition: MooseUtils.C:59
bool pathExists(const std::string &path)
Definition: MooseUtils.C:247
bool checkFileReadable(const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
Definition: MooseUtils.C:254

◆ escape()

void MooseUtils::escape ( std::string &  str)

Definition at line 207 of file MooseUtils.C.

Referenced by MooseServer::addParametersToList(), MooseServer::addValuesToList(), MooseServer::getHoverDisplayText(), YAMLFormatter::printBlockOpen(), InputFileFormatter::printParams(), YAMLFormatter::printParams(), and JsonSyntaxTree::setParams().

208 {
209  std::map<char, std::string> escapes;
210  escapes['\a'] = "\\a";
211  escapes['\b'] = "\\b";
212  escapes['\f'] = "\\f";
213  escapes['\n'] = "\\n";
214  escapes['\t'] = "\\t";
215  escapes['\v'] = "\\v";
216  escapes['\r'] = "\\r";
217 
218  for (const auto & it : escapes)
219  for (size_t pos = 0; (pos = str.find(it.first, pos)) != std::string::npos;
220  pos += it.second.size())
221  str.replace(pos, 1, it.second);
222 }

◆ fileSize()

std::size_t MooseUtils::fileSize ( const std::string &  filename)

Definition at line 1095 of file MooseUtils.C.

Referenced by Exodus::output().

1096 {
1097 #ifndef __WIN32__
1098  struct stat buffer;
1099  if (!stat(filename.c_str(), &buffer))
1100  return buffer.st_size;
1101 #else
1102  HANDLE hFile = CreateFile(filename.c_str(),
1103  GENERIC_READ,
1104  FILE_SHARE_READ | FILE_SHARE_WRITE,
1105  NULL,
1106  OPEN_EXISTING,
1107  FILE_ATTRIBUTE_NORMAL,
1108  NULL);
1109  if (hFile == INVALID_HANDLE_VALUE)
1110  return 0;
1111 
1112  LARGE_INTEGER size;
1113  if (GetFileSizeEx(hFile, &size))
1114  {
1115  CloseHandle(hFile);
1116  return size.QuadPart;
1117  }
1118 
1119  CloseHandle(hFile);
1120 #endif
1121  return 0;
1122 }

◆ findTestRoot()

std::string MooseUtils::findTestRoot ( )

Definition at line 75 of file MooseUtils.C.

Referenced by MooseApp::runInputs().

76 {
77  std::string path = ".";
78  for (int i = 0; i < 5; i++)
79  {
80  auto testroot = pathjoin(path, "testroot");
81  if (pathExists(testroot) && checkFileReadable(testroot))
82  return testroot;
83  path += "/..";
84  }
85  return "";
86 }
std::filesystem::path pathjoin(const std::filesystem::path &p)
Definition: MooseUtils.C:59
bool pathExists(const std::string &path)
Definition: MooseUtils.C:247
bool checkFileReadable(const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
Definition: MooseUtils.C:254

◆ getCurrentWorkingDir()

std::string MooseUtils::getCurrentWorkingDir ( )

Definition at line 436 of file MooseUtils.C.

Referenced by MooseApp::runInputs().

437 {
438  // Note: At the time of creating this method, our minimum compiler still
439  // does not support <filesystem>. Additionally, the inclusion of that header
440  // requires an additional library to be linked so for now, we'll just
441  // use the Unix standard library to get us the cwd().
442  constexpr unsigned int BUF_SIZE = 1024;
443  char buffer[BUF_SIZE];
444 
445  return getcwd(buffer, BUF_SIZE) != nullptr ? buffer : "";
446 }

◆ getDefaultExecFlagEnum()

ExecFlagEnum MooseUtils::getDefaultExecFlagEnum ( )

◆ getExtension()

std::string MooseUtils::getExtension ( const std::string &  filename,
const bool  rfind 
)

Definition at line 411 of file MooseUtils.C.

Referenced by SplitMeshAction::act(), CommonOutputAction::act(), SetupMeshAction::modifyParamsForUseSplit(), and stripExtension().

412 {
413  std::string file_ext = "";
414  if (filename != "")
415  {
416  // The next line splits filename at the last "/" and gives the file name after "/"
417  const std::string stripped_filename = splitFileName<std::string>(filename).second;
418  auto pos = rfind ? stripped_filename.rfind(".") : stripped_filename.find(".");
419  if (pos != std::string::npos)
420  file_ext += stripped_filename.substr(pos + 1, std::string::npos);
421  }
422 
423  return file_ext;
424 }

◆ getFilesInDirs()

std::list<std::string> MooseUtils::getFilesInDirs ( const std::list< std::string > &  directory_list,
const bool  files_only 
)

Definition at line 808 of file MooseUtils.C.

Referenced by MooseApp::getCheckpointFiles().

809 {
810  std::list<std::string> files;
811 
812  for (const auto & dir_name : directory_list)
813  files.splice(files.end(), listDir(dir_name, files_only));
814 
815  return files;
816 }
std::list< std::string > listDir(const std::string path, bool files_only)
Definition: MooseUtils.C:782

◆ getLatestCheckpointFilePrefix()

std::string MooseUtils::getLatestCheckpointFilePrefix ( const std::list< std::string > &  checkpoint_files)

Definition at line 819 of file MooseUtils.C.

Referenced by convertLatestCheckpoint(), and MooseApp::setRestartRecoverFileBase().

820 {
821  // Create storage for newest restart files
822  // Note that these might have the same modification time if the simulation was fast.
823  // In that case we're going to save all of the "newest" files and sort it out momentarily
824  std::time_t newest_time = 0;
825  std::list<std::string> newest_restart_files;
826 
827  // Loop through all possible files and store the newest
828  for (const auto & cp_file : checkpoint_files)
829  {
830  if (MooseUtils::hasExtension(cp_file, "rd"))
831  {
832  struct stat stats;
833  stat(cp_file.c_str(), &stats);
834 
835  std::time_t mod_time = stats.st_mtime;
836  if (mod_time > newest_time)
837  {
838  newest_restart_files.clear(); // If the modification time is greater, clear the list
839  newest_time = mod_time;
840  }
841 
842  if (mod_time == newest_time)
843  newest_restart_files.push_back(cp_file);
844  }
845  }
846 
847  // Loop through all of the newest files according the number in the file name
848  int max_file_num = -1;
849  std::string max_file;
850  std::string max_prefix;
851 
852  // Pull out the path including the number and the number itself
853  // This takes something_blah_out_cp/0024-restart-1.rd
854  // and returns "something_blah_out_cp/0024" as the "prefix"
855  // and then "24" as the number itself
856  pcrecpp::RE re_file_num("(.*?(\\d+))-restart-\\d+.rd$");
857 
858  // Now, out of the newest files find the one with the largest number in it
859  for (const auto & res_file : newest_restart_files)
860  {
861  int file_num = 0;
862 
863  // All of the file up to and including the digits
864  std::string file_prefix;
865 
866  re_file_num.FullMatch(res_file, &file_prefix, &file_num);
867 
868  if (file_num > max_file_num)
869  {
870  // Need both the header and the data
871  if (!RestartableDataReader::isAvailable(res_file))
872  continue;
873 
874  max_file_num = file_num;
875  max_file = res_file;
876  max_prefix = file_prefix;
877  }
878  }
879 
880  // Error if nothing was located
881  if (max_file_num == -1)
882  mooseError("No checkpoint file found!");
883 
884  return max_prefix;
885 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
bool hasExtension(const std::string &filename, std::string ext, bool strip_exodus_ext)
Definition: MooseUtils.C:387
static bool isAvailable(const std::filesystem::path &folder_base)

◆ getTermWidth()

unsigned short MooseUtils::getTermWidth ( bool  use_environment)

Initialize the value we intend to populate just in case the system call fails

Definition at line 640 of file MooseUtils.C.

Referenced by FormattedTable::printTable().

641 {
642 #ifndef __WIN32__
643  struct winsize w;
644 #else
645  struct
646  {
647  unsigned short ws_col;
648  } w;
649 #endif
650 
655 
656  if (use_environment)
657  {
658  char * pps_width = std::getenv("MOOSE_PPS_WIDTH");
659  if (pps_width != NULL)
660  {
661  std::stringstream ss(pps_width);
662  ss >> w.ws_col;
663  }
664  }
665  // Default to AUTO if no environment variable was set
667  {
668 #ifndef __WIN32__
669  try
670  {
671  ioctl(0, TIOCGWINSZ, &w);
672  }
673  catch (...)
674 #endif
675  {
676  }
677  }
678 
679  // Something bad happened, make sure we have a sane value
680  // 132 seems good for medium sized screens, and is available as a GNOME preset
682  w.ws_col = 132;
683 
684  return w.ws_col;
685 }
auto max(const L &left, const R &right)

◆ globCompare()

bool MooseUtils::globCompare ( const std::string &  candidate,
const std::string &  pattern,
std::size_t  c,
std::size_t  p 
)

Definition at line 932 of file MooseUtils.C.

Referenced by RestartableDataReporter::execute(), and ReferenceResidualConvergence::initialSetup().

936 {
937  if (p == pattern.size())
938  return c == candidate.size();
939 
940  if (pattern[p] == '*')
941  {
942  for (; c < candidate.size(); ++c)
943  if (globCompare(candidate, pattern, c, p + 1))
944  return true;
945  return globCompare(candidate, pattern, c, p + 1);
946  }
947 
948  if (pattern[p] != '?' && pattern[p] != candidate[c])
949  return false;
950 
951  return globCompare(candidate, pattern, c + 1, p + 1);
952 }
bool globCompare(const std::string &candidate, const std::string &pattern, std::size_t c, std::size_t p)
Definition: MooseUtils.C:932

◆ hasExtension()

bool MooseUtils::hasExtension ( const std::string &  filename,
std::string  ext,
bool  strip_exodus_ext 
)

Definition at line 387 of file MooseUtils.C.

Referenced by FileMesh::FileMesh(), FileRangeBuilder::FileRangeBuilder(), getLatestCheckpointFilePrefix(), and SolutionUserObjectBase::initialSetup().

388 {
389  // Extract the extension, w/o the '.'
390  std::string file_ext;
391  if (strip_exodus_ext)
392  {
393  pcrecpp::RE re(
394  ".*\\.([^\\.]*?)(?:-s\\d+)?\\s*$"); // capture the complete extension, ignoring -s*
395  re.FullMatch(filename, &file_ext);
396  }
397  else
398  {
399  pcrecpp::RE re(".*\\.([^\\.]*?)\\s*$"); // capture the complete extension
400  re.FullMatch(filename, &file_ext);
401  }
402 
403  // Perform the comparision
404  if (file_ext == ext)
405  return true;
406  else
407  return false;
408 }

◆ hostname()

std::string MooseUtils::hostname ( )

Definition at line 624 of file MooseUtils.C.

625 {
626  char hostname[1024];
627  hostname[1023] = '\0';
628 #ifndef __WIN32__
629  if (gethostname(hostname, 1023))
630  mooseError("Failed to retrieve hostname!");
631 #else
632  DWORD dwSize = sizeof(hostname);
633  if (!GetComputerNameEx(ComputerNamePhysicalDnsHostname, hostname, &dwSize))
634  mooseError("Failed to retrieve hostname!");
635 #endif
636  return hostname;
637 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
std::string hostname()
Definition: MooseUtils.C:624

◆ indentMessage()

void MooseUtils::indentMessage ( const std::string &  prefix,
std::string &  message,
const char *  color,
bool  indent_first_line,
const std::string &  post_prefix 
)

Definition at line 738 of file MooseUtils.C.

Referenced by DefaultNonlinearConvergence::checkConvergence(), ConsoleUtils::formatString(), OutputWarehouse::mooseConsole(), moose::internal::mooseErrorRaw(), and Console::write().

743 {
744  // First we need to see if the message we need to indent (with color) also contains color codes
745  // that span lines.
746  // The code matches all of the XTERM constants (see XTermConstants.h). If it does, then we'll work
747  // on formatting
748  // each colored multiline chunk one at a time with the right codes.
749  std::string colored_message;
750  std::string curr_color = COLOR_DEFAULT; // tracks last color code before newline
751  std::string line, color_code;
752 
753  bool ends_in_newline = message.empty() ? true : message.back() == '\n';
754 
755  bool first = true;
756 
757  std::istringstream iss(message);
758  for (std::string line; std::getline(iss, line);) // loop over each line
759  {
760  const static pcrecpp::RE match_color(".*(\\33\\[3\\dm)((?!\\33\\[3\\d)[^\n])*");
761  pcrecpp::StringPiece line_piece(line);
762  match_color.FindAndConsume(&line_piece, &color_code);
763 
764  if (!first || indent_first_line)
765  colored_message += color + prefix + post_prefix + curr_color;
766 
767  colored_message += line;
768 
769  // Only add a newline to the last line if it had one to begin with!
770  if (!iss.eof() || ends_in_newline)
771  colored_message += "\n";
772 
773  if (!color_code.empty())
774  curr_color = color_code; // remember last color of this line
775 
776  first = false;
777  }
778  message = colored_message;
779 }

◆ installedInputsDir()

std::string MooseUtils::installedInputsDir ( const std::string &  app_name,
const std::string &  dir_name,
const std::string &  extra_error_msg 
)

Definition at line 103 of file MooseUtils.C.

Referenced by MooseApp::copyInputs().

106 {
107  // See moose.mk for a detailed explanation of the assumed installed application
108  // layout. Installed inputs are expected to be installed in "share/<app_name>/<folder>".
109  // The binary, which has a defined location will be in "bin", a peer directory to "share".
110  std::string installed_path =
111  pathjoin(Moose::getExecutablePath(), "..", "share", app_name, dir_name);
112 
113  auto test_root = pathjoin(installed_path, "testroot");
114  if (!pathExists(installed_path))
115  mooseError("Couldn't locate any installed inputs to copy in path: ",
116  installed_path,
117  '\n',
118  extra_error_msg);
119 
120  checkFileReadable(test_root);
121  return installed_path;
122 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
std::string getExecutablePath()
Gets the directory the running executable is on Mac OS X and linux.
std::filesystem::path pathjoin(const std::filesystem::path &p)
Definition: MooseUtils.C:59
bool pathExists(const std::string &path)
Definition: MooseUtils.C:247
bool checkFileReadable(const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
Definition: MooseUtils.C:254

◆ isAllLowercase()

bool MooseUtils::isAllLowercase ( const std::string &  str)

Definition at line 1195 of file MooseUtils.C.

1196 {
1197  return std::all_of(
1198  str.begin(), str.end(), [](unsigned char c) { return !std::isalpha(c) || std::islower(c); });
1199 }

◆ levenshteinDist()

int MooseUtils::levenshteinDist ( const std::string &  s1,
const std::string &  s2 
)

Definition at line 176 of file MooseUtils.C.

Referenced by Moose::findSimilar().

177 {
178  // To change the type this function manipulates and returns, change
179  // the return type and the types of the two variables below.
180  auto s1len = s1.size();
181  auto s2len = s2.size();
182 
183  auto column_start = (decltype(s1len))1;
184 
185  auto column = new decltype(s1len)[s1len + 1];
186  std::iota(column + column_start, column + s1len + 1, column_start);
187 
188  for (auto x = column_start; x <= s2len; x++)
189  {
190  column[0] = x;
191  auto last_diagonal = x - column_start;
192  for (auto y = column_start; y <= s1len; y++)
193  {
194  auto old_diagonal = column[y];
195  auto possibilities = {
196  column[y] + 1, column[y - 1] + 1, last_diagonal + (s1[y - 1] == s2[x - 1] ? 0 : 1)};
197  column[y] = std::min(possibilities);
198  last_diagonal = old_diagonal;
199  }
200  }
201  auto result = column[s1len];
202  delete[] column;
203  return result;
204 }
auto min(const L &left, const R &right)

◆ linearPartitionChunk()

processor_id_type MooseUtils::linearPartitionChunk ( dof_id_type  num_items,
dof_id_type  num_chunks,
dof_id_type  item_id 
)

Definition at line 999 of file MooseUtils.C.

Referenced by DistributedRectilinearMeshGenerator::buildCube().

1000 {
1001  auto global_num_local_items = num_items / num_chunks;
1002 
1003  auto leftovers = num_items % num_chunks;
1004 
1005  auto first_item_past_first_part = leftovers * (global_num_local_items + 1);
1006 
1007  // Is it in the first section (that gets an extra item)
1008  if (item_id < first_item_past_first_part)
1009  return item_id / (global_num_local_items + 1);
1010  else
1011  {
1012  auto new_item_id = item_id - first_item_past_first_part;
1013 
1014  // First chunk after the first section + the number of chunks after that
1015  return leftovers + (new_item_id / global_num_local_items);
1016  }
1017 }

◆ linearPartitionItems()

void MooseUtils::linearPartitionItems ( dof_id_type  num_items,
dof_id_type  num_chunks,
dof_id_type  chunk_id,
dof_id_type num_local_items,
dof_id_type local_items_begin,
dof_id_type local_items_end 
)

Definition at line 973 of file MooseUtils.C.

Referenced by DistributedRectilinearMeshGenerator::buildCube().

979 {
980  auto global_num_local_items = num_items / num_chunks;
981 
982  num_local_items = global_num_local_items;
983 
984  auto leftovers = num_items % num_chunks;
985 
986  if (chunk_id < leftovers)
987  {
988  num_local_items++;
989  local_items_begin = num_local_items * chunk_id;
990  }
991  else
992  local_items_begin =
993  (global_num_local_items + 1) * leftovers + global_num_local_items * (chunk_id - leftovers);
994 
995  local_items_end = local_items_begin + num_local_items;
996 }

◆ listDir()

std::list<std::string> MooseUtils::listDir ( const std::string  path,
bool  files_only 
)

Definition at line 782 of file MooseUtils.C.

Referenced by convertLatestCheckpoint(), getFilesInDirs(), and removedirs().

783 {
784  std::list<std::string> files;
785 
786  tinydir_dir dir;
787  dir.has_next = 0; // Avoid a garbage value in has_next (clang StaticAnalysis)
788  tinydir_open(&dir, path.c_str());
789 
790  while (dir.has_next)
791  {
792  tinydir_file file;
793  file.is_dir = 0; // Avoid a garbage value in is_dir (clang StaticAnalysis)
794  tinydir_readfile(&dir, &file);
795 
796  if (!files_only || !file.is_dir)
797  files.push_back(path + "/" + file.name);
798 
799  tinydir_next(&dir);
800  }
801 
802  tinydir_close(&dir);
803 
804  return files;
805 }

◆ makedirs()

void MooseUtils::makedirs ( const std::string &  dir_name,
bool  throw_on_failure 
)

Definition at line 449 of file MooseUtils.C.

450 {
451  // split path into directories with delimiter '/'
452  std::vector<std::string> split_dir_names;
453  MooseUtils::tokenize(dir_name, split_dir_names);
454 
455  auto n = split_dir_names.size();
456 
457  // remove '.' and '..' when possible
458  auto i = n;
459  i = 0;
460  while (i != n)
461  {
462  if (split_dir_names[i] == ".")
463  {
464  for (auto j = i + 1; j < n; ++j)
465  split_dir_names[j - 1] = split_dir_names[j];
466  --n;
467  }
468  else if (i > 0 && split_dir_names[i] == ".." && split_dir_names[i - 1] != "..")
469  {
470  for (auto j = i + 1; j < n; ++j)
471  split_dir_names[j - 2] = split_dir_names[j];
472  n -= 2;
473  --i;
474  }
475  else
476  ++i;
477  }
478  if (n == 0)
479  return;
480 
481  split_dir_names.resize(n);
482 
483  // start creating directories recursively
484  std::string cur_dir = dir_name[0] == '/' ? "" : ".";
485  for (auto & dir : split_dir_names)
486  {
487  cur_dir += "/" + dir;
488 
489  if (!pathExists(cur_dir))
490  {
491  auto code = Utility::mkdir(cur_dir.c_str());
492  if (code != 0)
493  {
494  std::string msg = "Failed creating directory " + dir_name;
495  if (throw_on_failure)
496  throw std::invalid_argument(msg);
497  else
498  mooseError(msg);
499  }
500  }
501  }
502 }
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
int mkdir(const char *pathname)
bool pathExists(const std::string &path)
Definition: MooseUtils.C:247

◆ MaterialPropertyStorageDump()

void MooseUtils::MaterialPropertyStorageDump ( const HashMap< const libMesh::Elem *, HashMap< unsigned int, MaterialProperties >> &  props)

Definition at line 688 of file MooseUtils.C.

690 {
691  // Loop through the elements
692  for (const auto & elem_it : props)
693  {
694  Moose::out << "Element " << elem_it.first->id() << '\n';
695 
696  // Loop through the sides
697  for (const auto & side_it : elem_it.second)
698  {
699  Moose::out << " Side " << side_it.first << '\n';
700 
701  // Loop over properties
702  unsigned int cnt = 0;
703  for (const auto & mat_prop : side_it.second)
704  {
705  if (auto mp = dynamic_cast<const MaterialProperty<Real> *>(&mat_prop))
706  {
707  Moose::out << " Property " << cnt << '\n';
708  cnt++;
709 
710  // Loop over quadrature points
711  for (unsigned int qp = 0; qp < mp->size(); ++qp)
712  Moose::out << " prop[" << qp << "] = " << (*mp)[qp] << '\n';
713  }
714  }
715  }
716  }
717 
718  Moose::out << std::flush;
719 }

◆ mooseDocsURL()

std::string MooseUtils::mooseDocsURL ( const std::string &  path)

Definition at line 139 of file MooseUtils.C.

Referenced by ExecFlagEnum::getDocString().

140 {
141  return "https://mooseframework.inl.gov/" + path;
142 }

◆ parallelBarrierNotify()

void MooseUtils::parallelBarrierNotify ( const Parallel::Communicator comm,
bool  messaging 
)

Definition at line 327 of file MooseUtils.C.

Referenced by FEProblemBase::backupMultiApps(), FEProblemBase::execMultiApps(), FEProblemBase::execMultiAppTransfers(), FEProblemBase::finishMultiAppStep(), and FEProblemBase::restoreMultiApps().

328 {
329  processor_id_type secondary_processor_id;
330 
331  if (messaging)
332  Moose::out << "Waiting For Other Processors To Finish" << std::endl;
333  if (comm.rank() == 0)
334  {
335  // The primary process is already through, so report it
336  if (messaging)
337  Moose::out << "Jobs complete: 1/" << comm.size() << (1 == comm.size() ? "\n" : "\r")
338  << std::flush;
339  for (unsigned int i = 2; i <= comm.size(); ++i)
340  {
341  comm.receive(MPI_ANY_SOURCE, secondary_processor_id);
342  if (messaging)
343  Moose::out << "Jobs complete: " << i << "/" << comm.size()
344  << (i == comm.size() ? "\n" : "\r") << std::flush;
345  }
346  }
347  else
348  {
349  secondary_processor_id = comm.rank();
350  comm.send(0, secondary_processor_id);
351  }
352 
353  comm.barrier();
354 }
processor_id_type rank() const
processor_id_type size() const
uint8_t processor_id_type
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const

◆ parsesToReal()

bool MooseUtils::parsesToReal ( const std::string &  input,
Real parsed_real 
)

Definition at line 89 of file MooseUtils.C.

Referenced by DiffusionCG::addFEBCs(), DiffusionCG::addFEKernels(), DiffusionFV::addFVBCs(), DiffusionFV::addFVKernels(), FunctorExtremaPositions::FunctorExtremaPositions(), FunctorIC::FunctorIC(), and RankTwoTensorFromComponentProperties::RankTwoTensorFromComponentProperties().

90 {
91  std::istringstream ss(input);
92  Real real_value;
93  if (ss >> real_value && ss.eof())
94  {
95  if (parsed_real)
96  (*parsed_real) = real_value;
97  return true;
98  }
99  return false;
100 }
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ pathContains()

bool MooseUtils::pathContains ( const std::string &  expression,
const std::string &  string_to_find,
const std::string &  delims 
)

Definition at line 231 of file MooseUtils.C.

234 {
235  std::vector<std::string> elements;
236  tokenize(expression, elements, 0, delims);
237 
238  std::vector<std::string>::iterator found_it =
239  std::find(elements.begin(), elements.end(), string_to_find);
240  if (found_it != elements.end())
241  return true;
242  else
243  return false;
244 }
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:40
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...

◆ pathExists()

bool MooseUtils::pathExists ( const std::string &  path)

Definition at line 247 of file MooseUtils.C.

Referenced by MooseApp::copyInputs(), FileMeshGenerator::deduceCheckpointPath(), docsDir(), findTestRoot(), installedInputsDir(), RestartableDataReader::isAvailable(), makedirs(), removedirs(), MooseApp::run(), and runTestsExecutable().

248 {
249  struct stat buffer;
250  return (stat(path.c_str(), &buffer) == 0);
251 }

◆ pathjoin()

std::filesystem::path MooseUtils::pathjoin ( const std::filesystem::path &  p)

◆ prettyCppType()

std::string MooseUtils::prettyCppType ( const std::string &  cpp_type)

Definition at line 1140 of file MooseUtils.C.

Referenced by MooseServer::addParametersToList(), MooseServer::addValuesToList(), InputParametersChecksUtils< BatchMeshGeneratorAction >::assertParamDefined(), ReporterGeneralContext< T >::contextType(), ReporterBroadcastContext< T >::contextType(), ReporterScatterContext< T >::contextType(), ReporterGatherContext< T >::contextType(), ReporterVectorContext< T >::contextType(), Moose::Kokkos::dataLoad(), FunctorSmootherTempl< T >::FunctorSmootherTempl(), MooseServer::gatherDocumentDefinitionLocations(), MooseServer::getFileNameTypeValues(), MooseServer::getNodesByValueAndTypes(), ThreadedElementLoop< ConstElemPointerRange >::printExecutionOrdering(), Moose::ParameterRegistry::set(), JsonSyntaxTree::setParams(), and MFEMProblem::solverTypeString().

1141 {
1142  // On mac many of the std:: classes are inline namespaced with __1
1143  // On linux std::string can be inline namespaced with __cxx11
1144  std::string s = cpp_type;
1145  // Remove all spaces surrounding a >
1146  pcrecpp::RE("\\s(?=>)").GlobalReplace("", &s);
1147  pcrecpp::RE("std::__\\w+::").GlobalReplace("std::", &s);
1148  // It would be nice if std::string actually looked normal
1149  pcrecpp::RE("\\s*std::basic_string<char, std::char_traits<char>, std::allocator<char>>\\s*")
1150  .GlobalReplace("std::string", &s);
1151  // It would be nice if std::vector looked normal
1152  pcrecpp::RE r("std::vector<([[:print:]]+),\\s?std::allocator<\\s?\\1\\s?>\\s?>");
1153  r.GlobalReplace("std::vector<\\1>", &s);
1154  // Do it again for nested vectors
1155  r.GlobalReplace("std::vector<\\1>", &s);
1156  // It would be nice if std::map and unordered map looked normal
1157  pcrecpp::RE r_map(
1158  "std::map<\\s*((?:[^,<]|<[^>]*>)+)\\s*,\\s*((?:[^,<]|<[^>]*>)+)\\s*,\\s*"
1159  "std::less<\\s*\\1\\s*>\\s*,\\s*"
1160  "std::allocator<\\s*std::pair<\\s*(?:const\\s*\\1|\\1\\s*const)\\s*,\\s*\\2\\s*>\\s*>\\s*>");
1161  r_map.GlobalReplace("std::map<\\1, \\2>", &s);
1162  pcrecpp::RE r_umap(
1163  "std::unordered_map<\\s*([^,]+)\\s*,\\s*([^,]+)\\s*,\\s*"
1164  "std::hash<\\s*\\1\\s*>\\s*,\\s*"
1165  "std::equal_to<\\s*\\1\\s*>\\s*,\\s*"
1166  "std::allocator<\\s*std::pair<\\s*(?:const\\s*\\1|\\1\\s*const)\\s*,\\s*\\2\\s*>\\s*>\\s*>");
1167  r_umap.GlobalReplace("std::unordered_map<\\1, \\2>", &s);
1168 
1169  return s;
1170 }

◆ realpath()

std::string MooseUtils::realpath ( const std::string &  path)

Definition at line 1125 of file MooseUtils.C.

Referenced by Parser::parse(), and MooseApp::run().

1126 {
1127  return std::filesystem::absolute(path);
1128 }

◆ removeColor()

std::string& MooseUtils::removeColor ( std::string &  msg)

Definition at line 722 of file MooseUtils.C.

Referenced by Console::writeStreamToFile().

723 {
724  pcrecpp::RE re("(\\33\\[3[0-7]m))", pcrecpp::DOTALL());
725  re.GlobalReplace(std::string(""), &msg);
726  return msg;
727 }

◆ removedirs()

void MooseUtils::removedirs ( const std::string &  dir_name,
bool  throw_on_failure 
)

Definition at line 505 of file MooseUtils.C.

506 {
507  // split path into directories with delimiter '/'
508  std::vector<std::string> split_dir_names;
509  MooseUtils::tokenize(dir_name, split_dir_names);
510 
511  auto n = split_dir_names.size();
512 
513  // remove '.' and '..' when possible
514  auto i = n;
515  i = 0;
516  while (i != n)
517  {
518  if (split_dir_names[i] == ".")
519  {
520  for (auto j = i + 1; j < n; ++j)
521  split_dir_names[j - 1] = split_dir_names[j];
522  --n;
523  }
524  else if (i > 0 && split_dir_names[i] == ".." && split_dir_names[i - 1] != "..")
525  {
526  for (auto j = i + 1; j < n; ++j)
527  split_dir_names[j - 2] = split_dir_names[j];
528  n -= 2;
529  --i;
530  }
531  else
532  ++i;
533  }
534  if (n == 0)
535  return;
536 
537  split_dir_names.resize(n);
538 
539  // start removing directories recursively
540  std::string base_dir = dir_name[0] == '/' ? "" : ".";
541  for (i = n; i > 0; --i)
542  {
543  std::string cur_dir = base_dir;
544  auto j = i;
545  for (j = 0; j < i; ++j)
546  cur_dir += "/" + split_dir_names[j];
547 
548  // listDir should return at least '.' and '..'
549  if (pathExists(cur_dir) && listDir(cur_dir).size() == 2)
550  {
551  auto code = rmdir(cur_dir.c_str());
552  if (code != 0)
553  {
554  std::string msg = "Failed removing directory " + dir_name;
555  if (throw_on_failure)
556  throw std::invalid_argument(msg);
557  else
558  mooseError(msg);
559  }
560  }
561  else
562  // stop removing
563  break;
564  }
565 }
std::list< std::string > listDir(const std::string path, bool files_only)
Definition: MooseUtils.C:782
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
bool pathExists(const std::string &path)
Definition: MooseUtils.C:247

◆ removeExtraWhitespace()

std::string MooseUtils::removeExtraWhitespace ( const std::string &  input)

Definition at line 225 of file MooseUtils.C.

Referenced by CommandLine::initSubAppCommandLine(), and CommandLine::parse().

226 {
227  return std::regex_replace(input, std::regex("^\\s+|\\s+$|\\s+(?=\\s)"), "");
228 }

◆ replaceAll()

std::string MooseUtils::replaceAll ( std::string  str,
const std::string &  from,
const std::string &  to 
)

Definition at line 145 of file MooseUtils.C.

Referenced by ReporterDebugOutput::output(), and MooseUtils::DelimitedFileReaderTempl< T >::processLine().

146 {
147  size_t start_pos = 0;
148  while ((start_pos = str.find(from, start_pos)) != std::string::npos)
149  {
150  str.replace(start_pos, from.length(), to);
151  start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
152  }
153  return str;
154 }

◆ replaceStart()

void MooseUtils::replaceStart ( std::string &  string1,
const std::string &  string2,
const std::string &  string3 
)

Definition at line 1187 of file MooseUtils.C.

1188 {
1189  mooseAssert(startsWith(string1, string2),
1190  "Cannot replace the start because it doesn't match the start string");
1191  string1.replace(0, string2.size(), string3);
1192 }
bool startsWith(const std::string &string1, const std::string &string2)
Definition: MooseUtils.C:1179

◆ resample() [1/4]

template<typename T >
std::vector< T > MooseUtils::resample ( const std::vector< T > &  data,
MooseRandom generator,
const std::size_t  seed_index = 0 
)

Randomly resample a vector of data, allowing a value to be repeated.

Parameters
dataThe vector on which the values are to be swapped
generatorRandom number generator to use for shuffle
seed_index(default: 0) The seed index to use for calls to randl
comm_ptrOptional Communicator, if provided and running with multiple processors the vector is assumed to be distributed

Definition at line 531 of file Shuffle.h.

Referenced by resample().

534 {
535  return MooseUtils::resample(data, generator, seed_index, nullptr);
536 }
std::vector< T > resample(const std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
Randomly resample a vector of data, allowing a value to be repeated.
Definition: Shuffle.h:531

◆ resample() [2/4]

template<typename T >
std::vector< T > MooseUtils::resample ( const std::vector< T > &  data,
MooseRandom generator,
const libMesh::Parallel::Communicator comm 
)

Definition at line 540 of file Shuffle.h.

543 {
544  return MooseUtils::resample(data, generator, 0, &comm);
545 }
std::vector< T > resample(const std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
Randomly resample a vector of data, allowing a value to be repeated.
Definition: Shuffle.h:531

◆ resample() [3/4]

template<typename T >
std::vector< T > MooseUtils::resample ( const std::vector< T > &  data,
MooseRandom generator,
const std::size_t  seed_index,
const libMesh::Parallel::Communicator comm 
)

Definition at line 549 of file Shuffle.h.

553 {
554  return MooseUtils::resample(data, generator, seed_index, &comm);
555 }
std::vector< T > resample(const std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
Randomly resample a vector of data, allowing a value to be repeated.
Definition: Shuffle.h:531

◆ resample() [4/4]

template<typename T >
std::vector< T > MooseUtils::resample ( const std::vector< T > &  data,
MooseRandom generator,
const std::size_t  seed_index,
const libMesh::Parallel::Communicator comm_ptr 
)

Definition at line 335 of file Shuffle.h.

339 {
340  // Size of the local input data
341  const std::size_t n_local = data.size();
342 
343  // Re-sampled data vector to be returned
344  std::vector<T> replicate(n_local);
345 
346  // REPLICATED data
347  if (!comm_ptr || comm_ptr->size() == 1)
348  {
349  replicate.resize(n_local);
350  for (std::size_t j = 0; j < n_local; ++j)
351  {
352  auto index = generator.randl(seed_index, 0, n_local);
353  replicate[j] = data[index];
354  }
355  }
356 
357  // DISTRIBUTED data
358  else
359  {
360  // Compute the global size of the vector
361  std::size_t n_global = n_local;
362  comm_ptr->sum(n_global);
363 
364  // Compute the vector data offsets, the scope cleans up the "n_local" vector
365  std::vector<std::size_t> offsets(comm_ptr->size());
366  {
367  std::vector<std::size_t> local_sizes;
368  comm_ptr->allgather(n_local, local_sizes);
369  for (std::size_t i = 0; i < local_sizes.size() - 1; ++i)
370  offsets[i + 1] = offsets[i] + local_sizes[i];
371  }
372 
373  // Advance the random number generator to the current offset
374  const auto rank = comm_ptr->rank();
375  for (std::size_t i = 0; i < offsets[rank]; ++i)
376  generator.randl(seed_index, 0, n_global);
377 
378  // Compute the needs for this processor
379  std::unordered_map<processor_id_type, std::vector<std::pair<std::size_t, std::size_t>>> needs;
380  for (std::size_t i = 0; i < n_local; ++i)
381  {
382  const auto idx = generator.randl(seed_index, 0, n_global); // random global index
383 
384  // Locate the rank and local index of the data desired
385  const auto idx_offset_iter = std::prev(std::upper_bound(offsets.begin(), offsets.end(), idx));
386  const auto idx_rank = std::distance(offsets.begin(), idx_offset_iter);
387  const auto idx_local_idx = idx - *idx_offset_iter;
388 
389  // Local available data can be inserted into the re-sample, non-local data is add the the
390  // needs from other ranks
391  if (idx_rank == rank)
392  replicate[i] = data[idx_local_idx];
393  else
394  needs[idx_rank].emplace_back(idx_local_idx, i);
395  }
396 
397  // Advance the random number generator to the end of the global vector
398  for (std::size_t i = offsets[rank] + n_local; i < n_global; ++i)
399  generator.randl(seed_index, 0, n_global);
400 
401  // Collect the values to be returned to the various processors
402  std::unordered_map<processor_id_type, std::vector<std::pair<T, std::size_t>>> returns;
403  auto return_functor =
404  [&data, &returns](processor_id_type pid,
405  const std::vector<std::pair<std::size_t, std::size_t>> & indices)
406  {
407  auto & returns_pid = returns[pid];
408  for (const auto & idx : indices)
409  returns_pid.emplace_back(data[idx.first], idx.second);
410  };
411  Parallel::push_parallel_vector_data(*comm_ptr, needs, return_functor);
412 
413  // Receive resampled values from the various processors
414  auto recv_functor =
415  [&replicate](processor_id_type, const std::vector<std::pair<T, std::size_t>> & values)
416  {
417  for (const auto & value : values)
418  replicate[value.second] = value.first;
419  };
420  Parallel::push_parallel_vector_data(*comm_ptr, returns, recv_functor);
421  }
422  return replicate;
423 }
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
static uint32_t randl()
This method returns the next random number (long format) from the generator.
Definition: MooseRandom.h:71
processor_id_type rank() const
processor_id_type size() const
uint8_t processor_id_type
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)

◆ resampleWithFunctor() [1/4]

template<typename T , typename ActionFunctor >
void MooseUtils::resampleWithFunctor ( const std::vector< T > &  data,
const ActionFunctor &  functor,
MooseRandom generator,
const std::size_t  seed_index = 0 
)

Randomly resample a vector of data and apply a functor, allowing a value to be repeated.

Parameters
dataThe vector on which the values are to be swapped
functorFunctor to apply to each entry of the resampled vector
generatorRandom number generator to use for shuffle
seed_index(default: 0) The seed index to use for calls to randl
comm_ptrOptional Communicator, if provided and running with multiple processors the vector is assumed to be distributed

Definition at line 559 of file Shuffle.h.

Referenced by resampleWithFunctor().

563 {
564  return MooseUtils::resampleWithFunctor(data, functor, generator, seed_index, nullptr);
565 }
void resampleWithFunctor(const std::vector< T > &data, const ActionFunctor &functor, MooseRandom &generator, const std::size_t seed_index=0)
Randomly resample a vector of data and apply a functor, allowing a value to be repeated.
Definition: Shuffle.h:559

◆ resampleWithFunctor() [2/4]

template<typename T , typename ActionFunctor >
void MooseUtils::resampleWithFunctor ( const std::vector< T > &  data,
const ActionFunctor &  functor,
MooseRandom generator,
const libMesh::Parallel::Communicator comm 
)

Definition at line 569 of file Shuffle.h.

573 {
574  return MooseUtils::resampleWithFunctor(data, functor, generator, 0, &comm);
575 }
void resampleWithFunctor(const std::vector< T > &data, const ActionFunctor &functor, MooseRandom &generator, const std::size_t seed_index=0)
Randomly resample a vector of data and apply a functor, allowing a value to be repeated.
Definition: Shuffle.h:559

◆ resampleWithFunctor() [3/4]

template<typename T , typename ActionFunctor >
void MooseUtils::resampleWithFunctor ( const std::vector< T > &  data,
const ActionFunctor &  functor,
MooseRandom generator,
const std::size_t  seed_index,
const libMesh::Parallel::Communicator comm 
)

Definition at line 579 of file Shuffle.h.

584 {
585  return MooseUtils::resampleWithFunctor(data, functor, generator, seed_index, &comm);
586 }
void resampleWithFunctor(const std::vector< T > &data, const ActionFunctor &functor, MooseRandom &generator, const std::size_t seed_index=0)
Randomly resample a vector of data and apply a functor, allowing a value to be repeated.
Definition: Shuffle.h:559

◆ resampleWithFunctor() [4/4]

template<typename T , typename ActionFunctor >
void MooseUtils::resampleWithFunctor ( const std::vector< T > &  data,
const ActionFunctor &  functor,
MooseRandom generator,
const std::size_t  seed_index,
const libMesh::Parallel::Communicator comm_ptr 
)

Definition at line 427 of file Shuffle.h.

432 {
433  const std::size_t n_local = data.size();
434 
435  if (!comm_ptr || comm_ptr->size() == 1)
436  {
437  for (std::size_t j = 0; j < n_local; ++j)
438  {
439  auto index = generator.randl(seed_index, 0, n_local);
440  functor(data[index]);
441  }
442  }
443  else
444  {
445  // Compute the global size of the vector
446  std::size_t n_global = n_local;
447  comm_ptr->sum(n_global);
448 
449  // Compute the vector data offsets, the scope cleans up the "n_local" vector
450  std::vector<std::size_t> offsets(comm_ptr->size());
451  {
452  std::vector<std::size_t> local_sizes;
453  comm_ptr->allgather(n_local, local_sizes);
454  for (std::size_t i = 0; i < local_sizes.size() - 1; ++i)
455  offsets[i + 1] = offsets[i] + local_sizes[i];
456  }
457 
458  // Advance the random number generator to the current offset
459  const auto rank = comm_ptr->rank();
460  for (std::size_t i = 0; i < offsets[rank]; ++i)
461  generator.randl(seed_index, 0, n_global);
462 
463  // Compute the needs for this processor
464  std::unordered_map<processor_id_type, std::vector<std::size_t>> indices;
465  for (std::size_t i = 0; i < n_local; ++i)
466  {
467  const auto idx = generator.randl(seed_index, 0, n_global); // random global index
468 
469  // Locate the rank and local index of the data desired
470  const auto idx_offset_iter = std::prev(std::upper_bound(offsets.begin(), offsets.end(), idx));
471  const auto idx_rank = std::distance(offsets.begin(), idx_offset_iter);
472  const auto idx_local_idx = idx - *idx_offset_iter;
473 
474  // Push back the index to appropriate rank
475  indices[idx_rank].push_back(idx_local_idx);
476  }
477 
478  // Advance the random number generator to the end of the global vector
479  for (std::size_t i = offsets[rank] + n_local; i < n_global; ++i)
480  generator.randl(seed_index, 0, n_global);
481 
482  // Send the indices to the appropriate rank and have the calculator do its work
483  auto act_functor =
484  [&functor, &data](processor_id_type /*pid*/, const std::vector<std::size_t> & indices)
485  {
486  for (const auto & idx : indices)
487  functor(data[idx]);
488  };
489  Parallel::push_parallel_vector_data(*comm_ptr, indices, act_functor);
490  }
491 }
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
static uint32_t randl()
This method returns the next random number (long format) from the generator.
Definition: MooseRandom.h:71
processor_id_type rank() const
processor_id_type size() const
uint8_t processor_id_type
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)

◆ reset() [1/2]

template<class T , typename... Args>
auto MooseUtils::reset ( int  ,
T &  obj,
Args...  args 
) -> decltype(obj.reset(args...), void())

Definition at line 21 of file SharedPool.h.

Referenced by MooseUtils::SharedPool< T >::acquire().

22 {
23  obj.reset(std::forward<Args>(args)...);
24 }

◆ reset() [2/2]

template<class T , typename... Args>
void MooseUtils::reset ( double  ,
T &  ,
Args...   
)

Definition at line 28 of file SharedPool.h.

29 {
30 }

◆ rsplit()

std::vector<std::string> MooseUtils::rsplit ( const std::string &  str,
const std::string &  delimiter,
std::size_t  max_count 
)

Definition at line 1040 of file MooseUtils.C.

1041 {
1042  std::vector<std::string> output;
1043  std::size_t count = 0;
1044  size_t prev = str.length(), pos = str.length();
1045  do
1046  {
1047  pos = str.rfind(delimiter, prev);
1048  output.insert(output.begin(), str.substr(pos + delimiter.length(), prev - pos));
1049  prev = pos - delimiter.length();
1050  count += 1;
1051  } while (pos != std::string::npos && pos > 0 && count < max_count);
1052 
1053  if (pos != std::string::npos)
1054  output.insert(output.begin(), str.substr(0, pos));
1055 
1056  return output;
1057 }
charT const * delimiter
Definition: InfixIterator.h:35

◆ runTestsExecutable()

std::string MooseUtils::runTestsExecutable ( )

Definition at line 65 of file MooseUtils.C.

Referenced by MooseApp::runInputs().

66 {
67  auto build_loc = pathjoin(Moose::getExecutablePath(), "run_tests");
68  if (pathExists(build_loc) && checkFileReadable(build_loc))
69  return build_loc;
70  // TODO: maybe no path prefix - just moose_test_runner here?
71  return pathjoin(Moose::getExecutablePath(), "moose_test_runner");
72 }
std::string getExecutablePath()
Gets the directory the running executable is on Mac OS X and linux.
std::filesystem::path pathjoin(const std::filesystem::path &p)
Definition: MooseUtils.C:59
bool pathExists(const std::string &path)
Definition: MooseUtils.C:247
bool checkFileReadable(const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
Definition: MooseUtils.C:254

◆ serialBegin()

void MooseUtils::serialBegin ( const libMesh::Parallel::Communicator comm,
bool  warn 
)

Definition at line 357 of file MooseUtils.C.

Referenced by SerializerGuard::SerializerGuard().

358 {
359  // unless we are the first processor...
360  if (comm.rank() > 0)
361  {
362  // ...wait for the previous processor to finish
363  int dummy = 0;
364  comm.receive(comm.rank() - 1, dummy);
365  }
366  else if (warn)
367  mooseWarning("Entering serial execution block (use only for debugging)");
368 }
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition: MooseError.h:345
processor_id_type rank() const
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const

◆ serialEnd()

void MooseUtils::serialEnd ( const libMesh::Parallel::Communicator comm,
bool  warn 
)

Definition at line 371 of file MooseUtils.C.

Referenced by SerializerGuard::~SerializerGuard().

372 {
373  // unless we are the last processor...
374  if (comm.rank() + 1 < comm.size())
375  {
376  // ...notify the next processor of its turn
377  int dummy = 0;
378  comm.send(comm.rank() + 1, dummy);
379  }
380 
381  comm.barrier();
382  if (comm.rank() == 0 && warn)
383  mooseWarning("Leaving serial execution block (use only for debugging)");
384 }
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition: MooseError.h:345
processor_id_type rank() const
processor_id_type size() const
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const

◆ shortName()

std::string MooseUtils::shortName ( const std::string &  name)

Definition at line 612 of file MooseUtils.C.

Referenced by InputParameterWarehouse::addInputParameters(), ActionFactory::create(), CSV::getVectorPostprocessorFileName(), CSV::getVectorPostprocessorFilePrefix(), and CSV::initialSetup().

613 {
614  return name.substr(name.find_last_of('/') != std::string::npos ? name.find_last_of('/') + 1 : 0);
615 }
std::string name(const ElemQuality q)

◆ shuffle() [1/4]

template<typename T >
void MooseUtils::shuffle ( std::vector< T > &  data,
MooseRandom generator,
const std::size_t  seed_index = 0 
)

Shuffle function for serial or distributed vector of data that shuffles in place.

Parameters
dataThe vector on which the values are to be swapped
generatorRandom number generator to use for shuffle
seed_index(default: 0) The seed index to use for calls to randl
comm_ptrOptional Communicator, if provided and running with multiple processors the vector is assumed to be distributed

Both the serial and distributed version implement a Fisher-Yates shuffle https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

NOTE: This distributed shuffle I have here does a parallel communication with each swap pair generated. I am certain that there are more efficient ways to shuffle a distributed vector, but there doesn't seem to be an algorithm in the literature (my search was not extensive).

The reason I came to this conclusion was because of a 2019 paper, which states the following (https://iopscience.iop.org/article/10.1088/1742-6596/1196/1/012035):

The study also says that the Fisher-Yates Shuffle can be developed in two ways,
namely the algorithm's initial assumptions that allow for discrete uniform variables,
and also with the avent of large core clusters and GPUs, there is an interest in making
parallel versions of this algorithm.

This paper discusses the MergeShuffle (https://arxiv.org/abs/1508.03167), but that is a shared memory parallel algorithm.

Hence, if you want to become famous create a parallel Fisher-Yates algorithm for MPI.

Definition at line 505 of file Shuffle.h.

Referenced by shuffle().

506 {
507  return MooseUtils::shuffle(data, generator, seed_index, nullptr);
508 }
void shuffle(std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
Shuffle function for serial or distributed vector of data that shuffles in place. ...
Definition: Shuffle.h:505

◆ shuffle() [2/4]

template<typename T >
void MooseUtils::shuffle ( std::vector< T > &  data,
MooseRandom generator,
const libMesh::Parallel::Communicator comm 
)

Definition at line 512 of file Shuffle.h.

515 {
516  return MooseUtils::shuffle(data, generator, 0, &comm);
517 }
void shuffle(std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
Shuffle function for serial or distributed vector of data that shuffles in place. ...
Definition: Shuffle.h:505

◆ shuffle() [3/4]

template<typename T >
void MooseUtils::shuffle ( std::vector< T > &  data,
MooseRandom generator,
const std::size_t  seed_index,
const libMesh::Parallel::Communicator comm 
)

Definition at line 521 of file Shuffle.h.

525 {
526  return MooseUtils::shuffle(data, generator, seed_index, &comm);
527 }
void shuffle(std::vector< T > &data, MooseRandom &generator, const std::size_t seed_index=0)
Shuffle function for serial or distributed vector of data that shuffles in place. ...
Definition: Shuffle.h:505

◆ shuffle() [4/4]

template<typename T >
void MooseUtils::shuffle ( std::vector< T > &  data,
MooseRandom generator,
const std::size_t  seed_index,
const libMesh::Parallel::Communicator comm_ptr 
)

Definition at line 244 of file Shuffle.h.

248 {
249  // REPLICATED data
250  if (!comm_ptr || comm_ptr->size() == 1)
251  {
252  std::size_t n_global = data.size();
253  for (std::size_t i = n_global - 1; i > 0; --i)
254  {
255  auto j = generator.randl(seed_index, 0, i);
256  MooseUtils::swap(data, i, j, nullptr);
257  }
258  }
259 
260  // DISTRIBUTED data
261  else
262  {
263  // Local/global size
264  std::size_t n_local = data.size();
265  std::size_t n_global = n_local;
266  comm_ptr->sum(n_global);
267 
268  // Compute the vector data offsets, the scope cleans up the "n_local" vector
269  std::vector<std::size_t> offsets(comm_ptr->size());
270  {
271  std::vector<std::size_t> local_sizes;
272  comm_ptr->allgather(n_local, local_sizes);
273  for (std::size_t i = 0; i < local_sizes.size() - 1; ++i)
274  offsets[i + 1] = offsets[i] + local_sizes[i];
275  }
276 
277  // Perform swaps
278  auto rank = comm_ptr->rank();
279  for (std::size_t idx0 = n_global - 1; idx0 > 0; --idx0)
280  {
281  auto idx1 = generator.randl(seed_index, 0, idx0);
282 
283  // Locate the rank and local index of the data to swap
284  auto idx0_offset_iter = std::prev(std::upper_bound(offsets.begin(), offsets.end(), idx0));
285  auto idx0_rank = std::distance(offsets.begin(), idx0_offset_iter);
286  auto idx0_local_idx = idx0 - *idx0_offset_iter;
287 
288  auto idx1_offset_iter = std::prev(std::upper_bound(offsets.begin(), offsets.end(), idx1));
289  auto idx1_rank = std::distance(offsets.begin(), idx1_offset_iter);
290  auto idx1_local_idx = idx1 - *idx1_offset_iter;
291 
292  // The values, if any, needed from other rank
293  std::unordered_map<processor_id_type, std::vector<std::size_t>> needs;
294  if (idx0_rank != rank && idx1_rank == rank)
295  needs[idx0_rank].push_back(idx0_local_idx);
296  if (idx0_rank == rank && idx1_rank != rank)
297  needs[idx1_rank].push_back(idx1_local_idx);
298 
299  // Collect the values needed by this processor
300  std::unordered_map<processor_id_type, std::vector<T>> returns;
301  auto return_functor =
302  [&data, &returns](processor_id_type pid, const std::vector<std::size_t> & indices)
303  {
304  auto & returns_pid = returns[pid];
305  for (auto idx : indices)
306  returns_pid.push_back(data[idx]);
307  };
308  Parallel::push_parallel_vector_data(*comm_ptr, needs, return_functor);
309 
310  // Receive needed values from the others processors
311  std::vector<T> incoming;
312  auto recv_functor = [&incoming](processor_id_type /*pid*/, const std::vector<T> & values)
313  { incoming = values; };
314  Parallel::push_parallel_vector_data(*comm_ptr, returns, recv_functor);
315 
316  if (idx0_rank == rank && idx1_rank == rank)
317  MooseUtils::swap(data, idx0_local_idx, idx1_local_idx);
318 
319  else if (idx0_rank == rank)
320  {
321  mooseAssert(incoming.size() == 1, "Only one value should be received");
322  data[idx0_local_idx] = incoming[0];
323  }
324  else if (idx1_rank == rank)
325  {
326  mooseAssert(incoming.size() == 1, "Only one value should be received");
327  data[idx1_local_idx] = incoming[0];
328  }
329  }
330  }
331 }
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
static uint32_t randl()
This method returns the next random number (long format) from the generator.
Definition: MooseRandom.h:71
void swap(std::vector< T > &data, const std::size_t idx0, const std::size_t idx1, const libMesh::Parallel::Communicator &comm)
Swap function for serial or distributed vector of data.
Definition: Shuffle.h:495
processor_id_type rank() const
processor_id_type size() const
uint8_t processor_id_type

◆ split()

std::vector<std::string> MooseUtils::split ( const std::string &  str,
const std::string &  delimiter,
std::size_t  max_count 
)

Definition at line 1020 of file MooseUtils.C.

Referenced by BatchMeshGeneratorAction::convertStringToCompoundRealScalar(), MeshGenerator::generateInternal(), MultiApp::getCommandLineArgs(), Moose::ParameterRegistration::setDoubleVectorValue(), and MooseApp::setMFEMDevice().

1021 {
1022  std::vector<std::string> output;
1023  std::size_t count = 0;
1024  size_t prev = 0, pos = 0;
1025  do
1026  {
1027  pos = str.find(delimiter, prev);
1028  output.push_back(str.substr(prev, pos - prev));
1029  prev = pos + delimiter.length();
1030  count += 1;
1031  } while (pos != std::string::npos && count < max_count);
1032 
1033  if (pos != std::string::npos)
1034  output.push_back(str.substr(prev));
1035 
1036  return output;
1037 }
charT const * delimiter
Definition: InfixIterator.h:35

◆ startsWith()

bool MooseUtils::startsWith ( const std::string &  string1,
const std::string &  string2 
)

Definition at line 1179 of file MooseUtils.C.

Referenced by replaceStart().

1180 {
1181  if (string2.size() > string1.size())
1182  return false;
1183  return string1.compare(0, string2.size(), string2) == 0;
1184 }

◆ stringJoin()

std::string MooseUtils::stringJoin ( const std::vector< std::string > &  values,
const std::string &  separator = " " 
)
inline

Concatenates value into a single string separated by separator.

Definition at line 201 of file MooseStringUtils.h.

Referenced by InputParameters::addCommandLineParamHelper(), Moose::Builder::build(), InputParameters::checkParams(), Moose::Capability::enumerationToString(), Parser::joinErrorMessages(), Parser::parse(), ParsedPostprocessor::ParsedPostprocessor(), and MFEMProblem::solverTypeString().

202 {
203  std::string combined;
204  for (const auto & value : values)
205  combined += value + separator;
206  if (values.size())
207  combined = combined.substr(0, combined.size() - separator.size());
208  return combined;
209 }
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)

◆ stringToInteger()

int MooseUtils::stringToInteger ( const std::string &  input,
bool  throw_on_failure 
)

Definition at line 967 of file MooseUtils.C.

Referenced by FormattedTable::printTable().

968 {
969  return convert<int>(input, throw_on_failure);
970 }

◆ stripExtension()

std::string MooseUtils::stripExtension ( const std::string &  s,
const bool  rfind 
)

Definition at line 427 of file MooseUtils.C.

Referenced by SplitMeshAction::act(), CommonOutputAction::act(), and SetupMeshAction::modifyParamsForUseSplit().

428 {
429  const std::string ext = getExtension(s, rfind);
430  const bool offset = (ext.size() != 0);
431  // -1 offset accounts for the extension's leading dot ("."), if there is an extension
432  return s.substr(0, s.size() - ext.size() - offset);
433 }
std::string getExtension(const std::string &filename, const bool rfind)
Definition: MooseUtils.C:411

◆ swap() [1/2]

template<typename T >
void MooseUtils::swap ( std::vector< T > &  data,
const std::size_t  idx0,
const std::size_t  idx1,
const libMesh::Parallel::Communicator comm 
)

Swap function for serial or distributed vector of data.

Parameters
dataThe vector on which the values are to be swapped
idx0,idx1The global indices to be swapped
comm_ptrOptional Communicator, if provided and running with multiple processors the vector is assumed to be distributed

Definition at line 495 of file Shuffle.h.

Referenced by Syntax::addDependencySets(), AllNodesSendListThread::AllNodesSendListThread(), Moose::applyIndices(), AutomaticMortarGeneration::buildMortarSegmentMesh(), RestartableDataReader::clear(), FunctionPeriodicBoundary::FunctionPeriodicBoundary(), AdvancedExtruderGenerator::generate(), DistributedRectilinearMeshGenerator::paritionSquarely(), MaterialPropertyStorage::shift(), shuffle(), swap(), MooseUtils::StaticallyAllocatedSet< T, N >::swap(), MooseArray< libMesh::VectorValue >::swap(), Moose::Kokkos::MapBase< unsigned int, unsigned int >::swap(), MooseUtils::Buffer< T >::swap(), and ElementSubdomainModifierBase::timestepSetup().

499 {
500  MooseUtils::swap<T>(data, idx0, idx1, &comm);
501 }

◆ swap() [2/2]

template<typename T >
void MooseUtils::swap ( std::vector< T > &  data,
const std::size_t  idx0,
const std::size_t  idx1,
const libMesh::Parallel::Communicator comm_ptr = nullptr 
)

Definition at line 156 of file Shuffle.h.

160 {
161  if (!comm_ptr || comm_ptr->size() == 1)
162  {
163  mooseAssert(idx0 < data.size(),
164  "idx0 (" << idx0 << ") out of range, data.size() is " << data.size());
165  mooseAssert(idx1 < data.size(),
166  "idx1 (" << idx1 << ") out of range, data.size() is " << data.size());
167  std::swap(data[idx0], data[idx1]);
168  }
169 
170  else
171  {
172  // Size of the local input data
173  const auto n_local = data.size();
174  const auto rank = comm_ptr->rank();
175 
176  // Compute the global size of the vector
177  std::size_t n_global = n_local;
178  comm_ptr->sum(n_global);
179  mooseAssert(idx0 < n_global,
180  "idx0 (" << idx0 << ") out of range, the global data size is " << n_global);
181  mooseAssert(idx1 < n_global,
182  "idx1 (" << idx1 << ") out of range, the global data size is " << n_global);
183 
184  // Compute the vector data offsets, the scope cleans up the "n_local" vector
185  std::vector<std::size_t> offsets(comm_ptr->size());
186  {
187  std::vector<std::size_t> local_sizes;
188  comm_ptr->allgather(n_local, local_sizes);
189  for (std::size_t i = 0; i < local_sizes.size() - 1; ++i)
190  offsets[i + 1] = offsets[i] + local_sizes[i];
191  }
192 
193  // Locate the rank and local index of the data to swap
194  auto idx0_offset_iter = std::prev(std::upper_bound(offsets.begin(), offsets.end(), idx0));
195  auto idx0_rank = std::distance(offsets.begin(), idx0_offset_iter);
196  auto idx0_local_idx = idx0 - *idx0_offset_iter;
197 
198  auto idx1_offset_iter = std::prev(std::upper_bound(offsets.begin(), offsets.end(), idx1));
199  auto idx1_rank = std::distance(offsets.begin(), idx1_offset_iter);
200  auto idx1_local_idx = idx1 - *idx1_offset_iter;
201 
202  // The values, if any, needed from other rank
203  std::unordered_map<processor_id_type, std::vector<std::size_t>> needs;
204  if (idx0_rank != rank && idx1_rank == rank)
205  needs[idx0_rank].push_back(idx0_local_idx);
206  if (idx0_rank == rank && idx1_rank != rank)
207  needs[idx1_rank].push_back(idx1_local_idx);
208 
209  // Collect the values needed by this processor
210  std::unordered_map<processor_id_type, std::vector<T>> returns;
211  auto return_functor =
212  [&data, &returns](processor_id_type pid, const std::vector<std::size_t> & indices)
213  {
214  auto & returns_pid = returns[pid];
215  for (auto idx : indices)
216  returns_pid.push_back(data[idx]);
217  };
218  Parallel::push_parallel_vector_data(*comm_ptr, needs, return_functor);
219 
220  // Receive needed values from the others processors
221  std::vector<T> incoming;
222  auto recv_functor = [&incoming](processor_id_type /*pid*/, const std::vector<T> & values)
223  { incoming = values; };
224  Parallel::push_parallel_vector_data(*comm_ptr, returns, recv_functor);
225 
226  if (idx0_rank == rank && idx1_rank == rank)
227  MooseUtils::swap(data, idx0_local_idx, idx1_local_idx);
228 
229  else if (idx0_rank == rank)
230  {
231  mooseAssert(incoming.size() == 1, "Only one value should be received");
232  data[idx0_local_idx] = incoming[0];
233  }
234  else if (idx1_rank == rank)
235  {
236  mooseAssert(incoming.size() == 1, "Only one value should be received");
237  data[idx1_local_idx] = incoming[0];
238  }
239  }
240 }
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
void swap(std::vector< T > &data, const std::size_t idx0, const std::size_t idx1, const libMesh::Parallel::Communicator &comm)
Swap function for serial or distributed vector of data.
Definition: Shuffle.h:495
processor_id_type rank() const
processor_id_type size() const
uint8_t processor_id_type
void swap(std::vector< T > &data, const std::size_t idx0, const std::size_t idx1, const libMesh::Parallel::Communicator *comm_ptr=nullptr)
Definition: Shuffle.h:156

◆ tokenize()

template<typename T >
void MooseUtils::tokenize ( const std::string &  str,
std::vector< T > &  elements,
unsigned int  min_len = 1,
const std::string &  delims = "/" 
)

This function will split the passed in string on a set of delimiters appending the substrings to the passed in vector.

The delimiters default to "/" but may be supplied as well. In addition if min_len is supplied, the minimum token length will be >= than the supplied value. T should be std::string or a MOOSE derived string class.

Definition at line 55 of file MooseStringUtils.h.

Referenced by InputParameters::addCommandLineParamHelper(), Syntax::addDependencySets(), MooseEnumBase::addEnumerationName(), MooseEnumBase::addEnumerationNames(), JsonInputFileFormatter::addLine(), InputParameters::addParamNamesToGroup(), MultiMooseEnum::eraseSetValue(), TransfiniteMeshGenerator::getDiscreteEdge(), MooseApp::getLibrarySearchPaths(), TransfiniteMeshGenerator::getParsedEdge(), Syntax::isAssociated(), makedirs(), MultiMooseEnum::operator=(), FunctionMaterialPropertyDescriptor< is_ad >::parseDependentSymbols(), FunctionMaterialPropertyDescriptor< is_ad >::parseDerivative(), pathContains(), InputFileFormatter::printParams(), MooseUtils::DelimitedFileReaderTempl< T >::readColumnData(), InputParameters::registerBuildableTypes(), removedirs(), MultiMooseEnum::setAdditionalValue(), CommandLine::setCommandLineParam(), Moose::ParameterRegistration::setTripleVectorValue(), MooseApp::showInputs(), SingleMatrixPreconditioner::SingleMatrixPreconditioner(), tokenizeAndConvert(), and wildCardMatch().

59 {
60  elements.clear();
61 
62  std::string::size_type last_pos = str.find_first_not_of(delims, 0);
63  std::string::size_type pos = str.find_first_of(delims, std::min(last_pos + min_len, str.size()));
64 
65  while (last_pos != std::string::npos)
66  {
67  elements.push_back(str.substr(last_pos, pos - last_pos));
68  // skip delims between tokens
69  last_pos = str.find_first_not_of(delims, pos);
70  if (last_pos == std::string::npos)
71  break;
72  pos = str.find_first_of(delims, std::min(last_pos + min_len, str.size()));
73  }
74 }
auto min(const L &left, const R &right)

◆ tokenizeAndConvert()

template<typename T >
bool MooseUtils::tokenizeAndConvert ( const std::string &  str,
std::vector< T > &  tokenized_vector,
const std::string &  delimiter = " \t\n\v\f\r" 
)

tokenizeAndConvert splits a string using delimiter and then converts to type T.

If the conversion fails tokenizeAndConvert returns false, otherwise true.

Definition at line 162 of file MooseStringUtils.h.

Referenced by SplitMeshAction::act(), Moose::internal::CapabilityRegistry::check(), TransfiniteMeshGenerator::getCircarcEdge(), TransfiniteMeshGenerator::getDiscreteEdge(), and Moose::MFEM::CoefficientManager::getVectorCoefficientPtr().

165 {
166  std::vector<std::string> tokens;
167  MooseUtils::tokenize(str, tokens, 1, delimiter);
168  tokenized_vector.resize(tokens.size());
169  for (std::size_t i = 0; i < tokens.size(); ++i)
170  if (!convert<T>(tokens[i], tokenized_vector[i], false))
171  return false;
172  return true;
173 }
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...
charT const * delimiter
Definition: InfixIterator.h:35

◆ toLower()

std::string MooseUtils::toLower ( std::string  name)
inline

◆ toUpper()

std::string MooseUtils::toUpper ( std::string  name)
inline

◆ trim()

std::string MooseUtils::trim ( const std::string &  str,
const std::string &  white_space = " \t\n\v\f\r" 
)
inline

◆ underscoreToCamelCase()

std::string MooseUtils::underscoreToCamelCase ( const std::string &  underscore_name,
bool  leading_upper_case 
)

Definition at line 580 of file MooseUtils.C.

Referenced by MooseApp::libNameToAppName(), and ConsoleUtils::outputRelationshipManagerInformation().

581 {
582  pcrecpp::StringPiece input(underscore_name);
583  pcrecpp::RE re("([^_]*)(_|$)");
584 
585  std::string result;
586  std::string us, not_us;
587  bool make_upper = leading_upper_case;
588  while (re.Consume(&input, &not_us, &us))
589  {
590  if (not_us.length() > 0)
591  {
592  if (make_upper)
593  {
594  result += std::toupper(not_us[0]);
595  if (not_us.length() > 1)
596  result += not_us.substr(1);
597  }
598  else
599  result += not_us;
600  }
601  if (us == "")
602  break;
603 
604  // Toggle flag so next match is upper cased
605  make_upper = true;
606  }
607 
608  return result;
609 }

◆ wildCardMatch()

bool MooseUtils::wildCardMatch ( std::string  name,
std::string  search_string 
)

Definition at line 888 of file MooseUtils.C.

Referenced by JsonSyntaxTree::addParameters(), JsonSyntaxTree::addSyntaxType(), SyntaxTree::TreeNode::print(), InputFileFormatter::printParams(), and JsonSyntaxTree::setParams().

889 {
890  // Assume that an empty string matches anything
891  if (search_string == "")
892  return true;
893 
894  // transform to lower for case insenstive matching
895  std::transform(name.begin(), name.end(), name.begin(), (int (*)(int))std::toupper);
896  std::transform(search_string.begin(),
897  search_string.end(),
898  search_string.begin(),
899  (int (*)(int))std::toupper);
900 
901  // exact match!
902  if (search_string.find("*") == std::string::npos)
903  return search_string == name;
904 
905  // wildcard
906  std::vector<std::string> tokens;
907  MooseUtils::tokenize(search_string, tokens, 1, "*");
908 
909  size_t pos = 0;
910  for (unsigned int i = 0; i < tokens.size() && pos != std::string::npos; ++i)
911  {
912  pos = name.find(tokens[i], pos);
913  // See if we have a leading wildcard
914  if (search_string[0] != '*' && i == 0 && pos != 0)
915  return false;
916  }
917 
918  if (pos != std::string::npos && tokens.size() > 0)
919  {
920  // Now see if we have a trailing wildcard
921  size_t last_token_length = tokens.back().length();
922  if (*search_string.rbegin() == '*' || pos == name.size() - last_token_length)
923  return true;
924  else
925  return false;
926  }
927  else
928  return false;
929 }
std::string name(const ElemQuality q)
void tokenize(const std::string &str, std::vector< T > &elements, unsigned int min_len=1, const std::string &delims="/")
This function will split the passed in string on a set of delimiters appending the substrings to the ...
void ErrorVector unsigned int