Working version
New: openfoam as package Mod: logging Fix: checking environment New: virtual environment for python
This commit is contained in:
parent
ab0bf8f146
commit
4c18dc1b33
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,6 +2,7 @@ __pycache__
|
|||||||
build/
|
build/
|
||||||
logs/
|
logs/
|
||||||
storage/
|
storage/
|
||||||
|
env/
|
||||||
*.gz
|
*.gz
|
||||||
*.xz
|
*.xz
|
||||||
*.fls
|
*.fls
|
||||||
|
@ -4,6 +4,15 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|||||||
if [ "$1" = "clean" ]; then
|
if [ "$1" = "clean" ]; then
|
||||||
git clean -fdx
|
git clean -fdx
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
|
||||||
|
|
||||||
python ${DIR}/anisotropy/anisotropy.py
|
elif [ "$1" = "init" ]; then
|
||||||
|
python -m venv env
|
||||||
|
source env/bin/activate
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install requirements.txt
|
||||||
|
|
||||||
|
elif [ "$1" = "run" ]; then
|
||||||
|
source ${OPENFOAM}
|
||||||
|
python ${DIR}/anisotropy/anisotropy.py
|
||||||
|
|
||||||
|
fi
|
||||||
|
@ -3,38 +3,39 @@ import time
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
sys.path.append(os.path.abspath("../"))
|
ROOT = "/".join(__file__.split("/")[:-2])
|
||||||
|
sys.path.append(os.path.abspath(ROOT))
|
||||||
|
|
||||||
from utils import struct, checkEnv
|
from utils import struct
|
||||||
import toml
|
import toml
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
CONFIG = os.path.abspath("../conf/config.toml")
|
CONFIG = os.path.join(ROOT, "conf/config.toml")
|
||||||
config = struct(toml.load(CONFIG))
|
config = struct(toml.load(CONFIG))
|
||||||
|
|
||||||
def main():
|
|
||||||
|
|
||||||
#CONFIG = os.path.abspath("../conf/config.toml")
|
#CONFIG = os.path.abspath("../conf/config.toml")
|
||||||
#config = struct(toml.load(CONFIG))
|
#config = struct(toml.load(CONFIG))
|
||||||
|
|
||||||
LOG = os.path.abspath("../logs")
|
LOG = os.path.join(ROOT, "logs")
|
||||||
if not os.path.exists(LOG):
|
if not os.path.exists(LOG):
|
||||||
os.makedirs(LOG)
|
os.makedirs(LOG)
|
||||||
|
|
||||||
BUILD = os.path.abspath("../build")
|
BUILD = os.path.join(ROOT, "build")
|
||||||
if not os.path.exists(BUILD):
|
if not os.path.exists(BUILD):
|
||||||
os.makedirs(BUILD)
|
os.makedirs(BUILD)
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level = logging.INFO,
|
level = logging.INFO,
|
||||||
format = config.logger.format,
|
format = config.logger.format,
|
||||||
handlers = [
|
handlers = [
|
||||||
logging.StreamHandler(),
|
logging.StreamHandler(),
|
||||||
logging.FileHandler(f"{ LOG }/{ config.logger.name }.log")
|
logging.FileHandler(f"{ LOG }/{ config.logger.name }.log")
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
logger = logging.getLogger(config.logger.name)
|
logger = logging.getLogger(config.logger.name)
|
||||||
|
|
||||||
|
def main():
|
||||||
if checkEnv():
|
if checkEnv():
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -64,7 +65,7 @@ def main():
|
|||||||
if not returncode:
|
if not returncode:
|
||||||
task.flow = True
|
task.flow = True
|
||||||
|
|
||||||
with open(os.path.join(config.LOG, "tasks.log"), "a") as io:
|
with open(os.path.join(LOG, "tasks.log"), "a") as io:
|
||||||
idx = tasks.index(task)
|
idx = tasks.index(task)
|
||||||
io.write(f"""Task {idx}:
|
io.write(f"""Task {idx}:
|
||||||
structure:\t{task.structure}
|
structure:\t{task.structure}
|
||||||
@ -74,7 +75,7 @@ def main():
|
|||||||
flow:\t{task.flow}\n""")
|
flow:\t{task.flow}\n""")
|
||||||
|
|
||||||
|
|
||||||
logger.info(f"Warnings: {logger.warnings}\tErrors: {logger.errors}")
|
#logger.info(f"Warnings: {logger.warnings}\tErrors: {logger.errors}")
|
||||||
|
|
||||||
|
|
||||||
def createTasks():
|
def createTasks():
|
||||||
@ -89,7 +90,7 @@ def createTasks():
|
|||||||
theta = theta,
|
theta = theta,
|
||||||
fillet = getattr(config, structure).geometry.fillet,
|
fillet = getattr(config, structure).geometry.fillet,
|
||||||
direction = direction,
|
direction = direction,
|
||||||
export = os.path.abspath(f"../build/{ structure }/direction-{ direction[0] }{ direction [1] }{ direction [2] }/theta-{ theta }"),
|
export = os.path.join(ROOT, f"{ BUILD }/{ structure }/direction-{ direction[0] }{ direction [1] }{ direction [2] }/theta-{ theta }"),
|
||||||
mesh = False,
|
mesh = False,
|
||||||
flow = False
|
flow = False
|
||||||
)
|
)
|
||||||
@ -98,10 +99,10 @@ def createTasks():
|
|||||||
|
|
||||||
return tasks
|
return tasks
|
||||||
|
|
||||||
from salomepl.utils import runExecute
|
from salomepl.utils import runExecute, salomeVersion
|
||||||
|
|
||||||
def createMesh(task):
|
def createMesh(task):
|
||||||
scriptpath = os.path.abspath("../salomepl/genmesh.py")
|
scriptpath = os.path.join(ROOT, "salomepl/genmesh.py")
|
||||||
port = 2810
|
port = 2810
|
||||||
stime = time.monotonic()
|
stime = time.monotonic()
|
||||||
|
|
||||||
@ -111,7 +112,7 @@ def createMesh(task):
|
|||||||
int(task.fillet),
|
int(task.fillet),
|
||||||
"".join([str(coord) for coord in task.direction]),
|
"".join([str(coord) for coord in task.direction]),
|
||||||
os.path.join(task.export, "mesh.unv"),
|
os.path.join(task.export, "mesh.unv"),
|
||||||
os.path.abspath("../")
|
ROOT
|
||||||
)
|
)
|
||||||
returncode = runExecute(port, scriptpath, *args)
|
returncode = runExecute(port, scriptpath, *args)
|
||||||
|
|
||||||
@ -119,7 +120,7 @@ def createMesh(task):
|
|||||||
logger.info("createMesh: elapsed time: {}".format(timedelta(seconds = etime - stime)))
|
logger.info("createMesh: elapsed time: {}".format(timedelta(seconds = etime - stime)))
|
||||||
|
|
||||||
|
|
||||||
from openfoam import openfoam
|
import openfoam
|
||||||
|
|
||||||
def calculate(task):
|
def calculate(task):
|
||||||
foamCase = [ "0", "constant", "system" ]
|
foamCase = [ "0", "constant", "system" ]
|
||||||
@ -129,7 +130,7 @@ def calculate(task):
|
|||||||
|
|
||||||
for d in foamCase:
|
for d in foamCase:
|
||||||
shutil.copytree(
|
shutil.copytree(
|
||||||
os.path.abspath("../openfoam/template", d),
|
os.path.join(ROOT, "openfoam/template", d),
|
||||||
os.path.join(task.export, d)
|
os.path.join(task.export, d)
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -170,13 +171,30 @@ def calculate(task):
|
|||||||
if out:
|
if out:
|
||||||
logger.info(out)
|
logger.info(out)
|
||||||
|
|
||||||
os.chdir(config.ROOT)
|
os.chdir(ROOT)
|
||||||
|
|
||||||
etime = time.monotonic()
|
etime = time.monotonic()
|
||||||
logger.info("calculate: elapsed time: {}".format(timedelta(seconds = etime - stime)))
|
logger.info("calculate: elapsed time: {}".format(timedelta(seconds = etime - stime)))
|
||||||
|
|
||||||
return returncode
|
return returncode
|
||||||
|
|
||||||
|
def checkEnv():
|
||||||
|
missed = False
|
||||||
|
|
||||||
|
try:
|
||||||
|
pythonVersion = "Python {}".format(sys.version.split(" ")[0])
|
||||||
|
salomeplVersion = salomeVersion()
|
||||||
|
openfoamVersion = openfoam.foamVersion()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.critical("Missed environment %s", e)
|
||||||
|
missed = True
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.info(f"environment:\n\t{pythonVersion}\n\t{salomeplVersion}\n\t{openfoamVersion}")
|
||||||
|
|
||||||
|
finally:
|
||||||
|
return missed
|
||||||
|
|
||||||
|
|
||||||
def postprocessing(tasks):
|
def postprocessing(tasks):
|
||||||
|
@ -150,22 +150,4 @@ def portIsFree(address, port):
|
|||||||
return s.connect_ex((address, port)) == 0
|
return s.connect_ex((address, port)) == 0
|
||||||
|
|
||||||
|
|
||||||
def checkEnv():
|
|
||||||
missed = False
|
|
||||||
|
|
||||||
try:
|
|
||||||
pythonVersion = "Python {}".format(sys.version.split(" ")[0])
|
|
||||||
salomeVersion = salome_utils.salomeVersion()
|
|
||||||
foamVersion = foam_utils.foamVersion()
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
logger.critical("Missed environment")
|
|
||||||
missed = True
|
|
||||||
|
|
||||||
else:
|
|
||||||
logger.info(f"environment:\n\t{pythonVersion}\n\t{salomeVersion}\n\t{foamVersion}")
|
|
||||||
|
|
||||||
finally:
|
|
||||||
return missed
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
from .meshConversion import ideasUnvToFoam
|
||||||
|
from .meshManipulation import createPatch, transformPoints, checkMesh, renumberMesh
|
||||||
|
from .miscellaneous import foamDictionary
|
||||||
|
from .parallelProcessing import decomposePar
|
||||||
|
from .solvers import potentialFoam, simpleFoam
|
||||||
|
from .utils import foamVersion, foamClean
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
# meshConversion
|
||||||
|
"ideasUnvToFoam",
|
||||||
|
|
||||||
|
# meshManipulation
|
||||||
|
"createPatch",
|
||||||
|
"transformPoints",
|
||||||
|
"checkMesh",
|
||||||
|
"renumberMesh",
|
||||||
|
|
||||||
|
# miscellaneous
|
||||||
|
"foamDictionary",
|
||||||
|
|
||||||
|
# parallelProcessing
|
||||||
|
"decomposePar",
|
||||||
|
|
||||||
|
# solvers
|
||||||
|
"potentialFoam",
|
||||||
|
"simpleFoam",
|
||||||
|
|
||||||
|
# utils
|
||||||
|
"foamVersion",
|
||||||
|
"foamClean"
|
||||||
|
]
|
@ -1,17 +1,9 @@
|
|||||||
import os, sys
|
import os, sys
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
sys.path.append(os.path.abspath("../"))
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
from openfoam.miscellaneous import *
|
|
||||||
from openfoam.meshConversion import *
|
|
||||||
from openfoam.meshManipulation import *
|
|
||||||
from openfoam.parallelProcessing import *
|
|
||||||
from openfoam.solvers import *
|
|
||||||
|
|
||||||
def application(name: str, *args: str, case: str = None, stderr: bool = True, useMPI: bool = False) -> int:
|
def application(name: str, *args: str, case: str = None, stderr: bool = True, useMPI: bool = False) -> int:
|
||||||
|
|
||||||
cmd = []
|
cmd = []
|
@ -1,3 +1,4 @@
|
|||||||
|
from .application import application
|
||||||
|
|
||||||
def ideasUnvToFoam(mesh: str, case: str = None) -> (str, int):
|
def ideasUnvToFoam(mesh: str, case: str = None) -> (str, int):
|
||||||
return application("ideasUnvToFoam", mesh, case = case, stderr = True)
|
return application("ideasUnvToFoam", mesh, case = case, stderr = True)
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from .application import application
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
def createPatch(dictfile: str = None, case: str = None):
|
def createPatch(dictfile: str = None, case: str = None):
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from .application import application
|
||||||
|
|
||||||
def foamDictionary(filepath: str, entry: str, value: str = None, case: str = None):
|
def foamDictionary(filepath: str, entry: str, value: str = None, case: str = None):
|
||||||
args = [filepath, "-entry", entry]
|
args = [filepath, "-entry", entry]
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from .application import application
|
||||||
|
|
||||||
def decomposePar(case: str = None):
|
def decomposePar(case: str = None):
|
||||||
application("decomposePar", case = case, stderr = True)
|
application("decomposePar", case = case, stderr = True)
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from .application import application
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
def potentialFoam(case: str = None):
|
def potentialFoam(case: str = None):
|
||||||
|
@ -9,15 +9,28 @@ import math
|
|||||||
import salome
|
import salome
|
||||||
|
|
||||||
# get project path from args
|
# get project path from args
|
||||||
sys.path.append(sys.argv[6])
|
ROOT = sys.argv[6]
|
||||||
|
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 toml
|
||||||
import logging
|
import logging
|
||||||
from anisotropy.utils import struct
|
from anisotropy.utils import struct
|
||||||
|
|
||||||
CONFIG = os.path.abspath("../conf/config.toml")
|
CONFIG = os.path.join(ROOT, "conf/config.toml")
|
||||||
config = struct(toml.load(CONFIG))
|
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)
|
logger = logging.getLogger(config.logger.name)
|
||||||
|
|
||||||
from salomepl.simple import simpleCubic, simpleHexagonalPrism
|
from salomepl.simple import simpleCubic, simpleHexagonalPrism
|
||||||
@ -62,9 +75,10 @@ def genmesh(stype, theta, fillet, direction, export):
|
|||||||
elif direction == [1, 1, 1]:
|
elif direction == [1, 1, 1]:
|
||||||
structure = simpleHexagonalPrism
|
structure = simpleHexagonalPrism
|
||||||
|
|
||||||
fineness = config.simple.fineness
|
#fineness = config.simple.fineness
|
||||||
parameters = config.simple.parameters
|
#parameters = config.simple.parameters
|
||||||
viscousLayers = config.simple.viscousLayers
|
#viscousLayers = config.simple.viscousLayers
|
||||||
|
meshParameters = config.simple.mesh
|
||||||
|
|
||||||
elif stype == "faceCentered":
|
elif stype == "faceCentered":
|
||||||
if direction in [[1, 0, 0], [0, 0, 1]]:
|
if direction in [[1, 0, 0], [0, 0, 1]]:
|
||||||
@ -73,9 +87,10 @@ def genmesh(stype, theta, fillet, direction, export):
|
|||||||
elif direction == [1, 1, 1]:
|
elif direction == [1, 1, 1]:
|
||||||
structure = faceCenteredHexagonalPrism
|
structure = faceCenteredHexagonalPrism
|
||||||
|
|
||||||
fineness = config.faceCentered.fineness
|
#fineness = config.faceCentered.fineness
|
||||||
parameters = config.faceCentered.parameters
|
#parameters = config.faceCentered.parameters
|
||||||
viscousLayers = config.faceCentered.viscousLayers
|
#viscousLayers = config.faceCentered.viscousLayers
|
||||||
|
meshParameters = config.faceCentered.mesh
|
||||||
|
|
||||||
elif stype == "bodyCentered":
|
elif stype == "bodyCentered":
|
||||||
if direction in [[1, 0, 0], [0, 0, 1]]:
|
if direction in [[1, 0, 0], [0, 0, 1]]:
|
||||||
@ -84,9 +99,10 @@ def genmesh(stype, theta, fillet, direction, export):
|
|||||||
elif direction == [1, 1, 1]:
|
elif direction == [1, 1, 1]:
|
||||||
structure = bodyCenteredHexagonalPrism
|
structure = bodyCenteredHexagonalPrism
|
||||||
|
|
||||||
fineness = config.bodyCentered.fineness
|
#fineness = config.bodyCentered.fineness
|
||||||
parameters = config.bodyCentered.parameters
|
#parameters = config.bodyCentered.parameters
|
||||||
viscousLayers = config.bodyCentered.viscousLayers
|
#viscousLayers = config.bodyCentered.viscousLayers
|
||||||
|
meshParameters = config.bodyCentered.mesh
|
||||||
|
|
||||||
###
|
###
|
||||||
# Shape
|
# Shape
|
||||||
@ -108,10 +124,10 @@ def genmesh(stype, theta, fillet, direction, export):
|
|||||||
if group.GetName() in ["inlet", "outlet"]:
|
if group.GetName() in ["inlet", "outlet"]:
|
||||||
facesToIgnore.append(group)
|
facesToIgnore.append(group)
|
||||||
|
|
||||||
viscousLayers.facesToIgnore = facesToIgnore
|
meshParameters.facesToIgnore = facesToIgnore
|
||||||
viscousLayers.extrusionMethod = smeshBuilder.SURF_OFFSET_SMOOTH
|
meshParameters.extrusionMethod = smeshBuilder.SURF_OFFSET_SMOOTH
|
||||||
|
|
||||||
mesh = meshCreate(shape, groups, fineness, parameters, viscousLayers)
|
mesh = meshCreate(shape, groups, meshParameters) #fineness, parameters, viscousLayers)
|
||||||
meshCompute(mesh)
|
meshCompute(mesh)
|
||||||
|
|
||||||
meshStats(mesh)
|
meshStats(mesh)
|
||||||
|
@ -3,13 +3,13 @@ from salome.smesh import smeshBuilder
|
|||||||
smesh = smeshBuilder.New()
|
smesh = smeshBuilder.New()
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(config.logger.name)
|
logger = logging.getLogger("anisotropy")
|
||||||
|
|
||||||
def getSmesh():
|
def getSmesh():
|
||||||
return smesh
|
return smesh
|
||||||
|
|
||||||
|
|
||||||
def meshCreate(shape, groups, fineness, parameters, viscousLayers = None):
|
def meshCreate(shape, groups, parameters): #fineness, parameters, viscousLayers = None):
|
||||||
"""
|
"""
|
||||||
Creates a mesh from a geometry.
|
Creates a mesh from a geometry.
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ def meshCreate(shape, groups, fineness, parameters, viscousLayers = None):
|
|||||||
3: "Fine",
|
3: "Fine",
|
||||||
4: "Very fine",
|
4: "Very fine",
|
||||||
5: "Custom"
|
5: "Custom"
|
||||||
}[fineness]
|
}[parameters.fineness]
|
||||||
|
|
||||||
# Mesh
|
# Mesh
|
||||||
mesh = smesh.Mesh(shape)
|
mesh = smesh.Mesh(shape)
|
||||||
@ -46,9 +46,9 @@ def meshCreate(shape, groups, fineness, parameters, viscousLayers = None):
|
|||||||
param = netgen.Parameters()
|
param = netgen.Parameters()
|
||||||
param.SetMinSize(parameters.minSize)
|
param.SetMinSize(parameters.minSize)
|
||||||
param.SetMaxSize(parameters.maxSize)
|
param.SetMaxSize(parameters.maxSize)
|
||||||
param.SetFineness(fineness)
|
param.SetFineness(parameters.fineness)
|
||||||
|
|
||||||
if fineness == 5:
|
if parameters.fineness == 5:
|
||||||
param.SetGrowthRate(parameters.growthRate)
|
param.SetGrowthRate(parameters.growthRate)
|
||||||
param.SetNbSegPerEdge(parameters.nbSegPerEdge)
|
param.SetNbSegPerEdge(parameters.nbSegPerEdge)
|
||||||
param.SetNbSegPerRadius(parameters.nbSegPerRadius)
|
param.SetNbSegPerRadius(parameters.nbSegPerRadius)
|
||||||
@ -94,30 +94,30 @@ def meshCreate(shape, groups, fineness, parameters, viscousLayers = None):
|
|||||||
###
|
###
|
||||||
# Viscous layers
|
# Viscous layers
|
||||||
##
|
##
|
||||||
if not viscousLayers is None:
|
#if not viscousLayers is None:
|
||||||
vlayer = netgen.ViscousLayers(
|
vlayer = netgen.ViscousLayers(
|
||||||
viscousLayers.thickness,
|
parameters.thickness,
|
||||||
viscousLayers.numberOfLayers,
|
parameters.numberOfLayers,
|
||||||
viscousLayers.stretchFactor,
|
parameters.stretchFactor,
|
||||||
viscousLayers.facesToIgnore,
|
parameters.facesToIgnore,
|
||||||
viscousLayers.isFacesToIgnore,
|
parameters.isFacesToIgnore,
|
||||||
viscousLayers.extrusionMethod
|
parameters.extrusionMethod
|
||||||
)
|
)
|
||||||
|
|
||||||
logger.info("""meshCreate:
|
logger.info("""meshCreate:
|
||||||
viscous layers:
|
viscous layers:
|
||||||
thickness:\t{}
|
thickness:\t{}
|
||||||
number:\t{}
|
number:\t{}
|
||||||
stretch factor:\t{}""".format(
|
stretch factor:\t{}""".format(
|
||||||
viscousLayers.thickness,
|
parameters.thickness,
|
||||||
viscousLayers.numberOfLayers,
|
parameters.numberOfLayers,
|
||||||
viscousLayers.stretchFactor))
|
parameters.stretchFactor))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
else:
|
#else:
|
||||||
logger.info("""meshCreate:
|
# logger.info("""meshCreate:
|
||||||
viscous layers: disabled""")
|
#viscous layers: disabled""")
|
||||||
|
|
||||||
|
|
||||||
return mesh
|
return mesh
|
||||||
|
Loading…
x
Reference in New Issue
Block a user