From f10058054d96340a6a74e45945168027bd50794c Mon Sep 17 00:00:00 2001 From: Felix Schindler <felix.schindler@wwu.de> Date: Thu, 8 Aug 2019 15:24:25 +0200 Subject: [PATCH] [python|function-as-gridfunction] add bindings --- python/dune/xt/functions/CMakeLists.txt | 1 + python/dune/xt/functions/__init__.py | 1 + .../xt/functions/function-as-grid-function.cc | 71 +++++++++++++++++++ .../xt/functions/function-as-grid-function.hh | 58 +++++++++++++++ 4 files changed, 131 insertions(+) create mode 100644 python/dune/xt/functions/function-as-grid-function.cc create mode 100644 python/dune/xt/functions/function-as-grid-function.hh diff --git a/python/dune/xt/functions/CMakeLists.txt b/python/dune/xt/functions/CMakeLists.txt index db3c99b7f..4de9920c0 100644 --- a/python/dune/xt/functions/CMakeLists.txt +++ b/python/dune/xt/functions/CMakeLists.txt @@ -19,6 +19,7 @@ dune_pybindxi_add_module(_gridfunction_interface_3d EXCLUDE_FROM_ALL gridfunctio dune_pybindxi_add_module(_checkerboard EXCLUDE_FROM_ALL checkerboard.cc) dune_pybindxi_add_module(_constant EXCLUDE_FROM_ALL constant.cc) dune_pybindxi_add_module(_expression EXCLUDE_FROM_ALL expression.cc) +dune_pybindxi_add_module(_function_as_grid_function EXCLUDE_FROM_ALL function-as-grid-function.cc) dune_pybindxi_add_module(_indicator EXCLUDE_FROM_ALL indicator.cc) dune_pybindxi_add_module(_spe10 EXCLUDE_FROM_ALL spe10.cc) diff --git a/python/dune/xt/functions/__init__.py b/python/dune/xt/functions/__init__.py index 06474ec2d..7db7768e0 100644 --- a/python/dune/xt/functions/__init__.py +++ b/python/dune/xt/functions/__init__.py @@ -27,6 +27,7 @@ _modules = ( '_checkerboard', '_constant', '_expression', + '_function_as_grid_function', '_indicator', '_spe10', ) diff --git a/python/dune/xt/functions/function-as-grid-function.cc b/python/dune/xt/functions/function-as-grid-function.cc new file mode 100644 index 000000000..d1d89dfdf --- /dev/null +++ b/python/dune/xt/functions/function-as-grid-function.cc @@ -0,0 +1,71 @@ +// This file is part of the dune-xt-functions project: +// https://github.com/dune-community/dune-xt-functions +// Copyright 2009-2018 dune-xt-functions developers and contributors. All rights reserved. +// License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) +// or GPL-2.0+ (http://opensource.org/licenses/gpl-license) +// with "runtime exception" (http://www.dune-project.org/license.html) +// Authors: +// Felix Schindler (2016 - 2018) +// René Fritze (2018) +// Tim Keil (2018) + +#include "config.h" + +#include <string> +#include <vector> + +#include <dune/common/parallel/mpihelper.hh> + +#include <dune/pybindxi/pybind11.h> +#include <dune/pybindxi/stl.h> + +#include <python/dune/xt/common/bindings.hh> +#include <python/dune/xt/common/exceptions.bindings.hh> +#include <python/dune/xt/grid/grids.bindings.hh> + +#include "function-as-grid-function.hh" + + +template <class G> +void addbind_for_Grid(pybind11::module& m) +{ + using namespace Dune::XT::Functions::bindings; + const auto grid_id = Dune::XT::Grid::bindings::grid_name<G>::value(); + const auto g_dim = G::dimension; + + bind_FunctionAsGridFunctionWrapper<G, g_dim, 1, 1>(m, grid_id); + bind_FunctionAsGridFunctionWrapper<G, g_dim, 2, 1>(m, grid_id); + bind_FunctionAsGridFunctionWrapper<G, g_dim, 2, 2>(m, grid_id); + bind_FunctionAsGridFunctionWrapper<G, g_dim, 3, 1>(m, grid_id); + bind_FunctionAsGridFunctionWrapper<G, g_dim, 3, 3>(m, grid_id); +} // ... addbind_for_Grid(...) + + +template <class Tuple = Dune::XT::Grid::AvailableGridTypes> +void all_grids(pybind11::module& m) +{ + Dune::XT::Common::bindings::try_register(m, [](auto& m_) { // different grids but same entity + addbind_for_Grid<typename Tuple::head_type>(m_); + }); + all_grids<typename Tuple::tail_type>(m); +} // ... addbind_for_Grid(...) + + +template <> +void all_grids<boost::tuples::null_type>(pybind11::module&) +{} + + +PYBIND11_MODULE(_function_as_grid_function, m) +{ + namespace py = pybind11; + + py::module::import("dune.xt.common"); + py::module::import("dune.xt.la"); + py::module::import("dune.xt.grid"); + py::module::import("dune.xt.functions._gridfunction_interface_1d"); + py::module::import("dune.xt.functions._gridfunction_interface_2d"); + py::module::import("dune.xt.functions._gridfunction_interface_3d"); + + all_grids(m); +} diff --git a/python/dune/xt/functions/function-as-grid-function.hh b/python/dune/xt/functions/function-as-grid-function.hh new file mode 100644 index 000000000..3a407e960 --- /dev/null +++ b/python/dune/xt/functions/function-as-grid-function.hh @@ -0,0 +1,58 @@ +// This file is part of the dune-xt-functions project: +// https://github.com/dune-community/dune-xt-functions +// Copyright 2009-2018 dune-xt-functions developers and contributors. All rights reserved. +// License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) +// or GPL-2.0+ (http://opensource.org/licenses/gpl-license) +// with "runtime exception" (http://www.dune-project.org/license.html) +// Authors: +// Felix Schindler (2019) + +#ifndef PYTHON_DUNE_XT_FUNCTIONS_FUNCTION_AS_GRID_FUNCTION_HH +#define PYTHON_DUNE_XT_FUNCTIONS_FUNCTION_AS_GRID_FUNCTION_HH + +#include <dune/pybindxi/pybind11.h> + +#include <dune/xt/functions/base/function-as-grid-function.hh> +#include <dune/xt/functions/interfaces/function.hh> +#include <dune/xt/functions/interfaces/grid-function.hh> + +namespace Dune { +namespace XT { +namespace Functions { +namespace bindings { + + +template <class G, size_t d, size_t r, size_t rC> +typename std::enable_if< + Grid::is_grid<G>::value, + pybind11::class_<FunctionAsGridFunctionWrapper<typename G::template Codim<0>::Entity, r, rC, double>>>::type +bind_FunctionAsGridFunctionWrapper(pybind11::module& m, const std::string& grid_id) +{ + namespace py = pybind11; + using namespace pybind11::literals; + + using E = typename G::template Codim<0>::Entity; + using D = typename G::ctype; + using R = double; + using I = GridFunctionInterface<E, r, rC, R>; + using C = FunctionAsGridFunctionWrapper<E, r, rC, R>; + + const std::string classname = std::string("FunctionAsGridFunctionWrapper__" + grid_id + "_to_" + Common::to_string(r) + + "x" + Common::to_string(rC)); + py::class_<C, I> c(m, classname.c_str(), classname.c_str()); + + m.def("function_to_grid_function", + [](XT::Functions::FunctionInterface<d, r, rC, R>& func) { return std::make_unique<C>(func); }, + py::keep_alive<0, 1>(), + "function"_a); + + return c; +} // ... bind_FunctionAsGridFunctionWrapper(...) + + +} // namespace bindings +} // namespace Functions +} // namespace XT +} // namespace Dune + +#endif // PYTHON_DUNE_XT_FUNCTIONS_FUNCTION_AS_GRID_FUNCTION_HH -- GitLab