# Curvilinear Elements¶

• 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`. 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 } } } } ```