Skip to content

Commit

Permalink
DTIO: Split files into individual classes
Browse files Browse the repository at this point in the history
tokusanya committed Oct 16, 2024
1 parent 5eb0fb5 commit 4626efd
Showing 16 changed files with 971 additions and 745 deletions.
1 change: 1 addition & 0 deletions packages/seacas/libraries/ioss/src/Ioss_ChangeSet.C
Original file line number Diff line number Diff line change
@@ -22,6 +22,7 @@
#include <fmt/ostream.h>

#include <assert.h>
#include <iomanip>

namespace {
int file_exists(const Ioss::ParallelUtils &util, const std::string &filename,
268 changes: 0 additions & 268 deletions packages/seacas/libraries/ioss/src/Ioss_DynamicTopology.h
Original file line number Diff line number Diff line change
@@ -6,23 +6,7 @@

#pragma once

#include "Ioss_CodeTypes.h"
#include "Ioss_DBUsage.h"
#include "Ioss_DatabaseIO.h" // for DatabaseIO
#include "Ioss_ParallelUtils.h" // for ParallelUtils
#include "Ioss_PropertyManager.h" // for PropertyManager
#include "Ioss_Utils.h"
#include "ioss_export.h"

#include <cstddef> // for size_t, nullptr
#include <cstdint> // for int64_t
#include <iomanip>
#include <sstream>
#include <string> // for string, operator<

namespace Ioss {
class Region;
class DynamicTopologyNotifier;

/*! The TopologyModified enumeration is used as an argument to the
* topology_modified() functions in io to
@@ -61,256 +45,4 @@ namespace Ioss {

enum class FileControlOption { CONTROL_NONE, CONTROL_AUTO_MULTI_FILE, CONTROL_AUTO_GROUP_FILE };

class IOSS_EXPORT DynamicTopologyObserver
{
public:
DynamicTopologyObserver(Region *region) : m_region(region) {}

virtual ~DynamicTopologyObserver() {}

virtual void reset_topology_modification_all();
virtual void reset_topology_modification();
virtual void set_topology_modification(unsigned int type);
virtual void sync_topology_modification(unsigned int modFlag, unsigned int cumulativeModFlag);
virtual unsigned int get_topology_modification() const;

virtual unsigned int get_cumulative_topology_modification() const;
virtual void set_cumulative_topology_modification(unsigned int type);

int get_cumulative_topology_modification_field();

virtual bool is_topology_modified() const;
virtual bool is_automatic_restart() const { return m_automaticRestart; }
virtual bool is_restart_requested() const { return m_restartRequested; }

void set_automatic_restart(bool flag) { m_automaticRestart = flag; }
void set_restart_requested(bool flag) { m_restartRequested = flag; }

static const std::string topology_modification_change_name()
{
return std::string("CUMULATIVE_TOPOLOGY_MODIFICATION");
}

void register_region(Region *region);
Region *get_region() const { return m_region; }

void register_notifier(DynamicTopologyNotifier *notifier);
DynamicTopologyNotifier *get_notifier() const { return m_notifier; }

virtual void define_model();
virtual void write_model();
virtual void define_transient();

virtual FileControlOption get_control_option() const { return FileControlOption::CONTROL_NONE; }

virtual bool needs_new_output_file() const;

protected:
Region *m_region{nullptr};
unsigned int m_topologyModification{TOPOLOGY_SAME};
unsigned int m_cumulativeTopologyModification{TOPOLOGY_SAME};

bool m_automaticRestart{false};
bool m_restartRequested{false};

DynamicTopologyNotifier *m_notifier{nullptr};

void verify_region_is_registered() const;
IOSS_NODISCARD const ParallelUtils &util() const;
void synchronize_topology_modified_flags();

void set_topology_modification_nl(unsigned int type);

private:
DynamicTopologyObserver();
};

class IOSS_EXPORT DynamicTopologyNotifier
{
public:
DynamicTopologyNotifier(const std::string &model_name) : m_modelName(model_name) {}

virtual ~DynamicTopologyNotifier() = default;

std::string name() const { return m_modelName; }

std::vector<std::shared_ptr<DynamicTopologyObserver>> get_observers() const
{
return m_observers;
}

void register_observer(std::shared_ptr<DynamicTopologyObserver> observer);

void unregister_observer(std::shared_ptr<DynamicTopologyObserver> observer);

void reset_topology_modification();

void set_topology_modification(unsigned int type);

template <typename ObserverType> bool has_observer_type() const
{
bool found = false;

for (const std::shared_ptr<DynamicTopologyObserver> &observer : m_observers) {
if (dynamic_cast<const ObserverType *>(observer.get()) != nullptr) {
found = true;
break;
}
}
return found;
}

template <typename ObserverType>
std::vector<std::shared_ptr<ObserverType>> get_observer_type() const
{
std::vector<std::shared_ptr<ObserverType>> typed_observers;

for (const std::shared_ptr<DynamicTopologyObserver> &observer : m_observers) {
ObserverType *typed_observer = dynamic_cast<ObserverType *>(observer.get());
if (typed_observer != nullptr) {
typed_observers.push_back(std::dynamic_pointer_cast<ObserverType>(observer));
}
}

return typed_observers;
}

private:
const std::string m_modelName;
std::vector<std::shared_ptr<DynamicTopologyObserver>> m_observers;
};

class IOSS_EXPORT DynamicTopologyBroker
{
public:
static DynamicTopologyBroker *broker();

void register_model(const std::string &model_name);
void remove_model(const std::string &model_name);
void clear_models();

std::shared_ptr<DynamicTopologyNotifier> get_notifier(const std::string &model_name) const;
std::vector<std::shared_ptr<DynamicTopologyObserver>>
get_observers(const std::string &model_name) const;

void register_observer(const std::string &model_name,
std::shared_ptr<DynamicTopologyObserver> observer);
void register_observer(const std::string &model_name,
std::shared_ptr<DynamicTopologyObserver> observer, Region &region);

void reset_topology_modification(const std::string &model_name);
void set_topology_modification(const std::string &model_name, unsigned int type);

private:
DynamicTopologyBroker() {};
DynamicTopologyBroker(DynamicTopologyBroker &);

std::map<std::string, std::shared_ptr<DynamicTopologyNotifier>> m_notifiers;
};

class IOSS_EXPORT DynamicTopologyFileControl
{
public:
DynamicTopologyFileControl(Region *region);

void clone_and_replace_output_database(int steps = 0);
void add_output_database_change_set(int steps = 0);

static std::string change_set_prefix() { return "IOSS_FILE_GROUP-"; }

DatabaseIO *get_database() const;

static std::string get_cyclic_database_filename(const std::string &baseFileName,
unsigned int fileCyclicCount,
unsigned int step);

static std::string get_linear_database_filename(const std::string &baseFileName,
unsigned int step);

static std::string get_internal_file_change_set_name(unsigned int step);

unsigned int get_topology_change_count() const { return m_dbChangeCount; }
unsigned int get_file_cyclic_count() const { return m_fileCyclicCount; }
IfDatabaseExistsBehavior get_if_database_exists_behavior() const { return m_ifDatabaseExists; }

private:
Region *m_region{nullptr};
std::string m_ioDB;
std::string m_dbType;

PropertyManager m_properties;

unsigned int m_fileCyclicCount;
IfDatabaseExistsBehavior m_ifDatabaseExists;
unsigned int m_dbChangeCount;

IOSS_NODISCARD const ParallelUtils &util() const;

std::string get_unique_linear_filename(DatabaseUsage db_usage);
std::string construct_database_filename(int &step, DatabaseUsage db_usage);
bool file_exists(const std::string &filename, const std::string &db_type,
DatabaseUsage db_usage);
bool abort_if_exists(const std::string &filename, const std::string &db_type,
DatabaseUsage db_usage);

DatabaseIO *clone_output_database(int steps);
bool replace_output_database(DatabaseIO *db);
};

class IOSS_EXPORT DynamicTopologyStateLocator
{
public:
DynamicTopologyStateLocator(Region *region, bool loadAllFiles = true);
DynamicTopologyStateLocator(Ioss::DatabaseIO *db, const std::string &dbName,
const std::string &dbType, unsigned fileCyclicCount = 0,
bool loadAllFiles = true);
DynamicTopologyStateLocator(Ioss::DatabaseIO *db, unsigned fileCyclicCount = 0,
bool loadAllFiles = true);

virtual ~DynamicTopologyStateLocator();
DynamicTopologyStateLocator() = delete;
DynamicTopologyStateLocator(const DynamicTopologyStateLocator &) = delete;

DatabaseIO *get_database() const;

std::tuple<std::string, int, double> locate_db_state(double targetTime) const;
std::tuple<std::string, int, double> get_db_min_time() const;
std::tuple<std::string, int, double> get_db_max_time() const;

private:
struct DatabaseState
{
DatabaseState(Ioss::DatabaseIO *db)
{
if (!db->supports_internal_change_set()) {
changeSet = db->get_filename();
}
}

std::string changeSet{"/"};
int state{-1};
double time{-std::numeric_limits<double>::max()};
};

using StateLocatorCompare = std::function<bool(double, double)>;

void locate_state_impl(Ioss::DatabaseIO *db, double targetTime, StateLocatorCompare comparator,
DatabaseState &loc) const;

void locate_state(Ioss::DatabaseIO *db, double targetTime, DatabaseState &loc) const;

void locate_db_state_impl(double targetTime, DatabaseState &loc) const;

void get_db_time_impl(double init_time, StateLocatorCompare comparator,
DatabaseState &loc) const;

IOSS_NODISCARD const ParallelUtils &util() const;

Ioss::DatabaseIO *m_database{nullptr};
std::string m_ioDB;
std::string m_dbType;
unsigned m_fileCyclicCount{0};
bool m_loadAllFiles{true};
};

} // namespace Ioss
Loading

0 comments on commit 4626efd

Please sign in to comment.