20#include <pybind11/functional.h>
24 template<
class Tvec,
class Tgr
idVec>
25 void add_instance(py::module &m, std::string name_config, std::string name_model) {
27 using Tscal = shambase::VecComponent<Tvec>;
28 using Tgridscal = shambase::VecComponent<TgridVec>;
30 using T = Model<Tvec, TgridVec>;
31 using TConfig =
typename T::Solver::Config;
34 shamlog_debug_ln(
"[Py]",
"registering class :", name_config,
typeid(T).name());
35 shamlog_debug_ln(
"[Py]",
"registering class :", name_model,
typeid(T).name());
37 py::class_<TConfig>(m, name_config.c_str())
40 [](TConfig &self, Tscal scale_factor) {
41 self.grid_coord_to_pos_fact = scale_factor;
45 [](TConfig &self, Tscal eos_gamma) {
46 self.set_eos_gamma(eos_gamma);
49 "set_consistent_transport",
50 [](TConfig &self,
bool enable) {
51 self.use_consistent_transport = enable;
55 [](TConfig &self,
bool enable) {
56 self.use_van_leer = enable;
59 "set_scheduler_config",
60 [](TConfig &self,
u64 split_crit,
u64 merge_crit) {
61 self.scheduler_conf.split_load_value = split_crit;
62 self.scheduler_conf.merge_load_value = merge_crit;
65 py::arg(
"split_load_value"),
66 py::arg(
"merge_load_value"));
68 std::string sod_tube_analysis_name = name_model +
"_AnalysisSodTube";
69 py::class_<TAnalysisSodTube>(m, sod_tube_analysis_name.c_str())
70 .def(
"compute_L2_dist", [](TAnalysisSodTube &self) -> std::tuple<Tscal, Tvec, Tscal> {
71 auto ret = self.compute_L2_dist();
72 return {ret.rho, ret.v, ret.P};
74 py::class_<T>(m, name_model.c_str())
75 .def(
"init", &T::init)
76 .def(
"init_scheduler", &T::init_scheduler)
77 .def(
"make_base_grid", &T::make_base_grid)
78 .def(
"dump_vtk", &T::dump_vtk)
79 .def(
"evolve_once", &T::evolve_once)
80 .def(
"set_field_value_lambda_f64", &T::template set_field_value_lambda<f64>)
81 .def(
"set_field_value_lambda_f64_3", &T::template set_field_value_lambda<f64_3>)
84 [](T &self) -> TConfig {
89 [](T &self, TConfig cfg) {
90 if (self.ctx.is_scheduler_initialized()) {
92 "Cannot change solver config after scheduler is initialized");
95 self.solver.solver_config = cfg;
99 [](T &self, std::pair<TgridVec, TgridVec> block_coord,
u32 cell_local_id) {
100 return self.get_cell_coords(block_coord, cell_local_id);
103 "make_analysis_sodtube",
111 return std::make_unique<TAnalysisSodTube>(
113 self.solver.solver_config,
127 py::module mzeus = m.def_submodule(
"model_zeus",
"Shamrock Zeus solver");
129 std::string base_name =
"ZeusModel";
132 add_instance<f64_3, i64_3>(
133 mzeus, base_name +
"_f64_3_i64_3_SolverConfig", base_name +
"_f64_3_i64_3_Model");
135 using VariantAMRZeusBind = std::variant<std::unique_ptr<Model<f64_3, i64_3>>>;
139 [](
ShamrockCtx &ctx, std::string vector_type, std::string grid_repr) -> VariantAMRZeusBind {
140 VariantAMRZeusBind ret;
142 if (vector_type ==
"f64_3" && grid_repr ==
"i64_3") {
143 ret = std::make_unique<Model<f64_3, i64_3>>(ctx);
146 "unknown combination of representation and grid_repr");
153 py::arg(
"vector_type"),
154 py::arg(
"grid_repr"));
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
namespace for the zeus model
Pybind11 include and definitions.
#define Register_pymod(placeholdername)
Register a python module init function using static initialisation.