11#include <deal.II/base/utilities.h>
12#include <deal.II/distributed/solution_transfer.h>
14#include <boost/archive/binary_iarchive.hpp>
15#include <boost/archive/binary_oarchive.hpp>
16#include <boost/core/demangle.hpp>
24 namespace Checkpointing
28 std::is_same<typename Discretization<dim>::Triangulation,
29 dealii::parallel::distributed::Triangulation<dim>>::value;
40 const std::string &base_name)
42 if constexpr (have_distributed_triangulation<dim>) {
43 discretization.refinement() = 0;
44 discretization.
prepare(base_name);
45 discretization.
triangulation().load(base_name +
"-checkpoint.mesh");
47 AssertThrow(
false, dealii::ExcNotImplemented());
60 template <
int dim,
typename Number,
int n_comp,
int simd_length>
63 const std::string &base_name,
66 unsigned int &output_cycle,
67 const MPI_Comm &mpi_communicator)
69 if constexpr (have_distributed_triangulation<dim>) {
70 const auto &dof_handler = offline_data.
dof_handler();
77 std::array<ScalarVector, n_comp> state_vector;
78 for (
auto &it : state_vector) {
79 it.reinit(scalar_partitioner);
85 dealii::parallel::distributed::SolutionTransfer<dim, ScalarVector>
86 solution_transfer(dof_handler);
88 std::vector<ScalarVector *> ptr_state;
89 std::transform(state_vector.begin(),
91 std::back_inserter(ptr_state),
92 [](
auto &it) { return ⁢ });
94 solution_transfer.deserialize(ptr_state);
97 for (
auto &it : state_vector) {
100 U.update_ghost_values();
104 std::string name = base_name +
"-checkpoint";
106 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0) {
107 std::string meta = name +
".metadata";
109 std::ifstream file(meta, std::ios::binary);
110 boost::archive::binary_iarchive ia(file);
111 ia >> t >> output_cycle;
115 if constexpr (std::is_same_v<Number, double>)
116 ierr = MPI_Bcast(&t, 1, MPI_DOUBLE, 0, mpi_communicator);
118 ierr = MPI_Bcast(&t, 1, MPI_FLOAT, 0, mpi_communicator);
119 AssertThrowMPI(ierr);
121 ierr = MPI_Bcast(&output_cycle, 1, MPI_UNSIGNED, 0, mpi_communicator);
122 AssertThrowMPI(ierr);
124 ierr = MPI_Barrier(mpi_communicator);
125 AssertThrowMPI(ierr);
128 AssertThrow(
false, dealii::ExcNotImplemented());
144 template <
int dim,
typename Number,
int n_comp,
int simd_length>
147 const std::string &base_name,
150 const unsigned int output_cycle,
151 const MPI_Comm &mpi_communicator)
153 if constexpr (have_distributed_triangulation<dim>) {
154 const auto &triangulation =
156 const auto &dof_handler = offline_data.
dof_handler();
163 std::array<ScalarVector, n_comp> state_vector;
165 for (
auto &it : state_vector) {
166 it.reinit(scalar_partitioner);
172 dealii::parallel::distributed::SolutionTransfer<dim, ScalarVector>
173 solution_transfer(dof_handler);
175 std::vector<const ScalarVector *> ptr_state;
176 std::transform(state_vector.begin(),
178 std::back_inserter(ptr_state),
179 [](
auto &it) { return ⁢ });
180 solution_transfer.prepare_for_serialization(ptr_state);
182 std::string name = base_name +
"-checkpoint";
184 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0) {
185 for (
const std::string suffix :
186 {
".mesh",
".mesh_fixed.data",
".mesh.info",
".metadata"})
187 if (std::filesystem::exists(name + suffix))
188 std::filesystem::rename(name + suffix, name + suffix +
"~");
191 triangulation.save(name +
".mesh");
195 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0) {
196 std::string meta = name +
".metadata";
197 std::ofstream file(meta, std::ios::binary | std::ios::trunc);
198 boost::archive::binary_oarchive oa(file);
199 oa << t << output_cycle;
202 const int ierr = MPI_Barrier(mpi_communicator);
203 AssertThrowMPI(ierr);
206 AssertThrow(
false, dealii::ExcNotImplemented());
auto & triangulation() const
void prepare(const std::string &base_name)
auto & dof_handler() const
const auto & scalar_partitioner() const
auto & discretization() const
void extract_component(ScalarVector &scalar_vector, unsigned int component) const
void insert_component(const ScalarVector &scalar_vector, unsigned int component)
void load_state_vector(const OfflineData< dim, Number > &offline_data, const std::string &base_name, Vectors::MultiComponentVector< Number, n_comp, simd_length > &U, Number &t, unsigned int &output_cycle, const MPI_Comm &mpi_communicator)
void load_mesh(Discretization< dim > &discretization, const std::string &base_name)
void write_checkpoint(const OfflineData< dim, Number > &offline_data, const std::string &base_name, const Vectors::MultiComponentVector< Number, n_comp, simd_length > &U, const Number t, const unsigned int output_cycle, const MPI_Comm &mpi_communicator)
constexpr bool have_distributed_triangulation
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector