smesh/test/gmsh_runner.py
cconopoima a33b1ed60e [bos #38045][bos #38046] New SA versions of NETGEN and GMSH.
Add netgen_runner_test for 1D2D3D

add test for gmsh_runner

Improve test for netgen and gmsh. Add new versions in option mesher_launcher.py

Add test for Netgen2D SA version.

Test for Netgen 2D SA version.

Code cleanup.

Adapt mesher_launcher and add creating_parallel_gmsh_mesh.py test for Remote version of 3D GMSH.

test for parallel mesh for 2D using new netgen SA/Remote version. Add the possibility to export Mesh1D.med in SMESH_Gen.cxx at method parallelComputeSubMeshes. Modify the constructor of ParallelMesh class in smeshBuilder to handle 2D meshing in parallel.
2024-01-18 10:27:15 +00:00

239 lines
7.0 KiB
Python

#!/usr/bin/env python
import sys
import salome
salome.salome_init()
import time
from os import path
import tempfile
import subprocess
import GEOM, SMESH, SALOMEDS
from salome.geom import geomBuilder
from salome.smesh import smeshBuilder
import math
smesh = smeshBuilder.New()
geompy = geomBuilder.New()
import medcoupling as mc
def create_gmsh_empty_param_file(param_file):
""" Create a parameter file for runner """
param = """0"""
with open(param_file, "w") as ffile:
ffile.write(param)
def create_gmsh_param_file(param_file):
""" Create a parameter file for runner """
param = """1
0
0
0
0
0
0
2
1.0
0.0
1e22
0.0
0
0
0"""
with open(param_file, "w") as ffile:
ffile.write(param)
def runTheMesher( mesh_2d, geo, emptyParam=False ):
nb_tetras = 0
nb_points = 0
nb_triangles = 0
nb_segments = 0
with tempfile.TemporaryDirectory() as tmp_dir:
mesh_file = path.join(tmp_dir, "mesh.med")
shape_file = path.join(tmp_dir, "shape.brep")
param_file = path.join(tmp_dir, "gmsh_param.txt")
new_elementsbinary = path.join(tmp_dir, "nodesAndElements.bin")
output_mesh = path.join(tmp_dir, "mesh3D.med")
print("Running in folder: ", tmp_dir)
if not ( emptyParam ):
create_gmsh_param_file(param_file)
else:
create_gmsh_empty_param_file(param_file)
mesh_2d.ExportMED(mesh_file, 0, 41, 1, mesh_2d, 1, [], '', -1, 1)
geompy.ExportBREP( geo, shape_file )
runner = path.join("${GMSHPLUGIN_ROOT_DIR}",
"bin",
"salome",
"GMSHPlugin_Runner")
if sys.platform == 'win32':
runner += ".exe"
cmd = "{runner} GMSH3D {mesh_file} {shape_file} "\
"{param_file} NONE {new_elementsbinary} {output_mesh}"\
.format(runner=runner,
mesh_file=mesh_file,
shape_file=shape_file,
param_file=param_file,
new_elementsbinary=new_elementsbinary,
output_mesh=output_mesh)
print(cmd)
subprocess.check_call(cmd, shell=True)
mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", 0)
nb_tetras = mesh_read.getNumberOfCellsWithType(mc.NORM_TETRA4)
nb_points = mesh_read.getNumberOfNodes()
mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -1)
nb_triangles = mesh_read.getNumberOfCellsWithType(mc.NORM_TRI3)
mesh_read = mc.ReadUMeshFromFile(output_mesh, "MESH", -2)
nb_segments = mesh_read.getNumberOfCellsWithType(mc.NORM_SEG2)
return [nb_points, nb_segments, nb_triangles, nb_tetras]
def test_gmsh3dDefault():
""" Test gmsh3d """
# Building geometry
box = geompy.MakeBoxDXDYDZ(200, 200, 200)
geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
[_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
mesh_2d = smesh.Mesh(box, 'Maillage_1')
mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
isDone = mesh_2d.Compute()
premeshedTriangles = mesh_2d.NbFaces()
premeshedTetras = mesh_2d.NbVolumes()
if not isDone:
raise Exception("Error when computing Mesh")
smesh.SetName(mesh_2d, 'Maillage_1')
[nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box )
print("Nb Tetras:", nb_tetras)
print("Nb Triangles:", nb_triangles)
print("Nb Segments:", nb_segments)
print("Nb Points:", nb_points)
assert premeshedTetras == 0
assert nb_triangles == premeshedTriangles
assert nb_tetras == 6 # number of tetras for normalized 2D premesh (update if default 2D netgen change!)
assert nb_points == 8 # one node in each vertex of the cube
assert nb_segments > 0
def test_gmsh3d():
""" Test gmsh3d """
# Building geometry
box = geompy.MakeBoxDXDYDZ(200, 200, 200)
geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
[_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
# Creating 2D mesh
netgen_2d_parameters_1 = smesh.CreateHypothesisByAverageLength(
'NETGEN_Parameters_2D', 'NETGENEngine', 34.641, 0 )
mesh_2d = smesh.Mesh(box, 'Maillage_1')
mesh_2d.AddHypothesis(box, netgen_2d_parameters_1)
mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
isDone = mesh_2d.Compute()
premeshedTriangles = mesh_2d.NbFaces()
premeshedTetras = mesh_2d.NbVolumes()
if not isDone:
raise Exception("Error when computing Mesh")
smesh.SetName(mesh_2d, 'Maillage_1')
[nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box )
print("Nb Tetras:", nb_tetras)
print("Nb Triangles:", nb_triangles)
print("Nb Segments:", nb_segments)
print("Nb Points:", nb_points)
assert premeshedTetras == 0
assert nb_triangles == premeshedTriangles
assert nb_tetras > 6
assert nb_points > 8
assert nb_segments > 0
def test_gmsh3d_empty_parameters():
""" Test gmsh3d """
# Building geometry
box = geompy.MakeBoxDXDYDZ(200, 200, 200)
geompy.ExtractShapes(box, geompy.ShapeType["FACE"], True)
groupe_1 = geompy.CreateGroup(box, geompy.ShapeType["FACE"] )
geompy.UnionIDs(groupe_1, [3, 13, 23, 27, 31, 33])
[_, _, _, _, _, _, groupe_1] = geompy.GetExistingSubObjects(box, False)
shape_faces = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])
# Creating 2D mesh
netgen_2d_parameters_1 = smesh.CreateHypothesisByAverageLength(
'NETGEN_Parameters_2D', 'NETGENEngine', 34.641, 0 )
mesh_2d = smesh.Mesh(box, 'Maillage_1')
mesh_2d.AddHypothesis(box, netgen_2d_parameters_1)
mesh_2d.Triangle(algo=smeshBuilder.NETGEN_1D2D)
isDone = mesh_2d.Compute()
premeshedTriangles = mesh_2d.NbFaces()
premeshedTetras = mesh_2d.NbVolumes()
if not isDone:
raise Exception("Error when computing Mesh")
smesh.SetName(mesh_2d, 'Maillage_1')
[nb_points, nb_segments, nb_triangles, nb_tetras] = runTheMesher( mesh_2d, box, True )
print("Nb Tetras:", nb_tetras)
print("Nb Triangles:", nb_triangles)
print("Nb Segments:", nb_segments)
print("Nb Points:", nb_points)
assert premeshedTetras == 0
assert nb_triangles == premeshedTriangles
assert nb_tetras > 6
assert nb_points > 8
assert nb_segments > 0
if __name__ == "__main__":
if sys.platform == "win32":
print("Disabled on windows")
sys.exit(0)
test_gmsh3dDefault()
test_gmsh3d()
test_gmsh3d_empty_parameters()