24#ifdef ESPRESSO_WALBERLA
36#include <boost/mpi.hpp>
37#include <boost/mpi/collectives/all_reduce.hpp>
38#include <boost/mpi/collectives/broadcast.hpp>
52 bool m_single_precision;
72 if (
method ==
"save_checkpoint") {
75 save_checkpoint(path,
mode);
78 if (
method ==
"load_checkpoint") {
81 load_checkpoint(path,
mode);
106 [
this]() {
return m_single_precision; }},
110 [
this]() {
return m_instance->get_lattice().get_grid_dimensions(); }},
116 [[
nodiscard]] std::shared_ptr<::walberla::PoissonSolver>
122 void load_checkpoint(std::filesystem::path
const &path,
int mode) {
127 solver.get_lattice().get_grid_dimensions();
131 std::stringstream message;
132 message <<
"grid dimensions mismatch, read [" <<
read_grid_size <<
"], "
134 throw std::runtime_error(message.str());
139 auto const grid_size = solver.get_lattice().get_grid_dimensions();
143 for (
int i = 0; i <
i_max; i++) {
145 for (
int k = 0; k <
k_max; k++) {
149 static_cast<void>(solver.set_node_potential(ind,
potential));
160 void save_checkpoint(std::filesystem::path
const &path,
int mode) {
166 auto const grid_size = solver.get_lattice().get_grid_dimensions();
173 auto const on_failure = [](std::shared_ptr<CheckpointFile>
const &,
186 return solver.get_node_potential(ind);
189 auto failure =
false;
194 auto const grid_size = solver.get_lattice().get_grid_dimensions();
199 for (
int i = 0; i <
i_max; i++) {
201 for (
int k = 0; k <
k_max; k++) {
205 assert(1 == boost::mpi::all_reduce(comm,
206 static_cast<int>(!!result),
208 "Incorrect number of return values");
214 comm.recv(boost::mpi::any_source, 42,
cpnode);
217 boost::mpi::broadcast(comm, failure, 0);
220 comm.send(0, 42, *result);
222 boost::mpi::broadcast(comm, failure, 0);
void add_parameters(std::vector< AutoParameter > &¶ms)
virtual bool is_head_node() const =0
virtual boost::mpi::communicator const & get_comm() const =0
virtual Variant do_call_method(const std::string &, const VariantMap &)
Local implementation of call_method.
Context * context() const
Responsible context.
Handle for a checkpoint file.
Variant do_call_method(std::string const &method, VariantMap const ¶meters) override
void do_construct(VariantMap const &args) override
void make_instance(VariantMap const &args) override
std::shared_ptr<::walberla::PoissonSolver > get_instance() const noexcept override
void set_potential_conversion(double agrid, double tau)
::LatticeModel::units_map get_lattice_to_md_units_conversion() const override
std::shared_ptr< ::walberla::PoissonSolver > m_instance
auto serialize_vtk_writers() const
std::vector< std::shared_ptr< EKPoissonVTKHandle > > m_vtk_writers
std::shared_ptr< LatticeWalberla > m_lattice
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
void check_features(std::vector< std::string > const &features)
void save_checkpoint_common(Context const &context, std::string const classname, std::filesystem::path const &path, int mode, F1 const write_metadata, F2 const write_data, F3 const on_failure)
void unit_test_handle(int mode)
Inject code for unit tests.
void load_checkpoint_common(Context const &context, std::string const classname, std::filesystem::path const &path, int mode, F1 const read_metadata, F2 const read_data, F3 const on_success)
std::unordered_map< std::string, Variant > VariantMap
std::shared_ptr< walberla::PoissonSolver > new_ek_poisson_none(std::shared_ptr< LatticeWalberla > const &lattice, bool single_precision)
std::shared_ptr< walberla::PoissonSolver > new_ek_poisson_none_cuda(std::shared_ptr< LatticeWalberla > const &lattice, bool single_precision)
static constexpr const ReadOnly read_only
Recursive variant implementation.