anisotropy/salomepl/genmesh.py

167 lines
3.5 KiB
Python
Raw Normal View History

2021-05-26 17:18:39 +05:00
###
# This file executes inside salome environment
2021-05-26 22:02:44 +05:00
#
# salome starts at user home directory
2021-05-26 17:18:39 +05:00
##
import os, sys
2021-04-01 15:48:20 +05:00
import math
2021-03-24 21:27:12 +05:00
import salome
2021-06-02 16:12:34 +05:00
2021-07-26 18:00:23 +05:00
@click.command()
@click.argument("root")
@click.argument("name")
@click.argument("direction")
@click.argument("theta", type = click.FLOAT)
def genmesh(root, name, direction, theta):
###
# Args
##
direction = list(map(lambda num: float(num), direction[1:-1].split(",")))
###
# Modules
##
sys.path.extend([
root,
os.path.join(root, "env/lib/python3.9/site-packages")
])
import logging
import click
from anisotropy import Anisotropy
from salomepl.simple import simple
from salomepl.faceCentered import faceCentered
from salomepl.bodyCentered import bodyCentered
from salomepl.geometry import getGeom
from salomepl.mesh import Mesh, Fineness, ExtrusionMethod, defaultParameters
2021-07-26 18:00:23 +05:00
###
# Model
##
model = Anisotropy()
model.updateFromDB()
2021-07-26 18:00:23 +05:00
p = model.getParams(name, direction, theta)
2021-05-26 22:02:44 +05:00
2021-07-26 18:00:23 +05:00
###
# Logger
##
logging.basicConfig(
level = logging.INFO,
format = model.env["logger"]["format"],
handlers = [
logging.StreamHandler(),
logging.FileHandler(
os.path.join(model.env["LOG"], model.env["logger"]["name"])
)
]
)
logger = logging.getLogger(model.env["logger"]["name"])
2021-07-26 18:00:23 +05:00
###
# Entry
##
logger.info("\n".join([
"genmesh:",
f"structure type:\t{ p['name'] }",
f"coefficient:\t{ p['geometry']['theta'] }",
f"fillet:\t{ p['geometry']['fillets'] }",
f"flow direction:\t{ p['geometry']['direction'] }"
]))
2021-03-24 21:27:12 +05:00
2021-04-12 16:00:26 +05:00
salome.salome_init()
2021-07-26 18:00:23 +05:00
2021-04-12 16:00:26 +05:00
###
# Shape
##
2021-05-26 22:02:44 +05:00
geompy = getGeom()
2021-07-26 18:00:23 +05:00
structure = globals().get(p["name"])
shape, groups = structure(
p["geometry"]["theta"],
p["geometry"]["fillets"],
p["geometry"]["direction"]
)
2021-04-12 16:00:26 +05:00
[length, surfaceArea, volume] = geompy.BasicProperties(shape, theTolerance = 1e-06)
2021-07-26 18:00:23 +05:00
logger.info("\n".join([
"shape:"
f"edges length:\t{ length }",
f"surface area:\t{ surfaceArea }",
f"volume:\t{ volume }"
]))
2021-04-12 16:00:26 +05:00
###
# Mesh
##
2021-07-26 18:00:23 +05:00
mp = p["mesh"]
2021-07-26 18:00:23 +05:00
lengths = [
geompy.BasicProperties(edge)[0] for edge in geompy.SubShapeAll(shape, geompy.ShapeType["EDGE"])
]
meanSize = sum(lengths) / len(lengths)
2021-07-26 18:00:23 +05:00
mp["maxSize"] = meanSize
mp["minSize"] = meanSize * 1e-1
mp["chordalError"] = mp["maxSize"] / 2
faces = []
2021-04-12 16:00:26 +05:00
for group in groups:
if group.GetName() in mconfig["facesToIgnore"]:
faces.append(group)
2021-04-12 16:00:26 +05:00
mesh = Mesh(shape)
2021-07-26 18:00:23 +05:00
mesh.Tetrahedron(**mp)
if mp["viscousLayers"]:
mesh.ViscousLayers(**mp, faces = faces)
2021-07-26 18:00:23 +05:00
smp = p["submesh"]
2021-06-02 16:12:34 +05:00
2021-07-26 18:00:23 +05:00
for name in smp.keys():
for group in groups:
if group.GetName() == name:
subshape = group
2021-07-26 18:00:23 +05:00
smp["maxSize"] = meanSize * 1e-1
smp["minSize"] = meanSize * 1e-3
smp["chordalError"] = smp["minSize"] * 1e+1
mesh.Triangle(subshape, **smp)
2021-06-02 16:12:34 +05:00
2021-03-24 21:27:12 +05:00
returncode, errors = mesh.compute()
if not returncode:
2021-07-26 18:00:23 +05:00
# TODO: MeshResult
pass
else:
logger.error(errors)
mesh.removePyramids()
mesh.assignGroups()
2021-07-26 18:00:23 +05:00
mesh.exportUNV(os.path.join(p["path"], "mesh.unv"))
stats = ""
for k, v in mesh.stats().items():
stats += f"{ k }:\t\t{ v }\n"
logger.info(f"mesh stats:\n{ stats[ :-1] }")
2021-04-12 16:00:26 +05:00
salome.salome_close()