refactor(meshGeneration): working on gmsh to generate curvilinear isogeomatric spherical mesh
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user