https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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=" \t\n\v\f\r")
 Standard scripting language trim function.
 
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.
 
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.
 
template<typename T >
bool 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.
 
std::string toUpper (std::string name)
 Convert supplied string to upper case.
 
std::string toLower (std::string name)
 Convert supplied string to lower case.
 
std::string stringJoin (const std::vector< std::string > &values, const std::string &separator=" ")
 Concatenates value into a single string separated by separator.
 
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...)
 
bool isFinitePoint (const Point &point)
 
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.
 
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.
 
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.
 
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.
 
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 741 of file MooseUtils.C.

743{
744 for (auto i : make_range(int(message.length() / line_width)))
745 message.insert((i + 1) * (line_width + 2) - 2, "\n");
746}
void ErrorVector unsigned int

◆ baseName()

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

Definition at line 629 of file MooseUtils.C.

630{
631 return name.substr(0, name.find_last_of('/') != std::string::npos ? name.find_last_of('/') : 0);
632}

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

◆ beginsWith()

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

Definition at line 966 of file MooseUtils.C.

967{
968 return value.rfind(begin_value, 0) == 0;
969}

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

◆ buildBoundingBox()

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

Definition at line 1142 of file MooseUtils.C.

1143{
1144 BoundingBox bb;
1145 bb.union_with(p1);
1146 bb.union_with(p2);
1147 return bb;
1148}

Referenced by PropertyReadFile::PropertyReadFile().

◆ camelCaseToUnderscore()

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

Definition at line 579 of file MooseUtils.C.

580{
581 std::string replaced = camel_case_name;
582 // Put underscores in front of each contiguous set of capital letters
583 pcrecpp::RE("(?!^)(?<![A-Z_])([A-Z]+)").GlobalReplace("_\\1", &replaced);
584
585 // Convert all capital letters to lower case
586 std::transform(replaced.begin(), replaced.end(), replaced.begin(), ::tolower);
587 return replaced;
588}

Referenced by MooseApp::appNameToLibName().

◆ canonicalPath()

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

Definition at line 1184 of file MooseUtils.C.

1185{
1186 return std::filesystem::weakly_canonical(path).c_str();
1187}

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

◆ 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 265 of file MooseUtils.C.

269{
270 std::ifstream in(filename.c_str(), std::ifstream::in);
271 if (in.fail())
272 {
273 if (throw_on_unreadable)
275 (std::string("Unable to open file \"") + filename +
276 std::string("\". Check to make sure that it exists and that you have read permission."))
277 .c_str());
278 else
279 return false;
280 }
281
282 if (check_line_endings)
283 {
284 std::istream_iterator<char> iter(in);
285 std::istream_iterator<char> eos;
286 in >> std::noskipws;
287 while (iter != eos)
288 if (*iter++ == '\r')
289 mooseError(filename + " contains Windows(DOS) line endings which are not supported.");
290 }
291
292 if (check_for_git_lfs_pointer && checkForGitLFSPointer(in))
293 mooseError(filename + " appears to be a Git-LFS pointer. Make sure you have \"git-lfs\" "
294 "installed so that you may pull this file.");
295 in.close();
296
297 return true;
298}
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:301

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().

◆ checkFileWriteable()

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

Definition at line 318 of file MooseUtils.C.

319{
320 std::ofstream out(filename.c_str(), std::ios_base::app);
321 if (out.fail())
322 {
323 if (throw_on_unwritable)
325 (std::string("Unable to open file \"") + filename +
326 std::string("\". Check to make sure that it exists and that you have write permission."))
327 .c_str());
328 else
329 return false;
330 }
331
332 out.close();
333
334 return true;
335}

Referenced by PNGOutput::makePNG().

◆ checkForGitLFSPointer()

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

Definition at line 301 of file MooseUtils.C.

302{
303 mooseAssert(file.is_open(), "Passed in file handle is not open");
304
305 std::string line;
306
307 // git-lfs pointer files contain several name value pairs. The specification states that the
308 // first name/value pair must be "version {url}". We'll do a simplified check for that.
309 file.seekg(0);
310 std::getline(file, line);
311 if (line.find("version https://") != std::string::npos)
312 return true;
313 else
314 return false;
315}

Referenced by checkFileReadable().

◆ clearSymlink()

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

Definition at line 1084 of file MooseUtils.C.

