mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-24 21:10:33 +05:00
mpi4py support
This commit is contained in:
parent
31a64cd728
commit
eb75bc31a6
@ -14,6 +14,7 @@ option( USE_NATIVE_ARCH "build for native cpu architecture" ON)
|
|||||||
option( USE_GUI "don't build netgen with GUI" ON )
|
option( USE_GUI "don't build netgen with GUI" ON )
|
||||||
option( USE_PYTHON "build with python interface" ON )
|
option( USE_PYTHON "build with python interface" ON )
|
||||||
option( USE_MPI "enable mpi parallelization" OFF )
|
option( USE_MPI "enable mpi parallelization" OFF )
|
||||||
|
option( USE_MPI4PY "enable mpi4py interface" ON )
|
||||||
option( USE_OCC "(not supported) compile with OpenCascade geometry kernel" OFF)
|
option( USE_OCC "(not supported) compile with OpenCascade geometry kernel" OFF)
|
||||||
option( USE_JPEG "enable snapshots using library libjpeg" OFF )
|
option( USE_JPEG "enable snapshots using library libjpeg" OFF )
|
||||||
option( USE_MPEG "enable video recording with FFmpeg, uses libavcodec" OFF )
|
option( USE_MPEG "enable video recording with FFmpeg, uses libavcodec" OFF )
|
||||||
@ -297,6 +298,14 @@ if (USE_MPI)
|
|||||||
target_include_directories(netgen_metis INTERFACE ${METIS_INCLUDE_DIR})
|
target_include_directories(netgen_metis INTERFACE ${METIS_INCLUDE_DIR})
|
||||||
target_link_libraries(netgen_metis INTERFACE ${METIS_LIBRARY} )
|
target_link_libraries(netgen_metis INTERFACE ${METIS_LIBRARY} )
|
||||||
target_compile_definitions(netgen_metis INTERFACE METIS )
|
target_compile_definitions(netgen_metis INTERFACE METIS )
|
||||||
|
|
||||||
|
if(USE_MPI4PY AND USE_PYTHON)
|
||||||
|
execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import mpi4py;print(mpi4py.get_include())" OUTPUT_VARIABLE mpi4py_path OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
find_path(MPI4PY_INCLUDE_DIR mpi4py.h HINTS ${mpi4py_path}/mpi4py NO_DEFAULT_PATH REQUIRED)
|
||||||
|
target_include_directories(netgen_metis INTERFACE ${MPI4PY_INCLUDE_DIR})
|
||||||
|
target_compile_definitions(netgen_metis INTERFACE NG_MPI4PY )
|
||||||
|
message(STATUS "Found mpi4py: ${MPI4PY_INCLUDE_DIR}")
|
||||||
|
endif(USE_MPI4PY AND USE_PYTHON)
|
||||||
endif (USE_MPI)
|
endif (USE_MPI)
|
||||||
install(TARGETS netgen_mpi netgen_metis ${NG_INSTALL_DIR})
|
install(TARGETS netgen_mpi netgen_metis ${NG_INSTALL_DIR})
|
||||||
|
|
||||||
|
@ -13,6 +13,53 @@
|
|||||||
#include <../interface/writeuser.hpp>
|
#include <../interface/writeuser.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef NG_MPI4PY
|
||||||
|
#include <mpi4py.h>
|
||||||
|
|
||||||
|
struct mpi4py_comm {
|
||||||
|
mpi4py_comm() = default;
|
||||||
|
mpi4py_comm(MPI_Comm value) : value(value) {}
|
||||||
|
operator MPI_Comm () { return value; }
|
||||||
|
|
||||||
|
MPI_Comm value;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace pybind11 { namespace detail {
|
||||||
|
template <> struct type_caster<mpi4py_comm> {
|
||||||
|
public:
|
||||||
|
PYBIND11_TYPE_CASTER(mpi4py_comm, _("mpi4py_comm"));
|
||||||
|
|
||||||
|
// Python -> C++
|
||||||
|
bool load(handle src, bool) {
|
||||||
|
PyObject *py_src = src.ptr();
|
||||||
|
// Check that we have been passed an mpi4py communicator
|
||||||
|
if (PyObject_TypeCheck(py_src, &PyMPIComm_Type)) {
|
||||||
|
// Convert to regular MPI communicator
|
||||||
|
value.value = *PyMPIComm_Get(py_src);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return !PyErr_Occurred();
|
||||||
|
}
|
||||||
|
|
||||||
|
// C++ -> Python
|
||||||
|
static handle cast(mpi4py_comm src,
|
||||||
|
return_value_policy /* policy */,
|
||||||
|
handle /* parent */)
|
||||||
|
{
|
||||||
|
// Create an mpi4py handle
|
||||||
|
return PyMPIComm_New(src.value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}} // namespace pybind11::detail
|
||||||
|
|
||||||
|
#endif // NG_MPI4PY
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
using namespace netgen;
|
using namespace netgen;
|
||||||
|
|
||||||
extern const char *ngscript[];
|
extern const char *ngscript[];
|
||||||
@ -50,8 +97,15 @@ void TranslateException (const NgException & ex)
|
|||||||
|
|
||||||
static Transformation<3> global_trafo(Vec<3> (0,0,0));
|
static Transformation<3> global_trafo(Vec<3> (0,0,0));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DLL_HEADER void ExportNetgenMeshing(py::module &m)
|
DLL_HEADER void ExportNetgenMeshing(py::module &m)
|
||||||
{
|
{
|
||||||
|
#ifdef NG_MPI4PY
|
||||||
|
import_mpi4py();
|
||||||
|
#endif // NG_MPI4PY
|
||||||
py::register_exception<NgException>(m, "NgException");
|
py::register_exception<NgException>(m, "NgException");
|
||||||
m.attr("_netgen_executable_started") = py::cast(netgen::netgen_executable_started);
|
m.attr("_netgen_executable_started") = py::cast(netgen::netgen_executable_started);
|
||||||
string script;
|
string script;
|
||||||
@ -71,6 +125,12 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
|
|||||||
m.def("_SetThreadPercentage", [](double percent) { SetThreadPercent(percent); });
|
m.def("_SetThreadPercentage", [](double percent) { SetThreadPercent(percent); });
|
||||||
|
|
||||||
py::class_<NgMPI_Comm> (m, "MPI_Comm")
|
py::class_<NgMPI_Comm> (m, "MPI_Comm")
|
||||||
|
#ifdef NG_MPI4PY
|
||||||
|
.def(py::init([] (mpi4py_comm comm)
|
||||||
|
{
|
||||||
|
return NgMPI_Comm(comm);
|
||||||
|
}))
|
||||||
|
#endif // NG_MPI4PY
|
||||||
.def_property_readonly ("rank", &NgMPI_Comm::Rank)
|
.def_property_readonly ("rank", &NgMPI_Comm::Rank)
|
||||||
.def_property_readonly ("size", &NgMPI_Comm::Size)
|
.def_property_readonly ("size", &NgMPI_Comm::Size)
|
||||||
.def("Barrier", &NgMPI_Comm::Barrier)
|
.def("Barrier", &NgMPI_Comm::Barrier)
|
||||||
@ -100,6 +160,9 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef NG_MPI4PY
|
||||||
|
py::implicitly_convertible<mpi4py_comm, NgMPI_Comm>();
|
||||||
|
#endif // NG_MPI4PY
|
||||||
|
|
||||||
|
|
||||||
py::class_<NGDummyArgument>(m, "NGDummyArgument")
|
py::class_<NGDummyArgument>(m, "NGDummyArgument")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
FROM ubuntu:18.04
|
FROM ubuntu:18.04
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
MAINTAINER Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at>
|
MAINTAINER Matthias Hochsteger <matthias.hochsteger@tuwien.ac.at>
|
||||||
RUN apt-get update && apt-get -y install python3 libpython3-dev libxmu-dev tk-dev tcl-dev cmake git g++ libglu1-mesa-dev ccache python3-pytest python3-numpy python3-tk clang-tidy python3-distutils clang libopenmpi-dev openmpi-bin gfortran
|
RUN apt-get update && apt-get -y install python3 libpython3-dev libxmu-dev tk-dev tcl-dev cmake git g++ libglu1-mesa-dev ccache python3-pytest python3-numpy python3-tk python3-mpi4py clang-tidy python3-distutils clang libopenmpi-dev openmpi-bin gfortran
|
||||||
ADD . /root/src/netgen
|
ADD . /root/src/netgen
|
||||||
|
Loading…
Reference in New Issue
Block a user