Cloned SEACAS for EXODUS library with extra build files for internal package management.
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.

179 lines
6.3 KiB

2 years ago
/*
* Copyright(C) 1999-2021, 2023 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 "fmt/ostream.h"
#include "ps_pario_const.h" // for Parallel_IO, PIO_Info
#include "rf_allo.h" // for array_alloc
#include "rf_io_const.h" // for Debug_Flag
#include <array>
#include <cstdlib> // for exit
#include <cstring> // for strlen, etc
#include <sstream>
#include <string>
/*********** R O U T I N E S I N T H I S F I L E ***********************
Name_of_Routine type Called by
---------------------------------------------------------------------------
pdisk_stage_begin() void load_mesh (pe_exoII_io.c)
pdisk_stage_end() void load_mesh (pe_exoII_io.c)
gen_par_filename() void load_lb_info (rf_load_lb_info.c)
load_mesh (pe_exoII_io.c)
******************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
void gen_disk_map(struct Parallel_IO *pio_info, const std::array<int, 6> &proc_info, int /*proc*/,
int nproc)
/*
* This function generates a map of which processor ID writes to which
* RAID. Note that this is for each processor in the list, not necessarily
* the same as the number of processors being used during the run. Each
* processor has an identical list.
*/
{
/* Allocate memory for the list */
pio_info->RDsk_List =
reinterpret_cast<int **>(array_alloc(__FILE__, __LINE__, 2, proc_info[0], 2, sizeof(int)));
if ((pio_info->RDsk_List) == nullptr) {
fmt::print(stderr, "{}: ERROR, insufficient memory\n", __func__);
exit(1);
}
/* Generate the list of disks to which data will be written */
if (pio_info->Dsk_List_Cnt <= 0) {
for (int iproc = 0; iproc < proc_info[0]; iproc++) {
int ctrl_id = (iproc % pio_info->Num_Dsk_Ctrlrs);
pio_info->RDsk_List[iproc][0] = ctrl_id + pio_info->PDsk_Add_Fact;
}
}
else {
for (int iproc = 0; iproc < proc_info[0]; iproc++) {
pio_info->RDsk_List[iproc][0] = pio_info->Dsk_List[iproc % pio_info->Dsk_List_Cnt];
}
}
/* Generate the list of processors on which info is stored */
for (int iproc = 0; iproc < proc_info[0]; iproc++) {
int proc_id = iproc;
while (proc_id >= nproc) {
proc_id -= nproc;
}
pio_info->RDsk_List[iproc][1] = proc_id;
}
}
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
std::string gen_par_filename(const std::string &scalar_fname, int proc_for, int nprocs)
/*----------------------------------------------------------------------------
*
* Author(s): Gary Hennigan (1421)
*----------------------------------------------------------------------------
* Function which generates the name of a parallel file for a
* particular processor. The function does this by appending
* "N.p" to the end of the input parameter "scalar_fname", where:
*
* N - The number of processors utilized
* p - The processor ID.
*
* In addition, the location of the parallel disk system is prepended
* to each file name.
*---------------------------------------------------------------------------
* Example:
*
* scalar_fname = "Parallel-exoII-" (Input)
* par_fname = "/raid/io_01/tmp/rf_crew/Parallel-exoII-8.0" (Output)
*
* where, for this example:
*
* N = 8 processors
* p = 0 particular processor ID
*---------------------------------------------------------------------------
* Revision History:
*
* 05 November 1993: Date of Creation
*---------------------------------------------------------------------------
*/
{
/*
* Find out the number of digits needed to specify the processor ID.
* This allows numbers like 01-99, i.e., prepending zeros to the
* name to preserve proper alphabetic sorting of the files.
*/
int iMaxDigit = 0;
int iMyDigit = 0;
int iTemp1 = nprocs;
do {
iTemp1 /= 10;
iMaxDigit++;
} while (iTemp1 >= 1);
iTemp1 = proc_for;
do {
iTemp1 /= 10;
iMyDigit++;
} while (iTemp1 >= 1);
/*
* Append the number of processors in this run to the scalar file name
* along with a '.' (period).
*/
std::string par_filename =
scalar_fname + std::string(".") + std::to_string(nprocs) + std::string(".");
/*
* Append the proper number of zeros to the filename.
*/
for (int i1 = 0; i1 < iMaxDigit - iMyDigit; i1++) {
par_filename += std::string("0");
}
/*
* Generate the name of the directory on which the parallel disk
* array resides. This also directs which processor writes to what
* disk.
*/
par_filename += std::to_string(proc_for);
/*
* Finally, generate the complete file specification for the parallel
* file used by this processor.
*/
if (PIO_Info.NoSubdirectory == 1) {
par_filename = PIO_Info.Par_Dsk_Root + PIO_Info.Par_Dsk_SubDirec + par_filename;
}
else {
if (PIO_Info.Zeros != 0) {
int ctrlID = PIO_Info.RDsk_List[proc_for][0];
if (ctrlID <= 9) {
par_filename = PIO_Info.Par_Dsk_Root + "0" + std::to_string(ctrlID) + "/" +
PIO_Info.Par_Dsk_SubDirec + par_filename;
}
else {
par_filename = PIO_Info.Par_Dsk_Root + std::to_string(ctrlID) + "/" +
PIO_Info.Par_Dsk_SubDirec + par_filename;
}
}
else {
int ctrlID = PIO_Info.RDsk_List[proc_for][0];
par_filename = PIO_Info.Par_Dsk_Root + std::to_string(ctrlID) + "/" +
PIO_Info.Par_Dsk_SubDirec + par_filename;
}
}
if (Debug_Flag >= 4) {
fmt::print("Parallel file name: {}\n", par_filename);
}
return par_filename;
}