wolfhece 2.1.101__py3-none-any.whl → 2.1.103__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wolfhece/PyDraw.py +14 -7
- wolfhece/PyGui.py +6 -2
- wolfhece/Results2DGPU.py +1 -1
- wolfhece/apps/check_install.py +19 -1
- wolfhece/apps/version.py +1 -1
- wolfhece/mesh2d/gpu_2d.py +19 -11
- wolfhece/scenario/check_scenario.py +11 -0
- wolfhece/scenario/config_manager.py +163 -36
- wolfhece/scenario/update_void.py +34 -3
- wolfhece/wolf_array.py +26 -6
- {wolfhece-2.1.101.dist-info → wolfhece-2.1.103.dist-info}/METADATA +1 -1
- {wolfhece-2.1.101.dist-info → wolfhece-2.1.103.dist-info}/RECORD +15 -15
- {wolfhece-2.1.101.dist-info → wolfhece-2.1.103.dist-info}/WHEEL +0 -0
- {wolfhece-2.1.101.dist-info → wolfhece-2.1.103.dist-info}/entry_points.txt +0 -0
- {wolfhece-2.1.101.dist-info → wolfhece-2.1.103.dist-info}/top_level.txt +0 -0
    
        wolfhece/PyDraw.py
    CHANGED
    
    | @@ -5722,6 +5722,10 @@ class WolfMapViewer(wx.Frame): | |
| 5722 5722 | 
             
                            logging.warning(_('No active vector !'))
         | 
| 5723 5723 | 
             
                            return
         | 
| 5724 5724 |  | 
| 5725 | 
            +
                        if self.active_vector.closed:
         | 
| 5726 | 
            +
                            logging.error(_('The active vector is closed ! - You can only plot Q along a cross section not a polygon !'))
         | 
| 5727 | 
            +
                            return
         | 
| 5728 | 
            +
             | 
| 5725 5729 | 
             
                        if self.active_res2d is None:
         | 
| 5726 5730 | 
             
                            logging.warning(_('No active 2D result !'))
         | 
| 5727 5731 | 
             
                            return
         | 
| @@ -5748,11 +5752,11 @@ class WolfMapViewer(wx.Frame): | |
| 5748 5752 | 
             
                        if self.active_vector is None:
         | 
| 5749 5753 | 
             
                            logging.warning(_('No active vector !'))
         | 
| 5750 5754 | 
             
                            return
         | 
| 5751 | 
            -
             | 
| 5755 | 
            +
             | 
| 5752 5756 | 
             
                        if self.active_res2d is None:
         | 
| 5753 5757 | 
             
                            logging.warning(_('No active 2D result !'))
         | 
| 5754 5758 | 
             
                            return
         | 
| 5755 | 
            -
             | 
| 5759 | 
            +
             | 
| 5756 5760 | 
             
                        filterArray = ".csv (*.csv)|*.csv|all (*.*)|*.*"
         | 
| 5757 5761 | 
             
                        fdlg = wx.FileDialog(self, "Choose file name : ", wildcard=filterArray,
         | 
| 5758 5762 | 
             
                                                style=wx.FD_SAVE)
         | 
| @@ -5764,7 +5768,7 @@ class WolfMapViewer(wx.Frame): | |
| 5764 5768 | 
             
                            hydrographCSVPath = fdlg.GetPath()
         | 
| 5765 5769 |  | 
| 5766 5770 | 
             
                        fdlg.Destroy()
         | 
| 5767 | 
            -
             | 
| 5771 | 
            +
             | 
| 5768 5772 | 
             
                        if hydrographCSVPath is not None:
         | 
| 5769 5773 | 
             
                            # Create a progress dialog
         | 
| 5770 5774 | 
             
                            progress_dialog = wx.ProgressDialog(
         | 
| @@ -5796,18 +5800,18 @@ class WolfMapViewer(wx.Frame): | |
| 5796 5800 | 
             
                                wx.MessageBox(_("Error exporting hydrographs"), _("Export Hydrographs"), wx.OK | wx.ICON_ERROR)
         | 
| 5797 5801 | 
             
                                logging.error(_('Error exporting hydrographs'))
         | 
| 5798 5802 |  | 
| 5799 | 
            -
             | 
| 5803 | 
            +
             | 
| 5800 5804 | 
             
                    elif itemlabel == _("Export integrated Q along all vectors in active zone..."):
         | 
| 5801 5805 | 
             
                        autoscale = False
         | 
| 5802 5806 |  | 
| 5803 5807 | 
             
                        if self.active_zone is None:
         | 
| 5804 5808 | 
             
                            logging.warning(_('No active zone !'))
         | 
| 5805 5809 | 
             
                            return
         | 
| 5806 | 
            -
             | 
| 5810 | 
            +
             | 
| 5807 5811 | 
             
                        if self.active_res2d is None:
         | 
| 5808 5812 | 
             
                            logging.warning(_('No active 2D result !'))
         | 
| 5809 5813 | 
             
                            return
         | 
| 5810 | 
            -
             | 
| 5814 | 
            +
             | 
| 5811 5815 | 
             
                        filterArray = ".csv (*.csv)|*.csv|all (*.*)|*.*"
         | 
| 5812 5816 | 
             
                        fdlg = wx.FileDialog(self, "Choose file name : ", wildcard=filterArray,
         | 
| 5813 5817 | 
             
                                                style=wx.FD_SAVE)
         | 
| @@ -5850,7 +5854,7 @@ class WolfMapViewer(wx.Frame): | |
| 5850 5854 | 
             
                            else:
         | 
| 5851 5855 | 
             
                                wx.MessageBox(_("Error exporting hydrographs"), _("Export Hydrographs"), wx.OK | wx.ICON_ERROR)
         | 
| 5852 5856 | 
             
                                logging.error(_('Error exporting hydrographs'))
         | 
| 5853 | 
            -
             | 
| 5857 | 
            +
             | 
| 5854 5858 |  | 
| 5855 5859 | 
             
                    elif itemlabel == _("Plot stats unknown (selected nodes)..."):
         | 
| 5856 5860 | 
             
                        autoscale = False
         | 
| @@ -7638,6 +7642,9 @@ class WolfMapViewer(wx.Frame): | |
| 7638 7642 | 
             
                        res = wolfres2DGPU(filename, plotted=False)
         | 
| 7639 7643 |  | 
| 7640 7644 | 
             
                        tilesmap = res._result_store._tile_packer.tile_indirection_map()
         | 
| 7645 | 
            +
                        if tilesmap is None:
         | 
| 7646 | 
            +
                            logging.warning(_('No tile map found in the simulation'))
         | 
| 7647 | 
            +
                            return
         | 
| 7641 7648 |  | 
| 7642 7649 | 
             
                        header = header_wolf()
         | 
| 7643 7650 | 
             
                        res_header = res[0].get_header()
         | 
    
        wolfhece/PyGui.py
    CHANGED
    
    | @@ -59,7 +59,7 @@ except ImportError as e: | |
| 59 59 | 
             
            try:
         | 
| 60 60 | 
             
                from .RatingCurve import SPWMIGaugingStations,SPWDCENNGaugingStations
         | 
| 61 61 | 
             
                from .mesh2d.wolf2dprev import *
         | 
| 62 | 
            -
                from .Results2DGPU import wolfres2DGPU
         | 
| 62 | 
            +
                # from .Results2DGPU import wolfres2DGPU
         | 
| 63 63 | 
             
                from .PyGuiHydrology import GuiHydrology
         | 
| 64 64 | 
             
                from .RatingCurve import SPWMIGaugingStations,SPWDCENNGaugingStations
         | 
| 65 65 | 
             
                from .hydrology.Catchment import Catchment
         | 
| @@ -71,6 +71,7 @@ try: | |
| 71 71 | 
             
                from .mesh2d.gpu_2d import Sim_2D_GPU
         | 
| 72 72 | 
             
                from .mesh2d.wolf2dprev import prev_sim2D
         | 
| 73 73 | 
             
                from .mesh2d.cst_2D_boundary_conditions import BCType_2D, BCType_2D_OO, BCType_2D_GPU, Direction
         | 
| 74 | 
            +
             | 
| 74 75 | 
             
            except ImportError as e:
         | 
| 75 76 | 
             
                print(f"Import Error: {e} - RatingCurve, mesh2d, Results2DGPU, PyGuiHydrology, RatingCurve, hydrology, PyParams, picc, wolf_zi_db, CpGrid")
         | 
| 76 77 | 
             
                print("Please install the required modules using 'pip install -r requirements.txt'")
         | 
| @@ -2994,7 +2995,10 @@ class Wolf2DGPUModel(GenMapManager): | |
| 2994 2995 |  | 
| 2995 2996 | 
             
                def add_boundary_condition(self, i: int, j: int, bc_type:BCType_2D_GPU,  bc_value: float, border:Direction):
         | 
| 2996 2997 | 
             
                    """ alias """
         | 
| 2997 | 
            -
                     | 
| 2998 | 
            +
                    try:
         | 
| 2999 | 
            +
                        from wolfgpu.simple_simulation import BoundaryConditionsTypes, Direction as ss_direction
         | 
| 3000 | 
            +
                    except ImportError:
         | 
| 3001 | 
            +
                        logging.error(_('Cannot import BoundaryConditionsTypes and Direction from wolfgpu.simple_simulation'))
         | 
| 2998 3002 |  | 
| 2999 3003 | 
             
                    def convert_dirhece2gpu(direction:Direction) -> ss_direction:
         | 
| 3000 3004 | 
             
                        """ Convert the boundary conditions from HECE to GPU """
         | 
    
        wolfhece/Results2DGPU.py
    CHANGED
    
    | @@ -27,7 +27,7 @@ from .PyPalette import wolfpalette | |
| 27 27 |  | 
| 28 28 | 
             
            try:
         | 
| 29 29 | 
             
                from wolfgpu.results_store import ResultsStore, ResultType
         | 
| 30 | 
            -
            except :
         | 
| 30 | 
            +
            except ImportError:
         | 
| 31 31 | 
             
                logging.debug(_("Unable to import wolfgpu.results_store.ResultsStore. Please install wolfgpu package or add a symlink to the wolfgpu package in the wolfhece directory"))
         | 
| 32 32 |  | 
| 33 33 | 
             
            def _load_res(x) -> tuple[csr_array, csr_array, csr_array]:
         | 
    
        wolfhece/apps/check_install.py
    CHANGED
    
    | @@ -12,6 +12,24 @@ copying or distribution of this file, via any medium, is strictly prohibited. | |
| 12 12 | 
             
            def main():
         | 
| 13 13 | 
             
                # Check if installation is complete
         | 
| 14 14 | 
             
                ret = 'Checking installation\n---------------------\n\n'
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
                # Get list of packages
         | 
| 18 | 
            +
                import pkg_resources
         | 
| 19 | 
            +
                installed_packages = pkg_resources.working_set
         | 
| 20 | 
            +
                packages = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages])
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                #is osgeo in packages?
         | 
| 23 | 
            +
                if 'osgeo' in packages:
         | 
| 24 | 
            +
                    ret += 'OSGeo seems installed\n\n'
         | 
| 25 | 
            +
                else:
         | 
| 26 | 
            +
                    ret += 'OSGeo not installed\n Please install GDAL from https://github.com/cgohlke/geospatial-wheels/releases\n\n'
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                if 'wolfgpu' in packages:
         | 
| 29 | 
            +
                    ret += 'WolfGPU seems installed\n\n'
         | 
| 30 | 
            +
                else:
         | 
| 31 | 
            +
                    ret += 'WolfGPU not installed\n Please install WolfGPU if needed\n\n'
         | 
| 32 | 
            +
             | 
| 15 33 | 
             
                try:
         | 
| 16 34 | 
             
                    from osgeo import ogr, gdal
         | 
| 17 35 | 
             
                    ret += 'GDAL/OGR installed\n\n'
         | 
| @@ -25,7 +43,7 @@ def main(): | |
| 25 43 | 
             
                except ImportError as e:
         | 
| 26 44 | 
             
                    ret += 'Wolfpy not accessible\n\n'
         | 
| 27 45 | 
             
                    ret += 'Error : ' + str(e) + '\n\n'
         | 
| 28 | 
            -
             | 
| 46 | 
            +
             | 
| 29 47 | 
             
                try:
         | 
| 30 48 | 
             
                    from ..PyGui import MapManager
         | 
| 31 49 | 
             
                    ret += 'Wolfhece installed\n\n'
         | 
    
        wolfhece/apps/version.py
    CHANGED
    
    
    
        wolfhece/mesh2d/gpu_2d.py
    CHANGED
    
    | @@ -8,7 +8,7 @@ from ..wolf_array import WOLF_ARRAY_FULL_LOGICAL, WOLF_ARRAY_FULL_SINGLE, WOLF_A | |
| 8 8 | 
             
            from ..wolf_array import WolfArray, header_wolf
         | 
| 9 9 | 
             
            from ..PyTranslate import _
         | 
| 10 10 | 
             
            from ..PyVertexvectors import vector, zone, Zones
         | 
| 11 | 
            -
            from wolfgpu.simple_simulation import SimpleSimulation
         | 
| 11 | 
            +
            # from wolfgpu.simple_simulation import SimpleSimulation
         | 
| 12 12 |  | 
| 13 13 | 
             
            class infiltration_GPU():
         | 
| 14 14 | 
             
                def __init__(self, parent:"Sim_2D_GPU") -> None:
         | 
| @@ -83,7 +83,7 @@ class Sim_2D_GPU(): | |
| 83 83 | 
             
                        logging.error(_("Unable to import wolfgpu.simple_simulation.SimpleSimulation. Please install wolfgpu package or add a symlink to the wolfgpu package in the wolfhece directory"))
         | 
| 84 84 |  | 
| 85 85 | 
             
                    self.dir = Path(directory)
         | 
| 86 | 
            -
                    self._sim = None
         | 
| 86 | 
            +
                    self._sim:SimpleSimulation = None
         | 
| 87 87 | 
             
                    self._cached_arrays = {}
         | 
| 88 88 | 
             
                    self.magnetic_grid:header_wolf = None
         | 
| 89 89 |  | 
| @@ -100,6 +100,7 @@ class Sim_2D_GPU(): | |
| 100 100 | 
             
                        ('h','Initial water depth [m]',WOLF_ARRAY_FULL_SINGLE),
         | 
| 101 101 | 
             
                        ('qx','Initial discharge along X [m^2/s]',WOLF_ARRAY_FULL_SINGLE),
         | 
| 102 102 | 
             
                        ('qy','Initial discharge along Y [m^2/s]',WOLF_ARRAY_FULL_SINGLE),
         | 
| 103 | 
            +
                        ('bridge_roof','Bridge/Culvert (roof el.) [m]',WOLF_ARRAY_FULL_SINGLE),
         | 
| 103 104 | 
             
                    ]}
         | 
| 104 105 |  | 
| 105 106 | 
             
                    self.files_ic=['Initial water depth [m]','Initial discharge along X [m^2/s]','Initial discharge along Y [m^2/s]']
         | 
| @@ -126,11 +127,11 @@ class Sim_2D_GPU(): | |
| 126 127 | 
             
                        self._sim = None
         | 
| 127 128 |  | 
| 128 129 | 
             
                @property
         | 
| 129 | 
            -
                def sim(self) | 
| 130 | 
            +
                def sim(self):
         | 
| 130 131 | 
             
                    return self._sim
         | 
| 131 132 |  | 
| 132 133 | 
             
                @sim.setter
         | 
| 133 | 
            -
                def sim(self, value | 
| 134 | 
            +
                def sim(self, value) -> None:
         | 
| 134 135 | 
             
                    self._sim = value
         | 
| 135 136 |  | 
| 136 137 | 
             
                def __str__(self) -> str:
         | 
| @@ -165,11 +166,9 @@ class Sim_2D_GPU(): | |
| 165 166 | 
             
                    else:
         | 
| 166 167 | 
             
                        return None
         | 
| 167 168 |  | 
| 168 | 
            -
                def __getitem__(self, key:Literal['nap', 'bathymetry', 'manning', ' | 
| 169 | 
            +
                def __getitem__(self, key:Literal['nap', 'bathymetry', 'manning', 'infiltration_zones', 'h', 'qx', 'qy', 'bridge_roof']) -> WolfArray:
         | 
| 169 170 | 
             
                    """ Get an array from the simulation """
         | 
| 170 171 |  | 
| 171 | 
            -
                    nullvalues = {'nap':0, 'bathymetry':99999, 'manning':0, 'infiltration_zones':0, 'h':0, 'qx':0, 'qy':0}
         | 
| 172 | 
            -
             | 
| 173 172 | 
             
                    if self.is_loaded:
         | 
| 174 173 | 
             
                        if key in self._get_name_arrays():
         | 
| 175 174 | 
             
                            descr = self._get_description_arrays()[self._get_name_arrays().index(key)]
         | 
| @@ -178,7 +177,7 @@ class Sim_2D_GPU(): | |
| 178 177 | 
             
                                locarray = WolfArray(srcheader=self.get_header(),
         | 
| 179 178 | 
             
                                                     np_source=self.sim.__getattribute__(key),
         | 
| 180 179 | 
             
                                                     idx= descr,
         | 
| 181 | 
            -
                                                     nullvalue=nullvalues[key],
         | 
| 180 | 
            +
                                                     nullvalue=self.nullvalues[key],
         | 
| 182 181 | 
             
                                                     whichtype=self.files_array['Characteristics'][self._get_name_arrays().index(key)][2],
         | 
| 183 182 | 
             
                                                     masknull=False)
         | 
| 184 183 | 
             
                                locarray.loaded = True
         | 
| @@ -212,6 +211,11 @@ class Sim_2D_GPU(): | |
| 212 211 | 
             
                def create_arrays_from(self, source:WolfArray):
         | 
| 213 212 | 
             
                    """ Create arrays from a source """
         | 
| 214 213 |  | 
| 214 | 
            +
                    try:
         | 
| 215 | 
            +
                        from wolfgpu.simple_simulation import SimpleSimulation
         | 
| 216 | 
            +
                    except:
         | 
| 217 | 
            +
                        logging.error(_("Unable to import wolfgpu.simple_simulation.SimpleSimulation. Please install wolfgpu package or add a symlink to the wolfgpu package in the wolfhece directory"))
         | 
| 218 | 
            +
             | 
| 215 219 | 
             
                    if self.is_loaded:
         | 
| 216 220 | 
             
                        logging.error(_("Simulation exists, cannot create arrays from source or delete simulation first !"))
         | 
| 217 221 | 
             
                    else:
         | 
| @@ -346,11 +350,15 @@ class Sim_2D_GPU(): | |
| 346 350 |  | 
| 347 351 | 
             
                    return x,y
         | 
| 348 352 |  | 
| 353 | 
            +
                @property
         | 
| 354 | 
            +
                def nullvalues(self) -> dict[str,int]:
         | 
| 355 | 
            +
                    """ Define null values for the arrays """
         | 
| 356 | 
            +
             | 
| 357 | 
            +
                    return {'nap':0, 'bathymetry':99999., 'manning':0, 'infiltration_zones':0, 'h':0., 'qx':0., 'qy':0., 'bridge_roof':99999.}
         | 
| 358 | 
            +
             | 
| 349 359 | 
             
                def verify_files(self):
         | 
| 350 360 | 
             
                    """ Verify the files """
         | 
| 351 361 |  | 
| 352 | 
            -
                    nullvalues = {'nap':0, 'bathymetry':99999, 'manning':99999, 'infiltration_zones':99999, 'h':99999, 'qx':99999, 'qy':99999}
         | 
| 353 | 
            -
             | 
| 354 362 | 
             
                    if self.is_loaded:
         | 
| 355 363 | 
             
                        header = self.get_header()
         | 
| 356 364 | 
             
                        ref_mask= self.sim.nap == 0
         | 
| @@ -362,7 +370,7 @@ class Sim_2D_GPU(): | |
| 362 370 | 
             
                            if tmparray.shape != (header.nbx, header.nby):
         | 
| 363 371 | 
             
                                logging.error(_("Bad shape for array {0}".format(cur[0])))
         | 
| 364 372 | 
             
                                return False
         | 
| 365 | 
            -
                            if np.any(tmparray[np.logical_not(ref_mask)] == nullvalues[cur[0]]):
         | 
| 373 | 
            +
                            if np.any(tmparray[np.logical_not(ref_mask)] == self.nullvalues[cur[0]]):
         | 
| 366 374 | 
             
                                logging.error(_("Null value found in array {0}".format(cur[0])))
         | 
| 367 375 | 
             
                                return False
         | 
| 368 376 | 
             
                        return True
         | 
| @@ -123,6 +123,17 @@ def import_files(module_files:Union[list[Path],list[str]]) -> list[types.ModuleT | |
| 123 123 | 
             
                    sys.path.pop(0)
         | 
| 124 124 | 
             
                    os.chdir(olddir)
         | 
| 125 125 |  | 
| 126 | 
            +
                    # Test if some routines are missing
         | 
| 127 | 
            +
                    # if "impose_bc" in py_file.name:
         | 
| 128 | 
            +
                    #     to_test = ['impose_bc']
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                    # elif "update_void" in py_file.name:
         | 
| 131 | 
            +
                    #     to_test = ['update_topobathy', 'update_manning', 'update_infiltration', 'update_roof']
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                    # for routine in to_test:
         | 
| 134 | 
            +
                    #     if not hasattr(module, routine):
         | 
| 135 | 
            +
                    #         logging.warning(f'Le module {module} ne contient pas la routine {routine}.')
         | 
| 136 | 
            +
             | 
| 126 137 | 
             
                    modules.append(module)
         | 
| 127 138 |  | 
| 128 139 | 
             
                return modules
         | 
| @@ -30,7 +30,7 @@ import types | |
| 30 30 |  | 
| 31 31 | 
             
            from ..PyTranslate import _
         | 
| 32 32 | 
             
            from ..wolfresults_2D import Wolfresults_2D
         | 
| 33 | 
            -
            from ..wolf_array import WolfArray, header_wolf, WOLF_ARRAY_FULL_INTEGER
         | 
| 33 | 
            +
            from ..wolf_array import WolfArray, header_wolf, WOLF_ARRAY_FULL_INTEGER, WOLF_ARRAY_FULL_SINGLE
         | 
| 34 34 | 
             
            from .check_scenario import check_file_update, check_file_bc, import_files
         | 
| 35 35 | 
             
            from .update_void import create_new_file as update_void
         | 
| 36 36 | 
             
            from .imposebc_void import create_new_file as bc_void
         | 
| @@ -56,7 +56,7 @@ except: | |
| 56 56 | 
             
            # mann_*.tif
         | 
| 57 57 | 
             
            # infil_*.tif
         | 
| 58 58 |  | 
| 59 | 
            -
            ACCEPTED_PREFIX = ['bath_', 'mann_', 'infil_']
         | 
| 59 | 
            +
            ACCEPTED_PREFIX = ['bath_', 'mann_', 'infil_', 'roof_']
         | 
| 60 60 |  | 
| 61 61 | 
             
            def delete_folder(pth:Path):
         | 
| 62 62 | 
             
                for sub in pth.iterdir():
         | 
| @@ -471,7 +471,7 @@ class Config_Manager_2D_GPU: | |
| 471 471 |  | 
| 472 472 | 
             
                    logging.info(_('Number of tif files : {}'.format(len(list_tif))))
         | 
| 473 473 |  | 
| 474 | 
            -
                    standard_files = ['bathymetry.tif', 'manning.tif', 'infiltration.tif', 'h.tif', 'qx.tif', 'qy.tif']
         | 
| 474 | 
            +
                    standard_files = ['bathymetry.tif', 'manning.tif', 'infiltration.tif', 'h.tif', 'qx.tif', 'qy.tif', 'roof.tif']
         | 
| 475 475 |  | 
| 476 476 | 
             
                    log = ''
         | 
| 477 477 | 
             
                    for curtif in list_tif:
         | 
| @@ -502,6 +502,12 @@ class Config_Manager_2D_GPU: | |
| 502 502 | 
             
                                    loclog += _('Did you mean "infil_" ?') + '\n'
         | 
| 503 503 | 
             
                                    break
         | 
| 504 504 |  | 
| 505 | 
            +
                            tests = ['rof_', 'rooof_', 'rofo_', 'oof_', 'roff_']
         | 
| 506 | 
            +
                            for test in tests:
         | 
| 507 | 
            +
                                if curtif.name.lower().startswith(test):
         | 
| 508 | 
            +
                                    loclog += _('Did you mean "roof_" ?') + '\n'
         | 
| 509 | 
            +
                                    break
         | 
| 510 | 
            +
             | 
| 505 511 | 
             
                            logging.warning(loclog)
         | 
| 506 512 |  | 
| 507 513 | 
             
                            log += loclog
         | 
| @@ -612,7 +618,9 @@ class Config_Manager_2D_GPU: | |
| 612 618 | 
             
                    self._test_is_results(curdict)
         | 
| 613 619 |  | 
| 614 620 | 
             
                def _recursive_find_files(self, wd:Path, curdict:dict, erase_cache:bool = True):
         | 
| 615 | 
            -
                    """ Recherche récursive des fichiers de simulation/scenario dans les | 
| 621 | 
            +
                    """ Recherche récursive des fichiers de simulation/scenario dans les
         | 
| 622 | 
            +
                    répertoires dont la structure a été traduite en dictionnaire """
         | 
| 623 | 
            +
             | 
| 616 624 | 
             
                    if len(curdict.keys())>0:
         | 
| 617 625 | 
             
                        for k in curdict.keys():
         | 
| 618 626 | 
             
                            self._recursive_find_files(k, curdict[k])
         | 
| @@ -763,15 +771,19 @@ class Config_Manager_2D_GPU: | |
| 763 771 |  | 
| 764 772 | 
             
                    return curdict
         | 
| 765 773 |  | 
| 766 | 
            -
                def _select_tif_partname(self, curdict:dict, tifstr:Literal['bath_', 'mann_', 'infil_']):
         | 
| 774 | 
            +
                def _select_tif_partname(self, curdict:dict, tifstr:Literal['bath_', 'mann_', 'infil_', 'roof_']):
         | 
| 767 775 | 
             
                    """ Select tif files with a 'str' as name's prefix """
         | 
| 768 776 |  | 
| 777 | 
            +
                    assert tifstr in ACCEPTED_PREFIX, _('Bad prefix !')
         | 
| 778 | 
            +
             | 
| 769 779 | 
             
                    if tifstr == 'bath_':
         | 
| 770 780 | 
             
                        forced_add = ['bathymetry.tif']
         | 
| 771 781 | 
             
                    elif tifstr == 'mann_':
         | 
| 772 782 | 
             
                        forced_add = ['manning.tif']
         | 
| 773 783 | 
             
                    elif tifstr == 'infil_':
         | 
| 774 784 | 
             
                        forced_add = ['infiltration.tif']
         | 
| 785 | 
            +
                    elif tifstr == 'roof_':
         | 
| 786 | 
            +
                        forced_add = ['roof.tif']
         | 
| 775 787 |  | 
| 776 788 | 
             
                    tif_list = [curtif for curtif in curdict[GPU_2D_file_extensions.TIF.value] \
         | 
| 777 789 | 
             
                                if curtif.name.lower().startswith(tifstr) or \
         | 
| @@ -793,13 +805,15 @@ class Config_Manager_2D_GPU: | |
| 793 805 | 
             
                    all_tif_bath = [self._select_tif_partname(curdict, 'bath_') for curdict in curdicts]
         | 
| 794 806 | 
             
                    all_tif_mann = [self._select_tif_partname(curdict, 'mann_') for curdict in curdicts]
         | 
| 795 807 | 
             
                    all_tif_infil = [self._select_tif_partname(curdict, 'infil_') for curdict in curdicts]
         | 
| 808 | 
            +
                    all_tif_roof = [self._select_tif_partname(curdict, 'roof_') for curdict in curdicts]
         | 
| 796 809 |  | 
| 797 810 | 
             
                    # flatten list of lists
         | 
| 798 811 | 
             
                    all_tif_bath = [curel for curlist in all_tif_bath if len(curlist)>0 for curel in curlist]
         | 
| 799 812 | 
             
                    all_tif_mann = [curel for curlist in all_tif_mann if len(curlist)>0 for curel in curlist]
         | 
| 800 813 | 
             
                    all_tif_infil = [curel for curlist in all_tif_infil if len(curlist)>0 for curel in curlist]
         | 
| 814 | 
            +
                    all_tif_roof = [curel for curlist in all_tif_roof if len(curlist)>0 for curel in curlist]
         | 
| 801 815 |  | 
| 802 | 
            -
                    for cur_lst in [all_tif_bath, all_tif_mann, all_tif_infil]:
         | 
| 816 | 
            +
                    for cur_lst in [all_tif_bath, all_tif_mann, all_tif_infil, all_tif_roof]:
         | 
| 803 817 | 
             
                        for cur_tif in cur_lst:
         | 
| 804 818 | 
             
                            curarray:WolfArray = WolfArray(cur_tif)
         | 
| 805 819 | 
             
                            if curarray.nullvalue != 99999.:
         | 
| @@ -824,21 +838,31 @@ class Config_Manager_2D_GPU: | |
| 824 838 | 
             
                    all_tif_bath = [self._select_tif_partname(curdict, 'bath_') for curdict in curdicts]
         | 
| 825 839 | 
             
                    all_tif_mann = [self._select_tif_partname(curdict, 'mann_') for curdict in curdicts]
         | 
| 826 840 | 
             
                    all_tif_infil = [self._select_tif_partname(curdict, 'infil_') for curdict in curdicts]
         | 
| 841 | 
            +
                    all_tif_roof = [self._select_tif_partname(curdict, 'roof_') for curdict in curdicts]
         | 
| 827 842 |  | 
| 828 843 | 
             
                    # flatten list of lists
         | 
| 829 844 | 
             
                    all_tif_bath = [curel for curlist in all_tif_bath if len(curlist)>0 for curel in curlist]
         | 
| 830 845 | 
             
                    all_tif_mann = [curel for curlist in all_tif_mann if len(curlist)>0 for curel in curlist]
         | 
| 831 846 | 
             
                    all_tif_infil = [curel for curlist in all_tif_infil if len(curlist)>0 for curel in curlist]
         | 
| 847 | 
            +
                    all_tif_roof = [curel for curlist in all_tif_roof if len(curlist)>0 for curel in curlist]
         | 
| 832 848 |  | 
| 833 849 | 
             
                    # création du fichier vrt
         | 
| 834 850 | 
             
                    create_vrt_from_files_first_based(all_tif_bath, from_path / '__bath_assembly.vrt')
         | 
| 835 851 | 
             
                    create_vrt_from_files_first_based(all_tif_mann, from_path / '__mann_assembly.vrt')
         | 
| 852 | 
            +
             | 
| 836 853 | 
             
                    if len(all_tif_infil)>0:
         | 
| 837 854 | 
             
                        create_vrt_from_files_first_based(all_tif_infil, from_path / '__infil_assembly.vrt')
         | 
| 855 | 
            +
                    else:
         | 
| 856 | 
            +
                        logging.info(_('No infiltration files found ! -> no __infil_assembly.vrt file created !'))
         | 
| 857 | 
            +
             | 
| 858 | 
            +
                    if len(all_tif_roof)>0:
         | 
| 859 | 
            +
                        create_vrt_from_files_first_based(all_tif_roof, from_path / '__roof_assembly.vrt')
         | 
| 860 | 
            +
                    else:
         | 
| 861 | 
            +
                        logging.info(_('No roof files found ! -> no __roof_assembly.vrt file created !'))
         | 
| 838 862 |  | 
| 839 863 | 
             
                def create_vec(self,
         | 
| 840 864 | 
             
                               from_path:Path,
         | 
| 841 | 
            -
                               which:Literal['bath_', 'mann_', 'infil_'] = 'bath_') -> Zones:
         | 
| 865 | 
            +
                               which:Literal['bath_', 'mann_', 'infil_', 'roof_'] = 'bath_') -> Zones:
         | 
| 842 866 | 
             
                    """ Create a vec file from a path """
         | 
| 843 867 |  | 
| 844 868 | 
             
                    assert which in ACCEPTED_PREFIX, _('Bad prefix !')
         | 
| @@ -897,17 +921,18 @@ class Config_Manager_2D_GPU: | |
| 897 921 |  | 
| 898 922 | 
             
                def translate_vrt2tif(self, from_path:Path):
         | 
| 899 923 | 
             
                    """ Translate vrt to tif """
         | 
| 900 | 
            -
             | 
| 901 | 
            -
                     | 
| 924 | 
            +
             | 
| 925 | 
            +
                    vrtin = ['__bath_assembly.vrt', '__mann_assembly.vrt', '__infil_assembly.vrt', '__roof_assembly.vrt']
         | 
| 926 | 
            +
                    fout  = ['__bathymetry.tif'   , '__manning.tif', '__infiltration.tif', '__roof.tif']
         | 
| 902 927 |  | 
| 903 928 | 
             
                    for curin, curout in zip(vrtin, fout):
         | 
| 904 929 | 
             
                        if (from_path / curin).exists():
         | 
| 905 930 | 
             
                            translate_vrt2tif(from_path / curin, from_path / curout)
         | 
| 906 931 |  | 
| 907 | 
            -
                def  | 
| 932 | 
            +
                def apply_scripts_bath_mann_inf_roof(self, from_path:Path):
         | 
| 908 933 | 
             
                    """ Apply all scripts """
         | 
| 909 934 |  | 
| 910 | 
            -
                    filenames = ['__bathymetry.tif', '__manning.tif', '__infiltration.tif']
         | 
| 935 | 
            +
                    filenames = ['__bathymetry.tif', '__manning.tif', '__infiltration.tif', '__roof.tif']
         | 
| 911 936 |  | 
| 912 937 | 
             
                    # check if present on disk
         | 
| 913 938 | 
             
                    if not all([(from_path / curfile).exists() for curfile in filenames]):
         | 
| @@ -920,12 +945,13 @@ class Config_Manager_2D_GPU: | |
| 920 945 |  | 
| 921 946 | 
             
                    arrays = [WolfArray(from_path / curfile) for curfile in filenames]
         | 
| 922 947 |  | 
| 923 | 
            -
                    self. | 
| 948 | 
            +
                    self._apply_scripts_update_topo_maning_inf_roof(from_path, arrays[0], arrays[1], arrays[2], arrays[3])
         | 
| 924 949 |  | 
| 925 950 | 
             
                    # write the files
         | 
| 926 951 | 
             
                    arrays[0].write_all(from_path / '__bathymetry_after_scripts.tif')
         | 
| 927 952 | 
             
                    arrays[1].write_all(from_path / '__manning_after_scripts.tif')
         | 
| 928 953 | 
             
                    arrays[2].write_all(from_path / '__infiltration_after_scripts.tif')
         | 
| 954 | 
            +
                    arrays[3].write_all(from_path / '__roof_after_scripts.tif')
         | 
| 929 955 |  | 
| 930 956 | 
             
                def _import_scripts(self, from_path:Path, which) -> list[types.ModuleType]:
         | 
| 931 957 | 
             
                    """ List all modules in structure and import them.
         | 
| @@ -967,29 +993,59 @@ class Config_Manager_2D_GPU: | |
| 967 993 |  | 
| 968 994 | 
             
                    return imported_mod
         | 
| 969 995 |  | 
| 970 | 
            -
                def  | 
| 996 | 
            +
                def _import_scripts_topo_manning_inf_roof(self, from_path:Path) -> list[types.ModuleType]:
         | 
| 971 997 | 
             
                    """ import all topo and manning scripts from a path """
         | 
| 972 998 |  | 
| 973 999 | 
             
                    return self._import_scripts(from_path, WOLF_UPDATE)
         | 
| 974 1000 |  | 
| 975 | 
            -
                def  | 
| 1001 | 
            +
                def _apply_scripts_update_topo_maning_inf_roof(self,
         | 
| 976 1002 | 
             
                                                          modules:list[types.ModuleType] | Path | str,
         | 
| 977 1003 | 
             
                                                          array_bat:WolfArray,
         | 
| 978 1004 | 
             
                                                          array_mann:WolfArray,
         | 
| 979 | 
            -
                                                          array_inf:WolfArray | 
| 1005 | 
            +
                                                          array_inf:WolfArray,
         | 
| 1006 | 
            +
                                                          array_roof:WolfArray):
         | 
| 980 1007 | 
             
                    """ Apply all scripts from a list of modules """
         | 
| 981 1008 |  | 
| 982 1009 | 
             
                    if isinstance(modules, str):
         | 
| 983 1010 | 
             
                        modules = Path(modules)
         | 
| 984 1011 |  | 
| 985 1012 | 
             
                    if isinstance(modules, Path):
         | 
| 986 | 
            -
                        modules = self. | 
| 1013 | 
            +
                        modules = self._import_scripts_topo_manning_inf_roof(modules)
         | 
| 987 1014 |  | 
| 988 1015 | 
             
                    for curmod in modules:
         | 
| 989 1016 | 
             
                        instmod = curmod.Update_Sim_Scenario()
         | 
| 990 | 
            -
                         | 
| 991 | 
            -
             | 
| 992 | 
            -
             | 
| 1017 | 
            +
                        try:
         | 
| 1018 | 
            +
                            if not hasattr(instmod, "update_topobathy"):
         | 
| 1019 | 
            +
                                logging.info(_('No update_topobathy method found in the script {}!').format(curmod))
         | 
| 1020 | 
            +
                            else:
         | 
| 1021 | 
            +
                                instmod.update_topobathy(array_bat)
         | 
| 1022 | 
            +
                        except Exception as e:
         | 
| 1023 | 
            +
                            logging.error(_('An error occured during bathymetry script - {}!').format(e))
         | 
| 1024 | 
            +
             | 
| 1025 | 
            +
                        try:
         | 
| 1026 | 
            +
                            if not hasattr(instmod, "update_manning"):
         | 
| 1027 | 
            +
                                logging.info(_('No update_manning method found in the script {}!').format(curmod))
         | 
| 1028 | 
            +
                            else:
         | 
| 1029 | 
            +
                                instmod.update_manning(array_mann)
         | 
| 1030 | 
            +
                        except Exception as e:
         | 
| 1031 | 
            +
                            logging.error(_('An error occured during manning script - {}!').format(e))
         | 
| 1032 | 
            +
             | 
| 1033 | 
            +
                        try:
         | 
| 1034 | 
            +
                            if not hasattr(instmod, "update_infiltration"):
         | 
| 1035 | 
            +
                                logging.info(_('No update_infiltration method found in the script {}!').format(curmod))
         | 
| 1036 | 
            +
                            else:
         | 
| 1037 | 
            +
                                instmod.update_infiltration(array_inf)
         | 
| 1038 | 
            +
                        except Exception as e:
         | 
| 1039 | 
            +
                            logging.error(_('An error occured during infiltration script - {}!').format(e))
         | 
| 1040 | 
            +
             | 
| 1041 | 
            +
                        try:
         | 
| 1042 | 
            +
                            if not hasattr(instmod, "update_roof"):
         | 
| 1043 | 
            +
                                logging.info(_('No update_roof method found in the script {}!').format(curmod))
         | 
| 1044 | 
            +
                            else:
         | 
| 1045 | 
            +
                                instmod.update_roof(array_roof)
         | 
| 1046 | 
            +
                        except Exception as e:
         | 
| 1047 | 
            +
                            logging.error(_('An error occured during roof script - {}!').format(e))
         | 
| 1048 | 
            +
             | 
| 993 1049 |  | 
| 994 1050 | 
             
                def _import_scripts_bc(self, from_path:Path) -> list[types.ModuleType]:
         | 
| 995 1051 | 
             
                    """ Import all BC's scripts from a path """
         | 
| @@ -1006,7 +1062,10 @@ class Config_Manager_2D_GPU: | |
| 1006 1062 | 
             
                        modules = self._import_scripts_bc(modules)
         | 
| 1007 1063 |  | 
| 1008 1064 | 
             
                    for curmod in modules:
         | 
| 1009 | 
            -
                         | 
| 1065 | 
            +
                        try:
         | 
| 1066 | 
            +
                            curmod.Impose_BC_Scenario().impose_bc(sim)
         | 
| 1067 | 
            +
                        except Exception as e:
         | 
| 1068 | 
            +
                            logging.error(_('An error occured during BC script - {}!').format(e))
         | 
| 1010 1069 |  | 
| 1011 1070 |  | 
| 1012 1071 | 
             
                def load_hydrograph(self, path:Path, toplot=True) -> tuple[Hydrograph_scenario, plt.Figure, plt.Axes]:
         | 
| @@ -1088,11 +1147,30 @@ class Config_Manager_2D_GPU: | |
| 1088 1147 | 
             
                    else:
         | 
| 1089 1148 | 
             
                        logging.error(_("No 'bathymetry.tif' file found in the root directory !"))
         | 
| 1090 1149 |  | 
| 1150 | 
            +
                def create_void_roof(self):
         | 
| 1151 | 
            +
                    """ create void roof file """
         | 
| 1152 | 
            +
             | 
| 1153 | 
            +
                    if (self.workingdir / 'bathymetry.tif').exists():
         | 
| 1154 | 
            +
                        locheader = self.get_header()
         | 
| 1155 | 
            +
                        roof = WolfArray(srcheader=locheader, whichtype= WOLF_ARRAY_FULL_SINGLE)
         | 
| 1156 | 
            +
                        roof.array.data[:,:] = 99999.
         | 
| 1157 | 
            +
                        roof.nullvalue = 99999.
         | 
| 1158 | 
            +
                        roof.write_all(str(self.workingdir / 'roof.tif'))
         | 
| 1159 | 
            +
             | 
| 1160 | 
            +
                        if (self.workingdir / 'roof.tif').exists():
         | 
| 1161 | 
            +
                            logging.info(_('roof.tif created and set to 99999. ! -- Please edit it !'))
         | 
| 1162 | 
            +
                        else:
         | 
| 1163 | 
            +
                            logging.error(_("roof.tif not created ! --  Does 'bathymetry.tif' or any '.tif' file exist in the root directory ?"))
         | 
| 1164 | 
            +
                    else:
         | 
| 1165 | 
            +
                        logging.error(_("No 'bathymetry.tif' file found in the root directory !"))
         | 
| 1166 | 
            +
             | 
| 1167 | 
            +
             | 
| 1091 1168 | 
             
                def create_simulation(self,
         | 
| 1092 1169 | 
             
                                      dir:Path,
         | 
| 1093 1170 | 
             
                                      idx_hydros:list[int] = [-1],
         | 
| 1094 1171 | 
             
                                      delete_existing:bool = False,
         | 
| 1095 | 
            -
                                      preserve_ic:bool=False | 
| 1172 | 
            +
                                      preserve_ic:bool=False,
         | 
| 1173 | 
            +
                                      callback = None) -> list[Path]:
         | 
| 1096 1174 | 
             
                    """ Create a simulation from different hydrographs """
         | 
| 1097 1175 |  | 
| 1098 1176 | 
             
                    if isinstance(dir, str):
         | 
| @@ -1188,17 +1266,32 @@ class Config_Manager_2D_GPU: | |
| 1188 1266 | 
             
                        infiltration = WolfArray(srcheader=bat.get_header(), whichtype= WOLF_ARRAY_FULL_INTEGER)
         | 
| 1189 1267 | 
             
                        infiltration.array.data[:,:] = 0
         | 
| 1190 1268 |  | 
| 1269 | 
            +
                    # check for roof
         | 
| 1270 | 
            +
                    if exists(dir / '__roof.tif'):
         | 
| 1271 | 
            +
                        roof = WolfArray(str(dir / '__roof.tif'))
         | 
| 1272 | 
            +
                        if roof.wolftype != WOLF_ARRAY_FULL_SINGLE:
         | 
| 1273 | 
            +
                            logging.error(_('Roof .tif must be a full single array ! -- The array will be ignored !'))
         | 
| 1274 | 
            +
                            roof = WolfArray(srcheader=bat.get_header(), whichtype= WOLF_ARRAY_FULL_SINGLE)
         | 
| 1275 | 
            +
                            roof.array.data[:,:] = 99999.
         | 
| 1276 | 
            +
                    else:
         | 
| 1277 | 
            +
                        roof = WolfArray(srcheader=bat.get_header(), whichtype= WOLF_ARRAY_FULL_SINGLE)
         | 
| 1278 | 
            +
                        roof.array.data[:,:] = 99999.
         | 
| 1279 | 
            +
             | 
| 1191 1280 | 
             
                    # applying Python scrpitps on ARRAYS
         | 
| 1192 | 
            -
                    self. | 
| 1281 | 
            +
                    self._apply_scripts_update_topo_maning_inf_roof(dir, bat, man, infiltration, roof)
         | 
| 1193 1282 |  | 
| 1194 1283 | 
             
                    # save arrays on disk
         | 
| 1195 1284 | 
             
                    bat.write_all(str(dir / '__bathymetry_after_scripts.tif'))
         | 
| 1196 1285 | 
             
                    man.write_all(str(dir / '__manning_after_scripts.tif'))
         | 
| 1197 1286 | 
             
                    infiltration.write_all(str(dir / '__infiltration_after_scripts.tif'))
         | 
| 1287 | 
            +
                    roof.write_all(str(dir / '__roof_after_scripts.tif'))
         | 
| 1198 1288 |  | 
| 1199 1289 | 
             
                    # create simulation
         | 
| 1200 1290 | 
             
                    allsims = []
         | 
| 1201 | 
            -
                    for curdir, curhydro, curic in zip(used_dirs, used_hydros, used_ic):
         | 
| 1291 | 
            +
                    for id_sim, (curdir, curhydro, curic) in enumerate(zip(used_dirs, used_hydros, used_ic)):
         | 
| 1292 | 
            +
             | 
| 1293 | 
            +
                        if callback is not None:
         | 
| 1294 | 
            +
                            callback(id_sim)
         | 
| 1202 1295 |  | 
| 1203 1296 | 
             
                        # instanciation de la simulation
         | 
| 1204 1297 | 
             
                        cursim = SimpleSimulation(self._header.nbx, self._header.nby)
         | 
| @@ -1260,6 +1353,13 @@ class Config_Manager_2D_GPU: | |
| 1260 1353 |  | 
| 1261 1354 | 
             
                        cursim.infiltration_zones = np.asarray(infiltration.array.data, dtype=np.int32)
         | 
| 1262 1355 |  | 
| 1356 | 
            +
                        if roof.nbnotnull == 0:
         | 
| 1357 | 
            +
                            cursim.bridge_roof = None
         | 
| 1358 | 
            +
                            logging.info(_("No cells defined as roof ! -- Roof will be ignored !"))
         | 
| 1359 | 
            +
                        else:
         | 
| 1360 | 
            +
                            cursim.bridge_roof = roof.array.data
         | 
| 1361 | 
            +
                            logging.info(_("You have {} cells defined as roof").format(roof.nbnotnull))
         | 
| 1362 | 
            +
             | 
| 1263 1363 | 
             
                        # add hydrograph
         | 
| 1264 1364 | 
             
                        for idx, curline in curhydro.data.iterrows():
         | 
| 1265 1365 | 
             
                            cursim.add_infiltration(float(idx), [float(cur) for cur in curline.values])
         | 
| @@ -1505,29 +1605,33 @@ class UI_Manager_2D_GPU(): | |
| 1505 1605 | 
             
                    self._create_void_infil.Bind(wx.EVT_BUTTON,self.oncreate_void_infil)
         | 
| 1506 1606 | 
             
                    self._create_void_infil.SetToolTip(_('Create a void infiltration zones file based on bathymetry.tif'))
         | 
| 1507 1607 |  | 
| 1608 | 
            +
                    self._create_void_roof = wx.Button(self._frame,label = _('Create .tif bridge/culvert roof elevation'))
         | 
| 1609 | 
            +
                    self._create_void_roof.Bind(wx.EVT_BUTTON,self.oncreate_void_roof)
         | 
| 1610 | 
            +
                    self._create_void_roof.SetToolTip(_('Create a void roof file based on bathymetry.tif'))
         | 
| 1611 | 
            +
             | 
| 1508 1612 | 
             
                    self._create_void_scripts = wx.Button(self._frame,label = _('Create void scripts'))
         | 
| 1509 1613 | 
             
                    self._create_void_scripts.Bind(wx.EVT_BUTTON,self.oncreate_void_scripts)
         | 
| 1510 1614 | 
             
                    self._create_void_scripts.SetToolTip(_('Create void script files for topography, manning and infiltration'))
         | 
| 1511 1615 |  | 
| 1512 1616 | 
             
                    self._create_vrt = wx.Button(self._frame,label = _('Assembly .vrt to current level'))
         | 
| 1513 1617 | 
             
                    self._create_vrt.Bind(wx.EVT_BUTTON,self.oncreatevrt)
         | 
| 1514 | 
            -
                    self._create_vrt.SetToolTip(_('Create a .vrt file from all bathymetry and  | 
| 1618 | 
            +
                    self._create_vrt.SetToolTip(_('Create a .vrt file from all bathymetry, manning, infiltration and roof .tif files\nBe sure that all files are right named !\n\n - bathymetry must contain "bath"\n - manning must contain "mann"\n - infiltration must contain "infil"\n - roof must contain "roof"'))
         | 
| 1515 1619 |  | 
| 1516 1620 | 
             
                    self._translate_vrt = wx.Button(self._frame,label = _('Translate .vrt to .tif'))
         | 
| 1517 1621 | 
             
                    self._translate_vrt.Bind(wx.EVT_BUTTON,self.ontranslatevrt2tif)
         | 
| 1518 | 
            -
                    self._translate_vrt.SetToolTip(_('Translate .vrt files to .tif files\n\n - __bath_assembly.vrt -> __bathymetry.tif\n - __mann_assembly.vrt -> __manning.tif\n - __infil_assembly.vrt -> __infiltration.tif'))
         | 
| 1622 | 
            +
                    self._translate_vrt.SetToolTip(_('Translate .vrt files to .tif files\n\n - __bath_assembly.vrt -> __bathymetry.tif\n - __mann_assembly.vrt -> __manning.tif\n - __infil_assembly.vrt -> __infiltration.tif\n - __roof_assembly.vrt -> __roof.tif'))
         | 
| 1519 1623 |  | 
| 1520 | 
            -
                    self._apply_scripts = wx.Button(self._frame,label = _('Apply scripts on bathymetry, manning and  | 
| 1624 | 
            +
                    self._apply_scripts = wx.Button(self._frame,label = _('Apply scripts on bathymetry, manning, infiltration and roof elevation'))
         | 
| 1521 1625 | 
             
                    self._apply_scripts.Bind(wx.EVT_BUTTON,self.onapply_scripts)
         | 
| 1522 | 
            -
                    self._apply_scripts.SetToolTip(_('Apply scripts on bathymetry, manning and infiltration\n\n - bathymetry.tif\n - manning.tif\n - infiltration.tif\n\nThe scripts must be in the structure starting with parent directory and descending | 
| 1626 | 
            +
                    self._apply_scripts.SetToolTip(_('Apply scripts on bathymetry, manning and infiltration\n\n - bathymetry.tif\n - manning.tif\n - infiltration.tif\n - roof.tif\n\nThe scripts must be in the structure starting with parent directory and descending.'))
         | 
| 1523 1627 |  | 
| 1524 1628 | 
             
                    self._create_vec = wx.Button(self._frame,label = _('Search spatial coverage from current level'))
         | 
| 1525 1629 | 
             
                    self._create_vec.Bind(wx.EVT_BUTTON,self.oncreatevec)
         | 
| 1526 | 
            -
                    self._create_vec.SetToolTip(_('Create a .vecz file (with contour and global bounds) from all bathymetry and manning .tif files\nBe sure that all files are right named !\n\n - bathymetry must contain "bath"\n - manning must contain "mann"\n - infiltration must contain "infil"'))
         | 
| 1630 | 
            +
                    self._create_vec.SetToolTip(_('Create a .vecz file (with contour and global bounds) from all bathymetry and manning .tif files\nBe sure that all files are right named !\n\n - bathymetry must contain "bath"\n - manning must contain "mann"\n - infiltration must contain "infil"\n - roof must contain "roof"'))
         | 
| 1527 1631 |  | 
| 1528 1632 | 
             
                    self._check_prefix = wx.Button(self._frame,label = _('Check prefix (tif files)'))
         | 
| 1529 1633 | 
             
                    self._check_prefix.Bind(wx.EVT_BUTTON,self.oncheck_prefix)
         | 
| 1530 | 
            -
                    self._check_prefix.SetToolTip(_('Check prefix of .tif files\n\n - bath_*.tif\n - mann_*.tif\n - infil_*.tif\n\nThe prefix must be "bath_", "mann_" and " | 
| 1634 | 
            +
                    self._check_prefix.SetToolTip(_('Check prefix of .tif files\n\n - bath_*.tif\n - mann_*.tif\n - infil_*.tif\n - roof_*.tif\n\nThe prefix must be "bath_", "mann_", "infil_" and "roof_"'))
         | 
| 1531 1635 |  | 
| 1532 1636 | 
             
                    self._checkconsistency = wx.Button(self._frame,label = _('Check consistency'))
         | 
| 1533 1637 | 
             
                    self._checkconsistency.Bind(wx.EVT_BUTTON,self.oncheck_consistency)
         | 
| @@ -1577,6 +1681,7 @@ class UI_Manager_2D_GPU(): | |
| 1577 1681 | 
             
                    # buttons -> sizer
         | 
| 1578 1682 | 
             
                    sizer_buttons.Add(self._reload,1,wx.EXPAND)
         | 
| 1579 1683 | 
             
                    sizer_buttons.Add(self._create_void_infil,1,wx.EXPAND)
         | 
| 1684 | 
            +
                    sizer_buttons.Add(self._create_void_roof,1,wx.EXPAND)
         | 
| 1580 1685 | 
             
                    sizer_buttons.Add(self._create_void_scripts,1,wx.EXPAND)
         | 
| 1581 1686 | 
             
                    sizer_buttons.Add(self._check_prefix,1,wx.EXPAND)
         | 
| 1582 1687 | 
             
                    sizer_buttons.Add(self._create_vrt,1,wx.EXPAND)
         | 
| @@ -1645,6 +1750,12 @@ class UI_Manager_2D_GPU(): | |
| 1645 1750 | 
             
                    self._parent.create_void_infil()
         | 
| 1646 1751 | 
             
                    self.reload()
         | 
| 1647 1752 |  | 
| 1753 | 
            +
                def oncreate_void_roof(self, e:wx.MouseEvent):
         | 
| 1754 | 
            +
                    """ Création d'un fichier de toit de pont vide """
         | 
| 1755 | 
            +
             | 
| 1756 | 
            +
                    self._parent.create_void_roof()
         | 
| 1757 | 
            +
                    self.reload()
         | 
| 1758 | 
            +
             | 
| 1648 1759 | 
             
                def oncreate_void_scripts(self,e:wx.MouseEvent):
         | 
| 1649 1760 | 
             
                    """ Création d'un script vide """
         | 
| 1650 1761 |  | 
| @@ -1701,9 +1812,17 @@ class UI_Manager_2D_GPU(): | |
| 1701 1812 | 
             
                def oncreatevrt(self,e:wx.MouseEvent):
         | 
| 1702 1813 | 
             
                    """ Création d'un fichier vrt """
         | 
| 1703 1814 |  | 
| 1815 | 
            +
                    if self._selected_item is None:
         | 
| 1816 | 
            +
                        logging.error(_('Please select a scenario to analyze by activating an elemnt in the tree list !'))
         | 
| 1817 | 
            +
                        return
         | 
| 1818 | 
            +
             | 
| 1704 1819 | 
             
                    logging.info(_('Creating vrt ...'))
         | 
| 1705 1820 | 
             
                    mydata = self._treelist.GetItemData(self._selected_item)
         | 
| 1706 1821 |  | 
| 1822 | 
            +
                    if not 'path' in mydata:
         | 
| 1823 | 
            +
                        logging.error(_('Please select a scenario to analyze !'))
         | 
| 1824 | 
            +
                        return
         | 
| 1825 | 
            +
             | 
| 1707 1826 | 
             
                    # création du fichier vrt
         | 
| 1708 1827 | 
             
                    self._parent.create_vrt(mydata['path'])
         | 
| 1709 1828 | 
             
                    logging.info(_('... done !'))
         | 
| @@ -1713,6 +1832,10 @@ class UI_Manager_2D_GPU(): | |
| 1713 1832 | 
             
                def oncreatevec(self,e:wx.MouseEvent):
         | 
| 1714 1833 | 
             
                    """ Création d'un fichier vec """
         | 
| 1715 1834 |  | 
| 1835 | 
            +
                    if self._selected_item is None:
         | 
| 1836 | 
            +
                        logging.error(_('Please select a scenario to analyze by activating an elemnt in the tree list !'))
         | 
| 1837 | 
            +
                        return
         | 
| 1838 | 
            +
             | 
| 1716 1839 | 
             
                    logging.info(_('Creating vecz ...'))
         | 
| 1717 1840 | 
             
                    mydata = self._treelist.GetItemData(self._selected_item)
         | 
| 1718 1841 |  | 
| @@ -1783,7 +1906,7 @@ class UI_Manager_2D_GPU(): | |
| 1783 1906 | 
             
                        return
         | 
| 1784 1907 |  | 
| 1785 1908 | 
             
                    # application des scripts
         | 
| 1786 | 
            -
                    self._parent. | 
| 1909 | 
            +
                    self._parent.apply_scripts_bath_mann_inf_roof(mydata['path'])
         | 
| 1787 1910 |  | 
| 1788 1911 | 
             
                    self.reload()
         | 
| 1789 1912 | 
             
                    logging.info(_('... done !'))
         | 
| @@ -1794,7 +1917,7 @@ class UI_Manager_2D_GPU(): | |
| 1794 1917 | 
             
                    logging.info(_('Checking prefix ...'))
         | 
| 1795 1918 | 
             
                    if self._selected_item is None or self._selected_item == self._treelist.GetRootItem():
         | 
| 1796 1919 | 
             
                        logging.info(_('No item selected ! -- using root item'))
         | 
| 1797 | 
            -
                        with wx.MessageDialog(None, _('No item selected ! -- using root item'), _('Warning'), wx.OK | wx.CANCEL | wx.ICON_WARNING) as dlg:
         | 
| 1920 | 
            +
                        with wx.MessageDialog(None, _('No item selected ! -- using root item ?'), _('Warning'), wx.OK | wx.CANCEL | wx.ICON_WARNING) as dlg:
         | 
| 1798 1921 | 
             
                            ret = dlg.ShowModal()
         | 
| 1799 1922 | 
             
                            if ret != wx.ID_OK:
         | 
| 1800 1923 | 
             
                                return
         | 
| @@ -1805,7 +1928,7 @@ class UI_Manager_2D_GPU(): | |
| 1805 1928 | 
             
                    # création du fichier vrt
         | 
| 1806 1929 | 
             
                    log = self._parent.check_prefix(mydata['.tif']+mydata['.tiff'])
         | 
| 1807 1930 | 
             
                    if log =='':
         | 
| 1808 | 
            -
                        self._txtctrl.WriteText(_("All is fine !"))
         | 
| 1931 | 
            +
                        self._txtctrl.WriteText("\n".join([_("All is fine !")]))
         | 
| 1809 1932 | 
             
                    else:
         | 
| 1810 1933 | 
             
                        self._txtctrl.WriteText(log)
         | 
| 1811 1934 |  | 
| @@ -1816,16 +1939,16 @@ class UI_Manager_2D_GPU(): | |
| 1816 1939 |  | 
| 1817 1940 | 
             
                    log = self._parent.check_consistency()
         | 
| 1818 1941 | 
             
                    if log =='':
         | 
| 1819 | 
            -
                        self._txtctrl.WriteText(_("All is fine  | 
| 1942 | 
            +
                        self._txtctrl.WriteText("\n\n".join([_("All is fine !")]))
         | 
| 1820 1943 | 
             
                    else:
         | 
| 1821 | 
            -
                        self._txtctrl.WriteText( | 
| 1944 | 
            +
                        self._txtctrl.WriteText("\n\n".join([log]))
         | 
| 1822 1945 |  | 
| 1823 1946 | 
             
                    # Info on Python Environment and wolfgpu Path and version
         | 
| 1824 1947 | 
             
                    # -------------------------------------------------------
         | 
| 1825 1948 |  | 
| 1826 1949 | 
             
                    import sys
         | 
| 1827 1950 | 
             
                    # Python Environment
         | 
| 1828 | 
            -
                    self._txtctrl.write(_(' | 
| 1951 | 
            +
                    self._txtctrl.write(_('\nPython Environment\n'))
         | 
| 1829 1952 | 
             
                    self._txtctrl.write('-------------------\n')
         | 
| 1830 1953 | 
             
                    self._txtctrl.write('Python version : {}\n'.format(sys.version))
         | 
| 1831 1954 | 
             
                    self._txtctrl.write('Python path : {}\n'.format(sys.executable))
         | 
| @@ -1948,7 +2071,11 @@ class UI_Manager_2D_GPU(): | |
| 1948 2071 | 
             
                        preserve_ic = ret == wx.ID_YES
         | 
| 1949 2072 | 
             
                        dlg.Destroy()
         | 
| 1950 2073 |  | 
| 1951 | 
            -
                     | 
| 2074 | 
            +
                    pgbar = wx.ProgressDialog(_('Creating simulations ...'), _('Please wait ...'), maximum=len(hydro), parent=self._frame, style = wx.PD_APP_MODAL | wx.PD_AUTO_HIDE)
         | 
| 2075 | 
            +
             | 
| 2076 | 
            +
                    allsims = self._parent.create_simulation(Path(path), hydro, destroy_if_exists, preserve_ic, callback=pgbar.Update)
         | 
| 2077 | 
            +
             | 
| 2078 | 
            +
                    pgbar.Destroy()
         | 
| 1952 2079 |  | 
| 1953 2080 | 
             
                    self.reload()
         | 
| 1954 2081 |  | 
    
        wolfhece/scenario/update_void.py
    CHANGED
    
    | @@ -40,7 +40,7 @@ class Update_Sim: | |
| 40 40 | 
             
                      - topobahty.array.mask[:,:]
         | 
| 41 41 | 
             
                      - topobahty.array.data[:,:]
         | 
| 42 42 |  | 
| 43 | 
            -
                    Il n'est pas permis de remplacer la matrice (création d'une nouvelle matrice et/ou pointage d'una autre matrice). Toutes les operations doivent se faire dans l' | 
| 43 | 
            +
                    Il n'est pas permis de remplacer la matrice (création d'une nouvelle matrice et/ou pointage d'una autre matrice). Toutes les operations doivent se faire dans l'espace alloué.
         | 
| 44 44 |  | 
| 45 45 | 
             
                    EN
         | 
| 46 46 |  | 
| @@ -71,7 +71,7 @@ class Update_Sim: | |
| 71 71 | 
             
                      - manning.array.mask[:,:]
         | 
| 72 72 | 
             
                      - manning.array.data[:,:]
         | 
| 73 73 |  | 
| 74 | 
            -
                    Il n'est pas permis de remplacer la matrice (création d'une nouvelle matrice et/ou pointage d'una autre matrice). Toutes les operations doivent se faire dans l' | 
| 74 | 
            +
                    Il n'est pas permis de remplacer la matrice (création d'une nouvelle matrice et/ou pointage d'una autre matrice). Toutes les operations doivent se faire dans l'espace alloué.
         | 
| 75 75 |  | 
| 76 76 | 
             
                    EN
         | 
| 77 77 |  | 
| @@ -102,7 +102,7 @@ class Update_Sim: | |
| 102 102 | 
             
                      - infiltration_zones.array.mask[:,:]
         | 
| 103 103 | 
             
                      - infiltration_zones.array.data[:,:]
         | 
| 104 104 |  | 
| 105 | 
            -
                    Il n'est pas permis de remplacer la matrice (création d'une nouvelle matrice et/ou pointage d'una autre matrice). Toutes les operations doivent se faire dans l' | 
| 105 | 
            +
                    Il n'est pas permis de remplacer la matrice (création d'une nouvelle matrice et/ou pointage d'una autre matrice). Toutes les operations doivent se faire dans l'espace alloué.
         | 
| 106 106 |  | 
| 107 107 | 
             
                    EN
         | 
| 108 108 |  | 
| @@ -119,6 +119,37 @@ class Update_Sim: | |
| 119 119 | 
             
                    """
         | 
| 120 120 | 
             
                    pass
         | 
| 121 121 |  | 
| 122 | 
            +
                def update_roof(self, roof:WolfArray):
         | 
| 123 | 
            +
                    """
         | 
| 124 | 
            +
                    FR
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                    Cette fonction doit être particularisée afin d'appliquer des modifications
         | 
| 127 | 
            +
                    à l'altimétrie des ponts et ponceaux (toits)'.
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                    L'information de base se trouve dans le paramètre  'roof' de classe 'WolfArray'.
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    La matrice Numpy, en <Float32>, (avec masque - cf np.ma ) est accessible via :
         | 
| 132 | 
            +
                      - roof.array[:,:]
         | 
| 133 | 
            +
                      - roof.array.mask[:,:]
         | 
| 134 | 
            +
                      - roof.array.data[:,:]
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                    Il n'est pas permis de remplacer la matrice (création d'une nouvelle matrice et/ou pointage d'una autre matrice). Toutes les operations doivent se faire dans l'espace alloué.
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    EN
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                    This function must be customized to apply modifications to the roof elevation of bridges/culverts.
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                    The basic information is located in the 'roof' parameter ('WolfArray' class).
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                    The Numpy array, in <Float32>, (with a mask - see np.ma), can be accessed via:
         | 
| 145 | 
            +
                      - roof.array[:,:]
         | 
| 146 | 
            +
                      - roof.array.mask[:,:]
         | 
| 147 | 
            +
                      - roof.array.data[:,:]
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                    It is not allowed to replace the array (creating a new array and/or pointing an other array). All operations must be performed within the allocated space.
         | 
| 150 | 
            +
                    """
         | 
| 151 | 
            +
                    pass
         | 
| 152 | 
            +
             | 
| 122 153 | 
             
            def create_empty_method(method_name, method_signature, docstring, imports):
         | 
| 123 154 | 
             
                # Fonction utilitaire pour créer des méthodes vides avec la même signature, la documentation et les importations
         | 
| 124 155 | 
             
                imports_str = '\n'.join(f'import {module}' for module in imports)
         | 
    
        wolfhece/wolf_array.py
    CHANGED
    
    | @@ -2678,17 +2678,29 @@ class Ops_Array(wx.Frame): | |
| 2678 2678 |  | 
| 2679 2679 | 
             
                    # operator value
         | 
| 2680 2680 | 
             
                    opval = self.opvalue.GetValue()
         | 
| 2681 | 
            -
                    if opval.lower() == 'null' or opval.lower() == 'nan':
         | 
| 2681 | 
            +
                    if opval.lower() == 'null' or opval.lower() == 'nan' or opval.lower() == 'nul':
         | 
| 2682 2682 | 
             
                        curopvalue = self.parentarray.nullvalue
         | 
| 2683 2683 | 
             
                    else:
         | 
| 2684 | 
            -
                         | 
| 2684 | 
            +
                        try:
         | 
| 2685 | 
            +
                            tmp_float = float(opval)
         | 
| 2686 | 
            +
                        except:
         | 
| 2687 | 
            +
                            logging.error('Error in float conversion - Do you try to set null value ? - Accepted values : "Null" or "NaN"')
         | 
| 2688 | 
            +
                            return
         | 
| 2689 | 
            +
             | 
| 2690 | 
            +
                        curopvalue = tmp_float
         | 
| 2685 2691 |  | 
| 2686 2692 | 
             
                    # condition value
         | 
| 2687 2693 | 
             
                    curcondvalue = self.condvalue.GetValue()
         | 
| 2688 | 
            -
                    if curcondvalue.lower() == 'null' or curcondvalue.lower() == 'nan':
         | 
| 2694 | 
            +
                    if curcondvalue.lower() == 'null' or curcondvalue.lower() == 'nan' or curcondvalue.lower() == 'nul':
         | 
| 2689 2695 | 
             
                        curcondvalue = self.parentarray.nullvalue
         | 
| 2690 2696 | 
             
                    else:
         | 
| 2691 | 
            -
                         | 
| 2697 | 
            +
                        try:
         | 
| 2698 | 
            +
                            tmp_float = float(curcondvalue)
         | 
| 2699 | 
            +
                        except:
         | 
| 2700 | 
            +
                            logging.error('Error in float conversion - Do you try to set null value ? - Accepted values : "Null" or "NaN"')
         | 
| 2701 | 
            +
                            return
         | 
| 2702 | 
            +
             | 
| 2703 | 
            +
                        curcondvalue = tmp_float
         | 
| 2692 2704 |  | 
| 2693 2705 | 
             
                    self.parentarray.SelectionData.treat_select(curop, curcond, curopvalue, curcondvalue)
         | 
| 2694 2706 |  | 
| @@ -2698,8 +2710,16 @@ class Ops_Array(wx.Frame): | |
| 2698 2710 | 
             
                    curop = self.choiceop.GetSelection()
         | 
| 2699 2711 | 
             
                    curcond = self.condition.GetSelection()
         | 
| 2700 2712 |  | 
| 2701 | 
            -
                     | 
| 2702 | 
            -
             | 
| 2713 | 
            +
                    try:
         | 
| 2714 | 
            +
                        curopvalue = float(self.opvalue.GetValue())
         | 
| 2715 | 
            +
                    except:
         | 
| 2716 | 
            +
                        logging.error('Error in float conversion - operator')
         | 
| 2717 | 
            +
                        return
         | 
| 2718 | 
            +
                    try:
         | 
| 2719 | 
            +
                        curcondvalue = float(self.condvalue.GetValue())
         | 
| 2720 | 
            +
                    except:
         | 
| 2721 | 
            +
                        logging.error('Error in float conversion - condition')
         | 
| 2722 | 
            +
                        return
         | 
| 2703 2723 |  | 
| 2704 2724 | 
             
                    self.parentarray.SelectionData.mask_condition(curop, curcond, curopvalue, curcondvalue)
         | 
| 2705 2725 | 
             
                    self.refresh_array()
         | 
| @@ -7,8 +7,8 @@ wolfhece/ManageParams.py,sha256=EeuUI5Vvh9ixCvYf8YShMC1s1Yacc7OxOCN7q81gqiQ,517 | |
| 7 7 | 
             
            wolfhece/Model1D.py,sha256=SI4oNF_J3MdjiWZoizS8kuRXLMVyymX9dYfYJNVCQVI,476989
         | 
| 8 8 | 
             
            wolfhece/PyConfig.py,sha256=Bb1T8qjgKMChadJYDrHO9uo6CwItiAXScZpYkDXqZF8,11387
         | 
| 9 9 | 
             
            wolfhece/PyCrosssections.py,sha256=FnmM9DWY_SAF2EDH9Gu2PojXNtSTRF4-aYQuAAJXBh4,112771
         | 
| 10 | 
            -
            wolfhece/PyDraw.py,sha256= | 
| 11 | 
            -
            wolfhece/PyGui.py,sha256= | 
| 10 | 
            +
            wolfhece/PyDraw.py,sha256=p1lxn2ScM3f5QI97r80XDg4pgWSc6T-craaPVPfcX2Y,476586
         | 
| 11 | 
            +
            wolfhece/PyGui.py,sha256=jyeYF7srKH3HLZQGQIqcRW3u308KUDA-oLwzX-jkDzQ,143843
         | 
| 12 12 | 
             
            wolfhece/PyGuiHydrology.py,sha256=f60E8K9eGTnRq5RDF6yvt-ahf2AYegwQ9t25zZ2Mk1A,14946
         | 
| 13 13 | 
             
            wolfhece/PyHydrographs.py,sha256=jwtSNMMACwarxrtN1UeQYth99UNrhwPx1IGgUwcooHA,3774
         | 
| 14 14 | 
             
            wolfhece/PyPalette.py,sha256=81n1P-olOe4wElTLv-miSDhqvJU_RHcxgfpHt794dSw,31436
         | 
| @@ -22,7 +22,7 @@ wolfhece/RatingCurve.py,sha256=bUjIrQjvIjkD4V-z8bZmA6pe1ILtYNM0-3fT6YUY1RU,22498 | |
| 22 22 | 
             
            wolfhece/RatingCurveData.py,sha256=5UvnIm89BwqjnEbLCcY3CA8WoFd_xHJbooNy62fX5iY,57660
         | 
| 23 23 | 
             
            wolfhece/RatingCurve_xml.py,sha256=cUjReVMHFKtakA2wVey5zz6lCgHlSr72y7ZfswZDvTM,33891
         | 
| 24 24 | 
             
            wolfhece/ReadDataDCENN.py,sha256=vm-I4YMryvRldjXTvRYEUCxZsjb_tM7U9yj6OaPyD0k,1538
         | 
| 25 | 
            -
            wolfhece/Results2DGPU.py,sha256= | 
| 25 | 
            +
            wolfhece/Results2DGPU.py,sha256=dtLGrNe0VOWJHw5moduLBIaXFf2xRkmpKlIfmB2zje0,24453
         | 
| 26 26 | 
             
            wolfhece/__init__.py,sha256=FRDE8PiJAWxX9PMXsShRMZ8YADAY4WIgKMRh52rmhiw,23
         | 
| 27 27 | 
             
            wolfhece/_add_path.py,sha256=nudniS-lsgHwXXq5o626XRDzIeYj76GoGKYt6lcu2Nc,616
         | 
| 28 28 | 
             
            wolfhece/analyze_vect.py,sha256=3lkMwaQ4KRddBVRvlP9PcM66wZwwC0eCmypP91AW-os,6015
         | 
| @@ -51,7 +51,7 @@ wolfhece/pywalous.py,sha256=mWB7UxlYMIbPxNUDlONQEjcOOy9VSaRU9aYWZ5IFLu8,19164 | |
| 51 51 | 
             
            wolfhece/rain_SPWMI.py,sha256=qCfcmF7LajloOaCwnTrrSMzyME03YyilmRUOqrPrv3U,13846
         | 
| 52 52 | 
             
            wolfhece/textpillow.py,sha256=map7HsGYML_o5NHRdFg2s_TVQed_lDnpYNDv27MM0Vw,14130
         | 
| 53 53 | 
             
            wolfhece/tools_mpl.py,sha256=gQ3Jg1iuZiecmMqa5Eli2ZLSkttu68VXL8YmMDBaEYU,564
         | 
| 54 | 
            -
            wolfhece/wolf_array.py,sha256= | 
| 54 | 
            +
            wolfhece/wolf_array.py,sha256=ZJ_HvlN2GeuW4lNJ15-HZSOK5iNc_t5eN4YmL3lJYbY,420268
         | 
| 55 55 | 
             
            wolfhece/wolf_hist.py,sha256=7jeVrgSkM3ErJO6SRMH_PGzfLjIdw8vTy87kesldggk,3582
         | 
| 56 56 | 
             
            wolfhece/wolf_texture.py,sha256=DS5eobLxrq9ljyebYfpMSQPn8shkUAZZVfqrOKN_QUU,16951
         | 
| 57 57 | 
             
            wolfhece/wolf_tiles.py,sha256=2Ho2I20rHRY81KXxjgLOYISdF4OkJ2d6omeY4shDoGI,10386
         | 
| @@ -73,13 +73,13 @@ wolfhece/apps/WolfPython2.png,sha256=VMPV-M-3BCOg8zOJss8bXwPmzRYZy8Fo-XtnVYNgbaw | |
| 73 73 | 
             
            wolfhece/apps/WolfPython3.png,sha256=3G84zx14HnlB9YXMY4VUAO7IB3eu7JFvi4Kpmc_4zBE,403298
         | 
| 74 74 | 
             
            wolfhece/apps/__init__.py,sha256=OzzKItATWV0mDkz_LC2L3w5sgT2rt8ExXXCbR_FwvlY,24
         | 
| 75 75 | 
             
            wolfhece/apps/acceptability.py,sha256=hMIxTRNQARTTWJJaakb6kEK9udNh-w64VDgxxezVk3k,790
         | 
| 76 | 
            -
            wolfhece/apps/check_install.py,sha256= | 
| 76 | 
            +
            wolfhece/apps/check_install.py,sha256=kpfBBGjYqu_Ptk2XlQWmiXHxpiWY4ICt3N4B1VsACgs,2299
         | 
| 77 77 | 
             
            wolfhece/apps/check_version.py,sha256=Zze7ltzcM2ZzIGMwkcASIjapCG8CEzzW9kwNscA3NhM,1768
         | 
| 78 78 | 
             
            wolfhece/apps/curvedigitizer.py,sha256=Yps4bcayzbsz0AoVc_dkSk35dEhhn_esIBy1Ziefgmk,5334
         | 
| 79 79 | 
             
            wolfhece/apps/hydrometry.py,sha256=lhhJsFeb4zGL4bNQTs0co85OQ_6ssL1Oy0OUJCzhfYE,656
         | 
| 80 80 | 
             
            wolfhece/apps/isocurrent.py,sha256=dagmGR8ja9QQ1gwz_8fU-N052hIw-W0mWGVkzLu6C7I,4247
         | 
| 81 81 | 
             
            wolfhece/apps/splashscreen.py,sha256=SrustmIQeXnsiD-92OzjdGhBi-S7c_j-cSvuX4T6rtg,2929
         | 
| 82 | 
            -
            wolfhece/apps/version.py,sha256= | 
| 82 | 
            +
            wolfhece/apps/version.py,sha256=JzbTGIrCJEVfos-Oqf4HYsLQF6ZIUulzpzVopj07hdk,389
         | 
| 83 83 | 
             
            wolfhece/apps/wolf.py,sha256=j_CgvsL8rwixbVvVD5Z0s7m7cHZ86gmFLojKGuetMls,729
         | 
| 84 84 | 
             
            wolfhece/apps/wolf2D.py,sha256=4z_OPQ3IgaLtjexjMKX9ppvqEYyjFLt1hcfFABy3-jU,703
         | 
| 85 85 | 
             
            wolfhece/apps/wolf_logo.bmp,sha256=ruJ4MA51CpGO_AYUp_dB4SWKHelvhOvd7Q8NrVOjDJk,3126
         | 
| @@ -226,7 +226,7 @@ wolfhece/mesh2d/bc_manager.py,sha256=fKED0RhUjCmd0xd0lcOeZqiga5Glqs1ag1boYhXlq0k | |
| 226 226 | 
             
            wolfhece/mesh2d/cell_tracker.py,sha256=mPmnD5lEf3gLPuLqtAIo-Gp-ipAwQdPxzjWOGt0b7jM,8958
         | 
| 227 227 | 
             
            wolfhece/mesh2d/config_manager.py,sha256=DcdxCIIs_dyC6ayJOBULeY364LONogL9PBaqBtC9eQ4,14736
         | 
| 228 228 | 
             
            wolfhece/mesh2d/cst_2D_boundary_conditions.py,sha256=Y4DF68uAklF3fXJgf05nb_JvJk2pvzcu_wu5nFXpWJo,5008
         | 
| 229 | 
            -
            wolfhece/mesh2d/gpu_2d.py,sha256= | 
| 229 | 
            +
            wolfhece/mesh2d/gpu_2d.py,sha256=XeQIYMqdwFsLw-wDE5jbyphhCgta5QfZhE_7lVtNiCE,24260
         | 
| 230 230 | 
             
            wolfhece/mesh2d/simple_2d.py,sha256=mVFbTTG2Ah1idz2aYrxI44mi-Z24nC9Vxw1qP2Oib3Y,111350
         | 
| 231 231 | 
             
            wolfhece/mesh2d/wolf2dprev.py,sha256=D3CmGMYuhOJxQ7AyTSK97gko1ZaIRvO-0RbD2XvHfDM,491600
         | 
| 232 232 | 
             
            wolfhece/models/5_coul.pal,sha256=OI1UqcNIDBpJn2k_VDel__r-hKjjvdob0eqinGCI3QY,160
         | 
| @@ -268,10 +268,10 @@ wolfhece/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 | |
| 268 268 | 
             
            wolfhece/report/reporting.py,sha256=JUEXovx_S4jpYkJEBU0AC-1Qw2OkkWyV3VAp6iOfSHc,19494
         | 
| 269 269 | 
             
            wolfhece/report/wolf_report.png,sha256=NoSV58LSwb-oxCcZScRiJno-kxDwRdm_bK-fiMsKJdA,592485
         | 
| 270 270 | 
             
            wolfhece/scenario/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 271 | 
            -
            wolfhece/scenario/check_scenario.py,sha256= | 
| 272 | 
            -
            wolfhece/scenario/config_manager.py,sha256= | 
| 271 | 
            +
            wolfhece/scenario/check_scenario.py,sha256=d-LWa_FxmPxTSc_H1lDHwqLB6TCqj1IUrRJhatfPMMA,5623
         | 
| 272 | 
            +
            wolfhece/scenario/config_manager.py,sha256=FGhSbiZ6960-aZg1HHl131nnYGVcrE8C1rjGorrHH0E,105867
         | 
| 273 273 | 
             
            wolfhece/scenario/imposebc_void.py,sha256=PqA_99hKcaqK5zsK6IRIc5Exgg3WVpgWU8xpwNL49zQ,5571
         | 
| 274 | 
            -
            wolfhece/scenario/update_void.py,sha256= | 
| 274 | 
            +
            wolfhece/scenario/update_void.py,sha256=zb4LBX7uQCJykZWOKPQMTDtzoWkPRJqlx2qWMPvCnw8,8755
         | 
| 275 275 | 
             
            wolfhece/shaders/fragment_shader_texture.glsl,sha256=w6h8d5mJqFaGbao0LGmjRcFFdcEQ3ICIl9JpuT71K5k,177
         | 
| 276 276 | 
             
            wolfhece/shaders/geom_grid.glsl,sha256=7eAkutCrwoeJpIdF69Ar7K18YyClvVG8ArJJARcmC-Q,742
         | 
| 277 277 | 
             
            wolfhece/shaders/quad_frag_shader.glsl,sha256=GYGg9q4vFXiMuLK-pxSLz7crAE3dvlzJ7-e7PMfwSq0,1227
         | 
| @@ -292,8 +292,8 @@ wolfhece/ui/wolf_multiselection_collapsiblepane.py,sha256=8PlMYrb_8jI8h9F0_EagpM | |
| 292 292 | 
             
            wolfhece/ui/wolf_times_selection_comparison_models.py,sha256=ORy7fz4dcp691qKzaOZHrRLZ0uXNhL-LIHxmpDGL6BI,5007
         | 
| 293 293 | 
             
            wolfhece/wintab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 294 294 | 
             
            wolfhece/wintab/wintab.py,sha256=8A-JNONV6ujgsgG3lM5Uw-pVgglPATwKs86oBzzljoc,7179
         | 
| 295 | 
            -
            wolfhece-2.1. | 
| 296 | 
            -
            wolfhece-2.1. | 
| 297 | 
            -
            wolfhece-2.1. | 
| 298 | 
            -
            wolfhece-2.1. | 
| 299 | 
            -
            wolfhece-2.1. | 
| 295 | 
            +
            wolfhece-2.1.103.dist-info/METADATA,sha256=P_o5O7D46xHTvlo0hbWZ22gjXmXz14bE2xqOjlekwD0,2618
         | 
| 296 | 
            +
            wolfhece-2.1.103.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
         | 
| 297 | 
            +
            wolfhece-2.1.103.dist-info/entry_points.txt,sha256=ZZ-aSfbpdcmo-wo84lRFzBN7LaSnD1XRGSaAKVX-Gpc,522
         | 
| 298 | 
            +
            wolfhece-2.1.103.dist-info/top_level.txt,sha256=EfqZXMVCn7eILUzx9xsEu2oBbSo9liWPFWjIHik0iCI,9
         | 
| 299 | 
            +
            wolfhece-2.1.103.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |