diff --git a/src/Solver/RubarBE.py b/src/Solver/RubarBE.py index 26049dfa..6abf719c 100644 --- a/src/Solver/RubarBE.py +++ b/src/Solver/RubarBE.py @@ -395,25 +395,59 @@ class Rubar3(CommandLineSolver): lm = len(reach) + 1 f.write(f"{lm:>6}\n") - def get_stricklers_from_rk(rk): - return next( - map( - lambda s: ( - s.begin_strickler.medium if version == "2" - else s.begin_strickler.minor - ), - filter( - lambda f: rk in f, - edge.frictions.lst - ) + lst = list(filter( + lambda f: f.is_full_defined(), + edge.frictions.frictions + )) + + rk_min = 9999999.9 + rk_max = -9999999.9 + coeff_min = -1.0 + coeff_max = -1.0 + for s in lst: # TODO optimise ? + if s.begin_rk > rk_max: + rk_max = s.begin_rk + coeff_max = s.begin_strickler + if s.begin_rk < rk_min: + rk_min = s.begin_rk + coeff_min = s.begin_strickler + if s.end_rk > rk_max: + rk_max = s.end_rk + coeff_max = s.end_strickler + if s.end_rk < rk_min: + rk_min = s.end_rk + coeff_min = s.end_strickler + + def get_stricklers_from_rk(rk, lst): + + coeff = None + if rk > rk_max: + coeff = coeff_max + elif rk < rk_min: + coeff = coeff_min + else: + for s in lst: + print(s.begin_rk, s.end_rk) + if (rk >= s.begin_rk and rk <= s.end_rk or + rk <= s.begin_rk and rk >= s.end_rk): + coeff = s.begin_strickler # TODO: inerpolate + break + + # TODO interpolation if rk is not in frictons + + if coeff is None: + logger.error( + "Study frictions are not fully defined" ) - ) + return None + + return coeff.medium if version == "2" else coeff.minor ind = 1 for mail in edge.reach.inter_profiles_rk(): - coef = get_stricklers_from_rk(mail) - - f.write(f"{ind:>6} {coef:>12.5f}") + coef = get_stricklers_from_rk(mail, lst) + if coeff is not None: + f.write(f"{ind:>6} {coef:>12.5f}") ind += 1 f.write("\n")