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.
 
 
 
 
 
 

210 lines
6.0 KiB

// 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 "CJ_CodeTypes.h" // for StringIdVector, etc
#include "CJ_ExodusFile.h"
#include "CJ_SystemInterface.h"
#include "open_file_limit.h"
#include "smart_assert.h"
#include <climits>
#include <cstdlib>
#include <fmt/ostream.h>
#include <iomanip>
#include <iostream>
#include <string>
#include <exodusII.h>
std::vector<int> Excn::ExodusFile::fileids_;
std::vector<std::string> Excn::ExodusFile::filenames_;
int Excn::ExodusFile::outputId_ = -1;
int Excn::ExodusFile::ioWordSize_ = 0;
int Excn::ExodusFile::cpuWordSize_ = 0;
std::string Excn::ExodusFile::outputFilename_;
bool Excn::ExodusFile::keepOpen_ = false;
int Excn::ExodusFile::maximumNameLength_ = 32;
int Excn::ExodusFile::exodusMode_ = 0;
Excn::ExodusFile::ExodusFile(size_t which) : myLocation_(which)
{
SMART_ASSERT(which < filenames_.size())(which)(filenames_.size());
SMART_ASSERT(fileids_.size() == filenames_.size());
if (!keepOpen_ && which != 0) {
float version = 0.0;
int cpu_word_size = cpuWordSize_;
int io_wrd_size = ioWordSize_;
SMART_ASSERT(fileids_[which] == -1)(which)(fileids_[which]);
fileids_[which] = ex_open(filenames_[which].c_str(), EX_READ | exodusMode_, &cpu_word_size,
&io_wrd_size, &version);
if (fileids_[which] < 0) {
fmt::print(stderr, "ERROR: Cannot open file '{}' - exiting\n", filenames_[which]);
exit(1);
}
ex_set_max_name_length(fileids_[which], maximumNameLength_);
SMART_ASSERT(io_wrd_size == ioWordSize_);
SMART_ASSERT(cpu_word_size == cpuWordSize_);
}
}
int Excn::ExodusFile::output()
{
SMART_ASSERT(outputId_ >= 0);
return outputId_;
}
Excn::ExodusFile::operator int() const
{
SMART_ASSERT(fileids_[myLocation_] >= 0);
return fileids_[myLocation_];
}
Excn::ExodusFile::~ExodusFile()
{
try {
if (!keepOpen_ && myLocation_ != 0) {
SMART_ASSERT(fileids_[myLocation_] > 0)(myLocation_)(fileids_[myLocation_]);
ex_close(fileids_[myLocation_]);
fileids_[myLocation_] = -1;
}
}
catch (...) {
}
}
void Excn::ExodusFile::close_all()
{
for (auto &elem : fileids_) {
if (elem > 0) {
ex_close(elem);
}
elem = -1;
}
ex_close(outputId_);
outputId_ = -1;
}
bool Excn::ExodusFile::initialize(const SystemInterface &si)
{
// See if we can keep files open
size_t max_files = open_file_limit() - 1; // We also have an output exodus file...
if (si.inputFiles_.size() <= max_files) {
keepOpen_ = true;
if ((si.debug() & 1) != 0) {
fmt::print("Files kept open... (Max open = {})\n\n", max_files);
}
}
else {
keepOpen_ = false;
fmt::print("Single file mode... (Max open = {})\n\n", max_files);
}
float version = 0.0;
// create exo names
filenames_.resize(si.inputFiles_.size());
fileids_.resize(si.inputFiles_.size(), -1);
int overall_max_name_length = 32;
for (size_t p = 0; p < si.inputFiles_.size(); p++) {
std::string name = si.inputFiles_[p];
filenames_[p] = name;
if (p == 0) {
int cpu_word_size = sizeof(float);
int io_wrd_size = 0;
int exoid = ex_open(filenames_[p].c_str(), EX_READ, &cpu_word_size, &io_wrd_size, &version);
if (exoid < 0) {
fmt::print(stderr, "ERROR: Cannot open file '{}'\n", filenames_[p]);
return false;
}
int name_length = ex_inquire_int(exoid, EX_INQ_DB_MAX_USED_NAME_LENGTH);
if (name_length > overall_max_name_length) {
overall_max_name_length = name_length;
}
ex_close(exoid);
if (io_wrd_size < static_cast<int>(sizeof(float))) {
io_wrd_size = sizeof(float);
}
ioWordSize_ = io_wrd_size;
cpuWordSize_ = io_wrd_size;
if ((ex_int64_status(exoid & EX_ALL_INT64_DB) != 0) || si.ints_64_bit()) {
exodusMode_ = EX_ALL_INT64_API;
}
}
if (keepOpen_ || p == 0) {
int io_wrd_size = 0;
int mode = EX_READ | exodusMode_;
fileids_[p] = ex_open(filenames_[p].c_str(), mode, &cpuWordSize_, &io_wrd_size, &version);
if (fileids_[p] < 0) {
fmt::print(stderr, "ERROR: Cannot open file '{}'\n", filenames_[p]);
return false;
}
SMART_ASSERT(ioWordSize_ == io_wrd_size)(ioWordSize_)(io_wrd_size);
}
fmt::print("Part {}: '{}'\n", p + 1, name);
}
maximumNameLength_ = overall_max_name_length;
if (keepOpen_) {
for (size_t p = 0; p < si.inputFiles_.size(); p++) {
ex_set_max_name_length(fileids_[p], maximumNameLength_);
}
}
else {
ex_set_max_name_length(fileids_[0], maximumNameLength_);
}
return true;
}
bool Excn::ExodusFile::create_output(const SystemInterface &si)
// Create output file...
{
outputFilename_ = si.outputName_;
int mode = EX_CLOBBER | exodusMode_;
if (si.ints_64_bit()) {
mode |= EX_ALL_INT64_DB;
}
if (si.compress_data() > 0 || si.use_netcdf4() || si.szip()) {
mode |= EX_NETCDF4;
}
fmt::print("Output: '{}'\n", outputFilename_);
outputId_ = ex_create(outputFilename_.c_str(), mode, &cpuWordSize_, &ioWordSize_);
if (outputId_ < 0) {
fmt::print(stderr, "ERROR: Cannot open file '{}'\n", outputFilename_);
return false;
}
if (si.compress_data() > 0) {
ex_set_option(outputId_, EX_OPT_COMPRESSION_LEVEL, si.compress_data());
ex_set_option(outputId_, EX_OPT_COMPRESSION_SHUFFLE, 1);
if (si.szip()) {
ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_SZIP);
}
else if (si.zlib()) {
ex_set_option(outputId_, EX_OPT_COMPRESSION_TYPE, EX_COMPRESS_ZLIB);
}
}
fmt::print("IO Word size is {} bytes.\n", ioWordSize_);
ex_set_max_name_length(outputId_, maximumNameLength_);
return true;
}