Curvilinear ElementsΒΆ

Learning targets (advanced)

  • Construct curved boundaries using curvilinear elements

We have previously seen how mesh options can be used to generate quality meshes. When generating meshes for realistic objects, we often want to include curved surfaces. Using triangular meshes, curves can be well approximated compared to square and rectangular meshes. However, we can go one step further and create triangular elements with curved edges, so called curvilinear elements. These are especially well suited to the case of meshing curved surfaces with relatively few elements.

In this example we will learn how to apply a curvilinear correction to mesh objects using the mesh option CurvilinearDegree.

_images/snapshot_0011.png

Continuing from the examples introduced in mesh options, we have defined circles with the same radius but differing options for the meshing.

Circle {
  Name = "Circle_Left"
  ...
}

The object "Circle_Left" has no specific mesh options defined. Therefore, it uses the globally defined mesh constraints. The boundary of the circle is noticeably pointed and rough due to the coarse mesh constraint.

Circle {
  Name = "Circle_Center"
  MeshOptions {
    BoundaryMeshConstraint {
      MaximumSideLength = 0.2
    }
  }
  ...
}

The object "Circle_Center" has a constraint on the maximum length of the triangle sides which lie on the boundary. Due to the fine mesh constraint on the boundary, the circle edge is much smoother. This comes at the cost of requiring more elements to resolve the fine mesh.

Circle {
  Name = "Circle_Right"
  MeshOptions {
    CurvilinearDegree = 2
  }
  ...
}

The object "Circle_Right" has the CurvilinearDegree set to 2. The circle boundary is once again smooth due to the curvature of the triangle edges. This allows for smooth meshing of curved surfaces without increasing the number elements required.

The CurvilinearDegree determines the polynomial degree of the displacement field added to the linear mesh to approximate curved geometries. This allows for a more accurate resolution of curved geometries without increasing memory requirements due to smaller mesh elements.

Note

  • Higher values of the CurvilinearDegree allow for increasingly smooth edges of curved geometry objects, such as circles, ellipses, rings, etc.
  • The CurvilinearDegree has no effect for geometry objects with straight edges, such as squares and rectangles. This also includes polygons, even if the sides of the polygon are used to approximate a curved surface.
  • Using the CurvilinearDegree mesh option may increase the time meshing and assembly times.

Note

  • The FEM solver JCMsuite allows the CurvilinearDegree to be set between 1 and 10. A CurvilinearDegree of 1 provides the default straight edges, present if no curvilinear degree is defined.

Note

  • The CurvilinearDegree mesh option is very well suited to creating geometrically smooth meshes with few elements, and thus minimizing errors occurring due to the discretization of the geometry. Errors occurring due to the discretization of the field should be treated as usual in JCMsuite with a suitable choice of the mesh size and FiniteElementDegree.

.jcm Input File

  • layout.jcm [ASCII]

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    
    
    Layout2D {
      
      MeshOptions {
        MaximumSideLength = 2.0
        MinimumMeshAngle = 25.0
      }
      Objects {
        
        Polygon { 
          Name = "ComputationalDomain"
          DomainId = 4
          Priority = ComputationalDomain
          Points = [-6 -4, 6 -4, 6  4, -6  4] 
          MeshOptions {
            
          }
        }
        Circle { 
          Name = "Circle_Left"
          DomainId = 10
          Radius = 1.5
          GlobalPosition = [-3.6 0.0]       
        }
        
        Circle { 
          Name = "Circle_Center"
          DomainId = 10
          Radius = 1.5
          GlobalPosition = [0.0 0.0]      
          MeshOptions {        
            BoundaryMeshConstraint {
              MaximumSideLength = 0.2
            }
          }
        }
        
        Circle { 
          Name = "Circle_Right"
          DomainId = 10
          Radius = 1.5
          GlobalPosition = [3.6 0.0]       
          MeshOptions {
            CurvilinearDegree = 2
          }
        }    
      }
    }