anisotropy/salomepl/genmesh.py

143 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-06-02 16:12:34 +05:00
#
# sys.argv = [ .., ROOT, case ]
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-05-26 22:02:44 +05:00
# get project path from args
2021-06-02 16:12:34 +05:00
ROOT = sys.argv[1]
CASE = sys.argv[2]
sys.path.append(ROOT)
# site-packages from virtual env
sys.path.append(os.path.join(ROOT, "env/lib/python3.9/site-packages"))
import toml
import logging
from anisotropy.utils import struct
2021-06-02 12:41:12 +05:00
from salomepl.simple import simple
from salomepl.faceCentered import faceCentered
from salomepl.bodyCentered import bodyCentered
2021-05-26 22:02:44 +05:00
from salomepl.geometry import getGeom
from salomepl.mesh import Mesh, Fineness, ExtrusionMethod, defaultParameters
def genmesh(config):
2021-06-02 16:12:34 +05:00
logger.info(f"""genmesh:
structure type:\t{ config.structure }
coefficient:\t{ config.geometry.theta }
2021-06-02 16:12:34 +05:00
fillet:\t{ config.geometry.fillet }
flow direction:\t{ config.geometry.direction }""")
2021-03-24 21:27:12 +05:00
2021-04-12 16:00:26 +05:00
salome.salome_init()
###
# Shape
##
2021-05-26 22:02:44 +05:00
geompy = getGeom()
2021-06-02 16:12:34 +05:00
structure = globals().get(config.structure)
shape, groups = structure(config.geometry.theta, config.geometry.fillet, config.geometry.direction)
2021-04-12 16:00:26 +05:00
[length, surfaceArea, volume] = geompy.BasicProperties(shape, theTolerance = 1e-06)
2021-06-02 16:12:34 +05:00
logger.info(f"""shape:
edges length:\t{ length }
surface area:\t{ surfaceArea }
volume:\t{ volume }""")
2021-04-12 16:00:26 +05:00
###
# Mesh
##
config = dict(config)
mconfig = defaultParameters(**config["mesh"])
lengths = [ geompy.BasicProperties(edge)[0] for edge in geompy.SubShapeAll(shape, geompy.ShapeType["EDGE"]) ]
meanSize = sum(lengths) / len(lengths)
mconfig["maxSize"] = meanSize
mconfig["minSize"] = meanSize * 1e-1
mconfig["chordalError"] = mconfig["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
mconfig["faces"] = faces
mesh = Mesh(shape)
mesh.Tetrahedron(**mconfig)
if mconfig["viscousLayers"]:
mesh.ViscousLayers(**mconfig)
2021-04-12 16:00:26 +05:00
config["mesh"].update(mconfig)
smconfigs = config["mesh"]["submesh"]
2021-06-02 16:12:34 +05:00
for name in smconfigs.keys():
for group in groups:
if group.GetName() == name:
subshape = group
smconfig = defaultParameters(**smconfigs[name])
smconfig["maxSize"] = meanSize * 1e-1
smconfig["minSize"] = meanSize * 1e-3
smconfig["chordalError"] = smconfig["minSize"] * 1e+1
mesh.Triangle(subshape, **smconfig)
config["mesh"]["submesh"][name].update(smconfig)
2021-06-02 16:12:34 +05:00
2021-03-24 21:27:12 +05:00
returncode, errors = mesh.compute()
if not returncode:
config["status"]["mesh"] = True
else:
logger.error(errors)
with open(CONFIG, "w") as io:
toml.dump(config, io)
mesh.removePyramids()
mesh.assignGroups()
mesh.exportUNV(os.path.join(CASE, "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()
2021-04-05 22:15:47 +05:00
if __name__ == "__main__":
CONFIG = os.path.join(CASE, "task.toml")
config = struct(toml.load(CONFIG))
LOG = os.path.join(ROOT, "logs")
logging.basicConfig(
level = logging.INFO,
format = config.logger.format,
handlers = [
logging.StreamHandler(),
logging.FileHandler(f"{ LOG }/{ config.logger.name }.log")
]
)
logger = logging.getLogger(config.logger.name)
genmesh(config)