2019-08-08 13:12:33 +05:00
|
|
|
|
|
|
|
import os, pytest
|
2019-08-19 23:33:49 +05:00
|
|
|
from netgen.meshing import meshsize, MeshingParameters, SetMessageImportance
|
2019-08-08 13:12:33 +05:00
|
|
|
import netgen.csg as csg
|
|
|
|
import netgen.stl as stl
|
2019-08-21 20:28:09 +05:00
|
|
|
try:
|
|
|
|
import netgen.occ as occ
|
|
|
|
has_occ = True
|
|
|
|
except ImportError:
|
|
|
|
has_occ = False
|
2019-08-08 13:12:33 +05:00
|
|
|
from results import *
|
|
|
|
|
2019-08-19 23:33:49 +05:00
|
|
|
SetMessageImportance(0)
|
|
|
|
|
2019-08-08 13:12:33 +05:00
|
|
|
def getFiles(fileEnding):
|
|
|
|
r, d, files = next(os.walk(os.path.join("..","..","tutorials")))
|
|
|
|
return (f for f in files if f.endswith(fileEnding))
|
|
|
|
|
|
|
|
|
|
|
|
def getCheckFunc(filename):
|
|
|
|
def func(mesh,i):
|
|
|
|
if filename in number_elements:
|
|
|
|
# number of elements should be in 2% range of expected value
|
|
|
|
assert mesh.ne == pytest.approx(number_elements[filename][i], rel=0.02)
|
|
|
|
return func
|
|
|
|
|
|
|
|
def getResultFunc(filename):
|
|
|
|
def resultFunc(mesh):
|
|
|
|
results = {}
|
|
|
|
results["number_elements"] = mesh.ne
|
|
|
|
return results
|
|
|
|
return resultFunc
|
|
|
|
|
|
|
|
def getMeshingparameters(filename):
|
2019-08-19 23:33:49 +05:00
|
|
|
standard = [{}] + [{ "mp" : ms } for ms in (meshsize.very_coarse, meshsize.coarse, meshsize.moderate, meshsize.fine, meshsize.very_fine)]
|
2019-08-08 13:12:33 +05:00
|
|
|
if filename == "shell.geo":
|
|
|
|
return [] # do not test this example cause it needs so long...
|
|
|
|
if filename == "extrusion.geo":
|
|
|
|
return [] # this segfaults right now
|
2019-08-19 23:33:49 +05:00
|
|
|
if filename == "manyholes2.geo":
|
|
|
|
return [standard[1]] # this gets too big for finer meshsizes
|
|
|
|
if filename in ("manyholes.geo", "frame.step"):
|
|
|
|
return standard[:3] # this gets too big for finer meshsizes
|
|
|
|
if filename == "screw.step":
|
|
|
|
return standard[3:] # coarser meshes don't work here
|
2019-08-08 13:12:33 +05:00
|
|
|
return standard
|
|
|
|
|
2019-08-21 20:28:09 +05:00
|
|
|
_geofiles = [f for f in getFiles(".geo")] + [f for f in getFiles(".stl")]
|
|
|
|
if has_occ:
|
|
|
|
_geofiles += [f for f in getFiles(".step")]
|
2019-08-19 23:33:49 +05:00
|
|
|
|
2019-08-08 13:12:33 +05:00
|
|
|
def generateMesh(filename, mp):
|
|
|
|
if filename.endswith(".geo"):
|
|
|
|
geo = csg.CSGeometry(os.path.join("..","..","tutorials", filename))
|
|
|
|
elif filename.endswith(".stl"):
|
|
|
|
geo = stl.STLGeometry(os.path.join("..","..","tutorials", filename))
|
|
|
|
elif filename.endswith(".step"):
|
|
|
|
geo = occ.OCCGeometry(os.path.join("..","..","tutorials", filename))
|
2019-08-19 23:33:49 +05:00
|
|
|
return geo.GenerateMesh(**mp)
|
2019-08-08 13:12:33 +05:00
|
|
|
|
2019-08-29 20:56:47 +05:00
|
|
|
def isSlowTest(filename):
|
|
|
|
return filename in ["cubemcyl.geo", "frame.step", "revolution.geo", "manyholes.geo", "torus.geo",
|
|
|
|
"cubemsphere.geo", "manyholes2.geo", "matrix.geo", "trafo.geo", "ellipticcone.geo",
|
|
|
|
"period.geo", "shaft.geo", "cubeandring.geo", "ellipticcyl.geo",
|
|
|
|
"ellipsoid.geo", "cone.geo"]
|
|
|
|
|
|
|
|
def getParamForTest(filename):
|
|
|
|
return pytest.param(filename, getCheckFunc(filename), marks=pytest.mark.slow) if isSlowTest(filename) \
|
|
|
|
else (filename, getCheckFunc(filename))
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(("filename, checkFunc"), [getParamForTest(f) for f in _geofiles])
|
2019-08-08 13:12:33 +05:00
|
|
|
def test_geoFiles(filename, checkFunc):
|
|
|
|
for i, mp in enumerate(getMeshingparameters(filename)):
|
|
|
|
print("load geo", filename)
|
|
|
|
mesh = generateMesh(filename, mp)
|
|
|
|
if checkFunc is not None:
|
|
|
|
checkFunc(mesh,i)
|
|
|
|
|
|
|
|
import time
|
|
|
|
def generateResultFile():
|
|
|
|
with open("results.py", "w") as f:
|
|
|
|
print("number_elements = {}", file=f)
|
|
|
|
for _file, _func in ((gf, getResultFunc(gf)) for gf in _geofiles):
|
|
|
|
start = time.time()
|
|
|
|
print("write", _file)
|
|
|
|
mps = getMeshingparameters(_file)
|
|
|
|
if not mps:
|
|
|
|
continue
|
|
|
|
results = [_func(generateMesh(_file, mp)) for mp in mps]
|
|
|
|
print("number_elements['{}'] = {}".format(_file, "(" + ",".join((str(r["number_elements"]) for r in results)) + ")"), file=f)
|
|
|
|
print("needed", time.time() - start, "seconds")
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
generateResultFile()
|