Solver: Add some mage export.

mesh
Pierre-Antoine Rouby 2023-06-20 17:33:56 +02:00
parent d893db4ef7
commit 6a241f7a67
5 changed files with 163 additions and 8 deletions

View File

@ -261,7 +261,8 @@ class Reach:
# Get all guide line name
guide_set = reduce(
lambda acc, x: set(x).union(acc),
points_name
points_name,
set()
)
# Get incomplete guideline
@ -271,7 +272,8 @@ class Reach:
map(
lambda l: list(set(l).symmetric_difference(guide_set)),
points_name
)
),
[]
)
)

View File

@ -115,11 +115,17 @@ class AbstractSolver(object):
self._path_output = path
self._cmd_output = cmd
# Export
def export(self, study):
##########
# Export #
##########
def export(self, study, repertory, qlog = None):
raise NotImplementedMethodeError(self, self.export)
# Run
#######
# Run #
#######
def run_input_data_fomater(self):
if self._cmd_input == "":
return True

View File

@ -1,5 +1,9 @@
# -*- coding: utf-8 -*-
import os
from tools import timer
from Solver.ASolver import AbstractSolver
class Mage(AbstractSolver):
@ -45,6 +49,88 @@ class Mage(AbstractSolver):
return lst
##########
# Export #
##########
@timer
def _export_ST(self, study, repertory, qlog = None):
if qlog is not None:
qlog.put("Export ST file")
# Write header
for edge in study.river.edges():
name = f"Reach_{edge.id}"
with open(os.path.join(repertory, f"{name}.ST"), "w+") as f:
f.write("* This file is generate by PAMHYR, please don't modify\n")
for profile in edge.reach.profiles:
num = f"{profile.num:>6}"
c1 = f"{profile.code1:>6}"
c2 = f"{profile.code2:>6}"
t = f"{len(profile.points):>6}"
kp = f"{profile.kp:>13.4f}"
name = profile.name
f.write(f"{num}{c1}{c2}{t}{kp} {name}\n")
for point in profile.points:
x = f"{point.x:>13.4f}"
y = f"{point.y:>13.4f}"
z = f"{point.z:>13.4f}"
n = point.name
f.write(f"{x}{y}{z} {n}\n")
f.write(f" 999.9990 999.9990 999.9990\n")
f.write("* END OF FILE")
def _export_BC(self, bound, repertory, qlog = None):
t = "XX"
if bound.bctype == "ZD":
t = "AVA"
elif bound.bctype == "TD":
t = "HYD"
else:
return None
if qlog is not None:
qlog.put(f"Export {t} file")
with open(os.path.join(repertory, f"0.{t}"), "w+") as f:
f.write("* This file is generate by PAMHYR, please don't modify\n")
name = f"{bound.node.id:3}".replace(" ", "x")
f.write(f"* {bound.node.name} ({name}) {bound.bctype}\n")
f.write(f"${name}\n")
header = bound.header
f.write(f"*{header[0]:>9}|{header[1]:>10}\n")
for d in bound.data:
f.write(f"{d[0]:10.2f}{d[1]:10.3f}\n")
f.write("* END OF FILE")
@timer
def _export_bound_cond(self, study, repertory, qlog = None):
# Write header
lst = study.river.boundary_condition
for tab in ["liquid", "solid", "suspenssion"]:
for bound in lst.get_tab(tab):
self._export_BC(bound, repertory, qlog)
@timer
def export(self, study, repertory, qlog = None):
self._export_ST(study, repertory, qlog)
return True
##########
# MAGE 7 #
##########
class Mage7(Mage):
def __init__(self, name):
@ -58,6 +144,9 @@ class Mage7(Mage):
return lst
##########
# MAGE 8 #
##########
class Mage8(Mage):
def __init__(self, name):
@ -75,3 +164,57 @@ class Mage8(Mage):
lst.insert(i+1, ("mage_precision_reduction_factor_r", "1"))
return lst
##########
# Export #
##########
@timer
def _export_PAR(self, study, repertory, qlog = None):
if qlog is not None:
qlog.put("Export PAR file")
with open(os.path.join(repertory, "0.PAR"), "w+") as f:
f.write("* This file is generate by PAMHYR, please don't modify\n")
params = study.river.get_params(self.type).parameters
for p in params:
name = p.name\
.replace("all_", "")\
.replace("mage_", "")
value = p.value
f.write(f"{name} {value}\n")
f.write("* END OF FILE")
@timer
def _export_NET(self, study, repertory, qlog = None):
if qlog is not None:
qlog.put("Export NET file")
with open(os.path.join(repertory, "0.NET"), "w+") as f:
f.write("* This file is generate by PAMHYR, please don't modify\n")
edges = study.river.edges()
for e in edges:
name = e.name.replace(" ", "_")
if e._name == "":
name = f"Reach_{e.id}"
n1 = f"{e.node1.id:3}".replace(" ", "x")
n2 = f"{e.node2.id:3}".replace(" ", "x")
files = name + ".ST"
f.write(f"{name} {n1} {n2} {files}\n")
f.write("* END OF FILE")
@timer
def export(self, study, repertory, qlog = None):
self._export_PAR(study, repertory, qlog)
self._export_NET(study, repertory, qlog)
self._export_ST(study, repertory, qlog)
self._export_bound_cond(study, repertory, qlog)
return True

View File

@ -9,12 +9,12 @@ _translate = QCoreApplication.translate
solver_long_name = {
"generic": _translate("Solvers", "Generic"),
"mage7": _translate("Solvers", "Mage version 7"),
# "mage7": _translate("Solvers", "Mage version 7"),
"mage8": _translate("Solvers", "Mage version 8"),
}
solver_type_list = {
"generic": GenericSolver,
"mage7": Mage7,
# "mage7": Mage7,
"mage8": Mage8,
}

View File

@ -93,6 +93,11 @@ class SolverLogWindow(ASubMainWindow, ListedSubWindow):
self._alarm.start(500)
self._output = Queue()
self._log(f" *** Export study {self._solver.name}", color="blue")
self._solver.export(self._study, "/tmp/pamhyr/0/", qlog = self._output)
self.update()
self._log(f" *** Run solver {self._solver.name}", color="blue")
self._solver.run(self._process, self._output)
@ -133,7 +138,6 @@ class SolverLogWindow(ASubMainWindow, ListedSubWindow):
self.find(QAction, "action_pause").setEnabled(False)
self.find(QAction, "action_stop").setEnabled(False)
while self._output.qsize() != 0:
s = self._output.get()
self._log(s)