netgen/tests/pytest/test_tutorials.py
2019-08-08 10:12:33 +02:00

76 lines
2.8 KiB
Python

import os, pytest
from netgen.meshing import meshsize
import netgen.gui
import netgen.csg as csg
import netgen.stl as stl
import netgen.csg as csg
from results import *
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):
standard = (meshsize.very_coarse, meshsize.coarse, meshsize.moderate, meshsize.fine, meshsize.very_fine)
if filename == "shell.geo":
return [] # do not test this example cause it needs so long...
if filename == "extrusion.geo":
return [] # this segfaults right now
if filename == "manyholes2.geo" or filename == "manyholes.geo":
return standard[:2] # this gets too big for finer meshsizes
return standard
# don't test step files as they do not respect all meshing parameters correctly yet.
_geofiles = [f for f in getFiles(".geo")] + [f for f in getFiles(".stl")] # + [f for f in getFiles(".step")]
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))
return geo.GenerateMesh(mp)
@pytest.mark.parametrize("filename, checkFunc", [(f, getCheckFunc(f)) for f in _geofiles])
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()