# Curvilinear DegreeΒΆ

• 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 tetrahedral meshes, curves can be well approximated compared to cubic meshes. However, we can go one step further and create tetrahedral 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`.

We define three spheres with the same radius but differing options for the meshing. The left sphere has a coarse mesh constraint, the center sphere has a fine mesh constraint, while the right sphere has a coarse mesh constraint and curvilinear surface elements.

A cross section of the three spheres with the surrounding mesh emphasizes the differing surface curvatures of the objects.

```Sphere {
Name = "Coarse Sphere"
MeshOptions {
BoundaryMeshConstraint {
MaximumSideLength = 0.7
}
MaximumSideLength = 0.8
}
...
}
```

The object `"Coarse Sphere"` on the left hand side has a relatively coarse constraint for the side length of the tetrahedra for both the surface and interior. This results in a sphere surface that is noticeably pointed and rough.

```Sphere {
Name = "Fine Sphere"
MeshOptions {
BoundaryMeshConstraint {
MaximumSideLength = 0.3
}
MaximumSideLength = 0.8
}
...
}
```

The object `"Fine_Sphere"` in the center has a finer constraint on the side length of tetrahedra at the object surface. This results in the sphere surface being much more accurately resolved and it appears much smoother. This comes at the cost of requiring more elements to resolve the fine mesh.

```Sphere {
Name = "Curvilinear Sphere"
MeshOptions {
BoundaryMeshConstraint {
MaximumSideLength = 0.7
}
MaximumSideLength = 0.8
CurvilinearDegree = 2
}
...
}
```

The object `"Curvilinear Sphere"` on the right has the coarse mesh constraints seen in the object `"Coarse Sphere"`, with the addition of the `CurvilinearDegree` being set to 2. This produces a spherical surface that is even smoother than the one present in `"Fine Sphere"`, while also using many fewer elements.

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 `CurvilinearDegree` allow for increasingly smooth edges of curved geometry objects, such as spheres, ellipsoids, cylinders, etc.
• The `CurvilinearDegree` has no effect for geometry objects with straight edges, such as boxes and rectangles, unless a smooth corner rounding has been applied.
• 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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83``` ``` Layout3D { Name = "TutorialExample3DCurvilinear" MeshOptions { MaximumSideLength = 0.7 } Extrusion { Objects { Parallelogram { Name = "ComputationalDomain/Background" DomainId = 1 Priority = ComputationalDomain Port = Center Width = 16. Height = 5. Boundary { Class = Periodic } } } MultiLayer { LayerInterface { BoundaryClass = Transparent GlobalZ = -2.5 } Layer { Thickness = 5. DomainId = 1 } LayerInterface { BoundaryClass = Transparent } } } Objects { Sphere { Name = "Coarse Sphere" GlobalPosition = [3.5 0 0] Radius = 1.5 DomainId = 2 MeshOptions { BoundaryMeshConstraint { MaximumSideLength = 0.7 } MaximumSideLength = 0.8 } } Sphere { Name = "Fine Sphere" GlobalPosition = [0 0 0] Radius = 1.5 DomainId = 2 MeshOptions { BoundaryMeshConstraint { MaximumSideLength = 0.3 } MaximumSideLength = 0.8 } } Sphere { Name = "Curvilinear Sphere" GlobalPosition = [-3.5 0 0] Radius = 1.5 DomainId = 2 MeshOptions { BoundaryMeshConstraint { MaximumSideLength = 0.7 } MaximumSideLength = 0.8 CurvilinearDegree = 2 } } } } ```