Mod: runSalome stabilization

Fix: db entries now creates
This commit is contained in:
L-Nafaryus 2021-07-19 17:01:42 +05:00
parent 36bd441ba9
commit a962a6d64f
4 changed files with 208 additions and 203 deletions

View File

@ -3,10 +3,10 @@ import time
from datetime import timedelta, datetime
import shutil
ROOT = "/".join(__file__.split("/")[:-2])
sys.path.append(os.path.abspath(ROOT))
#ROOT = "/".join(__file__.split("/")[:-2])
#sys.path.append(os.path.abspath(ROOT))
from anisotropy.utils import struct
#from anisotropy.utils import struct
import toml
import logging
@ -14,37 +14,39 @@ __version__ = "1.1"
###
# Shell args
##
configPath = "conf/config.toml"
mode = "safe"
#configPath = "conf/config.toml"
#mode = "safe"
for n, arg in enumerate(sys.argv):
if arg == "-c" or arg == "--config":
configPath = sys.args[n + 1]
#for n, arg in enumerate(sys.argv):
# if arg == "-c" or arg == "--config":
# configPath = sys.args[n + 1]
if arg == "-s" or arg == "--safe":
mode = "safe"
# if arg == "-s" or arg == "--safe":
# mode = "safe"
elif arg == "-a" or arg == "--all":
mode = "all"
# elif arg == "-a" or arg == "--all":
# mode = "all"
###
# Load configuration and tools
##
CONFIG = os.path.join(ROOT, configPath)
config = struct(toml.load(CONFIG))
#CONFIG = os.path.join(ROOT, configPath)
#config = struct(toml.load(CONFIG))
LOG = os.path.join(ROOT, "logs")
if not os.path.exists(LOG):
os.makedirs(LOG)
#LOG = os.path.join(ROOT, "logs")
#if not os.path.exists(LOG):
# os.makedirs(LOG)
BUILD = os.path.join(ROOT, "build")
if not os.path.exists(BUILD):
os.makedirs(BUILD)
#BUILD = os.path.join(ROOT, "build")
#if not os.path.exists(BUILD):
# os.makedirs(BUILD)
##################################################################################
import os
import toml
from models import db, Structure, Mesh
from copy import deepcopy
from anisotropy.models import db, Structure, Mesh
import salomepl
env = { "ROOT": os.path.abspath(".") }
env.update({
@ -54,6 +56,10 @@ env.update({
})
env["db_path"] = os.path.join(env["BUILD"], "anisotropy.db")
_defaultConfig = os.path.join(env["ROOT"], "anisotropy/default.toml")
if os.path.exists(_defaultConfig):
env.update(toml.load(_defaultConfig))
if os.path.exists(env["CONFIG"]):
config = toml.load(env["CONFIG"])
@ -72,19 +78,30 @@ logging.basicConfig(
handlers = [
logging.StreamHandler(),
logging.FileHandler(
os.path.join(env["LOG"]), logger_env.get("name", "anisotropy")
os.path.join(env["LOG"], logger_env.get("name", "anisotropy"))
)
]
)
logger = logging.getLogger(logger_env.get("name", "anisotropy"))
def timer(func):
def inner(*args, **kwargs):
start = time.monotonic()
ret = func(*args, **kwargs)
elapsed = time.monotonic() - start
return ret, elapsed
return inner
class Anisotropy(object):
def __init__(self):
self.db = self._setupDB()
self.structures = self._expandConfigParams(env["structures"])
self._updateDB()
#self.updateDB()
@staticmethod
def version():
@ -96,7 +113,7 @@ class Anisotropy(object):
}
try:
salomeplVersion = salomeVersion()
salomeplVersion = salomepl.version()
openfoamVersion = openfoam.foamVersion()
except Exception:
@ -139,7 +156,7 @@ class Anisotropy(object):
for structure in structures:
for direction in structure["geometry"]["directions"]:
for theta in structure["geometry"]["theta"]:
for n, theta in enumerate(structure["geometry"]["theta"]):
prequeue = deepcopy(structure)
del prequeue["geometry"]["directions"]
@ -153,6 +170,8 @@ class Anisotropy(object):
"theta-{}".format(theta)
)
prequeue["mesh"]["thickness"] = structure["mesh"]["thickness"][n]
queue.append(prequeue)
return queue
@ -161,44 +180,86 @@ class Anisotropy(object):
queue = self._setupQueue(self.structures)
for structure in queue:
s = Structure.update(
s = Structure.create(
name = structure["name"],
path = structure["path"],
**structure["geometry"]
)
Mesh.update(
Mesh.create(
structure = s,
**structure["mesh"]
)
def computeGeometryParams(self):
from math import sqrt
structures = list(Structure.select().dicts())
structures = self._setupQueue(self.structures)
for s in structures:
if s["name"] == "simple":
s["L"] = 2 * s["r0"]
s["radius"] = s["r0"] / (1 - s["theta"])
s["length"] = s["L"] * sqrt(2)
s["width"] = s["L"] * sqrt(2)
s["height"] = s["L"]
theta = s["geometry"]["theta"]
C1, C2 = 0.8, 0.5 #0.8, 0.05
if s["name"] == "simple":
r0 = 1
L = 2 * r0
radius = r0 / (1 - theta)
C1, C2 = 0.8, 0.5
theta1, theta2 = 0.01, 0.28
Cf = C1 + (C2 - C1) / (theta2 - theta1) * (s["theta"] - theta1)
Cf = C1 + (C2 - C1) / (theta2 - theta1) * (theta - theta1)
delta = 0.2
s["fillets"] = delta - Cf * (s["radius"] - s["r0"])
fillets = delta - Cf * (radius - r0)
elif s["name"] == "faceCentered":
pass
L = 1.0
r0 = L * sqrt(2) / 4
radius = r0 / (1 - theta)
C1, C2 = 0.3, 0.2
theta1, theta2 = 0.01, 0.13
Cf = C1 + (C2 - C1) / (theta2 - theta1) * (theta - theta1)
delta = 0.012
fillets = delta - Cf * (radius - r0)
elif s["name"] == "bodyCentered":
pass
L = 1.0
r0 = L * sqrt(3) / 4
radius = r0 / (1 - theta)
C1, C2 = 0.3, 0.2
theta1, theta2 = 0.01, 0.18
Cf = C1 + (C2 - C1) / (theta2 - theta1) * (theta - theta1)
delta = 0.02
fillets = delta - Cf * (radius - r0)
buf = {} #deepcopy(s)
buf.update(
{"name": s["name"],
"path": s["path"]},
**s["geometry"]
)
buf.update({
"r0": r0,
"L": L,
"radius": radius,
"fillets": fillets
})
stable = Structure.create(**buf)
Mesh.create(
structure = stable,
**s["mesh"]
)
@timer
def computeMesh(self):
pass
scriptpath = os.path.join(env["ROOT"], "salomepl/genmesh.py")
port = 2900
out, err, returncode = salomepl.runSalome(port, scriptpath, env["ROOT"], case)
def computeFlow(self):
pass
@ -341,7 +402,7 @@ def createQueue():
return queue
from salomepl.utils import runExecute, salomeVersion
#from salomepl.utils import runExecute, salomeVersion
def computeMesh(case):
scriptpath = os.path.join(ROOT, "salomepl/genmesh.py")

View File

@ -1,5 +1,7 @@
from peewee import *
db = SqliteDatabase(None)
class BaseModel(Model):
class Meta:
database = db
@ -12,10 +14,8 @@ class Structure(BaseModel):
r0 = FloatField()
L = FloatField()
radius = FloatField()
length = FloatField()
width = FloatField()
height = FloatField()
fillet = BooleanField()
fillets = FloatField()
path = TextField()

View File

@ -15,109 +15,66 @@ simple = false
bodyCentered = false
faceCentered = true
###
# Simple
##
[simple.geometry]
theta = [0.01, 0.28, 0.01]
directions = [
[[structures]]
name = "simple"
[structures.geometry]
theta = [0.01, 0.28, 0.01]
directions = [
[1, 0, 0],
[0, 0, 1],
[1, 1, 1]
]
fillet = true
]
fillet = true
[simple.mesh]
viscousLayers = true
thickness = [0.01, 0.005]
[structures.mesh]
viscousLayers = true
thickness = [0.01, 0.005]
[simple.mesh.submesh.strips]
growthRate = 0.2
nbSegPerEdge = 2
nbSegPerRadius = 3
[structures.submesh.strips]
growthRate = 0.2
nbSegPerEdge = 2
nbSegPerRadius = 3
###
# Body-centered
##
# TODO: 0.18
[bodyCentered.geometry]
theta = [0.01, 0.17, 0.01]
directions = [
[[structures]]
name = "bodyCentered"
[structures.geometry]
theta = [0.01, 0.17, 0.01]
directions = [
[1, 0, 0],
[0, 0, 1],
[1, 1, 1]
]
fillet = true
]
fillet = true
[bodyCentered.mesh]
viscousLayers = true
thickness = [0.005, 0.0005]
[structures.mesh]
viscousLayers = true
thickness = [0.005, 0.0005]
[bodyCentered.mesh.submesh.strips]
growthRate = 0.2
nbSegPerEdge = 2
nbSegPerRadius = 3
[structures.submesh.strips]
growthRate = 0.2
nbSegPerEdge = 2
nbSegPerRadius = 3
###
# Face-centered
##
[faceCentered.geometry]
theta = [0.01, 0.13, 0.01]
directions = [
[[structures]]
name = "faceCentered"
[structures.geometry]
theta = [0.01, 0.13, 0.01]
directions = [
[1, 0, 0],
[0, 0, 1],
[1, 1, 1]
]
fillet = true
]
fillet = true
[faceCentered.mesh]
viscousLayers = true
thickness = [0.001, 0.0005]
[faceCentered.mesh.submesh.strips]
growthRate = 0.2
nbSegPerEdge = 2
nbSegPerRadius = 3
###
# Flow
##
[flow]
scale = [1e-5, 1e-5, 1e-5]
[flow.constant]
nu = 1e-6
[flow.approx.pressure.boundaryField]
inlet.type = "fixedValue"
inlet.value = 1e-3
outlet.type = "fixedValue"
outlet.value = 0
[flow.approx.velocity.boundaryField]
inlet.type = "fixedValue"
inlet.value = [
[ 6e-5, 6e-5, 0.0 ],
[ 0.0, 0.0, 6e-5 ],
[ 6e-5, 6e-5, 6e-5 ]
]
outlet.type = "zeroGradient"
outlet.value = "None"
[flow.main.pressure.boundaryField]
inlet.type = "fixedValue"
inlet.value = 1e-3
outlet.type = "fixedValue"
outlet.value = 0
[flow.main.velocity.boundaryField]
inlet.type = "pressureInletVelocity"
inlet.value = [
[ 0, 0, 0 ],
[ 0, 0, 0 ],
[ 0, 0, 0 ]
]
outlet.type = "zeroGradient"
outlet.value = "None"
[structures.mesh]
viscousLayers = true
thickness = [0.001, 0.0005]
[structures.submesh.strips]
growthRate = 0.2
nbSegPerEdge = 2
nbSegPerRadius = 3

View File

@ -3,81 +3,68 @@ import subprocess
import logging
import sys, os
logger = logging.getLogger()
def hasDesktop() -> bool:
return salome.sg.hasDesktop()
def startServer(port):
logger.info("Starting SALOME on port {} ...".format(port))
class SalomeNotFound(Exception):
pass
p = subprocess.Popen(["salome", "start", "--port", str(port), "-t"],
#shell = False,
def version() -> str:
if os.environ.get("SALOME_PATH"):
cmd = os.path.join(os.environ["SALOME_PATH"], "salome")
else:
raise(SalomeNotFound("Can't find salome executable."))
proc = subprocess.Popen(
[ cmd, "--version" ],
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
stderr = subprocess.PIPE
)
return p
out, err = proc.communicate()
def salomeVersion() -> str:
return "Salome 9.7.0 MPI"
return str(out, "utf-8").strip().split(" ")[-1]
def runExecute(port: int, scriptpath: str, *args) -> int:
cmd = ["salome-9.7.0-mpi", "start", "--shutdown-servers=1", "--port", str(port), "-t",
scriptpath, "args:{}".format(", ".join([str(arg) for arg in args]))]
def runSalome(port: int, scriptpath: str, root: str, logpath: str = None, *args) -> int:
logger.info("salome: {}".format(cmd[1 : 6]))
case = args[1]
logpath = os.path.join(case, "salome.log")
if os.environ.get("SALOME_PATH"):
cmd = os.path.join(os.environ["SALOME_PATH"], salome)
#p = subprocess.Popen(["salome", "start", "--shutdown-servers=1", "--port", str(port), "-t", scriptpath, "args:{}".format(", ".join([str(arg) for arg in args]))],
# stderr = subprocess.STDOUT)
#_, err = p.communicate()
else:
raise(SalomeNotFound("Can't find salome executable."))
with subprocess.Popen(cmd,
if not logpath:
logpath = "/tmp/salome.log"
fmtargs = "args:{}".format(", ".join([ str(arg) for arg in args ]))
cmdargs = [
"start", "-t",
"--shutdown-servers=1",
"--port", str(port),
scriptpath,
root,
logpath,
fmtargs
]
with subprocess.Popen(
[ cmd, cmdargs ],
stdout = subprocess.PIPE,
stderr = subprocess.PIPE) as p, \
open(logpath, "wb") as logfile:
stderr = subprocess.PIPE
) as proc, open(logpath, "wb") as logfile:
for line in p.stdout:
# sys.stdout.buffer.write(line)
logfile = open(logpath, "wb")
for line in proc.stdout:
logfile.write(line)
out, err = p.communicate()
#print(str(err, "utf-8"))
logfile.write(err)
if err:
logger.error("salome:\n\t{}".format(str(err, "utf-8")))
#if err:
# if p.returncode == 1:
# logger.error(err)
logfile.write(err)
# else:
# logger.warning(err)
return out, err, proc.returncode
return p.returncode
def killServer(port):
logger.info("Terminating SALOME on port {} ...".format(port))
p = subprocess.Popen(["salome", "kill", str(port)],
#shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
return p
def remote(port, cmd):
logger.info("Executing command in the SALOME on port {} ...".format(port))
# cmd = "python -m"; = "python -c"
p = subprocess.Popen(["salome", "remote", "-p", str(port), "--", str(cmd)],
#shell = True,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
return p