I would like to generate a nice mesh/grid (i.e., as homogeneous/isotropic as possible) on the unit sphere S^2 in R^3. In particular, I would like to generate two possible grid systems: 1) based on triangles; or 2) based on the Goldberg polyhedra (i.e., the so-called Geodesic Grid). I am wondering whether there are Julia packages to generate those meshes/grids.
Thanks a lot in advance!
Gmsh.jl can generate triangular meshes for spheres (via the addSphere(x,y,z,radius)
function).
Thanks a lot, @stevengj ! I’ll try that package.
Do you want quadrilaterals or triangles? Either can be generated with FinEtools. For example https://github.com/PetrKryslUCSD/FinEtoolsMeshing.jl/blob/8f2460a191e46fa3779fd2ac6a6662654aae9a8e/test/test_meshing.jl#L2963
Here is the GMSH geo file I use to generate spherical (and ellipsoidal meshes) (borrowed from http://bempp.com/)
// from bempp shapes.py
//
// Return an ellipsoid grid.
//
// Parameters
// ----------
// r1 : float
// Radius of first major axis
// r2 : float
// Radius of second major axis
// r3 : float
// Radius of third major axis
// origin : tuple
// Tuple specifying the origin of the ellipsoid
// h : float
// Element size.
// “”"
// stub = “”"max_freq = 2000;
C = 343.2;wav = C / max_freq;
lc = wav / 6; // Characteristic Length – i.e. basic mesh size parameter
r1 = 0.25;
r2 = 0.25;
r3 = 0.25;orig0 = 0.0;
orig1 = 0.0;
orig2 = 0.0;cl = lc;
cl2 = lc;Point(1) = {orig0,orig1,orig2,cl};
Point(2) = {orig0+r1,orig1,orig2,cl};
Point(3) = {orig0,orig1+r2,orig2,cl2};
Point(4) = {orig0-r1,orig1,orig2,cl};
Point(5) = {orig0,orig1-r2,orig2,cl2};
Point(6) = {orig0,orig1,orig2-r3,cl2};
Point(7) = {orig0,orig1,orig2+r3,cl2};Ellipse(1) = {2,1,2,3};
Ellipse(2) = {3,1,4,4};
Ellipse(3) = {4,1,4,5};
Ellipse(4) = {5,1,2,2};
Ellipse(5) = {3,1,3,6};
Ellipse(6) = {6,1,5,5};
Ellipse(7) = {5,1,5,7};
Ellipse(8) = {7,1,3,3};
Ellipse(9) = {2,1,2,7};
Ellipse(10) = {7,1,4,4};
Ellipse(11) = {4,1,4,6};
Ellipse(12) = {6,1,2,2};Line Loop(13) = {2,8,-10};
Ruled Surface(14) = {13};Line Loop(15) = {10,3,7};
Ruled Surface(16) = {15};Line Loop(17) = {-8,-9,1};
Ruled Surface(18) = {17};Line Loop(19) = {-11,-2,5};
Ruled Surface(20) = {19};Line Loop(21) = {-5,-12,-1};
Ruled Surface(22) = {21};Line Loop(23) = {-3,11,6};
Ruled Surface(24) = {23};Line Loop(25) = {-7,4,9};
Ruled Surface(26) = {25};Line Loop(27) = {-4,12,-6};
Ruled Surface(28) = {27};Surface Loop(29) = {28,26,16,14,20,24,22,18};
// GMSH did NOT like this compound constraint…
// Compound Surface{28,26,16,14,20,24,22,18};Volume(30) = {29};
Physical Surface(1) = {14};
Physical Surface(2) = {16};
Physical Surface(3) = {18};
Physical Surface(4) = {20};
Physical Surface(5) = {22};
Physical Surface(6) = {24};
Physical Surface(7) = {26};
Physical Surface(8) = {28};// To generate a curvilinear mesh and optimize it to produce provably valid
// curved elements (see A. Johnen, J.-F. Remacle and C. Geuzaine. Geometric
// validity of curvilinear finite elements. Journal of Computational Physics
// 233, pp. 359-372, 2013; and T. Toulorge, C. Geuzaine, J.-F. Remacle,
// J. Lambrechts. Robust untangling of curvilinear meshes. Journal of
// Computational Physics 254, pp. 8-26, 2013), you can uncomment the following
// lines:
//
// Mesh.ElementOrder = 2;
// Mesh.HighOrderOptimize = 2;Mesh.Algorithm = 2;
Mesh.ElementOrder = 2;
Mesh.HighOrderOptimize = 2;
Here is a solution in pure Julia:
using Meshes
# sphere geometry
sphere = Sphere((0.,0.,0.), 1.)
# polygonal mesh with quadrangles + triangles
mesh = discretize(sphere, RegularDiscretization(30, 30))
# triangulate the mesh so that it contains only triangles
tmesh = triangulate(mesh)
# you can refine a mesh further with triangles
ttmesh = refine(tmesh, TriRefinement())
# or refine it further with quadrangles
qmesh = refine(tmesh, QuadRefinement())
Here is a visualization of all these meshes:
using MeshViz
# choose a Makie backend
import GLMakie as Mke
fig = Mke.Figure()
viz(fig[1,1], mesh, showfacets = true)
viz(fig[1,2], tmesh, showfacets = true)
viz(fig[1,3], ttmesh, showfacets = true)
viz(fig[1,4], qmesh, showfacets = true)
fig
More discretization methods are available, check the docs: Discretization · Meshes.jl
We are always happy to review PRs with new methods.
Thank you everyone for suggesting all these packages! I’ll check them all, and decide which one I would like to use.