mirror of https://gitlab.com/pamhyr/pamhyr2
start to work on compare results
parent
58f72cfa6b
commit
558085705f
|
|
@ -70,12 +70,20 @@ from View.SedimentLayers.Reach.Window import ReachSedimentLayersWindow
|
||||||
from View.AdditionalFiles.Window import AddFileListWindow
|
from View.AdditionalFiles.Window import AddFileListWindow
|
||||||
from View.REPLines.Window import REPLineListWindow
|
from View.REPLines.Window import REPLineListWindow
|
||||||
from View.SolverParameters.Window import SolverParametersWindow
|
from View.SolverParameters.Window import SolverParametersWindow
|
||||||
from View.RunSolver.Window import SelectSolverWindow, SolverLogWindow
|
from View.RunSolver.Window import (
|
||||||
|
SelectSolverWindow,
|
||||||
|
SolverLogWindow,
|
||||||
|
CompareSolversWindow
|
||||||
|
)
|
||||||
from View.CheckList.Window import CheckListWindow
|
from View.CheckList.Window import CheckListWindow
|
||||||
from View.Results.Window import ResultsWindow
|
from View.Results.Window import ResultsWindow, CompareResultsWindow
|
||||||
from View.Results.ReadingResultsDialog import ReadingResultsDialog
|
from View.Results.ReadingResultsDialog import ReadingResultsDialog
|
||||||
from View.Debug.Window import ReplWindow
|
from View.Debug.Window import ReplWindow
|
||||||
|
|
||||||
|
from Solver.Solvers import GenericSolver
|
||||||
|
|
||||||
|
from Model.Results.Results import Results
|
||||||
|
|
||||||
# Optional internal display of documentation for make the application
|
# Optional internal display of documentation for make the application
|
||||||
# package lighter...
|
# package lighter...
|
||||||
try:
|
try:
|
||||||
|
|
@ -117,7 +125,7 @@ define_model_action = [
|
||||||
"action_menu_edit_reach_sediment_layers", "action_menu_edit_reservoirs",
|
"action_menu_edit_reach_sediment_layers", "action_menu_edit_reservoirs",
|
||||||
"action_menu_edit_hydraulic_structures", "action_menu_additional_file",
|
"action_menu_edit_hydraulic_structures", "action_menu_additional_file",
|
||||||
"action_menu_results_last", "action_open_results_from_file",
|
"action_menu_results_last", "action_open_results_from_file",
|
||||||
"action_menu_boundary_conditions_sediment",
|
"action_compare_results", "action_menu_boundary_conditions_sediment",
|
||||||
"action_menu_rep_additional_lines",
|
"action_menu_rep_additional_lines",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -255,6 +263,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
|
||||||
"action_menu_close": self.close_model,
|
"action_menu_close": self.close_model,
|
||||||
"action_menu_results_last": self.open_last_results,
|
"action_menu_results_last": self.open_last_results,
|
||||||
"action_open_results_from_file": self.open_results_from_file,
|
"action_open_results_from_file": self.open_results_from_file,
|
||||||
|
"action_compare_results": self.compare_results,
|
||||||
# Help
|
# Help
|
||||||
"action_menu_pamhyr_users_wiki": self.open_doc_user,
|
"action_menu_pamhyr_users_wiki": self.open_doc_user,
|
||||||
"action_menu_pamhyr_developers_pdf":
|
"action_menu_pamhyr_developers_pdf":
|
||||||
|
|
@ -1344,6 +1353,103 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
|
||||||
results=file_name[0]
|
results=file_name[0]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def compare_results(self):
|
||||||
|
if self._study is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
run = CompareSolversWindow(
|
||||||
|
study=self._study,
|
||||||
|
config=self.conf,
|
||||||
|
parent=self
|
||||||
|
)
|
||||||
|
if run.exec():
|
||||||
|
results = self.diff_results(run.solver1,
|
||||||
|
run.solver2)
|
||||||
|
|
||||||
|
# At least one result not available
|
||||||
|
if results is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Windows already opened
|
||||||
|
if self.sub_window_exists(
|
||||||
|
ResultsWindow,
|
||||||
|
data=[
|
||||||
|
self._study,
|
||||||
|
None, # No config
|
||||||
|
results._solver,
|
||||||
|
results
|
||||||
|
]
|
||||||
|
):
|
||||||
|
return
|
||||||
|
|
||||||
|
res = CompareResultsWindow(
|
||||||
|
study=self._study,
|
||||||
|
solver=results._solver,
|
||||||
|
results=results,
|
||||||
|
parent=self
|
||||||
|
)
|
||||||
|
res.show()
|
||||||
|
|
||||||
|
|
||||||
|
def diff_results(self, solver1, solver2):
|
||||||
|
if solver1 is None:
|
||||||
|
# TODO message
|
||||||
|
return None
|
||||||
|
if solver2 is None:
|
||||||
|
# TODO message
|
||||||
|
return None
|
||||||
|
|
||||||
|
solver3 = GenericSolver(solver1.name+" - "+solver2.name)
|
||||||
|
|
||||||
|
result1 = solver1.results(
|
||||||
|
self._study,
|
||||||
|
self._solver_workdir(solver1),
|
||||||
|
)
|
||||||
|
|
||||||
|
if result1 is None:
|
||||||
|
# TODO message
|
||||||
|
return None
|
||||||
|
|
||||||
|
result2 = solver2.results(
|
||||||
|
self._study,
|
||||||
|
self._solver_workdir(solver2),
|
||||||
|
)
|
||||||
|
|
||||||
|
if result2 is None:
|
||||||
|
# TODO message
|
||||||
|
return None
|
||||||
|
|
||||||
|
if result2.get("nb_reach") != result1.get("nb_reach"):
|
||||||
|
# TODO message
|
||||||
|
return None
|
||||||
|
|
||||||
|
if result2.get("nb_profile") != result1.get("nb_profile"):
|
||||||
|
# TODO message
|
||||||
|
return None
|
||||||
|
|
||||||
|
result3 = Results(self._study, solver3)
|
||||||
|
result3.set("nb_reach", result1.get("nb_reach"))
|
||||||
|
result3.set("nb_profile", result1.get("nb_profile"))
|
||||||
|
ts = list(result1.get("timestamps").intersection(result2.get("timestamps")))
|
||||||
|
result3.set("timestamps", ts)
|
||||||
|
|
||||||
|
for i in range(int(result1.get("nb_reach"))):
|
||||||
|
# Add reach to results reach list
|
||||||
|
r = result3.river.add(i)
|
||||||
|
|
||||||
|
for timestamp in result3.get("timestamps"):
|
||||||
|
for r in range(int(result1.get("nb_reach"))):
|
||||||
|
reach1 = result1.river.reach(r)
|
||||||
|
reach2 = result2.river.reach(r)
|
||||||
|
reach3 = result3.river.reach(r)
|
||||||
|
for p, (profile1, profile2) in enumerate(zip(reach1.profiles, reach2.profiles)):
|
||||||
|
for key in ["Z", "Q"]:
|
||||||
|
d1 = profile1.get_ts_key(timestamp, key)
|
||||||
|
d2 = profile2.get_ts_key(timestamp, key)
|
||||||
|
reach3.set(p, timestamp, key, d1-d2)
|
||||||
|
|
||||||
|
return result3
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# DOCUMENTATION #
|
# DOCUMENTATION #
|
||||||
#################
|
#################
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,10 @@ class TableModel(PamhyrTableModel):
|
||||||
v = self._lst[row].geometry.speed(q, z)
|
v = self._lst[row].geometry.speed(q, z)
|
||||||
a = self._lst[row].geometry.wet_area(z)
|
a = self._lst[row].geometry.wet_area(z)
|
||||||
b = self._lst[row].geometry.wet_width(z)
|
b = self._lst[row].geometry.wet_width(z)
|
||||||
froude = v / sqrt(9.81 * (a / b))
|
if b == 0.0 or a == 0.0:
|
||||||
|
froude = 0.0
|
||||||
|
else:
|
||||||
|
froude = v / sqrt(9.81 * (a / b))
|
||||||
return f"{froude:.4f}"
|
return f"{froude:.4f}"
|
||||||
else:
|
else:
|
||||||
v = 0.0
|
v = 0.0
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,10 @@ from View.Results.CustomPlot.CustomPlotValuesSelectionDialog import (
|
||||||
)
|
)
|
||||||
|
|
||||||
from View.Results.Table import TableModel
|
from View.Results.Table import TableModel
|
||||||
from View.Results.translate import ResultsTranslate
|
from View.Results.translate import (
|
||||||
|
ResultsTranslate,
|
||||||
|
CompareResultsTranslate
|
||||||
|
)
|
||||||
from View.Stricklers.Window import StricklersWindow
|
from View.Stricklers.Window import StricklersWindow
|
||||||
|
|
||||||
_translate = QCoreApplication.translate
|
_translate = QCoreApplication.translate
|
||||||
|
|
@ -83,11 +86,12 @@ class ResultsWindow(PamhyrWindow):
|
||||||
|
|
||||||
def __init__(self, study=None, config=None,
|
def __init__(self, study=None, config=None,
|
||||||
solver=None, results=None,
|
solver=None, results=None,
|
||||||
parent=None):
|
parent=None, trad=None):
|
||||||
self._solver = solver
|
self._solver = solver
|
||||||
self._results = results
|
self._results = results
|
||||||
|
|
||||||
trad = ResultsTranslate()
|
if trad is None:
|
||||||
|
trad = ResultsTranslate()
|
||||||
name = (
|
name = (
|
||||||
trad[self._pamhyr_name] + " - "
|
trad[self._pamhyr_name] + " - "
|
||||||
+ study.name + " - "
|
+ study.name + " - "
|
||||||
|
|
@ -855,3 +859,38 @@ class ResultsWindow(PamhyrWindow):
|
||||||
)
|
)
|
||||||
|
|
||||||
return my_dict
|
return my_dict
|
||||||
|
|
||||||
|
|
||||||
|
class CompareResultsWindow(ResultsWindow):
|
||||||
|
_pamhyr_ui = "Results"
|
||||||
|
_pamhyr_name = "Results"
|
||||||
|
|
||||||
|
def _path_file(self, filename):
|
||||||
|
return os.path.abspath(
|
||||||
|
os.path.join(
|
||||||
|
os.path.dirname(__file__),
|
||||||
|
"..", "ui", "ressources", filename
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, study=None, config=None,
|
||||||
|
solver=None, results=None,
|
||||||
|
parent=None):
|
||||||
|
self._solver = solver
|
||||||
|
self._results = results
|
||||||
|
|
||||||
|
trad = CompareResultsTranslate()
|
||||||
|
name = (
|
||||||
|
trad[self._pamhyr_name] + " - "
|
||||||
|
+ study.name + " - "
|
||||||
|
+ self._solver.name
|
||||||
|
)
|
||||||
|
|
||||||
|
super(CompareResultsWindow, self).__init__(
|
||||||
|
study=study,
|
||||||
|
config=config,
|
||||||
|
solver=solver,
|
||||||
|
results=results,
|
||||||
|
parent=parent,
|
||||||
|
trad=trad
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -95,3 +95,35 @@ class ResultsTranslate(MainTranslate):
|
||||||
"min_depth": self._dict["unit_min_depth"],
|
"min_depth": self._dict["unit_min_depth"],
|
||||||
"max_depth": self._dict["unit_max_depth"],
|
"max_depth": self._dict["unit_max_depth"],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CompareResultsTranslate(ResultsTranslate):
|
||||||
|
def __init__(self):
|
||||||
|
super(CompareResultsTranslate, self).__init__()
|
||||||
|
|
||||||
|
self._dict['label_water'] = u"Δ "+_translate("Results", "Water elevation")
|
||||||
|
self._dict['unit_elevation'] = u"Δ "+self._dict["unit_elevation"]
|
||||||
|
|
||||||
|
self._sub_dict["table_headers_raw_data"] = {
|
||||||
|
"name": _translate("Results", "Profile"),
|
||||||
|
"water_elevation": u"Δ "+self._dict["unit_water_elevation"],
|
||||||
|
"discharge": u"Δ "+self._dict["unit_discharge"],
|
||||||
|
"velocity": u"Δ "+self._dict["unit_velocity"],
|
||||||
|
"width": u"Δ "+self._dict["unit_width"],
|
||||||
|
"depth": u"Δ "+self._dict["unit_depth"],
|
||||||
|
"mean_depth": u"Δ "+self._dict["unit_mean_depth"],
|
||||||
|
"wet_area": u"Δ "+self._dict["unit_wet_area"],
|
||||||
|
"wet_perimeter": u"Δ "+self._dict["unit_wet_perimeter"],
|
||||||
|
"hydraulic_radius": u"Δ "+self._dict["unit_hydraulic_radius"],
|
||||||
|
"froude": u"Δ "+self._dict["unit_froude"],
|
||||||
|
}
|
||||||
|
|
||||||
|
self._sub_dict["values_y"] = {
|
||||||
|
"bed_elevation": u"Δ "+self._dict["unit_bed_elevation"],
|
||||||
|
"water_elevation": u"Δ "+self._dict["unit_water_elevation"],
|
||||||
|
"discharge": u"Δ "+self._dict["unit_discharge"],
|
||||||
|
"velocity": u"Δ "+self._dict["unit_velocity"],
|
||||||
|
"depth": u"Δ "+self._dict["unit_depth"],
|
||||||
|
"mean_depth": u"Δ "+self._dict["unit_mean_depth"],
|
||||||
|
"froude": u"Δ "+self._dict["unit_froude"],
|
||||||
|
"wet_area": u"Δ "+self._dict["unit_wet_area"],
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -134,6 +134,107 @@ class SelectSolverWindow(PamhyrDialog):
|
||||||
super(SelectSolverWindow, self).accept()
|
super(SelectSolverWindow, self).accept()
|
||||||
|
|
||||||
|
|
||||||
|
class CompareSolversWindow(PamhyrDialog):
|
||||||
|
_pamhyr_ui = "CompareSolvers"
|
||||||
|
_pamhyr_name = "Compare solvers"
|
||||||
|
|
||||||
|
def __init__(self, study=None, config=None,
|
||||||
|
parent=None):
|
||||||
|
self._solver1 = None
|
||||||
|
self._solver2 = None
|
||||||
|
|
||||||
|
name = _translate("Solver", "Compare solvers")
|
||||||
|
super(CompareSolversWindow, self).__init__(
|
||||||
|
title=name,
|
||||||
|
study=study,
|
||||||
|
config=config,
|
||||||
|
options=[],
|
||||||
|
parent=parent
|
||||||
|
)
|
||||||
|
|
||||||
|
self.setup_combobox1()
|
||||||
|
self.setup_combobox2()
|
||||||
|
self.setup_connections()
|
||||||
|
self.select_last_solver()
|
||||||
|
|
||||||
|
def setup_combobox1(self):
|
||||||
|
solvers = self._config.solvers
|
||||||
|
solvers_name = list(
|
||||||
|
map(
|
||||||
|
self._format_solver_name,
|
||||||
|
solvers
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.combobox_add_items("comboBox1", solvers_name)
|
||||||
|
|
||||||
|
def setup_combobox2(self):
|
||||||
|
solvers = self._config.solvers
|
||||||
|
solvers_name = list(
|
||||||
|
map(
|
||||||
|
self._format_solver_name,
|
||||||
|
solvers
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.combobox_add_items("comboBox2", solvers_name)
|
||||||
|
|
||||||
|
def setup_connections(self):
|
||||||
|
self.find(QPushButton, "pushButton_ok").clicked.connect(self.accept)
|
||||||
|
self.find(QPushButton, "pushButton_cancel")\
|
||||||
|
.clicked.connect(self.reject)
|
||||||
|
|
||||||
|
def select_last_solver(self):
|
||||||
|
solvers = self._config.solvers
|
||||||
|
last = self._config.last_solver_name
|
||||||
|
|
||||||
|
solver = list(
|
||||||
|
filter(
|
||||||
|
lambda s: s.name == last,
|
||||||
|
solvers
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(solver) != 0:
|
||||||
|
self.set_combobox_text(
|
||||||
|
"comboBox1",
|
||||||
|
self._format_solver_name(solver[0])
|
||||||
|
)
|
||||||
|
|
||||||
|
def _format_solver_name(self, solver):
|
||||||
|
return f"{solver.name} - ({solver._type})"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def solver1(self):
|
||||||
|
return self._solver1
|
||||||
|
|
||||||
|
@property
|
||||||
|
def solver2(self):
|
||||||
|
return self._solver2
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
solver_name1 = self.get_combobox_text("comboBox1")
|
||||||
|
solver_name1 = solver_name1.rsplit(" - ", 1)[0]
|
||||||
|
|
||||||
|
self._solver1 = next(
|
||||||
|
filter(
|
||||||
|
lambda s: s.name == solver_name1,
|
||||||
|
self._config.solvers
|
||||||
|
)
|
||||||
|
)
|
||||||
|
solver_name2 = self.get_combobox_text("comboBox2")
|
||||||
|
solver_name2 = solver_name2.rsplit(" - ", 1)[0]
|
||||||
|
|
||||||
|
self._solver2 = next(
|
||||||
|
filter(
|
||||||
|
lambda s: s.name == solver_name2,
|
||||||
|
self._config.solvers
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
super(CompareSolversWindow, self).accept()
|
||||||
|
|
||||||
|
|
||||||
class SolverLogWindow(PamhyrWindow):
|
class SolverLogWindow(PamhyrWindow):
|
||||||
_pamhyr_ui = "SolverLog"
|
_pamhyr_ui = "SolverLog"
|
||||||
_pamhyr_name = "Solver Log"
|
_pamhyr_name = "Solver Log"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Dialog</class>
|
||||||
|
<widget class="QDialog" name="Dialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>320</width>
|
||||||
|
<height>80</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dialog</string>
|
||||||
|
</property>
|
||||||
|
<property name="locale">
|
||||||
|
<locale language="English" country="Europe"/>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QComboBox" name="comboBox1"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_cancel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Cancel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_ok">
|
||||||
|
<property name="text">
|
||||||
|
<string>OK</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QComboBox" name="comboBox2"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
|
|
@ -158,6 +158,7 @@
|
||||||
</property>
|
</property>
|
||||||
<addaction name="action_menu_results_last"/>
|
<addaction name="action_menu_results_last"/>
|
||||||
<addaction name="action_open_results_from_file"/>
|
<addaction name="action_open_results_from_file"/>
|
||||||
|
<addaction name="action_compare_results"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_help">
|
<widget class="QMenu" name="menu_help">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
|
|
@ -730,6 +731,14 @@
|
||||||
<string>REP additional lines</string>
|
<string>REP additional lines</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="action_compare_results">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Compare results</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue