Hello everyone, I am currently implementing the lowest order nedelec simplex elements, which just have one degree of freedom on each edge, but this dof is oriented. I already made good progress in 2D with triangles and hanging nodes, but the sign-conflict for hanging edges in 3D is difficult to resolve.
For 3D, in order to get consistent, precomputable restriction matrices, we need to redefine the orientation of local basis functions at hanging faces and hanging edges. I should be able to adapt the definition for hanging faces from FE_NedelecSZ(Link <https://github.com/dealii/dealii/blob/b18de73e305dfdb7db0f36526767de32c1b86584/source/fe/fe_nedelec_sz.cc#L1796-L1828> ). For hanging edges, the orientation of the child basis function on that line must be the same orientation as the parent basis function of the coarser neighbor on that line. For the FE_NedelecSZ class, the sign adjustment for hanging edges is computed by assuming that each line_neighbor is at most two face_neighbors away (Link <https://github.com/dealii/dealii/blob/b18de73e305dfdb7db0f36526767de32c1b86584/source/fe/fe_nedelec_sz.cc#L1830-L1930>). This assumption does not hold for simplices (and not even for all cube coarse meshes).. So the problem that I want to solve is: On a 2:1 edge-balanced 3d mesh, given a cell and a local edge, return the parent global line when there is a coarser edge-adjacent element and return the own global line, when no coarser element is edge-adjacent. With that information, I can multiply the local basis functions by -1 if their orientation does not fit the global orientation of the line or the parent line. We already thought about some approaches: 1. Contrary to the cell iterators, line iterators do not provide parent functionality. Thus we could add parent functionality to line iterators. 2. It is possible to precompute the edge-relations with one sweep over all cells, since children are available for line-iterators. But since I am trying to incorporate the functionality into fill_fe_values, fill_fe_values itself is not the place to precompute information, and get_data(), where precomputation should take place does not have access to the triangulation. 3. If we still want to focus on precomputation, this information could be saved in the nedelec finite element, with a special function to update that information, which the user needs to call. 4. If we do not precompute anything, one possible solution could be to iterate over face-neighbors adjacent to that line until we find a coarser element, the boundary or our original element. 5. We also had a look into vertex_to_cell_map <https://dealii.org/developer/doxygen/deal.II/namespaceGridTools.html#a9b7e2ca8ecd26a472e5225ba91a58acb>, but as its computation contains a loop over all cells, we again would want to precompute it, but we do not see an appropriate place to precompute information depending on the triangulation in a finite element. (6. Move resolving the sign-conflict from the finite element to the dof-handler.) Am i missing any options? Which of these options do you think are viable, and which do you prefer? Best regards Lukas Dreyer -- The deal.II project is located at http://www.dealii.org/ For mailing list/forum options, see https://groups.google.com/d/forum/dealii?hl=en --- You received this message because you are subscribed to the Google Groups "deal.II User Group" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/dealii/c92aa252-ad70-44b8-8d26-228e7479049fn%40googlegroups.com.
