Curvilinear DegreeΒΆ
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 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 theCurvilinearDegree
to be set between 1 and 10. ACurvilinearDegree
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 inJCMsuite
with a suitable choice of the mesh size andFiniteElementDegree
.
.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 } } } }