以下是我用来在两个不同网格之间进行插值的 python FEniCS(我使用 dolphin 2019.1.0)脚本的简短 MWE。这个想法是加速插值,特别是如果函数空间的大小很大,大约为 10^6。但我无法成功运行它。
以下 python 代码转换是使用 void 函数 (extract_dof_component_map_1) 的参数在 c++ 中对 <std::unordered map> 的 dict。我要求它使用标准的 Pybind 11 模块“通过引用传递参数 (dict)”。
它显示此语句的语法错误,因为 PYBIND11 模块中的定义不正确。成功运行代码应打印“hi”。
测试.py
from dolfin import * import cppimport
compiled_cpp_module = cppimport.imp('delta_interpolation')
mesh = UnitCubeMesh(21, 21, 21) V = VectorFunctionSpace(mesh, 'CG', 2)
dof_component_map = {}
compiled_cpp_module.extract_dof_component_map_1(dof_component_map, V)
.cpp 文件
/*
<%
from dolfin.jit.jit import dolfin_pc
setup_pybind11(cfg)
cfg['include_dirs'] = dolfin_pc['include_dirs']
cfg['library_dirs'] = dolfin_pc['library_dirs']
cfg['compiler_args'] = ['-std=c++11', '-DHAS_MPI']
%>
*/
#include <pybind11/pybind11.h>
#include <pybind11/stl_bind.h>
#include <pybind11/eigen.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <dolfin/la/GenericVector.h>
#include <dolfin/function/Function.h>
#include <dolfin/function/FunctionSpace.h>
#include <dolfin/fem/GenericDofMap.h>
#include <dolfin/fem/FiniteElement.h>
#include <dolfin/common/RangedIndexSet.h>
#include <dolfin/geometry/BoundingBoxTree.h>
#include <dolfin/mesh/Edge.h>
#include <dolfin/mesh/Mesh.h>
#include <dolfin/mesh/Cell.h>
#include <dolfin/mesh/CellType.h>
#include <dolfin/mesh/MeshEntityIterator.h>
#include <dolfin/mesh/Vertex.h>
#include <dolfin/geometry/Point.h>
#include <dolfin/mesh/MeshEntity.h>
PYBIND11_MAKE_OPAQUE(std::unordered_map<std::size_t, std::size_t>);
using namespace dolfin;
namespace py = pybind11;
void extract_dof_component_map_1(std::unordered_map<std::size_t,
std::size_t>& dof_component_map,
const FunctionSpace& V)
{
std::cout << "hi";
}
PYBIND11_MODULE(delta_interpolation, m)
{
py::bind_map<std::unordered_map<std::size_t, std::size_t>>(m, "unordered_mapping");
m.def("extract_dof_component_map_1", (void (*)(std::unordered_map<std::size_t,
std::size_t>& , const FunctionSpace&))
&extract_dof_component_map_1);
m.def("extract_dof_component_map_1", [](py::dict d, py::object U){
auto _d = d.cast<std::unordered_map<std::size_t, std::size_t>&>();
auto _U = U.attr("_cpp_object").cast<const FunctionSpace&>();
extract_dof_component_map_1(_d, _U);
});
}
错误:
compiled_cpp_module.extract_dof_component_map_1(dof_component_map, V)
RuntimeError: Uable to cast Python instance to C++ type (complie in debug mode for details)
注意:我已经验证了 FunctionSpace 在 PYBIND11 中的定义是正确的。只有通过引用转换 dict 的语法是不正确的。
感谢您为解决此语法错误提供的任何帮助。提前致谢。