24#ifdef ESPRESSO_WALBERLA
36#include <boost/mpi.hpp>
37#include <boost/mpi/collectives/all_reduce.hpp>
38#include <boost/mpi/collectives/broadcast.hpp>
51 std::shared_ptr<::walberla::PoissonSolver> m_instance;
52 std::shared_ptr<LatticeWalberla> m_lattice;
54 bool m_single_precision;
68 m_instance = make_new_instance(m_lattice->lattice(), m_single_precision);
74 if (
method ==
"save_checkpoint") {
77 save_checkpoint(path,
mode);
80 if (
method ==
"load_checkpoint") {
83 load_checkpoint(path,
mode);
101 [
this]() {
return m_single_precision; }},
105 [
this]() {
return m_instance->get_lattice().get_grid_dimensions(); }},
109 [[
nodiscard]] std::shared_ptr<::walberla::PoissonSolver>
115 void load_checkpoint(std::filesystem::path
const &path,
int mode) {
116 auto &solver = *m_instance;
120 solver.get_lattice().get_grid_dimensions();
124 std::stringstream message;
125 message <<
"grid dimensions mismatch, read [" <<
read_grid_size <<
"], "
127 throw std::runtime_error(message.str());
132 auto const grid_size = solver.get_lattice().get_grid_dimensions();
136 for (
int i = 0; i <
i_max; i++) {
138 for (
int k = 0; k <
k_max; k++) {
142 static_cast<void>(solver.set_node_potential(ind,
potential));
153 void save_checkpoint(std::filesystem::path
const &path,
int mode) {
154 auto &solver = *m_instance;
159 auto const grid_size = solver.get_lattice().get_grid_dimensions();
166 auto const on_failure = [](std::shared_ptr<CheckpointFile>
const &,
179 return solver.get_node_potential(ind);
182 auto failure =
false;
187 auto const grid_size = solver.get_lattice().get_grid_dimensions();
192 for (
int i = 0; i <
i_max; i++) {
194 for (
int k = 0; k <
k_max; k++) {
198 assert(1 == boost::mpi::all_reduce(comm,
199 static_cast<int>(!!result),
201 "Incorrect number of return values");
207 comm.recv(boost::mpi::any_source, 42,
cpnode);
210 boost::mpi::broadcast(comm, failure, 0);
213 comm.send(0, 42, *result);
215 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)
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)
T get_value(Variant const &v)
Extract value of specific type T from a Variant.
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.