1085{
1086#ifndef __WIN32__
1087 struct stat sbuf;
1088 if (lstat(link.c_str(), &sbuf) == 0)
1089 {
1090 auto err = unlink(link.c_str());
1091 if (err != 0)
1092 mooseError("Failed to remove symbolic link (via 'unlink') to ", link);
1093 }
1094#else
1095 auto attr = GetFileAttributesA(link.c_str());
1096 if (attr != INVALID_FILE_ATTRIBUTES)
1097 {
1098 auto err = _unlink(link.c_str());
1099 if (err != 0)
1100 mooseError("Failed to remove link/file (via '_unlink') to ", link);
1101 }
1102#endif
1103}

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

◆ 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.

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 trim(const std::string &str, const std::string &white_space=" \t\n\v\f\r")
Standard scripting language trim function.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
std::string name(const ElemQuality q)
std::string demangle(const char *name)

◆ convertLatestCheckpoint()

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

Definition at line 168 of file MooseUtils.C.

169{
170 auto slash_pos = orig.find_last_of("/");
171 auto path = orig.substr(0, slash_pos);
172 auto file = orig.substr(slash_pos + 1);
173 if (file != "LATEST")
174 return orig;
175
177
178 if (converted.empty())
179 mooseError("Unable to find suitable recovery file!");
180
181 return converted;
182}
std::list< std::string > listDir(const std::string path, bool files_only)
Definition MooseUtils.C:793
std::string getLatestCheckpointFilePrefix(const std::list< std::string > &checkpoint_files)
Definition MooseUtils.C:830

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

◆ createSymlink()

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

Definition at line 1071 of file MooseUtils.C.

1072{
1073 clearSymlink(link);
1074#ifndef __WIN32__
1075 auto err = symlink(target.c_str(), link.c_str());
1076#else
1077 auto err = CreateSymbolicLink(target.c_str(), link.c_str(), 0);
1078#endif
1079 if (err)
1080 mooseError("Failed to create symbolic link (via 'symlink') from ", target, " to ", link);
1081}
void clearSymlink(const std::string &link)

Referenced by CSV::output().

◆ docsDir()

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

Definition at line 136 of file MooseUtils.C.

137{
138 // See moose.mk for a detailed explanation of the assumed installed application
139 // layout. Installed docs are expected to be installed in "share/<app_name>/doc".
140 // The binary, which has a defined location will be in "bin", a peer directory to "share".
141 std::string installed_path = pathjoin(Moose::getExecutablePath(), "..", "share", app_name, "doc");
142
143 auto docfile = pathjoin(installed_path, "css", "moose.css");
144 if (pathExists(docfile) && checkFileReadable(docfile))
145 return installed_path;
146 return "";
147}
std::filesystem::path pathjoin(const std::filesystem::path &p)
Definition MooseUtils.C:70
bool pathExists(const std::string &path)
Definition MooseUtils.C:258
bool checkFileReadable(const std::string &filename, bool check_line_endings, bool throw_on_unreadable, bool check_for_git_lfs_pointer)
Definition MooseUtils.C:265
std::string getExecutablePath()
Gets the directory the running executable is on Mac OS X and linux.

Referenced by MooseApp::run().

◆ escape()

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

Definition at line 218 of file MooseUtils.C.

219{
220 std::map<char, std::string> escapes;
221 escapes['\a'] = "\\a";
222 escapes['\b'] = "\\b";
223 escapes['\f'] = "\\f";
224 escapes['\n'] = "\\n";
225 escapes['\t'] = "\\t";
226 escapes['\v'] = "\\v";
227 escapes['\r'] = "\\r";
228
229 for (const auto & it : escapes)
230 for (size_t pos = 0; (pos = str.find(it.first, pos)) != std::string::npos;
231 pos += it.second.size())
232 str.replace(pos, 1, it.second);
233}
for(PetscInt i=0;i< nvars;++i)

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

◆ fileSize()

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

Definition at line 1106 of file MooseUtils.C.

1107{
1108#ifndef __WIN32__
1109 struct stat buffer;
1110 if (!stat(filename.c_str(), &buffer))
1111 return buffer.st_size;
1112#else
1113 HANDLE hFile = CreateFile(filename.c_str(),
1114 GENERIC_READ,
1115 FILE_SHARE_READ | FILE_SHARE_WRITE,
1116 NULL,
1117 OPEN_EXISTING,
1118 FILE_ATTRIBUTE_NORMAL,
1119 NULL);
1120 if (hFile == INVALID_HANDLE_VALUE)
1121 return 0;
1122
1123 LARGE_INTEGER size;
1124 if (GetFileSizeEx(hFile, &size))
1125 {
1126 CloseHandle(hFile);
1127 return size.QuadPart;
1128 }
1129
1130 CloseHandle(hFile);
1131#endif
1132 return 0;
1133}

Referenced by Exodus::output().

◆ findTestRoot()

std::string MooseUtils::findTestRoot ( )

Definition at line 86 of file MooseUtils.C.

87{
88 std::string path = ".";
89 for (int i = 0; i < 5; i++)
90 {
91 auto testroot = pathjoin(path, "testroot");
92 if (pathExists(testroot) && checkFileReadable(testroot))
93 return testroot;
94 path += "/..";
95 }
96 return "";
97}

Referenced by MooseApp::runInputs().

◆ getCurrentWorkingDir()

std::string MooseUtils::getCurrentWorkingDir ( )

Definition at line 447 of file MooseUtils.C.

448{
449 // Note: At the time of creating this method, our minimum compiler still
450 // does not support <filesystem>. Additionally, the inclusion of that header
451 // requires an additional library to be linked so for now, we'll just
452 // use the Unix standard library to get us the cwd().
453 constexpr unsigned int BUF_SIZE = 1024;
454 char buffer[BUF_SIZE];
455
456 return getcwd(buffer, BUF_SIZE) != nullptr ? buffer : "";
457}

Referenced by MooseApp::runInputs().

◆ getDefaultExecFlagEnum()

ExecFlagEnum MooseUtils::getDefaultExecFlagEnum ( )

◆ getExtension()

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

Definition at line 422 of file MooseUtils.C.

423{
424 std::string file_ext = "";
425 if (filename != "")
426 {
427 // The next line splits filename at the last "/" and gives the file name after "/"
428 const std::string stripped_filename = splitFileName<std::string>(filename).second;
429 auto pos = rfind ? stripped_filename.rfind(".") : stripped_filename.find(".");
430 if (pos != std::string::npos)
431 file_ext += stripped_filename.substr(pos + 1, std::string::npos);
432 }
433
434 return file_ext;
435}

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

◆ getFilesInDirs()

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

Definition at line 819 of file MooseUtils.C.

820{
821 std::list<std::string> files;
822
823 for (const auto & dir_name : directory_list)
824 files.splice(files.end(), listDir(dir_name, files_only));
825
826 return files;
827}

Referenced by MooseApp::getCheckpointFiles().

◆ getLatestCheckpointFilePrefix()

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

Definition at line 830 of file MooseUtils.C.

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

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

◆ 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 651 of file MooseUtils.C.

652{
653#ifndef __WIN32__
654 struct winsize w;
655#else
656 struct
657 {
658 unsigned short ws_col;
659 } w;
660#endif
665 w.ws_col = std::numeric_limits<unsigned short>::max();
666
667 if (use_environment)
668 {
669 char * pps_width = std::getenv("MOOSE_PPS_WIDTH");
670 if (pps_width != NULL)
671 {
672 std::stringstream ss(pps_width);
673 ss >> w.ws_col;
674 }
675 }
676 // Default to AUTO if no environment variable was set
677 if (w.ws_col == std::numeric_limits<unsigned short>::max())
678 {
679#ifndef __WIN32__
680 try
681 {
682 ioctl(0, TIOCGWINSZ, &w);
683 }
684 catch (...)
685#endif
686 {
687 }
688 }
689
690 // Something bad happened, make sure we have a sane value
691 // 132 seems good for medium sized screens, and is available as a GNOME preset
692 if (w.ws_col == std::numeric_limits<unsigned short>::max())
693 w.ws_col = 132;
694
695 return w.ws_col;
696}

Referenced by FormattedTable::printTable().

◆ globCompare()

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

Definition at line 943 of file MooseUtils.C.

947{
948 if (p == pattern.size())
949 return c == candidate.size();
950
951 if (pattern[p] == '*')
952 {
953 for (; c < candidate.size(); ++c)
954 if (globCompare(candidate, pattern, c, p + 1))
955 return true;
956 return globCompare(candidate, pattern, c, p + 1);
957 }
958
959 if (pattern[p] != '?' && pattern[p] != candidate[c])
960 return false;
961
962 return globCompare(candidate, pattern, c + 1, p + 1);
963}
bool globCompare(const std::string &candidate, const std::string &pattern, std::size_t c, std::size_t p)
Definition MooseUtils.C:943

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

◆ hasExtension()

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

Definition at line 398 of file MooseUtils.C.

399{
400 // Extract the extension, w/o the '.'
401 std::string file_ext;
402 if (strip_exodus_ext)
403 {
404 pcrecpp::RE re(
405 ".*\\.([^\\.]*?)(?:-s\\d+)?\\s*$"); // capture the complete extension, ignoring -s*
406 re.FullMatch(filename, &file_ext);
407 }
408 else
409 {
410 pcrecpp::RE re(".*\\.([^\\.]*?)\\s*$"); // capture the complete extension
411 re.FullMatch(filename, &file_ext);
412 }
413
414 // Perform the comparision
415 if (file_ext == ext)
416 return true;
417 else
418 return false;
419}

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

◆ hostname()

std::string MooseUtils::hostname ( )

Definition at line 635 of file MooseUtils.C.

636{
637 char hostname[1024];
638 hostname[1023] = '\0';
639#ifndef __WIN32__
640 if (gethostname(hostname, 1023))
641 mooseError("Failed to retrieve hostname!");
642#else
643 DWORD dwSize = sizeof(hostname);
644 if (!GetComputerNameEx(ComputerNamePhysicalDnsHostname, hostname, &dwSize))
645 mooseError("Failed to retrieve hostname!");
646#endif
647 return hostname;
648}
std::string hostname()
Definition MooseUtils.C:635

Referenced by hostname().

◆ 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 749 of file MooseUtils.C.

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

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

◆ installedInputsDir()

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

Definition at line 114 of file MooseUtils.C.

117{
118 // See moose.mk for a detailed explanation of the assumed installed application
119 // layout. Installed inputs are expected to be installed in "share/<app_name>/<folder>".
120 // The binary, which has a defined location will be in "bin", a peer directory to "share".
121 std::string installed_path =
122 pathjoin(Moose::getExecutablePath(), "..", "share", app_name, dir_name);
123
124 auto test_root = pathjoin(installed_path, "testroot");
125 if (!pathExists(installed_path))
126 mooseError("Couldn't locate any installed inputs to copy in path: ",
127 installed_path,
128 '\n',
129 extra_error_msg);
130
131 checkFileReadable(test_root);
132 return installed_path;
133}

Referenced by MooseApp::copyInputs().

◆ isAllLowercase()

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

Definition at line 1206 of file MooseUtils.C.

1207{
1208 return std::all_of(
1209 str.begin(), str.end(), [](unsigned char c) { return !std::isalpha(c) || std::islower(c); });
1210}

◆ isFinitePoint()

bool MooseUtils::isFinitePoint ( const Point &  point)

Definition at line 60 of file MooseUtils.C.

