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;
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>
62 const std::string &base_name,
65 unsigned int &output_cycle,
66 const MPI_Comm &mpi_communicator)
68 if constexpr (have_distributed_triangulation<dim>) {
69 const auto &dof_handler = offline_data.
dof_handler();
76 std::array<scalar_type, n_comp> state_vector;
77 for (
auto &it : state_vector) {
78 it.reinit(scalar_partitioner);
84 dealii::parallel::distributed::SolutionTransfer<dim, scalar_type>
85 solution_transfer(dof_handler);
87 std::vector<scalar_type *> ptr_state;
88 std::transform(state_vector.begin(),
90 std::back_inserter(ptr_state),
91 [](
auto &it) { return ⁢ });
93 solution_transfer.deserialize(ptr_state);
96 for (
auto &it : state_vector) {
99 U.update_ghost_values();
103 std::string name = base_name +
"-checkpoint";
105 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0) {
106 std::string meta = name +
".metadata";
108 std::ifstream file(meta, std::ios::binary);
109 boost::archive::binary_iarchive ia(file);
110 ia >> t >> output_cycle;
114 if constexpr (std::is_same_v<Number, double>)
115 ierr = MPI_Bcast(&t, 1, MPI_DOUBLE, 0, mpi_communicator);
117 ierr = MPI_Bcast(&t, 1, MPI_FLOAT, 0, mpi_communicator);
118 AssertThrowMPI(ierr);
120 ierr = MPI_Bcast(&output_cycle, 1, MPI_UNSIGNED, 0, mpi_communicator);
121 AssertThrowMPI(ierr);
123 ierr = MPI_Barrier(mpi_communicator);
124 AssertThrowMPI(ierr);
127 AssertThrow(
false, dealii::ExcNotImplemented());
143 template <
int dim,
typename Number,
int n_comp,
int simd_length>
146 const std::string &base_name,
149 const unsigned int output_cycle,
150 const MPI_Comm &mpi_communicator)
152 if constexpr (have_distributed_triangulation<dim>) {
153 const auto &triangulation =
155 const auto &dof_handler = offline_data.
dof_handler();
162 std::array<scalar_type, n_comp> state_vector;
164 for (
auto &it : state_vector) {
165 it.reinit(scalar_partitioner);
171 dealii::parallel::distributed::SolutionTransfer<dim, scalar_type>
172 solution_transfer(dof_handler);
174 std::vector<const scalar_type *> ptr_state;
175 std::transform(state_vector.begin(),
177 std::back_inserter(ptr_state),
178 [](
auto &it) { return ⁢ });
179 solution_transfer.prepare_for_serialization(ptr_state);
181 std::string name = base_name +
"-checkpoint";
183 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0) {
184 for (
const std::string suffix :
185 {
".mesh",
".mesh_fixed.data",
".mesh.info",
".metadata"})
186 if (std::filesystem::exists(name + suffix))
187 std::filesystem::rename(name + suffix, name + suffix +
"~");
190 triangulation.save(name +
".mesh");
194 if (dealii::Utilities::MPI::this_mpi_process(mpi_communicator) == 0) {
195 std::string meta = name +
".metadata";
196 std::ofstream file(meta, std::ios::binary | std::ios::trunc);
197 boost::archive::binary_oarchive oa(file);
198 oa << t << output_cycle;
201 const int ierr = MPI_Barrier(mpi_communicator);
202 AssertThrowMPI(ierr);
205 AssertThrow(
false, dealii::ExcNotImplemented());
auto & triangulation() const
void insert_component(const scalar_type &scalar_vector, unsigned int component)
void extract_component(scalar_type &scalar_vector, unsigned int component) const
auto & dof_handler() const
const auto & scalar_partitioner() const
auto & discretization() const
void write_checkpoint(const OfflineData< dim, Number > &offline_data, const std::string &base_name, const MultiComponentVector< Number, n_comp, simd_length > &U, const Number t, const unsigned int output_cycle, const MPI_Comm &mpi_communicator)
void load_mesh(Discretization< dim > &discretization, const std::string &base_name)
void load_state_vector(const OfflineData< dim, Number > &offline_data, const std::string &base_name, MultiComponentVector< Number, n_comp, simd_length > &U, Number &t, unsigned int &output_cycle, const MPI_Comm &mpi_communicator)
constexpr bool have_distributed_triangulation