Skip to content

Isoparametric h-adaptation in 2D ( high order split and swapping )

Kaloyan Kirilov requested to merge meshing/nektar:feature/h-adaptation into master

Feature addressed

This module allows for isoparametric 2D high-order h-adaptation (splitting and swapping). It does split both triangular elements with all possible maps. The quadrilateral elements in a hybrid mesh are also split with respect to their adjacent split triangles to ensure conformity.

Proposed solution

The module uses the concept of Isoparametric splitting based on predefined maps that are defined in standard space (reference space). This way the geometrical accuracy and validity of the element is conserved without the need for the CAD itself or CAD-API queries. If the element is straight-sided, we do perform a standard splitting, hence NO expensive backwards and forward mapping between reference and physical spaces are performed.


The module uses a hierarchical approach where.

  1. Process the input options for splitting
    • User-defined element IDs
    • Uniform (all elements)
    • Based on a scale field ( same approach with interpolation as VarOpti r-scaling )
    • Finest(use map that split 1:4) for all selected elements to be split
  2. Identifies the edges to be splitting
    • Longest edge
    • User-defined IDs
    • Uniform (all edges)
    • Once edge is split - add the adjacent element (m_elLink) to the list of elements to be split).
    • When the adjacent element is Quad - we propagate the splitting to the opposite edge and until we reach m_elLink= 0 ( boundary)
  3. Splits isoparametrically the edges. ( Create Hanging Nodes and New Edges)
    • Assign a new member to the Edge->m_childEdges Edge->m_hangingNode
    • Construct the meshgraph pointer of the edge and populate back the edgeNodes
    • If linear - split in the middle and do not construct the meshgraph point.
  4. Loop over the selected and adjacent elements and split.
    1. Identify the relevant map
    2. Split according to the map (create the internal edges)
    3. If linear - just connect the hanging node with the opposite vertex (Much cheaper - No - Backwards and Forward transform).
    4. If the element has an edge that is on the boundary, create m_element[1] edge element for the boundary.
  5. Swapping (optional, robust improvement)
    1. Loop over the adapted elements
    2. Check ratios between local edges
    3. If large -> perform swapping and check if the quality is better
      1. Select the largest edge and the adjacent element
      2. Create new Quad element with the other 4 edges
      3. Create the isoparametric representation of this quad element
      4. Create the new alternative diagonal.
      5. Create the new triangular elements.


Suggested reviewers

@dmoxey , @mgreen

Please add any other information that could be useful for reviewers.


  • Functions and classes, or changes to them, are documented.
  • User guide/documentation is updated.
  • Changelog is updated.
  • Suitable tests added for new functionality.
  • Contributed code is correctly formatted. (See the contributing guidelines).
  • License added to any new files.
  • No extraneous files have been added (e.g. compiler output or test data files).
Edited by Kaloyan Kirilov

Merge request reports