Hello,

I think the adaptive mesh refinement rule used in ngsolve is the bisection algorithm. I understand how it works in 2D on a triangular mesh, but am having trouble about the algorithm details used in netgen.

Can you point me to the right reference so that I can have a better understanding of the tetrahedral bisection algorithm. One thing was a surprise to me is that in 3D, a newly generated vertex’s parent nodes can be two newly generated vertices, which does not happen in 2D.

Best,

Guosheng

Hi Guosheng,

The bisection is coded following Arnold + Mukherjee

When one tetrahedral element is marked for refinement, it will be bisected 3 times to obtain half the mesh-size.

Also un-marked elements get refined to form the conforming closure.

I also wonder why parent nodes are newly generated vertices on the current level, on tetrahedral meshes.

Can you provide an example ?

Joachim

Hi Joachim,

Thanks for the quick response. I will take a look at their algorithm.

Attached is a small locally refined mesh. There are two vertices in the last level mesh for which one of there parent vertex is a new vertex in the last level.

Best,

Guosheng

Attachment: testBisect.py

It seems that we would not expect new vertices being always children of old vertices for tet refinement in theory.

For the previously provided mesh, we fine the vertex V32 in refinement level 2 is the child of V8 and V19 (which is also a new vertex in refinement level 2).

Looking into details of the mesh connectivity, I found the new vertex V32 is needed for mesh conformity, otherwise, V25 will be a hanging node on edge V8/V9 for the tet [V8,V19,V31,V9].

To close this post, I found the reason for new vertices with new parent vertices is the 3 times bisection of a type P_f tet (according to notation of Arnold/Mukherjee).

It generates a face that is bisected three times, as shown in the attached figure (bottom face 012).