You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.4 KiB
82 lines
2.4 KiB
2 years ago
|
/*
|
||
|
* Copyright(C) 1999-2021 National Technology & Engineering Solutions
|
||
|
* of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
|
||
|
* NTESS, the U.S. Government retains certain rights in this software.
|
||
|
*
|
||
|
* See packages/seacas/LICENSE for details
|
||
|
*/
|
||
|
|
||
|
#include <cstdlib>
|
||
|
|
||
|
#include <string>
|
||
|
|
||
|
#include <EP_Internals.h>
|
||
|
#include <EP_ParallelDisks.h>
|
||
|
|
||
|
#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || \
|
||
|
defined(__MINGW32__) || defined(_WIN64) || defined(__MINGW64__)
|
||
|
#include <Shlwapi.h>
|
||
|
#endif
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
Excn::ParallelDisks::ParallelDisks() = default;
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
Excn::ParallelDisks::~ParallelDisks() = default;
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
void Excn::ParallelDisks::rename_file_for_mp(const std::string &rootdir, const std::string &subdir,
|
||
|
std::string &name, int node, int numproc) const
|
||
|
{
|
||
|
// Possible to have node layout without parallel disks
|
||
|
|
||
|
std::string prepend;
|
||
|
if (!rootdir.empty()) {
|
||
|
prepend = rootdir + "/";
|
||
|
}
|
||
|
else if (Excn::is_path_absolute(name)) {
|
||
|
prepend = "";
|
||
|
}
|
||
|
else {
|
||
|
prepend = "./";
|
||
|
}
|
||
|
|
||
|
int lnn = node;
|
||
|
Create_IO_Filename(name, lnn, numproc);
|
||
|
if (!subdir.empty()) {
|
||
|
name = subdir + "/" + name;
|
||
|
}
|
||
|
name = prepend + name;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
void Excn::ParallelDisks::Create_IO_Filename(std::string &name, int processor, int num_processors)
|
||
|
{
|
||
|
// Current format for per-processor file names is:
|
||
|
// PREFIX/basename.num_proc.cur_proc
|
||
|
// the 'cur_proc' field is padded to be the same width as
|
||
|
// the 'num_proc' field
|
||
|
// Examples: basename.8.1, basename.64.03, basename.128.001
|
||
|
|
||
|
// Create a std::string containing the total number of processors
|
||
|
std::string num_proc = std::to_string(num_processors);
|
||
|
size_t proc_width = num_proc.length();
|
||
|
|
||
|
// Create a std::string containing the current processor number
|
||
|
std::string cur_proc = std::to_string(processor);
|
||
|
size_t cur_width = cur_proc.length();
|
||
|
|
||
|
// Build the filename
|
||
|
name += ".";
|
||
|
name += num_proc;
|
||
|
name += ".";
|
||
|
|
||
|
// Now, pad with zeros so that 'cur_proc' portion is same
|
||
|
// width as 'num_proc' portion.
|
||
|
while (cur_width++ < proc_width) {
|
||
|
name += "0";
|
||
|
}
|
||
|
|
||
|
name += cur_proc;
|
||
|
}
|