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.

Reply via email to