diff --git a/src/Checker/Mage.py b/src/Checker/Mage.py index 949e61ae..f7d4d747 100644 --- a/src/Checker/Mage.py +++ b/src/Checker/Mage.py @@ -229,7 +229,11 @@ for each reach" gls = [] for edge in edges: - comp, incomp = edge.reach.compute_guidelines() + profiles = edge.reach.enabled_profiles + comp, incomp = edge.reach.compute_guidelines( + profiles=profiles, + update_cache=False + ) if len(incomp) != 0: self._status = STATUS.WARNING self._summary = "incomplete_guideline" @@ -237,7 +241,6 @@ for each reach" gls.append(comp) - profiles = edge.reach.profiles for profile in profiles: if not profile.has_standard_named_points(): self._status = STATUS.WARNING diff --git a/src/Checker/Study.py b/src/Checker/Study.py index bddfa4a7..7889cf2e 100644 --- a/src/Checker/Study.py +++ b/src/Checker/Study.py @@ -87,7 +87,7 @@ class StudyGeometryChecker(AbstractModelChecker): return False for edge in edges: - if len(edge.reach.profiles) < 2: + if len(edge.reach.enabled_profiles) < 2: summary = "no_geometry_defined" status = STATUS.ERROR ok = False @@ -132,8 +132,12 @@ class StudyInitialConditionsChecker(AbstractModelChecker): return ok ic = river.initial_conditions[reach] - len_ic = len(ic) - len_reach = len(reach) + enabled_profiles = set(reach.enabled_profiles) + len_ic = sum( + data["section"] in enabled_profiles + for data in ic.data + ) + len_reach = len(enabled_profiles) if len_ic < len_reach: self._summary = "initial_condition_missing_profile" diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py index 04f1144e..db5724f6 100644 --- a/src/Model/Geometry/Reach.py +++ b/src/Model/Geometry/Reach.py @@ -494,14 +494,22 @@ class Reach(SQLSubModel): ) @timer - def compute_guidelines(self): + def compute_guidelines(self, profiles=None, update_cache=True): """Compute reach guidelines + Args: + profiles: Profiles used to compute the guidelines. If omitted, + all non-deleted profiles of the reach are used. + update_cache: Whether to update the reach guidelines cache. + Returns: Tuple of complete and incomplete guidelines name. """ + if profiles is None: + profiles = self.profiles + # Get all point contained into a guideline - named_points = [profile.named_points() for profile in self.profiles] + named_points = [profile.named_points() for profile in profiles] points_name = list( map( lambda lst: list(map(lambda p: p.name, lst)), @@ -532,11 +540,13 @@ class Reach(SQLSubModel): complete = guide_set - incomplete - # Compute guideline and put data in cache - self._compute_guidelines_cache(guide_set, named_points, - complete, incomplete) + if update_cache: + # Compute guideline and put data in cache + self._compute_guidelines_cache( + guide_set, named_points, complete, incomplete + ) + self.modified() - self.modified() return (complete, incomplete) def _map_guidelines_points(self, func, full=False): diff --git a/src/Model/Results/River/River.py b/src/Model/Results/River/River.py index 6e32b7a3..44cacde7 100644 --- a/src/Model/Results/River/River.py +++ b/src/Model/Results/River/River.py @@ -276,7 +276,7 @@ class Profile(SQLSubModel): class Reach(SQLSubModel): _sub_classes = [Profile] - def __init__(self, reach, study, parent, with_init=True): + def __init__(self, reach, study, parent, with_init=True, profiles=None): super(Reach, self).__init__( id=-1, status=study.status, owner_scenario=study.status.scenario.id @@ -287,10 +287,12 @@ class Reach(SQLSubModel): self._reach = reach # Source reach in the study self._profiles = [] if with_init: + if profiles is None: + profiles = reach.profiles self._profiles = list( map( lambda p: Profile(p, self._study, self._parent), - reach.profiles + profiles ) ) @@ -379,7 +381,14 @@ class Reach(SQLSubModel): for i, profile in enumerate(reach.profiles): data["profile"] = profile - new_reach._profiles += [Profile._db_load(execute, data)] + result_profile = Profile._db_load(execute, data) + if len(result_profile) > 0: + new_reach._profiles.append(result_profile) + + new_reach._profile_mask = [ + profile.name[0:8] != 'interpol' + for profile in new_reach._profiles + ] return new_reach @@ -418,10 +427,13 @@ class River(SQLSubModel): def has_reach(self, id): return 0 <= id < len(self._reachs) - def add(self, reach_id): + def add(self, reach_id, profiles=None): reachs = self._study.river.enable_edges() - new = Reach(reachs[reach_id].reach, self._study, self._parent) + new = Reach( + reachs[reach_id].reach, self._study, self._parent, + profiles=profiles + ) self._reachs.append(new) return new @@ -460,9 +472,9 @@ class River(SQLSubModel): for reach in study.river.reachs(): data["reach"] = reach.reach - new_river._reachs.append( - Reach._db_load(execute, data) - ) + result_reach = Reach._db_load(execute, data) + if len(result_reach) > 0: + new_river._reachs.append(result_reach) return new_river diff --git a/src/Solver/AdisTS.py b/src/Solver/AdisTS.py index 4c0c11e7..4a619113 100644 --- a/src/Solver/AdisTS.py +++ b/src/Solver/AdisTS.py @@ -180,7 +180,7 @@ class AdisTS(CommandLineSolver): files.append(str(os.path.join("net", f"{name}.ST"))) cnt_num = 1 - for profile in edge.reach.profiles: + for profile in edge.reach.enabled_profiles: self._export_ST_profile_header( f, files, profile, cnt_num ) @@ -335,7 +335,7 @@ class AdisTS(CommandLineSolver): return coeff.minor, coeff.medium - for j, profile in enumerate(edge.reach.profiles): + for j, profile in enumerate(edge.reach.enabled_profiles): coef_min, coef_moy = get_stricklers_from_rk(profile.rk, lst) f.write( @@ -861,7 +861,10 @@ class AdisTSwc(AdisTS): for i in range(ibmax): # Add results reach to reach list - r = results.river.add(i) + geometry_reach = study.river.enable_edges()[i].reach + r = results.river.add( + i, profiles=geometry_reach.enabled_profiles + ) reachs.append(r) is1[i] = data[2 * i] - 1 # first section of reach i diff --git a/src/Solver/AdisTT.py b/src/Solver/AdisTT.py index 418a845d..7605ed13 100644 --- a/src/Solver/AdisTT.py +++ b/src/Solver/AdisTT.py @@ -187,7 +187,7 @@ class AdisTT(CommandLineSolver): files.append(str(os.path.join("net", f"{name}.ST"))) cnt_num = 1 - for profile in edge.reach.profiles: + for profile in edge.reach.enabled_profiles: self._export_ST_profile_header( f, files, profile, cnt_num ) @@ -310,7 +310,7 @@ class AdisTT(CommandLineSolver): return coeff.minor, coeff.medium - for j, profile in enumerate(edge.reach.profiles): + for j, profile in enumerate(edge.reach.enabled_profiles): coef_min, coef_moy = get_stricklers_from_rk(profile.rk, lst) f.write( @@ -647,7 +647,10 @@ class AdisTTwc(AdisTT): for i in range(ibmax): # Add results reach to reach list - r = results.river.add(i) + geometry_reach = study.river.enable_edges()[i].reach + r = results.river.add( + i, profiles=geometry_reach.enabled_profiles + ) reachs.append(r) is1[i] = data[2 * i] - 1 # first section of reach i diff --git a/src/Solver/Mage.py b/src/Solver/Mage.py index a7f5740d..c15b2152 100644 --- a/src/Solver/Mage.py +++ b/src/Solver/Mage.py @@ -224,7 +224,7 @@ class Mage(CommandLineSolver): files.append(str(os.path.join("net", f"{name}.ST"))) cnt_num = 1 - for profile in edge.reach.profiles: + for profile in edge.reach.enabled_profiles: self._export_ST_profile_header( f, files, profile, cnt_num ) @@ -489,7 +489,12 @@ class Mage(CommandLineSolver): if cond.is_deleted(): continue - data = cond.data + enabled_profiles = set(reach.reach.enabled_profiles) + data = [ + item for item in cond.data + if not item.is_deleted() + and item["section"] in enabled_profiles + ] if len(data) == 0: continue @@ -497,9 +502,6 @@ class Mage(CommandLineSolver): id_sec = 1 for d in data: - if d.is_deleted(): - continue - IR = f"{id}" IS = f"{id_sec}" discharge = f"{d['discharge']:>10.5f}" @@ -1097,7 +1099,10 @@ class Mage8(Mage): for i in range(nb_reach): # Add results reach to reach list - r = results.river.add(i) + geometry_reach = study.river.enable_edges()[i].reach + r = results.river.add( + i, profiles=geometry_reach.enabled_profiles + ) reachs.append(r) # ID of first and last reach profiles @@ -1402,7 +1407,10 @@ class Mage8(Mage): zfd_lst = [] for r in reachs: - z_min = r.geometry.get_z_min() + z_min = [ + profile.geometry.z_min() + for profile in r.profiles + ] sls = map( lambda p: p.get_ts_key(ts_list[0], "sl")[0], r.profiles