61{
62 for (const auto component : make_range(Moose::dim))
63 if (!std::isfinite(point(component)))
64 return false;
65
66 return true;
67}
if(!dmm->_nl) SETERRQ(PETSC_COMM_WORLD
unsigned int dim
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...

Referenced by Moose::Mortar::projectQPoints3d(), and MortarSegmentHelper::referencePoint().

◆ levenshteinDist()

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

Definition at line 187 of file MooseUtils.C.

188{
189 // To change the type this function manipulates and returns, change
190 // the return type and the types of the two variables below.
191 auto s1len = s1.size();
192 auto s2len = s2.size();
193
194 auto column_start = (decltype(s1len))1;
195
196 auto column = new decltype(s1len)[s1len + 1];
197 std::iota(column + column_start, column + s1len + 1, column_start);
198
199 for (auto x = column_start; x <= s2len; x++)
200 {
201 column[0] = x;
202 auto last_diagonal = x - column_start;
203 for (auto y = column_start; y <= s1len; y++)
204 {
205 auto old_diagonal = column[y];
206 auto possibilities = {
207 column[y] + 1, column[y - 1] + 1, last_diagonal + (s1[y - 1] == s2[x - 1] ? 0 : 1)};
208 column[y] = std::min(possibilities);
209 last_diagonal = old_diagonal;
210 }
211 }
212 auto result = column[s1len];
213 delete[] column;
214 return result;
215}

Referenced by Moose::findSimilar().

◆ linearPartitionChunk()

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

Definition at line 1010 of file MooseUtils.C.

1011{
1012 auto global_num_local_items = num_items / num_chunks;
1013
1014 auto leftovers = num_items % num_chunks;
1015
1016 auto first_item_past_first_part = leftovers * (global_num_local_items + 1);
1017
1018 // Is it in the first section (that gets an extra item)
1019 if (item_id < first_item_past_first_part)
1020 return item_id / (global_num_local_items + 1);
1021 else
1022 {
1023 auto new_item_id = item_id - first_item_past_first_part;
1024
1025 // First chunk after the first section + the number of chunks after that
1026 return leftovers + (new_item_id / global_num_local_items);
1027 }
1028}

Referenced by DistributedRectilinearMeshGenerator::buildCube().

◆ 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 984 of file MooseUtils.C.

990{
991 auto global_num_local_items = num_items / num_chunks;
992
993 num_local_items = global_num_local_items;
994
995 auto leftovers = num_items % num_chunks;
996
997 if (chunk_id < leftovers)
998 {
999 num_local_items++;
1000 local_items_begin = num_local_items * chunk_id;
1001 }
1002 else
1003 local_items_begin =
1004 (global_num_local_items + 1) * leftovers + global_num_local_items * (chunk_id - leftovers);
1005
1006 local_items_end = local_items_begin + num_local_items;
1007}

Referenced by DistributedRectilinearMeshGenerator::buildCube().

◆ listDir()

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

Definition at line 793 of file MooseUtils.C.

794{
795 std::list<std::string> files;
796
797 tinydir_dir dir;
798 dir.has_next = 0; // Avoid a garbage value in has_next (clang StaticAnalysis)
799 tinydir_open(&dir, path.c_str());
800
801 while (dir.has_next)
802 {
803 tinydir_file file;
804 file.is_dir = 0; // Avoid a garbage value in is_dir (clang StaticAnalysis)
805 tinydir_readfile(&dir, &file);
806
807 if (!files_only || !file.is_dir)
808 files.push_back(path + "/" + file.name);
809
810 tinydir_next(&dir);
811 }
812
813 tinydir_close(&dir);
814
815 return files;
816}

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

◆ makedirs()

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

Definition at line 460 of file MooseUtils.C.

461{
462 // split path into directories with delimiter '/'
463 std::vector<std::string> split_dir_names;
464 MooseUtils::tokenize(dir_name, split_dir_names);
465
466 auto n = split_dir_names.size();
467
468 // remove '.' and '..' when possible
469 auto i = n;
470 i = 0;
471 while (i != n)
472 {
473 if (split_dir_names[i] == ".")
474 {
475 for (auto j = i + 1; j < n; ++j)
476 split_dir_names[j - 1] = split_dir_names[j];
477 --n;
478 }
479 else if (i > 0 && split_dir_names[i] == ".." && split_dir_names[i - 1] != "..")
480 {
481 for (auto j = i + 1; j < n; ++j)
482 split_dir_names[j - 2] = split_dir_names[j];
483 n -= 2;
484 --i;
485 }
486 else
487 ++i;
488 }
489 if (n == 0)
490 return;
491
492 split_dir_names.resize(n);
493
494 // start creating directories recursively
495 std::string cur_dir = dir_name[0] == '/' ? "" : ".";
496 for (auto & dir : split_dir_names)
497 {
498 cur_dir += "/" + dir;
499
500 if (!pathExists(cur_dir))
501 {
502 auto code = Utility::mkdir(cur_dir.c_str());
503 if (code != 0)
504 {
505 std::string msg = "Failed creating directory " + dir_name;
506 if (throw_on_failure)
507 throw std::invalid_argument(msg);
508 else
509 mooseError(msg);
510 }
511 }
512 }
513}
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 ...
int mkdir(const char *pathname)

◆ MaterialPropertyStorageDump()

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

Definition at line 699 of file MooseUtils.C.

701{
702 // Loop through the elements
703 for (const auto & elem_it : props)
704 {
705 Moose::out << "Element " << elem_it.first->id() << '\n';
706
707 // Loop through the sides
708 for (const auto & side_it : elem_it.second)
709 {
710 Moose::out << " Side " << side_it.first << '\n';
711
712 // Loop over properties
713 unsigned int cnt = 0;
714 for (const auto & mat_prop : side_it.second)
715 {
716 if (auto mp = dynamic_cast<const MaterialProperty<Real> *>(&mat_prop))
717 {
718 Moose::out << " Property " << cnt << '\n';
719 cnt++;
720
721 // Loop over quadrature points
722 for (unsigned int qp = 0; qp < mp->size(); ++qp)
723 Moose::out << " prop[" << qp << "] = " << (*mp)[qp] << '\n';
724 }
725 }
726 }
727 }
728
729 Moose::out << std::flush;
730}

◆ mooseDocsURL()

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

Definition at line 150 of file MooseUtils.C.

151{
152 return "https://mooseframework.inl.gov/" + path;
153}

Referenced by ExecFlagEnum::getDocString().

◆ parallelBarrierNotify()

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

Definition at line 338 of file MooseUtils.C.

339{
340 processor_id_type secondary_processor_id;
341
342 if (messaging)
343 Moose::out << "Waiting For Other Processors To Finish" << std::endl;
344 if (comm.rank() == 0)
345 {
346 // The primary process is already through, so report it
347 if (messaging)
348 Moose::out << "Jobs complete: 1/" << comm.size() << (1 == comm.size() ? "\n" : "\r")
349 << std::flush;
350 for (unsigned int i = 2; i <= comm.size(); ++i)
351 {
352 comm.receive(MPI_ANY_SOURCE, secondary_processor_id);
353 if (messaging)
354 Moose::out << "Jobs complete: " << i << "/" << comm.size()
355 << (i == comm.size() ? "\n" : "\r") << std::flush;
356 }
357 }
358 else
359 {
360 secondary_processor_id = comm.rank();
361 comm.send(0, secondary_processor_id);
362 }
363
364 comm.barrier();
365}
processor_id_type size() const
processor_id_type rank() const
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

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

◆ parsesToReal()

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

Definition at line 100 of file MooseUtils.C.

101{
102 std::istringstream ss(input);
103 Real real_value;
104 if (ss >> real_value && ss.eof())
105 {
106 if (parsed_real)
107 (*parsed_real) = real_value;
108 return true;
109 }
110 return false;
111}

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

◆ pathContains()

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

Definition at line 242 of file MooseUtils.C.

245{
246 std::vector<std::string> elements;
247 tokenize(expression, elements, 0, delims);
248
249 std::vector<std::string>::iterator found_it =
250 std::find(elements.begin(), elements.end(), string_to_find);
251 if (found_it != elements.end())
252 return true;
253 else
254 return false;
255}

◆ pathExists()

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

Definition at line 258 of file MooseUtils.C.

259{
260 struct stat buffer;
261 return (stat(path.c_str(), &buffer) == 0);
262}

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

◆ pathjoin()

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

◆ prettyCppType()

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

Definition at line 1151 of file MooseUtils.C.

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

Referenced by MooseServer::addParametersToList(), MooseServer::addValuesToList(), InputParametersChecksUtils< C >::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(), CSG::CSGSurface::getSurfaceType(), CSG::CSGLattice::getType(), CSG::CSGEngUnit::getUnitType(), ThreadedElementLoop< RangeType >::printExecutionOrdering(), Moose::ParameterRegistry::set(), JsonSyntaxTree::setParams(), and MFEMProblem::solverTypeString().

◆ realpath()

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

Definition at line 1136 of file MooseUtils.C.

1137{
1138 return std::filesystem::absolute(path);
1139}

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

◆ removeColor()

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

Definition at line 733 of file MooseUtils.C.

734{
735 pcrecpp::RE re("(\\33\\[3[0-7]m))", pcrecpp::DOTALL());
736 re.GlobalReplace(std::string(""), &msg);
737 return msg;
738}

Referenced by Console::writeStreamToFile().

◆ removedirs()

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

Definition at line 516 of file MooseUtils.C.

517{
518 // split path into directories with delimiter '/'
519 std::vector<std::string> split_dir_names;
520 MooseUtils::tokenize(dir_name, split_dir_names);
521
522 auto n = split_dir_names.size();
523
524 // remove '.' and '..' when possible
525 auto i = n;
526 i = 0;
527 while (i != n)
528 {
529 if (split_dir_names[i] == ".")
530 {
531 for (auto j = i + 1; j < n; ++j)
532 split_dir_names[j - 1] = split_dir_names[j];
533 --n;
534 }
535 else if (i > 0 && split_dir_names[i] == ".." && split_dir_names[i - 1] != "..")
536 {
537 for (auto j = i + 1; j < n; ++j)
538 split_dir_names[j - 2] = split_dir_names[j];
539 n -= 2;
540 --i;
541 }
542 else
543 ++i;
544 }
545 if (n == 0)
546 return;
547
548 split_dir_names.resize(n);
549
550 // start removing directories recursively
551 std::string base_dir = dir_name[0] == '/' ? "" : ".";
552 for (i = n; i > 0; --i)
553 {
554 std::string cur_dir = base_dir;
555 auto j = i;
556 for (j = 0; j < i; ++j)
557 cur_dir += "/" + split_dir_names[j];
558
559 // listDir should return at least '.' and '..'
560 if (pathExists(cur_dir) && listDir(cur_dir).size() == 2)
561 {
562 auto code = rmdir(cur_dir.c_str());
563 if (code != 0)
564 {
565 std::string msg = "Failed removing directory " + dir_name;
566 if (throw_on_failure)
567 throw std::invalid_argument(msg);
568 else
569 mooseError(msg);
570 }
571 }
572 else
573 // stop removing
574 break;
575 }
576}

◆ removeExtraWhitespace()

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

Definition at line 236 of file MooseUtils.C.

237{
238 return std::regex_replace(input, std::regex("^\\s+|\\s+$|\\s+(?=\\s)"), "");
239}

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

◆ replaceAll()

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

Definition at line 156 of file MooseUtils.C.

157{
158 size_t start_pos = 0;
159 while ((start_pos = str.find(from, start_pos)) != std::string::npos)
160 {
161 str.replace(start_pos, from.length(), to);
162 start_pos += to.length(); // Handles case where 'to' is a substring of 'from'
163 }
164 return str;
165}

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

◆ replaceStart()

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

Definition at line 1198 of file MooseUtils.C.

1199{
1200 mooseAssert(startsWith(string1, string2),
1201 "Cannot replace the start because it doesn't match the start string");
1202 string1.replace(0, string2.size(), string3);
1203}
bool startsWith(const std::string &string1, const std::string &string2)

◆ resample() [1/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() [2/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}

◆ 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_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}
std::array< Real, 2 > values
Definition MortarUtils.C:52
static uint32_t randl()
This method returns the next random number (long format) from the generator.
Definition MooseRandom.h:71
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
uint8_t processor_id_type
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)

◆ resample() [4/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.

534{
535 return MooseUtils::resample(data, generator, seed_index, nullptr);
536}

Referenced by resample(), resample(), and resample().

◆ resampleWithFunctor() [1/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() [2/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}

◆ 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_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}

◆ 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 = 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.

563{
564 return MooseUtils::resampleWithFunctor(data, functor, generator, seed_index, nullptr);
565}

Referenced by resampleWithFunctor(), resampleWithFunctor(), and resampleWithFunctor().

◆ reset() [1/2]

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

Definition at line 28 of file SharedPool.h.

29{
30}

◆ reset() [2/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.

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

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

◆ rsplit()

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

Definition at line 1051 of file MooseUtils.C.

1052{
1053 std::vector<std::string> output;
1054 std::size_t count = 0;
1055 size_t prev = str.length(), pos = str.length();
1056 do
1057 {
1058 pos = str.rfind(delimiter, prev);
1059 output.insert(output.begin(), str.substr(pos + delimiter.length(), prev - pos));
1060 prev = pos - delimiter.length();
1061 count += 1;
1062 } while (pos != std::string::npos && pos > 0 && count < max_count);
1063
1064 if (pos != std::string::npos)
1065 output.insert(output.begin(), str.substr(0, pos));
1066
1067 return output;
1068}
unsigned int count
Definition MortarUtils.C:53

◆ runTestsExecutable()

std::string MooseUtils::runTestsExecutable ( )

Definition at line 76 of file MooseUtils.C.

77{
78 auto build_loc = pathjoin(Moose::getExecutablePath(), "run_tests");
79 if (pathExists(build_loc) && checkFileReadable(build_loc))
80 return build_loc;
81 // TODO: maybe no path prefix - just moose_test_runner here?
82 return pathjoin(Moose::getExecutablePath(), "moose_test_runner");
83}

Referenced by MooseApp::runInputs().

◆ serialBegin()

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

Definition at line 368 of file MooseUtils.C.

369{
370 // unless we are the first processor...
371 if (comm.rank() > 0)
372 {
373 // ...wait for the previous processor to finish
374 int dummy = 0;
375 comm.receive(comm.rank() - 1, dummy);
376 }
377 else if (warn)
378 mooseWarning("Entering serial execution block (use only for debugging)");
379}
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345

Referenced by SerializerGuard::SerializerGuard().

◆ serialEnd()

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

Definition at line 382 of file MooseUtils.C.

383{
384 // unless we are the last processor...
385 if (comm.rank() + 1 < comm.size())
386 {
387 // ...notify the next processor of its turn
388 int dummy = 0;
389 comm.send(comm.rank() + 1, dummy);
390 }
391
392 comm.barrier();
393 if (comm.rank() == 0 && warn)
394 mooseWarning("Leaving serial execution block (use only for debugging)");
395}

Referenced by SerializerGuard::~SerializerGuard().

◆ shortName()

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

Definition at line 623 of file MooseUtils.C.

624{
625 return name.substr(name.find_last_of('/') != std::string::npos ? name.find_last_of('/') + 1 : 0);
626}

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

◆ shuffle() [1/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() [2/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}

◆ 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_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 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

◆ shuffle() [4/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.

506{
507 return MooseUtils::shuffle(data, generator, seed_index, nullptr);
508}

Referenced by shuffle(), shuffle(), and shuffle().

◆ split()

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

Definition at line 1031 of file MooseUtils.C.

1032{
1033 std::vector<std::string> output;
1034 std::size_t count = 0;
1035 size_t prev = 0, pos = 0;
1036 do
1037 {
1038 pos = str.find(delimiter, prev);
1039 output.push_back(str.substr(prev, pos - prev));
1040 prev = pos + delimiter.length();
1041 count += 1;
1042 } while (pos != std::string::npos && count < max_count);
1043
1044 if (pos != std::string::npos)
1045 output.push_back(str.substr(prev));
1046
1047 return output;
1048}

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

◆ startsWith()

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

Definition at line 1190 of file MooseUtils.C.

1191{
1192 if (string2.size() > string1.size())
1193 return false;
1194 return string1.compare(0, string2.size(), string2) == 0;
1195}

Referenced by replaceStart().

◆ 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.

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}

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

◆ stringToInteger()

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

Definition at line 978 of file MooseUtils.C.

979{
980 return convert<int>(input, throw_on_failure);
981}

Referenced by FormattedTable::printTable().

◆ stripExtension()

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

Definition at line 438 of file MooseUtils.C.

439{
440 const std::string ext = getExtension(s, rfind);
441 const bool offset = (ext.size() != 0);
442 // -1 offset accounts for the extension's leading dot ("."), if there is an extension
443 return s.substr(0, s.size() - ext.size() - offset);
444}
std::string getExtension(const std::string &filename, const bool rfind)
Definition MooseUtils.C:422

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

◆ 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.

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

Referenced by shuffle(), and swap().

◆ 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}

◆ 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.

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}

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().

◆ 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.

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}

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

