5
$\begingroup$

The Element Mesh Generation tutorial describes how good mesh accuracy is achieved through adjusting boundary nodes so they match the region boundary. This is illustrated with this example:

mesh2d = ToElementMesh[Disk[]];
\[Pi] - Total@First@mesh2d["MeshElementMeasure"]
2.00118*10^-6

When I try the 3d equivalent of this, I get a much bigger error:

mesh3d = ToElementMesh[Sphere[]];
4/3 \[Pi] - Total@First@mesh3d["MeshElementMeasure"]
0.0213137

I suspect this node adjusting process works differently in 3d. Is there a way to improve the accuracy of 3d meshes without requiring a huge number of elements?

$\endgroup$
5
$\begingroup$

In 3D the boundary improvement is much harder than in 2D for this reason it is off by default in 3D. You can turn it on with

mesh3d = ToElementMesh[Ball[], "ImproveBoundaryPosition" -> True];
4/3 \[Pi] - Total@First@mesh3d["MeshElementMeasure"]

0.0000975943

When it's off I get 0.0600351. Should you get messages that the element quality is below zero then the movement of the boundary nodes mixed the mesh structure up. One of these days I'd need to write a better code for the 3D boundary improvement.

For a Sphere you get a better result with:

bmesh = ToBoundaryMesh[Sphere[]];
bmesh["MeshOrder"]
1

Area[Sphere[]] - NIntegrate[1, Element[{x, y, z}, bmesh]]
0.035370648951490224`

Versus:

bmesh = ToBoundaryMesh[Sphere[], "MeshOrder" -> 2];
bmesh["MeshOrder"]
2

Area[Sphere[]] - NIntegrate[1, Element[{x, y, z}, bmesh]]
0.00012678984229808066`

(Note there is no "BoundaryElementMeasure"). "ImproveBoundaryPosition" does not seem to have an effect here. I can quite say off hand why that is.

In some cases Method 3 (attaching a symbolic region to a numeric region for improving accuracy) can be useful too.

$\endgroup$
2
  • $\begingroup$ Thanks @user21. When I try using the "ImproveBoundaryPosition" -> True option on a Sphere (instead of a Ball) I don't see any improvement in accuracy. Is that because a Sphere is a shell rather than a solid body? $\endgroup$ Jul 8 at 0:56
  • $\begingroup$ @JackMcInerney, see update. $\endgroup$
    – user21
    Jul 8 at 4:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.