diff --git a/src/serac/physics/base_physics.cpp b/src/serac/physics/base_physics.cpp index aa2d7bb35..aca90b8dc 100644 --- a/src/serac/physics/base_physics.cpp +++ b/src/serac/physics/base_physics.cpp @@ -331,7 +331,7 @@ void BasePhysics::saveSummary(axom::sidre::DataStore& datastore, const double t) } } -FiniteElementState BasePhysics::loadCheckpointedState(const std::string& state_name, int cycle) const +FiniteElementState BasePhysics::loadCheckpointedState(const std::string& state_name, int cycle) { if (checkpoint_to_disk_) { // See if the requested cycle has been checkpointed previously @@ -356,16 +356,21 @@ FiniteElementState BasePhysics::loadCheckpointedState(const std::string& state_n return checkpoint_states_.at(state_name)[static_cast(cycle)]; } -std::unordered_map BasePhysics::getCheckpointedStates(int cycle_to_load) const +void BasePhysics::loadCheckpointedStatesFromDisk(int cycle_to_load) +{ + std::vector previous_states_ptrs; + for (const auto& state_name : stateNames()) { + previous_states_ptrs.emplace_back(const_cast(&state(state_name))); + } + StateManager::loadCheckpointedStates(cycle_to_load, previous_states_ptrs); +} + +std::unordered_map BasePhysics::getCheckpointedStates(int cycle_to_load) { std::unordered_map previous_states_map; - std::vector previous_states_ptrs; if (checkpoint_to_disk_) { - for (const auto& state_name : stateNames()) { - previous_states_ptrs.emplace_back(const_cast(&state(state_name))); - } - StateManager::loadCheckpointedStates(cycle_to_load, previous_states_ptrs); + loadCheckpointedStatesFromDisk(cycle_to_load); for (const auto& state_name : stateNames()) { previous_states_map.emplace(state_name, state(state_name)); } diff --git a/src/serac/physics/base_physics.hpp b/src/serac/physics/base_physics.hpp index 3d15c57ec..7f6d51158 100644 --- a/src/serac/physics/base_physics.hpp +++ b/src/serac/physics/base_physics.hpp @@ -396,6 +396,13 @@ class BasePhysics { */ virtual void outputStateToDisk(std::optional paraview_output_dir = {}) const; + /** + * @brief load checkpointed states from disk into states array + * + * @param cycle The cycle to retrieve state from + */ + void loadCheckpointedStatesFromDisk(int cycle); + /** * @brief Accessor for getting a single named finite element state primal solution from the physics modules at a given * checkpointed cycle index @@ -404,7 +411,7 @@ class BasePhysics { * @param cycle The cycle to retrieve state from * @return The named primal Finite Element State */ - FiniteElementState loadCheckpointedState(const std::string& state_name, int cycle) const; + FiniteElementState loadCheckpointedState(const std::string& state_name, int cycle); /** * @brief Accessor for getting a single named finite element dual solution from the physics modules at a given @@ -415,7 +422,7 @@ class BasePhysics { * @return The named Finite Element Dual */ virtual FiniteElementDual loadCheckpointedDual([[maybe_unused]] const std::string& state_name, - [[maybe_unused]] int cycle) const + [[maybe_unused]] int cycle) { SLIC_ERROR_ROOT(axom::fmt::format("loadCheckpointedDual not enabled in physics module {}", name_)); return *duals_[0]; @@ -486,7 +493,7 @@ class BasePhysics { * @param cycle The cycle to retrieve state from * @return A map containing the primal field names and their associated FiniteElementStates at the requested cycle */ - std::unordered_map getCheckpointedStates(int cycle) const; + std::unordered_map getCheckpointedStates(int cycle); /// @brief Name of the physics module std::string name_ = {}; diff --git a/src/serac/physics/solid_mechanics.hpp b/src/serac/physics/solid_mechanics.hpp index 33b19bdbe..973e7c1c6 100644 --- a/src/serac/physics/solid_mechanics.hpp +++ b/src/serac/physics/solid_mechanics.hpp @@ -762,7 +762,7 @@ class SolidMechanics, std::integer_se } /// @overload - FiniteElementDual loadCheckpointedDual(const std::string& dual_name, int cycle) const override + FiniteElementDual loadCheckpointedDual(const std::string& dual_name, int cycle) override { if (dual_name == "reactions") { auto checkpointed_sol = getCheckpointedStates(cycle);