◆ 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 591 of file MooseUtils.C.

592{
593 pcrecpp::StringPiece input(underscore_name);
594 pcrecpp::RE re("([^_]*)(_|$)");
595
596 std::string result;
597 std::string us, not_us;
598 bool make_upper = leading_upper_case;
599 while (re.Consume(&input, &not_us, &us))
600 {
601 if (not_us.length() > 0)
602 {
603 if (make_upper)
604 {
605 result += std::toupper(not_us[0]);
606 if (not_us.length() > 1)
607 result += not_us.substr(1);
608 }
609 else
610 result += not_us;
611 }
612 if (us == "")
613 break;
614
615 // Toggle flag so next match is upper cased
616 make_upper = true;
617 }
618
619 return result;
620}

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

◆ wildCardMatch()

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

Definition at line 899 of file MooseUtils.C.

900{
901 // Assume that an empty string matches anything
902 if (search_string == "")
903 return true;
904
905 // transform to lower for case insenstive matching
906 std::transform(name.begin(), name.end(), name.begin(), (int (*)(int))std::toupper);
907 std::transform(search_string.begin(),
908 search_string.end(),
909 search_string.begin(),
910 (int (*)(int))std::toupper);
911
912 // exact match!
913 if (search_string.find("*") == std::string::npos)
914 return search_string == name;
915
916 // wildcard
917 std::vector<std::string> tokens;
918 MooseUtils::tokenize(search_string, tokens, 1, "*");
919
920 size_t pos = 0;
921 for (unsigned int i = 0; i < tokens.size() && pos != std::string::npos; ++i)
922 {
923 pos = name.find(tokens[i], pos);
924 // See if we have a leading wildcard
925 if (search_string[0] != '*' && i == 0 && pos != 0)
926 return false;
927 }
928
929 if (pos != std::string::npos && tokens.size() > 0)
930 {
931 // Now see if we have a trailing wildcard
932 size_t last_token_length = tokens.back().length();
933 if (*search_string.rbegin() == '*' || pos == name.size() - last_token_length)
934 return true;
935 else
936 return false;
937 }
938 else
939 return false;
940}

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