start to work on compare results

compare_results
Theophile Terraz 2024-11-28 09:20:20 +01:00
parent 58f72cfa6b
commit 558085705f
9 changed files with 358 additions and 7 deletions

View File

@ -70,12 +70,20 @@ from View.SedimentLayers.Reach.Window import ReachSedimentLayersWindow
from View.AdditionalFiles.Window import AddFileListWindow
from View.REPLines.Window import REPLineListWindow
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.Results.Window import ResultsWindow
from View.Results.Window import ResultsWindow, CompareResultsWindow
from View.Results.ReadingResultsDialog import ReadingResultsDialog
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
# package lighter...
try:
@ -117,7 +125,7 @@ define_model_action = [
"action_menu_edit_reach_sediment_layers", "action_menu_edit_reservoirs",
"action_menu_edit_hydraulic_structures", "action_menu_additional_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",
]
@ -255,6 +263,7 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
"action_menu_close": self.close_model,
"action_menu_results_last": self.open_last_results,
"action_open_results_from_file": self.open_results_from_file,
"action_compare_results": self.compare_results,
# Help
"action_menu_pamhyr_users_wiki": self.open_doc_user,
"action_menu_pamhyr_developers_pdf":
@ -1344,6 +1353,103 @@ class ApplicationWindow(QMainWindow, ListedSubWindow, WindowToolKit):
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 #
#################

View File

@ -123,7 +123,10 @@ class TableModel(PamhyrTableModel):
v = self._lst[row].geometry.speed(q, z)
a = self._lst[row].geometry.wet_area(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}"
else:
v = 0.0

View File

@ -61,7 +61,10 @@ from View.Results.CustomPlot.CustomPlotValuesSelectionDialog import (
)
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
_translate = QCoreApplication.translate
@ -83,11 +86,12 @@ class ResultsWindow(PamhyrWindow):
def __init__(self, study=None, config=None,
solver=None, results=None,
parent=None):
parent=None, trad=None):
self._solver = solver
self._results = results
trad = ResultsTranslate()
if trad is None:
trad = ResultsTranslate()
name = (
trad[self._pamhyr_name] + " - "
+ study.name + " - "
@ -855,3 +859,38 @@ class ResultsWindow(PamhyrWindow):
)
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
)

View File

@ -95,3 +95,35 @@ class ResultsTranslate(MainTranslate):
"min_depth": self._dict["unit_min_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"],
}

View File

@ -134,6 +134,107 @@ class SelectSolverWindow(PamhyrDialog):
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):
_pamhyr_ui = "SolverLog"
_pamhyr_name = "Solver Log"

View File

@ -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>

View File

@ -158,6 +158,7 @@
</property>
<addaction name="action_menu_results_last"/>
<addaction name="action_open_results_from_file"/>
<addaction name="action_compare_results"/>
</widget>
<widget class="QMenu" name="menu_help">
<property name="title">
@ -730,6 +731,14 @@
<string>REP additional lines</string>
</property>
</action>
<action name="action_compare_results">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Compare results</string>
</property>
</action>
</widget>
<resources/>
<connections>

Binary file not shown.

Binary file not shown.