From cfe5041689cdda15db3019ef527d59f51cdeae12 Mon Sep 17 00:00:00 2001 From: TiKeil <keil.menden@web.de> Date: Thu, 12 Jul 2018 14:24:40 +0200 Subject: [PATCH] [python] split bindings --- python/dune/xt/CMakeLists.txt | 3 + python/dune/xt/bindings.cc | 101 +----------------- python/dune/xt/functions/__init__.py | 11 +- python/dune/xt/interfaces.cc | 148 +++++++++++++++++++++++++++ python/setup.cfg | 2 +- 5 files changed, 164 insertions(+), 101 deletions(-) create mode 100644 python/dune/xt/interfaces.cc diff --git a/python/dune/xt/CMakeLists.txt b/python/dune/xt/CMakeLists.txt index 08b4c3c8e..62badeb62 100644 --- a/python/dune/xt/CMakeLists.txt +++ b/python/dune/xt/CMakeLists.txt @@ -7,5 +7,8 @@ # Rene Milk (2018) # ~~~ +dune_pybindxi_add_module(_interfaces EXCLUDE_FROM_ALL interfaces.cc) dune_pybindxi_add_module(_functions EXCLUDE_FROM_ALL bindings.cc) + +add_dune_alberta_flags(GRIDDIM 2 _interfaces) add_dune_alberta_flags(GRIDDIM 2 _functions) diff --git a/python/dune/xt/bindings.cc b/python/dune/xt/bindings.cc index 57472e2f1..a3ffc1e97 100644 --- a/python/dune/xt/bindings.cc +++ b/python/dune/xt/bindings.cc @@ -22,7 +22,6 @@ #include <python/dune/xt/common/exceptions.bindings.hh> #include <python/dune/xt/grid/grids.bindings.hh> -#include <python/dune/xt/functions/interfaces.hh> #include <python/dune/xt/functions/constant.hh> #include <python/dune/xt/functions/checkerboard.hh> #include <python/dune/xt/functions/ESV2007.bindings.hh> @@ -37,82 +36,17 @@ void addbind_for_Grid(pybind11::module& m) { using namespace Dune::XT::Functions; const auto grid_id = Dune::XT::Grid::bindings::grid_name<G>::value(); - const auto diff = internal::Combination::difference; - const auto sum = internal::Combination::sum; - const auto prod = internal::Combination::product; const auto g_dim = G::dimension; - auto i_1_1 = bind_GridFunctionInterface<G, 1, 1>(m, grid_id); - auto i_2_1 = bind_GridFunctionInterface<G, 2, 1>(m, grid_id); - auto i_3_1 = bind_GridFunctionInterface<G, 3, 1>(m, grid_id); - auto i_4_1 = bind_GridFunctionInterface<G, 4, 1>(m, grid_id); - auto i_1_3 = bind_GridFunctionInterface<G, 1, 3>(m, grid_id); - auto i_3_3 = bind_GridFunctionInterface<G, 3, 3>(m, grid_id); - - //! this generates multiple binds for the same type - //! auto i_d_d = bind_GridFunctionInterface<G, g_dim, g_dim>(m, grid_id); - auto i_d_d = bind_GridFunctionInterface<G, 2, 2>(m, grid_id); - - bind_combined_GridFunction<G, g_dim, diff, 1, 1, 1, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 1, 1, 1, 1>(i_1_1); - - bind_combined_GridFunction<G, g_dim, diff, 2, 1, 2, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 2, 1, 2, 1>(i_2_1); - - bind_combined_GridFunction<G, g_dim, diff, 3, 1, 3, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 3, 1, 3, 1>(i_3_1); - - bind_combined_GridFunction<G, g_dim, diff, 4, 1, 4, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 4, 1, 4, 1>(i_4_1); - - bind_combined_GridFunction<G, g_dim, diff, 2, 2, 2, 2>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, diff, g_dim, g_dim, g_dim, g_dim>(i_d_d); - - - bind_combined_GridFunction<G, g_dim, sum, 1, 1, 1, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 1, 1, 1, 1>(i_1_1); - - bind_combined_GridFunction<G, g_dim, sum, 2, 1, 2, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 2, 1, 2, 1>(i_2_1); - - bind_combined_GridFunction<G, g_dim, sum, 3, 1, 3, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 3, 1, 3, 1>(i_3_1); - - bind_combined_GridFunction<G, g_dim, sum, 4, 1, 4, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 4, 1, 4, 1>(i_4_1); - - bind_combined_GridFunction<G, g_dim, sum, 2, 2, 2, 2>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, sum, g_dim, g_dim, g_dim, g_dim>(i_d_d); - - - bind_combined_GridFunction<G, g_dim, prod, 1, 1, 1, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 1, 1>(i_1_1); - - bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 1>(i_1_1); - - bind_combined_GridFunction<G, g_dim, prod, 1, 1, 3, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 3, 1>(i_1_1); - - bind_combined_GridFunction<G, g_dim, prod, 1, 1, 4, 1>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 4, 1>(i_1_1); - - bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 2>(m, grid_id); - addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 2>(i_1_1); - - bind_CheckerboardFunction<G, g_dim, 1, 1>(m, grid_id); bind_CheckerboardFunction<G, g_dim, 2, 1>(m, grid_id); bind_CheckerboardFunction<G, g_dim, 3, 1>(m, grid_id); bind_CheckerboardFunction<G, g_dim, 4, 1>(m, grid_id); bind_CheckerboardFunction<G, g_dim, 1, 3>(m, grid_id); bind_CheckerboardFunction<G, g_dim, 3, 3>(m, grid_id); - // bind_CheckerboardFunction<G, g_dim, 1, 2>(m, grid_id); - // bind_CheckerboardFunction<G, g_dim, 1, 3>(m, grid_id); // bindings::ESV2007::CutoffFunction<G>::bind(m); - bind_Spe10Model1Function<G, g_dim, 1, 1>(m, grid_id); bind_IndicatorFunction<G, g_dim, 1, 1>(m, grid_id); @@ -124,45 +58,15 @@ void addbind_for_Grid(pybind11::module& m) } // ... addbind_for_Grid(...) -PYBIND11_PLUGIN(_functions) +PYBIND11_MODULE(_functions, m) { namespace py = pybind11; using namespace pybind11::literals; using namespace Dune::XT::Functions; - py::module m("_functions", "dune-xt-functions"); - - Dune::XT::Common::bindings::addbind_exceptions(m); - py::module::import("dune.xt.common"); py::module::import("dune.xt.grid"); - - bind_FunctionInterface<1, 1, 1>(m); - bind_FunctionInterface<1, 2, 1>(m); - bind_FunctionInterface<1, 3, 1>(m); - bind_FunctionInterface<1, 4, 1>(m); - bind_FunctionInterface<1, 2, 2>(m); - bind_FunctionInterface<1, 1, 2>(m); - bind_FunctionInterface<1, 1, 3>(m); - bind_FunctionInterface<1, 3, 3>(m); - - bind_FunctionInterface<2, 1, 1>(m); - bind_FunctionInterface<2, 2, 1>(m); - bind_FunctionInterface<2, 3, 1>(m); - bind_FunctionInterface<2, 4, 1>(m); - bind_FunctionInterface<2, 2, 2>(m); - bind_FunctionInterface<2, 1, 2>(m); - bind_FunctionInterface<2, 1, 3>(m); - bind_FunctionInterface<2, 3, 3>(m); - - bind_FunctionInterface<3, 1, 1>(m); - bind_FunctionInterface<3, 2, 1>(m); - bind_FunctionInterface<3, 3, 1>(m); - bind_FunctionInterface<3, 4, 1>(m); - bind_FunctionInterface<3, 2, 2>(m); - bind_FunctionInterface<3, 1, 2>(m); - bind_FunctionInterface<3, 1, 3>(m); - bind_FunctionInterface<3, 3, 3>(m); + py::module::import("dune.xt.interfaces"); bind_ConstantFunction<1, 1, 1>(m); bind_ConstantFunction<1, 2, 1>(m); @@ -222,5 +126,4 @@ PYBIND11_PLUGIN(_functions) //#endif Dune::XT::Common::bindings::add_initialization(m, "dune.xt.functions"); - return m.ptr(); } diff --git a/python/dune/xt/functions/__init__.py b/python/dune/xt/functions/__init__.py index 19fcbc843..ee607e34e 100644 --- a/python/dune/xt/functions/__init__.py +++ b/python/dune/xt/functions/__init__.py @@ -12,4 +12,13 @@ # ~~~ import dune.xt -from dune.xt._functions import * \ No newline at end of file + +try: + from dune.xt._interfaces import * + from dune.xt._functions import * +except ImportError as e: + import os + import logging + if os.environ.get('DXT_PYTHON_DEBUG', False): + raise e + logging.error('dune-xt-functions bindings not available') diff --git a/python/dune/xt/interfaces.cc b/python/dune/xt/interfaces.cc new file mode 100644 index 000000000..fe2dce485 --- /dev/null +++ b/python/dune/xt/interfaces.cc @@ -0,0 +1,148 @@ +// 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 - 2017) +// Rene Milk (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 <python/dune/xt/functions/interfaces.hh> + +#include <python/dune/xt/common/exceptions.bindings.hh> + +template <class G> +void add_bind_for_Grid_interface(pybind11::module& m) +{ + using namespace Dune::XT::Functions; + const auto grid_id = Dune::XT::Grid::bindings::grid_name<G>::value(); + const auto diff = internal::Combination::difference; + const auto sum = internal::Combination::sum; + const auto prod = internal::Combination::product; + const auto g_dim = G::dimension; + + auto i_1_1 = bind_GridFunctionInterface<G, 1, 1>(m, grid_id); + auto i_2_1 = bind_GridFunctionInterface<G, 2, 1>(m, grid_id); + auto i_3_1 = bind_GridFunctionInterface<G, 3, 1>(m, grid_id); + auto i_4_1 = bind_GridFunctionInterface<G, 4, 1>(m, grid_id); + auto i_1_3 = bind_GridFunctionInterface<G, 1, 3>(m, grid_id); + auto i_3_3 = bind_GridFunctionInterface<G, 3, 3>(m, grid_id); + + //! this generates multiple binds for the same type + //! auto i_d_d = bind_GridFunctionInterface<G, g_dim, g_dim>(m, grid_id); + auto i_d_d = bind_GridFunctionInterface<G, 2, 2>(m, grid_id); + + bind_combined_GridFunction<G, g_dim, diff, 1, 1, 1, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 1, 1, 1, 1>(i_1_1); + + bind_combined_GridFunction<G, g_dim, diff, 2, 1, 2, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 2, 1, 2, 1>(i_2_1); + + bind_combined_GridFunction<G, g_dim, diff, 3, 1, 3, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 3, 1, 3, 1>(i_3_1); + + bind_combined_GridFunction<G, g_dim, diff, 4, 1, 4, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, diff, 4, 1, 4, 1>(i_4_1); + + bind_combined_GridFunction<G, g_dim, diff, 2, 2, 2, 2>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, diff, g_dim, g_dim, g_dim, g_dim>(i_d_d); + + + bind_combined_GridFunction<G, g_dim, sum, 1, 1, 1, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 1, 1, 1, 1>(i_1_1); + + bind_combined_GridFunction<G, g_dim, sum, 2, 1, 2, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 2, 1, 2, 1>(i_2_1); + + bind_combined_GridFunction<G, g_dim, sum, 3, 1, 3, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 3, 1, 3, 1>(i_3_1); + + bind_combined_GridFunction<G, g_dim, sum, 4, 1, 4, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, sum, 4, 1, 4, 1>(i_4_1); + + bind_combined_GridFunction<G, g_dim, sum, 2, 2, 2, 2>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, sum, g_dim, g_dim, g_dim, g_dim>(i_d_d); + + + bind_combined_GridFunction<G, g_dim, prod, 1, 1, 1, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 1, 1>(i_1_1); + + bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 1>(i_1_1); + + bind_combined_GridFunction<G, g_dim, prod, 1, 1, 3, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 3, 1>(i_1_1); + + bind_combined_GridFunction<G, g_dim, prod, 1, 1, 4, 1>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 4, 1>(i_1_1); + + bind_combined_GridFunction<G, g_dim, prod, 1, 1, 2, 2>(m, grid_id); + addbind_GridFunctionInterface_combined_op<G, g_dim, prod, 1, 1, 2, 2>(i_1_1); +} // ... addbind_for_Grid(...) + + +PYBIND11_MODULE(_interfaces, m) +{ + namespace py = pybind11; + using namespace pybind11::literals; + using namespace Dune::XT::Functions; + + py::module::import("dune.xt.common"); + py::module::import("dune.xt.grid"); + + bind_FunctionInterface<1, 1, 1>(m); + bind_FunctionInterface<1, 2, 1>(m); + bind_FunctionInterface<1, 3, 1>(m); + bind_FunctionInterface<1, 4, 1>(m); + bind_FunctionInterface<1, 2, 2>(m); + bind_FunctionInterface<1, 1, 2>(m); + bind_FunctionInterface<1, 1, 3>(m); + bind_FunctionInterface<1, 3, 3>(m); + + bind_FunctionInterface<2, 1, 1>(m); + bind_FunctionInterface<2, 2, 1>(m); + bind_FunctionInterface<2, 3, 1>(m); + bind_FunctionInterface<2, 4, 1>(m); + bind_FunctionInterface<2, 2, 2>(m); + bind_FunctionInterface<2, 1, 2>(m); + bind_FunctionInterface<2, 1, 3>(m); + bind_FunctionInterface<2, 3, 3>(m); + + bind_FunctionInterface<3, 1, 1>(m); + bind_FunctionInterface<3, 2, 1>(m); + bind_FunctionInterface<3, 3, 1>(m); + bind_FunctionInterface<3, 4, 1>(m); + bind_FunctionInterface<3, 2, 2>(m); + bind_FunctionInterface<3, 1, 2>(m); + bind_FunctionInterface<3, 1, 3>(m); + bind_FunctionInterface<3, 3, 3>(m); + + add_bind_for_Grid_interface<Dune::YaspGrid<1, Dune::EquidistantOffsetCoordinates<double, 1>>>(m); + add_bind_for_Grid_interface<Dune::YaspGrid<2, Dune::EquidistantOffsetCoordinates<double, 2>>>(m); +#if HAVE_DUNE_ALUGRID + add_bind_for_Grid_interface<Dune::ALUGrid<2, 2, Dune::simplex, Dune::conforming>>(m); +#endif +#if HAVE_UG + add_bind_for_Grid_interface<Dune::UGGrid<2>>(m); +#endif + //#if HAVE_ALBERTA + // addbind_for_Grid<Dune::AlbertaGrid<2, 2>>(m, "2d_simplex_albertagrid"); + //#endif + + Dune::XT::Common::bindings::add_initialization(m, "dune.xt.functions"); +} diff --git a/python/setup.cfg b/python/setup.cfg index 1dd0ffda4..d1b3bbae1 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -34,7 +34,7 @@ python_files = test/*.py python_class = Test pep8maxlinelength = 120 pep8ignore = E221,E226,E241,E242 -addopts= --cov dune/ -p no:warnings +addopts= --cov dune/ -p no:warnings -s [metadata] # this is mandatory to lave license end up in .whl -- GitLab