refactor(meshGeneration): working on gmsh to generate curvilinear isogeomatric spherical mesh

This commit is contained in:
2025-04-30 07:26:58 -04:00
parent ec37fda35b
commit 424f6eee9b
11 changed files with 43664 additions and 28 deletions

View File

@@ -1,37 +1,39 @@
import pygmsh
import meshio
import numpy as np
from math import sqrt
import argparse
import subprocess as sp
import os
def mesh_size_callback(dim, tag, x, y, z, lc, a, b, k):
r = np.sqrt(x**2 + y**2 + z**2)
size = a + (b-a) * (1-np.exp(-k*r))
return size
def generateMesh(coreMeshRes, outerMeshRes, k, order):
# gmsh sphere.geo -3 -setnumber Parameters/Order 1 -setnumber Parameters/CoreRes 0.2 -setnumber Parameters/OuterRes 0.4 -setnumber Parameters/K 2.0 -o sphere_order2.msh
gmsh_cmd = [
'gmsh',
'sphere.geo', # Path to your GMSH geometry file
'-3', # Generate 3D mesh
'-setnumber', 'Parameters/Order', str(order),
'-setnumber', 'Parameters/CoreRes', str(coreMeshRes),
'-setnumber', 'Parameters/OuterRes', str(outerMeshRes),
'-setnumber', 'Parameters/K', str(k),
'-o', 'sphere.vtk', # Output mesh file
'-format', 'vtk'
def generate_spherical_mesh(radius=1.0, coreRes = 0.1, outRes = 0.1, k = 2):
with pygmsh.occ.Geometry() as geom:
originPoint = geom.add_point([0.0, 0.0, 0.0], mesh_size=coreRes)
geom.add_ball([0.0, 0.0, 0.0], 1.0)
geom.set_mesh_size_callback(lambda dim, tag, x, y, z, lc: mesh_size_callback(dim, tag, x, y, z, lc, coreRes, outRes, k))
mesh = geom.generate_mesh(verbose=True)
return mesh
def write_mfem_mesh(meshData, filename):
meshio.write(filename, meshData, file_format='gmsh22')
]
# Use popen to run
process = sp.Popen(gmsh_cmd)
stdout, stderr = process.communicate()
if process.returncode != 0:
print(f"Error generating mesh: {stderr.decode()}")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Generate a spherical mesh')
parser.add_argument('--radius', type=float, default=1.0, help='Radius of the sphere')
parser.add_argument('--coreMeshRes', type=float, default=0.01, help='Core Mesh Resolution')
parser.add_argument('--outerMeshRes', type=float, default=0.1, help='Outer Mesh Resolution')
parser.add_argument('--coreMeshRes', type=float, default=0.1, help='Core Mesh Resolution target')
parser.add_argument('--outerMeshRes', type=float, default=0.3, help='Outer Mesh Resolution target')
parser.add_argument('--k', type=float, default=2, help='Mesh size scaling factor')
parser.add_argument('--output', type=str, default='sphere.msh', help='Output file name')
# Add argument for element order
parser.add_argument('--order', type=int, default=2, help='Mesh element order (e.g., 1 for linear, 2 for quadratic)')
parser.add_argument('--output', type=str, default='sphere.vtk', help='Output file name')
args = parser.parse_args()
meshData = generate_spherical_mesh(args.radius, args.coreMeshRes, args.outerMeshRes, args.k)
write_mfem_mesh(meshData, args.output)
# Generate the mesh
generateMesh(args.coreMeshRes, args.outerMeshRes, args.k, args.order)