Skip to content

Commit

Permalink
Merge branch 'meshnodes_vef' into 'master'
Browse files Browse the repository at this point in the history
vertices, edges and faces of mesh nodes

See merge request jschoeberl/ngsolve!335
  • Loading branch information
JSchoeberl committed Mar 26, 2018
2 parents 8a332a0 + 2508847 commit cd91bcf
Showing 1 changed file with 44 additions and 28 deletions.
72 changes: 44 additions & 28 deletions comp/python_comp.cpp
Expand Up @@ -665,37 +665,42 @@ ANY_DOF: Any used dof (LOCAL_DOF or INTERFACE_DOF or WIREBASKET_DOF)
py::class_<MeshNode, NodeId> (m, "MeshNode", "a node within a mesh") py::class_<MeshNode, NodeId> (m, "MeshNode", "a node within a mesh")
.def_property_readonly("vertices", [](MeshNode & node) -> py::tuple .def_property_readonly("vertices", [](MeshNode & node) -> py::tuple
{ {
const MeshAccess & mesh = node.Mesh(); auto& mesh = node.Mesh();
if (node.GetType() == NT_EDGE) switch (node.GetType())
{ {
/* case NT_EDGE:
auto verts = node.Mesh().GetEdgePNums(node.GetNr()); return MakePyTuple(Substitute(ArrayObject(mesh.GetEdgePNums(node.GetNr())), Nr2Vert));
py::tuple tup(2); case NT_FACE:
for (size_t i = 0; i < 2; i++) return MakePyTuple(Substitute(mesh.GetFacePNums(node.GetNr()), Nr2Vert));
tup[i] = py::cast(NodeId(NT_VERTEX, verts[i])); case NT_CELL:
return tup; return MakePyTuple(Substitute(mesh.GetElPNums(ElementId(VOL, node.GetNr())),
*/ Nr2Vert));

default:
auto Nr2MeshVert = [&mesh] (size_t nr) throw py::type_error("vertices only available for edge, face and cell nodes\n");
{ return MeshNode(NodeId(NT_VERTEX,nr), mesh); };
auto verts = node.Mesh().GetEdgePNums(node.GetNr());
return MakePyTuple (Substitute(ArrayObject(verts), Nr2MeshVert));
} }
if (node.GetType() == NT_FACE) }, "tuple of global vertex numbers")
.def_property_readonly("edges",[](MeshNode & node) -> py::tuple
{
auto& mesh = node.Mesh();
switch(node.GetType())
{ {
/* case NT_FACE:
auto verts = node.Mesh().GetFacePNums(node.GetNr()); return MakePyTuple(Substitute(mesh.GetFaceEdges(node.GetNr()), Nr2Edge));
py::tuple tup(verts.Size()); case NT_CELL:
for (size_t i = 0; i < verts.Size(); i++) return MakePyTuple(Substitute(mesh.GetElEdges(ElementId(VOL,node.GetNr())),
tup[i] = py::cast(NodeId(NT_VERTEX, verts[i])); Nr2Edge));
return tup; default:
*/ throw py::type_error("edges only available for face and cell nodes\n");
auto verts = node.Mesh().GetFacePNums(node.GetNr());
return MakePyTuple (Substitute(verts, Nr2Vert));
} }
throw py::type_error("vertices only available for edge and face nodes\n"); }, "tuple of global edge numbers")
}, .def_property_readonly("faces", [](MeshNode & node) -> py::tuple
"tuple of global vertex numbers") {
auto & mesh = node.Mesh();
if (node.GetType() == NT_CELL)
return MakePyTuple(Substitute(mesh.GetElFacets(ElementId(VOL, node.GetNr())),
Nr2Face));
throw py::type_error("faces only available for cell nodes\n");
}, "tuple of global face numbers")


; ;


Expand Down Expand Up @@ -929,7 +934,8 @@ mesh (netgen.Mesh): a mesh generated from Netgen
.def_property_readonly ("nv", &MeshAccess::GetNV, "Number of vertices") .def_property_readonly ("nv", &MeshAccess::GetNV, "Number of vertices")
.def_property_readonly ("ne", static_cast<size_t(MeshAccess::*)()const> (&MeshAccess::GetNE), "Number of volume elements") .def_property_readonly ("ne", static_cast<size_t(MeshAccess::*)()const> (&MeshAccess::GetNE), "Number of volume elements")
.def_property_readonly ("nedge", &MeshAccess::GetNEdges, "Number of edges") .def_property_readonly ("nedge", &MeshAccess::GetNEdges, "Number of edges")
.def_property_readonly ("nface", &MeshAccess::GetNFaces, "Number of faces") .def_property_readonly ("nface", &MeshAccess::GetNFaces, "Number of faces")
.def ("nnodes", &MeshAccess::GetNNodes, "Number of nodes given type")
.def_property_readonly ("dim", &MeshAccess::GetDimension, "Mesh dimension") .def_property_readonly ("dim", &MeshAccess::GetDimension, "Mesh dimension")
.def_property_readonly ("ngmesh", &MeshAccess::GetNetgenMesh, "Get the Netgen mesh") .def_property_readonly ("ngmesh", &MeshAccess::GetNetgenMesh, "Get the Netgen mesh")


Expand All @@ -955,6 +961,11 @@ mesh (netgen.Mesh): a mesh generated from Netgen
return T_Range<MeshNode> (MeshNode(NodeId(NT_FACE, 0), *mesh), return T_Range<MeshNode> (MeshNode(NodeId(NT_FACE, 0), *mesh),
MeshNode(NodeId(NT_FACE, mesh->GetNNodes(NT_FACE)), *mesh)); MeshNode(NodeId(NT_FACE, mesh->GetNNodes(NT_FACE)), *mesh));
}, "iterable of mesh faces") }, "iterable of mesh faces")

.def("nodes", [] (shared_ptr<MeshAccess> mesh, NODE_TYPE type)
{
return T_Range<MeshNode> (MeshNode(NodeId(type, 0), *mesh),
MeshNode(NodeId(type, mesh->GetNNodes(type)),*mesh)); }, py::arg("node_type"), "iterable of mesh nodes of type type")


.def ("GetTrafo", .def ("GetTrafo",
static_cast<ElementTransformation&(MeshAccess::*)(ElementId,Allocator&)const> static_cast<ElementTransformation&(MeshAccess::*)(ElementId,Allocator&)const>
Expand Down Expand Up @@ -1180,6 +1191,11 @@ mesh (netgen.Mesh): a mesh generated from Netgen
py::arg("VOL_or_BND") = VOL, py::arg("VOL_or_BND") = VOL,
docu_string("Get a MappedIntegrationPoint in the point (x,y,z) on the matching volume (VorB=VOL, default) or surface (VorB=BND) element. BBND elements aren't supported")) docu_string("Get a MappedIntegrationPoint in the point (x,y,z) on the matching volume (VorB=VOL, default) or surface (VorB=BND) element. BBND elements aren't supported"))


.def("__call__", [](MeshAccess& ma, NodeId id)
{
return MeshNode(id,ma);
}, "Get MeshNode from NodeId")

.def("Contains", .def("Contains",
[](MeshAccess & ma, double x, double y, double z) [](MeshAccess & ma, double x, double y, double z)
{ {
Expand Down

0 comments on commit cd91bcf

Please sign in to comment.