Obtain high order mesh edge and face nodes?

Here’s a python variant of the function in the PR:

def entities_to_geometry(mesh, dim, entity_list):
    # See https://github.com/FEniCS/dolfinx/pull/1684

    layout = mesh.geometry.cmap.create_dof_layout()
    num_entity_dofs = layout.num_entity_closure_dofs(dim)
    xdofs = mesh.geometry.dofmap

    tdim = mesh.topology.dim
    mesh.topology.create_entities(dim)
    mesh.topology.create_connectivity(dim, tdim)
    mesh.topology.create_connectivity(tdim, dim)
    e_to_c = mesh.topology.connectivity(dim, tdim)
    c_to_e = mesh.topology.connectivity(tdim, dim)

    entity_geometry = np.empty((len(entity_list), num_entity_dofs))

    for i, idx in enumerate(entity_list):
        cell = e_to_c.links(idx)[0]
        cell_entities = c_to_e.links(cell)
        pos = np.nonzero(cell_entities == idx)[0]
        assert pos.size
        local_entity = cell_entities[pos]
        entity_dofs = layout.entity_closure_dofs(dim, local_entity)

        xc = xdofs.links(cell)
        entity_geometry[i] = xc[entity_dofs]

    return entity_geometry
1 Like