mirror of https://gitlab.com/pamhyr/pamhyr2
Solver: RubarBE: Add RubarBE at solvers and fix export.
parent
982d346264
commit
6d9b193d25
|
|
@ -209,6 +209,9 @@ class Friction(SQLSubModel):
|
||||||
|
|
||||||
self._status.modified()
|
self._status.modified()
|
||||||
|
|
||||||
|
def __contains__(self, kp):
|
||||||
|
return self.contains_kp(kp)
|
||||||
|
|
||||||
def contains_kp(self, kp):
|
def contains_kp(self, kp):
|
||||||
return (
|
return (
|
||||||
self._begin_kp <= kp <= self._end_kp
|
self._begin_kp <= kp <= self._end_kp
|
||||||
|
|
|
||||||
|
|
@ -365,10 +365,14 @@ class Reach(SQLSubModel):
|
||||||
return 0.0
|
return 0.0
|
||||||
|
|
||||||
def inter_profiles_kp(self):
|
def inter_profiles_kp(self):
|
||||||
res_kp = [self.profile(0).kp]
|
profiles = sorted(self.profiles, key=lambda p: p.kp)
|
||||||
|
first = profiles[0]
|
||||||
|
last = profiles[-1]
|
||||||
|
|
||||||
profiles = iter(self.profiles)
|
res_kp = [first.kp]
|
||||||
previous = next(profile)
|
|
||||||
|
profiles = iter(profiles)
|
||||||
|
previous = next(profiles)
|
||||||
|
|
||||||
for profile in profiles:
|
for profile in profiles:
|
||||||
prev = previous.kp
|
prev = previous.kp
|
||||||
|
|
@ -381,7 +385,7 @@ class Reach(SQLSubModel):
|
||||||
|
|
||||||
previous = profile
|
previous = profile
|
||||||
|
|
||||||
res_kp.append(self.profile(len(self) - 1).kp)
|
res_kp.append(last.kp)
|
||||||
return res_kp
|
return res_kp
|
||||||
|
|
||||||
# Sediment Layers
|
# Sediment Layers
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ from Model.Results.River.River import River, Reach, Profile
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
class RubarBE(CommandLineSolver):
|
class RubarBE(CommandLineSolver):
|
||||||
_type = "rubarbe"
|
_type = "rubarbe"
|
||||||
|
|
||||||
|
|
@ -134,7 +135,19 @@ class RubarBE(CommandLineSolver):
|
||||||
name = self._study.name
|
name = self._study.name
|
||||||
return f"{name}.TRA"
|
return f"{name}.TRA"
|
||||||
|
|
||||||
def _export_donnee(self, study, repertory, files, qlog, name="0"):
|
|
||||||
|
def export(self, study, repertory, qlog=None):
|
||||||
|
self._study = study
|
||||||
|
name = study.name.replace(" ", "_")
|
||||||
|
|
||||||
|
self._export_donnee(study, repertory, qlog, name=name)
|
||||||
|
self._export_ts(study, repertory, qlog, name=name)
|
||||||
|
self._export_geomac_i(study, repertory, qlog, name=name)
|
||||||
|
self._export_mail(study, repertory, qlog, name=name)
|
||||||
|
self._export_tps(study, repertory, qlog, name=name)
|
||||||
|
self._export_stricklers(study, repertory, qlog, name=name)
|
||||||
|
|
||||||
|
def _export_donnee(self, study, repertory, qlog, name="0"):
|
||||||
if qlog is not None:
|
if qlog is not None:
|
||||||
qlog.put("Export DONNEE file")
|
qlog.put("Export DONNEE file")
|
||||||
|
|
||||||
|
|
@ -144,14 +157,17 @@ class RubarBE(CommandLineSolver):
|
||||||
), "w+"
|
), "w+"
|
||||||
) as f:
|
) as f:
|
||||||
params = filter(
|
params = filter(
|
||||||
lambda p: "rubarbe_sediment_" not in p[0],
|
lambda p: "rubarbe_sediment_" not in p.name,
|
||||||
study.river.get_params(self.type).parameters
|
study.river.get_params(self._type).parameters
|
||||||
)
|
)
|
||||||
|
|
||||||
it = iter(params)
|
it = iter(params)
|
||||||
|
|
||||||
line = 0
|
line = 0
|
||||||
while line < 29:
|
while line < 29:
|
||||||
lh, value = next(it)
|
param = next(it)
|
||||||
|
name = param.name
|
||||||
|
value = param.value
|
||||||
|
|
||||||
if value != "":
|
if value != "":
|
||||||
# Value format
|
# Value format
|
||||||
|
|
@ -166,13 +182,13 @@ class RubarBE(CommandLineSolver):
|
||||||
value = "O" if value == "y" else "N"
|
value = "O" if value == "y" else "N"
|
||||||
|
|
||||||
# Write value
|
# Write value
|
||||||
f.write(f"{lh:<50}{value}")
|
f.write(f"{name:<50}{value}")
|
||||||
|
|
||||||
# Add values of 'rubarbe_iodebord' and
|
# Add values of 'rubarbe_iodebord' and
|
||||||
# 'rubarbe_iostockage'
|
# 'rubarbe_iostockage'
|
||||||
if lh == "rubarbe_iodev":
|
if name == "rubarbe_iodev":
|
||||||
_, v2 = next(it)
|
v2 = next(it).value
|
||||||
_, v3 = next(it)
|
v3 = next(it).value
|
||||||
|
|
||||||
f.write(f"{v2}{v3}")
|
f.write(f"{v2}{v3}")
|
||||||
|
|
||||||
|
|
@ -181,7 +197,7 @@ class RubarBE(CommandLineSolver):
|
||||||
|
|
||||||
line += 1
|
line += 1
|
||||||
|
|
||||||
def _export_ts(self, study, repertory, files, qlog, name="0"):
|
def _export_ts(self, study, repertory, qlog, name="0"):
|
||||||
if qlog is not None:
|
if qlog is not None:
|
||||||
qlog.put("Export TS file")
|
qlog.put("Export TS file")
|
||||||
|
|
||||||
|
|
@ -190,31 +206,40 @@ class RubarBE(CommandLineSolver):
|
||||||
repertory, f"ts.{name}"
|
repertory, f"ts.{name}"
|
||||||
), "w+"
|
), "w+"
|
||||||
) as f:
|
) as f:
|
||||||
|
def float_format(string):
|
||||||
|
if "." in string:
|
||||||
|
return f"{float(string):>10.0f}"
|
||||||
|
return ""
|
||||||
|
|
||||||
params = filter(
|
params = filter(
|
||||||
lambda p: "rubarbe_sediment_" in p[0],
|
lambda p: "rubarbe_sediment_" in p.name,
|
||||||
study.river.get_params(self.type).parameters
|
study.river.get_params(self.type).parameters
|
||||||
)
|
)
|
||||||
it = iter(params)
|
it = iter(params)
|
||||||
|
|
||||||
line = 0
|
line = 0
|
||||||
while line < 20:
|
while line < 20:
|
||||||
lh, value = next(it)
|
param = next(it)
|
||||||
|
name = param.name
|
||||||
|
value = param.value
|
||||||
|
|
||||||
if value != "":
|
if value != "":
|
||||||
# Value format
|
# Value format
|
||||||
if value.count('.') == 1:
|
if value.count('.') == 1:
|
||||||
value = f"{float(value):>10.0f}"
|
value = f"{float_format(value)}"
|
||||||
|
else:
|
||||||
|
value = f"{value:>10}"
|
||||||
|
|
||||||
# Write value
|
# Write value
|
||||||
f.write(f"{lh:<50}{value}")
|
f.write(f"{name:<50}{value}")
|
||||||
|
|
||||||
# Add values of 'rubarbe_iodebord' and
|
# Add values of 'rubarbe_iodebord' and
|
||||||
# 'rubarbe_iostockage'
|
# 'rubarbe_iostockage'
|
||||||
if lh == "rubarbe_sediment_mult_1":
|
if name == "rubarbe_sediment_mult_1":
|
||||||
_, m2 = f"{float(next(it)):>10.0f}"
|
m2 = f"{float_format(next(it).value)}"
|
||||||
_, m3 = f"{float(next(it)):>10.0f}"
|
m3 = f"{float_format(next(it).value)}"
|
||||||
_, m4 = f"{float(next(it)):>10.0f}"
|
m4 = f"{float_format(next(it).value)}"
|
||||||
_, m5 = f"{float(next(it)):>10.0f}"
|
m5 = f"{float_format(next(it).value)}"
|
||||||
|
|
||||||
f.write(f"{m2}{m3}{m4}{m5}")
|
f.write(f"{m2}{m3}{m4}{m5}")
|
||||||
|
|
||||||
|
|
@ -223,7 +248,7 @@ class RubarBE(CommandLineSolver):
|
||||||
|
|
||||||
line += 1
|
line += 1
|
||||||
|
|
||||||
def _export_geomac_i(self, study, repertory, files, qlog, name="0"):
|
def _export_geomac_i(self, study, repertory, qlog, name="0"):
|
||||||
if qlog is not None:
|
if qlog is not None:
|
||||||
qlog.put("Export GEOMAC-i file")
|
qlog.put("Export GEOMAC-i file")
|
||||||
|
|
||||||
|
|
@ -241,15 +266,18 @@ class RubarBE(CommandLineSolver):
|
||||||
|
|
||||||
ind = 1
|
ind = 1
|
||||||
for profile in reach.profiles:
|
for profile in reach.profiles:
|
||||||
kp = profile.get_kp()
|
kp = profile.kp
|
||||||
n_points = len(profile)
|
n_points = len(profile)
|
||||||
|
|
||||||
f.write(f"{ind:>4} {kp:>11.3f} {n_points:>4}\n")
|
f.write(f"{ind:>4} {kp:>11.3f} {n_points:>4}\n")
|
||||||
|
|
||||||
for point in profile.points:
|
for point in profile.points:
|
||||||
label = point.name.lower()
|
label = point.name.lower()
|
||||||
if label[0] == "r":
|
if label != "":
|
||||||
label = label[1].upper()
|
if label[0] == "r":
|
||||||
|
label = label[1].upper()
|
||||||
|
else:
|
||||||
|
label = lable[0]
|
||||||
|
|
||||||
y = point.y
|
y = point.y
|
||||||
z = point.z
|
z = point.z
|
||||||
|
|
@ -258,7 +286,7 @@ class RubarBE(CommandLineSolver):
|
||||||
tmcs = 0.0
|
tmcs = 0.0
|
||||||
|
|
||||||
f.write(
|
f.write(
|
||||||
f"{label[0]} {y:>11.5f}" +
|
f"{label} {y:>11.5f}" +
|
||||||
f"{z:>13.5f}{dcs:>15.10f}" +
|
f"{z:>13.5f}{dcs:>15.10f}" +
|
||||||
f"{scs:>15.10f}{tmcs:>15.5f}" +
|
f"{scs:>15.10f}{tmcs:>15.5f}" +
|
||||||
"\n"
|
"\n"
|
||||||
|
|
@ -266,7 +294,7 @@ class RubarBE(CommandLineSolver):
|
||||||
|
|
||||||
ind += 1
|
ind += 1
|
||||||
|
|
||||||
def _export_mail(self, study, repertory, files, qlog, name="0"):
|
def _export_mail(self, study, repertory, qlog, name="0"):
|
||||||
if qlog is not None:
|
if qlog is not None:
|
||||||
qlog.put("Export MAIL file")
|
qlog.put("Export MAIL file")
|
||||||
|
|
||||||
|
|
@ -276,11 +304,12 @@ class RubarBE(CommandLineSolver):
|
||||||
), "w+"
|
), "w+"
|
||||||
) as f:
|
) as f:
|
||||||
for edge in study.river.enable_edges():
|
for edge in study.river.enable_edges():
|
||||||
lm = len(edge) + 1
|
reach = edge.reach
|
||||||
|
lm = len(reach) + 1
|
||||||
f.write(f"{lm:>13}\n")
|
f.write(f"{lm:>13}\n")
|
||||||
|
|
||||||
for mails in [edge.reach.inter_profiles_kp(),
|
for mails in [reach.inter_profiles_kp(),
|
||||||
edge.reach.profiles.get_kp()]:
|
reach.get_kp()]:
|
||||||
ind = 0
|
ind = 0
|
||||||
for mail in mails:
|
for mail in mails:
|
||||||
f.write(f"{mail:15.3f}")
|
f.write(f"{mail:15.3f}")
|
||||||
|
|
@ -292,13 +321,13 @@ class RubarBE(CommandLineSolver):
|
||||||
if ind % 3 != 0:
|
if ind % 3 != 0:
|
||||||
f.write("\n")
|
f.write("\n")
|
||||||
|
|
||||||
def _export_stricklers(self, study, repertory, files, qlog, name="0"):
|
def _export_stricklers(self, study, repertory, qlog, name="0"):
|
||||||
self._export_frot(study, repertory, files, qlog, name="0", version="")
|
self._export_frot(study, repertory, qlog, name=name, version="")
|
||||||
self._export_frot(study, repertory, files, qlog, name="0", version="2")
|
self._export_frot(study, repertory, qlog, name=name, version="2")
|
||||||
|
|
||||||
def _export_frot(self, study, repertory, files, qlog, name="0", version=""):
|
def _export_frot(self, study, repertory, qlog, name="0", version=""):
|
||||||
if qlog is not None:
|
if qlog is not None:
|
||||||
qlog.put("Export FROT file")
|
qlog.put(f"Export FROT{version} file")
|
||||||
|
|
||||||
with open(
|
with open(
|
||||||
os.path.join(
|
os.path.join(
|
||||||
|
|
@ -306,26 +335,20 @@ class RubarBE(CommandLineSolver):
|
||||||
), "w+"
|
), "w+"
|
||||||
) as f:
|
) as f:
|
||||||
for edge in study.river.enable_edges():
|
for edge in study.river.enable_edges():
|
||||||
lm = len(edge) + 1
|
reach = edge.reach
|
||||||
|
lm = len(reach) + 1
|
||||||
f.write(f"{lm:>6}\n")
|
f.write(f"{lm:>6}\n")
|
||||||
|
|
||||||
# TODO: Take in consideration begin and end Stricklers
|
|
||||||
f_i = list(
|
|
||||||
map(
|
|
||||||
lambda f: (f.begin_kp, f.end_kp, f.begin_strickler),
|
|
||||||
reach.frictions
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_stricklers_from_kp(kp):
|
def get_stricklers_from_kp(kp):
|
||||||
return next(
|
return next(
|
||||||
map(
|
map(
|
||||||
lambda s: (
|
lambda s: (
|
||||||
s[2].medium if version == "2"
|
s.begin_strickler.medium if version == "2"
|
||||||
else s[2].minor
|
else s.begin_strickler.minor
|
||||||
),
|
),
|
||||||
filter(
|
filter(
|
||||||
lambda f: f.contains_kp(kp), f_i
|
lambda f: kp in f,
|
||||||
|
edge.frictions.lst
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -339,7 +362,7 @@ class RubarBE(CommandLineSolver):
|
||||||
ind += 1
|
ind += 1
|
||||||
f.write("\n")
|
f.write("\n")
|
||||||
|
|
||||||
def _export_tps(self, study, repertory, files, qlog, name="0"):
|
def _export_tps(self, study, repertory, qlog, name="0"):
|
||||||
if qlog is not None:
|
if qlog is not None:
|
||||||
qlog.put("Export TPS file")
|
qlog.put("Export TPS file")
|
||||||
|
|
||||||
|
|
@ -348,16 +371,22 @@ class RubarBE(CommandLineSolver):
|
||||||
repertory, f"tps.{name}"
|
repertory, f"tps.{name}"
|
||||||
), "w+"
|
), "w+"
|
||||||
) as f:
|
) as f:
|
||||||
for reach in study.river.enable_edges():
|
for edge in study.river.enable_edges():
|
||||||
|
reach = edge.reach
|
||||||
|
|
||||||
f.write(f"0.0\n")
|
f.write(f"0.0\n")
|
||||||
|
|
||||||
ics = study.river.initial_conditions.get(reach)
|
ics = study.river.initial_conditions.get(edge)
|
||||||
data = self._export_tps_init_data(ics)
|
data = self._export_tps_init_data(ics)
|
||||||
|
|
||||||
profiles = edge.reach.profiles
|
profiles = reach.profiles
|
||||||
first = profiles[0]
|
first = profiles[0]
|
||||||
last = profiles[-1]
|
last = profiles[-1]
|
||||||
|
|
||||||
|
if first.kp not in data or last.kp not in data:
|
||||||
|
logger.error("Study initial condition is not fully defined")
|
||||||
|
return
|
||||||
|
|
||||||
f_h_s = self._export_tps_profile_height_speed(first, data)
|
f_h_s = self._export_tps_profile_height_speed(first, data)
|
||||||
l_h_s = self._export_tps_profile_height_speed(last, data)
|
l_h_s = self._export_tps_profile_height_speed(last, data)
|
||||||
|
|
||||||
|
|
@ -366,10 +395,14 @@ class RubarBE(CommandLineSolver):
|
||||||
|
|
||||||
ind = 2
|
ind = 2
|
||||||
it = iter(profiles)
|
it = iter(profiles)
|
||||||
prev = next(profiles)
|
prev = next(it)
|
||||||
|
|
||||||
prev_h, prev_s = f_h_s
|
prev_h, prev_s = f_h_s
|
||||||
for profile in it:
|
for profile in it:
|
||||||
|
if profile.kp not in data:
|
||||||
|
ind += 1
|
||||||
|
continue
|
||||||
|
|
||||||
cur_h, cur_s = self._export_tps_profile_height_speed(
|
cur_h, cur_s = self._export_tps_profile_height_speed(
|
||||||
profile, data
|
profile, data
|
||||||
)
|
)
|
||||||
|
|
@ -378,7 +411,7 @@ class RubarBE(CommandLineSolver):
|
||||||
h = (prev_h + cur_h) / 2
|
h = (prev_h + cur_h) / 2
|
||||||
s = (prev_s + cur_s) / 2
|
s = (prev_s + cur_s) / 2
|
||||||
|
|
||||||
f.write(f"{ind:>5} {h} {s}")
|
f.write(f"{ind:>5} {h} {s}\n")
|
||||||
|
|
||||||
prev_h, prev_s = cur_h, cur_s
|
prev_h, prev_s = cur_h, cur_s
|
||||||
ind += 1
|
ind += 1
|
||||||
|
|
@ -390,11 +423,7 @@ class RubarBE(CommandLineSolver):
|
||||||
def _export_tps_init_data(self, ics):
|
def _export_tps_init_data(self, ics):
|
||||||
data = {}
|
data = {}
|
||||||
|
|
||||||
for ic in ics:
|
for d in ics.data:
|
||||||
d = ic.data
|
|
||||||
if len(d) == 0:
|
|
||||||
continue
|
|
||||||
|
|
||||||
data[d['kp']] = (
|
data[d['kp']] = (
|
||||||
d['elevation'],
|
d['elevation'],
|
||||||
d['discharge'],
|
d['discharge'],
|
||||||
|
|
@ -406,7 +435,7 @@ class RubarBE(CommandLineSolver):
|
||||||
z = data[profile.kp][0]
|
z = data[profile.kp][0]
|
||||||
q = data[profile.kp][1]
|
q = data[profile.kp][1]
|
||||||
|
|
||||||
heiglt = z - profile.z_min()
|
height = z - profile.z_min()
|
||||||
speed = profile.seed(q, z)
|
speed = profile.speed(q, z)
|
||||||
|
|
||||||
return height, speed
|
return height, speed
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ from Solver.GenericSolver import GenericSolver
|
||||||
from Solver.Mage import (
|
from Solver.Mage import (
|
||||||
Mage7, Mage8, MageFake7,
|
Mage7, Mage8, MageFake7,
|
||||||
)
|
)
|
||||||
|
from Solver.RubarBE import RubarBE
|
||||||
|
|
||||||
_translate = QCoreApplication.translate
|
_translate = QCoreApplication.translate
|
||||||
|
|
||||||
|
|
@ -30,6 +31,7 @@ solver_long_name = {
|
||||||
# "mage7": "Mage v7",
|
# "mage7": "Mage v7",
|
||||||
"mage8": "Mage v8",
|
"mage8": "Mage v8",
|
||||||
# "mage_fake7": "Mage fake v7",
|
# "mage_fake7": "Mage fake v7",
|
||||||
|
"rubarbe": "RubarBE",
|
||||||
}
|
}
|
||||||
|
|
||||||
solver_type_list = {
|
solver_type_list = {
|
||||||
|
|
@ -37,4 +39,5 @@ solver_type_list = {
|
||||||
# "mage7": Mage7,
|
# "mage7": Mage7,
|
||||||
"mage8": Mage8,
|
"mage8": Mage8,
|
||||||
# "mage_fake7": MageFake7,
|
# "mage_fake7": MageFake7,
|
||||||
|
"rubarbe": RubarBE,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue