diff --git a/python/python.cc b/python/python.cc index a5e71fe..808e3a8 100644 --- a/python/python.cc +++ b/python/python.cc @@ -1,388 +1,386 @@ #include "action_interface.hh" #include "communicator.hh" #include "compute_list.hh" #include "domain_multiscale.hh" #include "dumper_list.hh" #include "factory_multiscale.hh" #include "filter_interface.hh" #include "filter_list.hh" #include "geometry_list.hh" #include "geometry_manager.hh" #include "lib_continuum.hh" #include "lib_dd.hh" #include "lib_dumper.hh" #include "lib_filter.hh" #include "lib_geometry.hh" #include "lib_md.hh" #include "lib_stimulation.hh" #include "lm_common.hh" #include "lm_type_caster.hh" #include "stimulation_interface.hh" #include "stimulation_list.hh" #include #include #include namespace py = pybind11; using namespace libmultiscale; std::vector fake_argv; std::vector c_argv; void loadModules() { // auto sys = py::module::import("sys"); // auto argv = sys.attr("argv"); // fake_argv = py::cast>(argv); // std::cout << "AAAA " << fake_argv.size() << std::endl; // for (auto &&v : fake_argv) { // std::cout << "AAAA " << &v[0] << std::endl; // c_argv.push_back(&v[0]); // } // loadModules(c_argv.size(), c_argv.data()); loadModules(0, nullptr); create_seg_fault = false; } extern std::string lm_release_info; template void ModuleProperty(py::module &m, const char *n, T &var) { // setting a property // import the builtins and get the "property" python class auto property = py::module::import("builtins").attr("property"); m.attr(n) = property(py::cpp_function([&]() { return var; }), py::cpp_function([&](T2 &a) { var = a; })); } #include "domain_lammps_dynamic.hh" template void declare_domain(py::module &m, const char *class_name) { py::class_>( m, class_name, py::multiple_inheritance()) .def(py::init()) .def("init", [](Class &self) { self.checkAllKeywordsAreParsed(); self.init(); }); } template void declare_geometry(py::module &m, const char *class_name) { py::class_>( m, class_name, py::multiple_inheritance()) .def(py::init()) .def("init", [](Class &self) { self.checkAllKeywordsAreParsed(); self.init(); }); } template void declare_stimulation(py::module &m, const char *class_name) { py::class_>( m, class_name, py::multiple_inheritance()) .def(py::init()) .def("init", [](Class &self) { self.checkAllKeywordsAreParsed(); self.init(); }); } template void declare_compute(py::module &m, const char *class_name) { py::class_>( m, class_name, py::multiple_inheritance()) .def(py::init()) .def("init", [](Class &self) { self.checkAllKeywordsAreParsed(); self.init(); }); } template void declare_filter(py::module &m, const char *class_name) { py::class_>( m, class_name, py::multiple_inheritance()) .def(py::init()) .def("init", [](Class &self) { self.checkAllKeywordsAreParsed(); self.init(); }); } template void declare_dumper(py::module &m, const char *class_name) { py::class_>( m, class_name, py::multiple_inheritance()) .def(py::init()) .def("init", [](Class &self) { self.checkAllKeywordsAreParsed(); self.init(); }); } std::string clean_class_name(const std::string &arg) { std::string res = arg; res.erase(std::remove(res.begin(), res.end(), '<'), res.end()); res.erase(std::remove(res.begin(), res.end(), '>'), res.end()); return res; } PYBIND11_MODULE(pylibmultiscale, m) { m.doc() = "LibMultiScale python module"; ModuleProperty(m, "current_step", current_step); ModuleProperty(m, "lm_my_proc_id", lm_my_proc_id); ModuleProperty(m, "current_stage", current_stage); py::enum_(m, "IntegrationSchemeStage") .value("NONE_STEP", NONE_STEP) .value("PRE_DUMP", PRE_DUMP) .value("PRE_STEP1", PRE_STEP1) .value("PRE_STEP2", PRE_STEP2) .value("PRE_STEP3", PRE_STEP3) .value("PRE_STEP4", PRE_STEP4) .value("PRE_STEP5", PRE_STEP5) .value("PRE_STEP6", PRE_STEP6) .value("PRE_STEP7", PRE_STEP7) .value("PRE_FATAL", PRE_FATAL) .value("ALL_STEP", ALL_STEP) .export_values(); py::enum_(m, "CouplingStage") .value("COUPLING_STEP1", COUPLING_STEP1) .value("COUPLING_STEP2", COUPLING_STEP2) .value("COUPLING_STEP3", COUPLING_STEP3) .value("COUPLING_STEP4", COUPLING_STEP4) .value("COUPLING_STEP5", COUPLING_STEP5) .value("COUPLING_STEP6", COUPLING_STEP6) .value("COUPLING_STEP7", COUPLING_STEP7) .export_values(); py::enum_(m, "DOFType") .value("dt_local_master", dt_local_master) .value("dt_local_slave", dt_local_slave) .value("dt_local", dt_local) .value("dt_ghost", dt_ghost) .value("dt_all", dt_all) .export_values(); m.def("loadModules", &::loadModules, "Load all the module dependencies of libmultiscale"); m.def("closeModules", &closeModules, "close all the module dependencies of libmultiscale"); m.attr("release_info") = py::cast(lm_release_info); py::class_(m, "DomainMultiScale") .def_static("getManager", &DomainMultiScale::getManager, py::return_value_policy::reference) .def("build", &DomainMultiScale::build) .def("getObject", &DomainMultiScale::getObject, py::return_value_policy::reference) .def("getTimeStep", &DomainMultiScale::getTimeStep) .def("performStep1", &DomainMultiScale::performStep1) .def("performStep2", &DomainMultiScale::performStep2) .def("performStep3", &DomainMultiScale::performStep3) .def("coupling", &DomainMultiScale::coupling) .def("destroy", &DomainMultiScale::destroy) .def("addObject", py::overload_cast>( &DomainMultiScale::addObject)); py::class_(m, "ActionManager") .def_static("getManager", py::overload_cast<>(&ActionManager::getManager), py::return_value_policy::reference) .def_static("getManager", py::overload_cast(&ActionManager::getManager), py::return_value_policy::reference) .def("action", &ActionManager::action) .def("destroy", &ActionManager::destroy) .def("addObject", py::overload_cast>( &ActionManager::addObject)); py::class_(m, "FilterManager") .def_static("getManager", py::overload_cast<>(&FilterManager::getManager), py::return_value_policy::reference) .def_static("getManager", py::overload_cast(&FilterManager::getManager), py::return_value_policy::reference) .def("action", &FilterManager::action) .def("destroy", &FilterManager::destroy); py::class_(m, "CommGroup") .def(py::init()); py::class_(m, "Communicator") .def("getCommunicator", &Communicator::getCommunicator, py::return_value_policy::reference) .def("getNumberFreeProcs", &Communicator::getNumberFreeProcs) .def("addGroup", &Communicator::addGroup) .def("getGroup", &Communicator::getGroup); m.attr("prologue") = py::module::import("prologue"); py::class_(m, "GeometryManager") .def_static("getManager", &GeometryManager::getManager, - py::return_value_policy::reference) + py::return_value_policy::reference) .def("addGeometry", &GeometryManager::addGeometry) .def("destroy", &GeometryManager::destroy); py::class_>(m, "Parsable") .def("getPossibleKeywords", &Parsable::getPossibleKeywords) .def("getParam", &Parsable::getParam) .def("setParam", [](Parsable &self, const std::string &keyword, py::object &val) { self.setParam(keyword, val); }) .def_property_readonly("params", [m](Parsable &self) { return m.attr("prologue").attr("LMParameters")(self); }); py::class_>( m, "DomainInterface", py::multiple_inheritance()) .def("performStep1", &DomainInterface::performStep1) .def("performStep2", &DomainInterface::performStep2) .def("performStep3", &DomainInterface::performStep3) .def("performStep4", &DomainInterface::performStep4) .def("performStep5", &DomainInterface::performStep5); py::class_>( m, "Geometry", py::multiple_inheritance()); py::class_>( m, "ActionInterface", py::multiple_inheritance()) .def("action", &StimulationInterface::action); py::class_>(m, "StimulationInterface", py::multiple_inheritance()) .def("stimulate", &StimulationInterface::stimulate); py::class_>(m, "FilterInterface", py::multiple_inheritance()) .def("build", &FilterInterface::build); py::class_>(m, "DumperInterface", py::multiple_inheritance()) .def("dump", &DumperInterface::dump); py::class_>(m, "ComputeInterface", py::multiple_inheritance()) .def("compute", &ComputeInterface::compute) .def("getOutputs", &ComputeInterface::getOutputs, py::return_value_policy::reference) .def("getOutput", &ComputeInterface::getOutput, py::return_value_policy::reference) .def("getArray", &ComputeInterface::getArray, py::return_value_policy::reference) .def("getCastedOutput", [](ComputeInterface &self, bool eval, std::string name) { return self.getCastedOutput>(eval, name); }, py::arg("eval") = true, py::arg("name") = "output"); py::class_>(m, "ContainerArrayReal", py::multiple_inheritance()) .def_readwrite("name_computed", &ContainerArray::name_computed) .def("getDim", &ContainerArray::getDim) .def("size", &ContainerArray::size, py::arg("dt") = dt_local) .def("to_array", [](ContainerArray &self) { const UInt Dim = self.getDim(); UInt sz = self.size() / Dim; if (sz == 0) return py::object(py::none()); Eigen::Map< Eigen::Array> _array(&self[0], sz, Dim); return py::cast(_array); }); - ; - py::class_(m, "ArgumentContainer"); #define PYTHON_DOMAIN(n, data, obj) \ { \ using _class = BOOST_PP_TUPLE_ELEM(3, 0, obj); \ std::string domain_name = \ clean_class_name(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(3, 0, obj))); \ declare_domain<_class>(m, domain_name.c_str()); \ } BOOST_PP_SEQ_FOR_EACH(PYTHON_DOMAIN, f, LIST_ATOM_MODEL); BOOST_PP_SEQ_FOR_EACH(PYTHON_DOMAIN, f, LIST_DD_MODEL); BOOST_PP_SEQ_FOR_EACH(PYTHON_DOMAIN, f, LIST_CONTINUUM_MODEL); #undef DECLARE_PYTHON #define PYTHON_GEOMETRY(n, data, obj) \ { \ using _class = BOOST_PP_TUPLE_ELEM(2, 0, obj); \ std::string geometry_name = \ clean_class_name(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, obj))); \ \ declare_geometry<_class>(m, geometry_name.c_str()); \ } BOOST_PP_SEQ_FOR_EACH(PYTHON_GEOMETRY, f, LIST_GEOMETRY); #undef PYTHON_GEOMETRY #define PYTHON_STIMULATION(n, data, obj) \ { \ using _class = BOOST_PP_TUPLE_ELEM(2, 0, obj); \ std::string stimulation_name = \ clean_class_name(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, obj))); \ \ declare_stimulation<_class>(m, stimulation_name.c_str()); \ } BOOST_PP_SEQ_FOR_EACH(PYTHON_STIMULATION, f, LIST_STIMULATION); #undef PYTHON_STIMULATION #define PYTHON_COMPUTE(n, data, obj) \ { \ using _class = BOOST_PP_TUPLE_ELEM(2, 0, obj); \ std::string compute_name = \ clean_class_name(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, obj))); \ \ declare_compute<_class>(m, compute_name.c_str()); \ } BOOST_PP_SEQ_FOR_EACH(PYTHON_COMPUTE, f, LIST_COMPUTE); #undef PYTHON_COMPUTE #define PYTHON_FILTER(n, data, obj) \ { \ using _class = BOOST_PP_TUPLE_ELEM(2, 0, obj); \ std::string filter_name = \ clean_class_name(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, obj))); \ \ declare_filter<_class>(m, filter_name.c_str()); \ } BOOST_PP_SEQ_FOR_EACH(PYTHON_FILTER, f, LIST_FILTER); #undef PYTHON_FILTER #define PYTHON_DUMPER(n, data, obj) \ { \ using _class = BOOST_PP_TUPLE_ELEM(2, 0, obj); \ std::string filter_name = \ clean_class_name(BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, obj))); \ \ declare_dumper<_class>(m, filter_name.c_str()); \ } BOOST_PP_SEQ_FOR_EACH(PYTHON_DUMPER, f, LIST_DUMPER); #undef PYTHON_DUMPER }