flood-adapt 0.3.10__py3-none-any.whl → 0.3.11__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.
flood_adapt/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  # has to be here at the start to avoid circular imports
2
- __version__ = "0.3.10"
2
+ __version__ = "0.3.11"
3
3
 
4
4
  from flood_adapt import adapter, dbs_classes, objects
5
5
  from flood_adapt.config.config import Settings
@@ -35,8 +35,8 @@ from flood_adapt.misc.path_builder import (
35
35
  from flood_adapt.misc.utils import cd, resolve_filepath
36
36
  from flood_adapt.objects.events.event_set import EventSet
37
37
  from flood_adapt.objects.events.events import Event, Mode, Template
38
- from flood_adapt.objects.events.historical import HistoricalEvent
39
38
  from flood_adapt.objects.events.hurricane import TranslationModel
39
+ from flood_adapt.objects.events.synthetic import SyntheticEvent
40
40
  from flood_adapt.objects.forcing import unit_system as us
41
41
  from flood_adapt.objects.forcing.discharge import (
42
42
  DischargeConstant,
@@ -885,9 +885,11 @@ class SfincsAdapter(IHazardAdapter):
885
885
  self.preprocess(scenario, event)
886
886
  self.process(scenario, event)
887
887
  self.postprocess(scenario, event)
888
- shutil.rmtree(
889
- self._get_simulation_path(scenario, sub_event=event), ignore_errors=True
890
- )
888
+
889
+ if not self.settings.config.save_simulation:
890
+ shutil.rmtree(
891
+ self._get_simulation_path(scenario, sub_event=event), ignore_errors=True
892
+ )
891
893
 
892
894
  def _run_risk_scenario(self, scenario: Scenario):
893
895
  """Run the whole workflow for a risk scenario.
@@ -911,11 +913,12 @@ class SfincsAdapter(IHazardAdapter):
911
913
  self.calculate_rp_floodmaps(scenario)
912
914
 
913
915
  # Cleanup
914
- for i, sub_event in enumerate(event_set._events):
915
- shutil.rmtree(
916
- self._get_simulation_path(scenario, sub_event=sub_event),
917
- ignore_errors=True,
918
- )
916
+ if not self.settings.config.save_simulation:
917
+ for i, sub_event in enumerate(event_set._events):
918
+ shutil.rmtree(
919
+ self._get_simulation_path(scenario, sub_event=sub_event),
920
+ ignore_errors=True,
921
+ )
919
922
 
920
923
  def _ensure_no_existing_forcings(self):
921
924
  """Check for existing forcings in the model and raise an error if any are found."""
@@ -1819,8 +1822,7 @@ class SfincsAdapter(IHazardAdapter):
1819
1822
  def _add_tide_gauge_plot(
1820
1823
  self, fig, event: Event, units: us.UnitTypesLength
1821
1824
  ) -> None:
1822
- # check if event is historic
1823
- if not isinstance(event, HistoricalEvent):
1825
+ if isinstance(event, SyntheticEvent):
1824
1826
  return
1825
1827
  if self.settings.tide_gauge is None:
1826
1828
  return
@@ -1832,17 +1834,20 @@ class SfincsAdapter(IHazardAdapter):
1832
1834
  units=us.UnitTypesLength(units),
1833
1835
  )
1834
1836
 
1835
- if df_gauge is not None:
1836
- gauge_reference_height = self.settings.water_level.get_datum(
1837
- self.settings.tide_gauge.reference
1838
- ).height.convert(units)
1837
+ if df_gauge is None:
1838
+ self.logger.warning(
1839
+ "No water level data available for the tide gauge. Could not add it to the plot."
1840
+ )
1841
+ return
1839
1842
 
1840
- waterlevel = df_gauge.iloc[:, 0] + gauge_reference_height
1843
+ gauge_reference_height = self.settings.water_level.get_datum(
1844
+ self.settings.tide_gauge.reference
1845
+ ).height.convert(units)
1841
1846
 
1842
- # If data is available, add to plot
1843
- fig.add_trace(
1844
- px.line(waterlevel, color_discrete_sequence=["#ea6404"]).data[0]
1845
- )
1846
- fig["data"][0]["name"] = "model"
1847
- fig["data"][1]["name"] = "measurement"
1848
- fig.update_layout(showlegend=True)
1847
+ waterlevel = df_gauge.iloc[:, 0] + gauge_reference_height
1848
+
1849
+ # If data is available, add to plot
1850
+ fig.add_trace(px.line(waterlevel, color_discrete_sequence=["#ea6404"]).data[0])
1851
+ fig["data"][0]["name"] = "model"
1852
+ fig["data"][1]["name"] = "measurement"
1853
+ fig.update_layout(showlegend=True)
@@ -97,14 +97,8 @@ class OffshoreSfincsHandler(IOffshoreSfincsHandler, DatabaseUser):
97
97
  # SfincsAdapter.write() doesnt write the bca file apparently so we need to copy the template
98
98
  if sim_path.exists():
99
99
  shutil.rmtree(sim_path)
100
- shutil.copytree(self.template_path, sim_path)
101
100
 
102
- with SfincsAdapter(model_root=sim_path) as _offshore_model:
103
- if _offshore_model.sfincs_completed(sim_path):
104
- _offshore_model.logger.info(
105
- f"Skip preprocessing offshore model as it has already been run for `{self.scenario.name}`."
106
- )
107
- return
101
+ with SfincsAdapter(model_root=self.template_path) as _offshore_model:
108
102
  # Load objects, set root & write template model
109
103
  _offshore_model._load_scenario_objects(self.scenario, self.event)
110
104
  _offshore_model.write(path_out=sim_path)
@@ -285,6 +285,44 @@ class Database(IDatabase):
285
285
  zsmax = ds["risk_map"][:, :].to_numpy().T
286
286
  return zsmax
287
287
 
288
+ def get_flood_map_geotiff(
289
+ self,
290
+ scenario_name: str,
291
+ return_period: Optional[int] = None,
292
+ ) -> Optional[Path]:
293
+ """Return the path to the geotiff file with the flood map for the given scenario.
294
+
295
+ Parameters
296
+ ----------
297
+ scenario_name : str
298
+ name of scenario
299
+ return_period : int, optional
300
+ return period in years, by default None. Only for risk scenarios.
301
+
302
+ Returns
303
+ -------
304
+ Optional[Path]
305
+ path to the flood map geotiff file, or None if it does not exist
306
+ """
307
+ if not return_period:
308
+ file_path = self.scenarios.output_path.joinpath(
309
+ scenario_name,
310
+ "Flooding",
311
+ f"FloodMap_{scenario_name}.tif",
312
+ )
313
+ else:
314
+ file_path = self.scenarios.output_path.joinpath(
315
+ scenario_name,
316
+ "Flooding",
317
+ f"RP_{return_period:04d}_maps.tif",
318
+ )
319
+ if not file_path.is_file():
320
+ self.logger.warning(
321
+ f"Flood map for scenario '{scenario_name}' at {file_path} does not exist."
322
+ )
323
+ return None
324
+ return file_path
325
+
288
326
  def get_building_footprints(self, scenario_name: str) -> GeoDataFrame:
289
327
  """Return a geodataframe of the impacts at the footprint level.
290
328
 
@@ -770,7 +770,9 @@ class FloodAdapt:
770
770
  """
771
771
  return self.database.get_depth_conversion()
772
772
 
773
- def get_max_water_level_map(self, name: str, rp: int = None) -> np.ndarray:
773
+ def get_max_water_level_map(
774
+ self, name: str, rp: Optional[int] = None
775
+ ) -> np.ndarray:
774
776
  """
775
777
  Return the maximum water level for the given scenario.
776
778
 
@@ -788,6 +790,26 @@ class FloodAdapt:
788
790
  """
789
791
  return self.database.get_max_water_level(name, rp)
790
792
 
793
+ def get_flood_map_geotiff(
794
+ self, name: str, rp: Optional[int] = None
795
+ ) -> Optional[Path]:
796
+ """
797
+ Return the path to the geotiff file with the flood map for the given scenario.
798
+
799
+ Parameters
800
+ ----------
801
+ name : str
802
+ The name of the scenario.
803
+ rp : int, optional
804
+ The return period of the water level, by default None. Only for event set scenarios.
805
+
806
+ Returns
807
+ -------
808
+ flood_map_geotiff : Optional[Path]
809
+ The path to the geotiff file with the flood map for the scenario if it exists, otherwise None.
810
+ """
811
+ return self.database.get_flood_map_geotiff(name, rp)
812
+
791
813
  def get_building_footprint_impacts(self, name: str) -> gpd.GeoDataFrame:
792
814
  """
793
815
  Return a geodataframe of the impacts at the footprint level.
@@ -53,11 +53,13 @@ class Template(str, Enum):
53
53
  def description(self) -> str:
54
54
  match self:
55
55
  case Template.Historical:
56
- return "Select a time period for a historic event. This method can use offshore wind and pressure fields for the selected time period to simulate nearshore water levels or download gauged waterlevels to perform a realistic simulation. These water levels are used together with rainfall and river discharge input to simulate flooding in the site area."
56
+ return "Select and optionally modify a real event by specifying a past time period."
57
57
  case Template.Hurricane:
58
- return "Select a historical hurricane track from the hurricane database, and shift the track if desired."
58
+ return (
59
+ "Select a historical hurricane track from the hurricane database."
60
+ )
59
61
  case Template.Synthetic:
60
- return "Customize a synthetic event by specifying the waterlevels, wind, rainfall and river discharges without being based on a historical event."
62
+ return "Build a custom event by specifying wind, water levels, rainfall, and discharge."
61
63
  case _:
62
64
  raise ValueError(f"Invalid event template: {self}")
63
65
 
@@ -1,11 +1,12 @@
1
1
  import os
2
2
  from enum import Enum
3
3
  from pathlib import Path
4
- from typing import Any, Optional
4
+ from typing import Any, Optional, Type, TypeVar
5
5
 
6
6
  import geopandas as gpd
7
7
  import pyproj
8
- from pydantic import Field, field_validator, model_validator
8
+ import tomli
9
+ from pydantic import Field, field_serializer, field_validator, model_validator
9
10
 
10
11
  from flood_adapt.config.site import Site
11
12
  from flood_adapt.misc.utils import resolve_filepath, save_file_to_database
@@ -107,6 +108,9 @@ class SelectionType(str, Enum):
107
108
  all = "all"
108
109
 
109
110
 
111
+ T = TypeVar("T", bound="Measure")
112
+
113
+
110
114
  class Measure(Object):
111
115
  """The expected variables and data types of attributes common to all measures.
112
116
 
@@ -120,9 +124,91 @@ class Measure(Object):
120
124
  Description of the measure.
121
125
  type: MeasureType
122
126
  Type of measure. Should be one of the MeasureType enum values.
127
+ selection_type: SelectionType
128
+ Type of selection. Should be one of the SelectionType enum values.
129
+ polygon_file: str, Optional
130
+ Path to a polygon file, either absolute or relative to the measure's toml path in the database.
131
+ aggregation_area_name: str, Optional
132
+ Name of the aggregation area. Required if `selection_type` is 'aggregation_area'.
133
+ aggregation_area_type: str, Optional
134
+ Type of aggregation area. Required if `selection_type` is 'aggregation_area'.
123
135
  """
124
136
 
125
137
  type: MeasureType
138
+ selection_type: SelectionType
139
+
140
+ polygon_file: Optional[str] = Field(
141
+ default=None,
142
+ min_length=1,
143
+ description="Path to a polygon file, either absolute or relative to the measure path.",
144
+ )
145
+
146
+ aggregation_area_type: Optional[str] = None
147
+ aggregation_area_name: Optional[str] = None
148
+
149
+ @model_validator(mode="after")
150
+ def validate_selection_type(self) -> "Measure":
151
+ match self.selection_type:
152
+ case SelectionType.all:
153
+ pass
154
+ case SelectionType.polygon | SelectionType.polyline:
155
+ if not self.polygon_file:
156
+ raise ValueError(
157
+ "If `selection_type` is 'polygon' or 'polyline', then `polygon_file` needs to be set."
158
+ )
159
+ case SelectionType.aggregation_area:
160
+ if not self.aggregation_area_name:
161
+ raise ValueError(
162
+ "If `selection_type` is 'aggregation_area', then `aggregation_area_name` needs to be set."
163
+ )
164
+ if not self.aggregation_area_type:
165
+ raise ValueError(
166
+ "If `selection_type` is 'aggregation_area', then `aggregation_area_type` needs to be set."
167
+ )
168
+ case _:
169
+ raise ValueError(
170
+ f"Invalid selection type: {self.selection_type}. "
171
+ "Must be one of 'aggregation_area', 'polygon', 'polyline', or 'all'."
172
+ )
173
+ return self
174
+
175
+ @field_serializer("polygon_file")
176
+ def serialize_polygon_file(self, value: Optional[str]) -> Optional[str]:
177
+ """Serialize the polygon_file attribute to a string of only the file name."""
178
+ if value is None:
179
+ return None
180
+ return Path(value).name
181
+
182
+ @classmethod
183
+ def load_file(cls: Type[T], file_path: Path | str | os.PathLike) -> T:
184
+ """Load the measure from a file.
185
+
186
+ Parameters
187
+ ----------
188
+ filepath : Path | str | os.PathLike
189
+ Path to the file to load the measure from.
190
+
191
+ Returns
192
+ -------
193
+ Measure
194
+ The loaded measure object.
195
+ """
196
+ with open(file_path, mode="rb") as fp:
197
+ toml = tomli.load(fp)
198
+ measure = cls.model_validate(toml)
199
+
200
+ if measure.polygon_file:
201
+ measure.polygon_file = str(Path(file_path).parent / measure.polygon_file)
202
+
203
+ return measure
204
+
205
+ def save_additional(self, output_dir: Path | str | os.PathLike) -> None:
206
+ if self.polygon_file:
207
+ Path(output_dir).mkdir(parents=True, exist_ok=True)
208
+ src_path = resolve_filepath("measures", self.name, self.polygon_file)
209
+ path = save_file_to_database(src_path, Path(output_dir))
210
+ # Update the shapefile path in the object so it is saved in the toml file as well
211
+ self.polygon_file = path.name
126
212
 
127
213
 
128
214
  class HazardMeasure(Measure):
@@ -143,39 +229,12 @@ class HazardMeasure(Measure):
143
229
 
144
230
  """
145
231
 
146
- selection_type: SelectionType
147
- polygon_file: Optional[str] = Field(
148
- default=None,
149
- min_length=1,
150
- description="Path to a polygon file, either absolute or relative to the measure path.",
151
- )
152
-
153
232
  @field_validator("type")
154
233
  def validate_type(cls, value):
155
234
  if not MeasureType.is_hazard(value):
156
235
  raise ValueError(f"Invalid hazard type: {value}")
157
236
  return value
158
237
 
159
- @model_validator(mode="after")
160
- def validate_selection_type(self) -> "HazardMeasure":
161
- if (
162
- self.selection_type
163
- not in [SelectionType.aggregation_area, SelectionType.all]
164
- and self.polygon_file is None
165
- ):
166
- raise ValueError(
167
- "If `selection_type` is not 'aggregation_area' or 'all', then `polygon_file` needs to be set."
168
- )
169
- return self
170
-
171
- def save_additional(self, output_dir: Path | str | os.PathLike) -> None:
172
- if self.polygon_file:
173
- Path(output_dir).mkdir(parents=True, exist_ok=True)
174
- src_path = resolve_filepath("measures", self.name, self.polygon_file)
175
- path = save_file_to_database(src_path, Path(output_dir))
176
- # Update the shapefile path in the object so it is saved in the toml file as well
177
- self.polygon_file = path.name
178
-
179
238
 
180
239
  class ImpactMeasure(Measure):
181
240
  """The expected variables and data types of attributes common to all impact measures.
@@ -200,15 +259,6 @@ class ImpactMeasure(Measure):
200
259
  Name of the aggregation area.
201
260
  """
202
261
 
203
- type: MeasureType
204
- selection_type: SelectionType
205
- aggregation_area_type: Optional[str] = None
206
- aggregation_area_name: Optional[str] = None
207
- polygon_file: Optional[str] = Field(
208
- default=None,
209
- min_length=1,
210
- description="Path to a polygon file, relative to the database path.",
211
- )
212
262
  property_type: str # TODO make enum
213
263
 
214
264
  @field_validator("type")
@@ -217,34 +267,6 @@ class ImpactMeasure(Measure):
217
267
  raise ValueError(f"Invalid impact type: {value}")
218
268
  return value
219
269
 
220
- @model_validator(mode="after")
221
- def validate_aggregation_area_name(self):
222
- if (
223
- self.selection_type == SelectionType.aggregation_area
224
- and self.aggregation_area_name is None
225
- ):
226
- raise ValueError(
227
- "If `selection_type` is 'aggregation_area', then `aggregation_area_name` needs to be set."
228
- )
229
- return self
230
-
231
- @model_validator(mode="after")
232
- def validate_polygon_file(self):
233
- if self.selection_type == SelectionType.polygon and self.polygon_file is None:
234
- raise ValueError(
235
- "If `selection_type` is 'polygon', then `polygon_file` needs to be set."
236
- )
237
-
238
- return self
239
-
240
- def save_additional(self, output_dir: Path | str | os.PathLike) -> None:
241
- """Save the additional files to the database."""
242
- if self.polygon_file:
243
- src_path = resolve_filepath("measures", self.name, self.polygon_file)
244
- path = save_file_to_database(src_path, Path(output_dir))
245
- # Update the shapefile path in the object so it is saved in the toml file as well
246
- self.polygon_file = path.name
247
-
248
270
 
249
271
  class Elevate(ImpactMeasure):
250
272
  """The expected variables and data types of the "elevate" impact measure.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: flood-adapt
3
- Version: 0.3.10
3
+ Version: 0.3.11
4
4
  Summary: A software package support system which can be used to assess the benefits and costs of flood resilience measures
5
5
  Author-email: Gundula Winter <Gundula.Winter@deltares.nl>, Panos Athanasiou <Panos.Athanasiou@deltares.nl>, Frederique de Groen <Frederique.deGroen@deltares.nl>, Tim de Wilde <Tim.deWilde@deltares.nl>, Julian Hofer <Julian.Hofer@deltares.nl>, Daley Adrichem <Daley.Adrichem@deltares.nl>, Luuk Blom <Luuk.Blom@deltares.nl>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -731,6 +731,7 @@ Requires-Dist: minio<8,>=7.2.15; extra == "docs"
731
731
  Requires-Dist: python-dotenv<2.0,>=1.0; extra == "docs"
732
732
  Requires-Dist: folium<1.0,>=0.19.0; extra == "docs"
733
733
  Requires-Dist: mapclassify<3.0,>=2.8.0; extra == "docs"
734
+ Requires-Dist: contextily; extra == "docs"
734
735
  Provides-Extra: all
735
736
  Requires-Dist: flood-adapt[build,dev,docs]; extra == "all"
736
737
 
@@ -1,10 +1,10 @@
1
- flood_adapt/__init__.py,sha256=ZxMf895wrejrTen6xCPdBXGZeVGGLufl1ZEdyGVrgh8,776
1
+ flood_adapt/__init__.py,sha256=ddZDt6_YqcpNI59YE5LwRFDqQiHxX7abekyhUu8Lvi0,776
2
2
  flood_adapt/database_builder.py,sha256=E0JPsPuq2PHhCzH0cp7kDEkRYG3XQBjlCaEoK0GGttc,436
3
- flood_adapt/flood_adapt.py,sha256=8PJxCeBjrxYSpx49k0pSurViuPEX6Kv_CiDcVrMl5zU,37636
3
+ flood_adapt/flood_adapt.py,sha256=szovzFyApBeT-XPMZ-GNsWH-ap63ejouP7hZZjadMVU,38364
4
4
  flood_adapt/adapter/__init__.py,sha256=UuiuVz5vKDoXnvBUMJ7Yybk0pjZkYLREgTA4G1Pzj8c,258
5
5
  flood_adapt/adapter/fiat_adapter.py,sha256=hKvQa86w7Gxrg2c_hCjN-mcyASd5gLCE5eugQJ3ExYY,58781
6
- flood_adapt/adapter/sfincs_adapter.py,sha256=SiqrjUT_2864T-wNEkr38YPSvKvZVNKF6VOTUWI7xWU,74685
7
- flood_adapt/adapter/sfincs_offshore.py,sha256=0uEgZ_3DnbWHV62ZGlNQVD7-0CbXZlnbYc9mH0YOcvw,7793
6
+ flood_adapt/adapter/sfincs_adapter.py,sha256=8xIWnW-hHUMqtSLTl01GoE9s-MNN3zaSkLo8HBnoQZo,74880
7
+ flood_adapt/adapter/sfincs_offshore.py,sha256=QWJBD1ReQuVrQn3enyQeKR-YTHTQmGxzrLOjnOJkths,7486
8
8
  flood_adapt/adapter/interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  flood_adapt/adapter/interface/hazard_adapter.py,sha256=S2NIUAMSRgxC_E-tZRJ2qIP06U1zEVdn-MnvMTrn86s,2828
10
10
  flood_adapt/adapter/interface/impact_adapter.py,sha256=wWMCcKUkxISz-yN2q3CBIQj0Gm8C2gtXsMwOKajX9ik,1423
@@ -75,7 +75,7 @@ flood_adapt/database_builder/templates/infometrics/US_NSI/without_SVI/infographi
75
75
  flood_adapt/database_builder/templates/infometrics/US_NSI/without_SVI/infographic_metrics_config_risk.toml,sha256=VLO7NRWTPzYRj3jYDb_mImPTppSm8Lh1ajCdNPuyc4U,2045
76
76
  flood_adapt/database_builder/templates/output_layers/bin_colors.toml,sha256=yN3_h2IimOyjtfhZ-ZoWyNa-2cAeFRNlbvaNTLhEMfA,417
77
77
  flood_adapt/dbs_classes/__init__.py,sha256=J-a6BEkjDhuUzzRKuAn_AtTg_D9wNIsmY3BnVTiC2JA,731
78
- flood_adapt/dbs_classes/database.py,sha256=A2HW4VVnbXbxJfiDNp-0E_bF6P82-xCKus7iu5JMnrU,17125
78
+ flood_adapt/dbs_classes/database.py,sha256=iNf9nDm09gH9wdTO__CXmFKNr_IcHXbIscZLcDv7xQU,18390
79
79
  flood_adapt/dbs_classes/dbs_benefit.py,sha256=DDiVeXei8GGRs95gCd3B9NxcHwcWrcsrebnpqxMjvYU,2642
80
80
  flood_adapt/dbs_classes/dbs_event.py,sha256=LbkFbT5aHdfcSkvuHlaA1C0stEFhCjy6JiNIsbrowds,1848
81
81
  flood_adapt/dbs_classes/dbs_measure.py,sha256=tbhLkcly_gtofOpenidOPc993BZWxZHgM09cfEb09a4,4050
@@ -100,7 +100,7 @@ flood_adapt/objects/benefits/benefits.py,sha256=1Di8v2B7YOdMkRlg0A6k6qtMqYE_JaaN
100
100
  flood_adapt/objects/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
101
  flood_adapt/objects/events/event_factory.py,sha256=CYq8itWurILPGNSDtWKWV5FF4UxjrRFiza6w2OQJEdU,4276
102
102
  flood_adapt/objects/events/event_set.py,sha256=fpmNbrd3qXWPgyqphv_Rf2iNsZCLvwz6YEbjMV7WIXA,2810
103
- flood_adapt/objects/events/events.py,sha256=dxlTsn7rJVk3mMVUS5TSuIERmZRNh5GY0X-SnYw82ZU,8656
103
+ flood_adapt/objects/events/events.py,sha256=xuZsmew4oG2TTh7M3lRLr0z2k-T-XU2ahbi-l_uPNGY,8341
104
104
  flood_adapt/objects/events/historical.py,sha256=rnutGsi_S3WaSKUD7nB7GzSmGUOoToPL4V_M4kCMxiE,1858
105
105
  flood_adapt/objects/events/hurricane.py,sha256=UFbw8_DvxuY0_nEqpFfW3op6NWOApbTlN6BgwCAP_yI,2330
106
106
  flood_adapt/objects/events/synthetic.py,sha256=Q8OHbBumeEwbrzA1imBrxiGiB92RWyigVcGVUbisSh4,1366
@@ -121,7 +121,7 @@ flood_adapt/objects/forcing/waterlevels.py,sha256=8lCmUdeyABurJwftae4_Iut9hCn24x
121
121
  flood_adapt/objects/forcing/wind.py,sha256=xs_xZdUoZUDP1y1xITlNVJwiyDt6wQsFbPFhVRDjSqg,3925
122
122
  flood_adapt/objects/measures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
123
  flood_adapt/objects/measures/measure_factory.py,sha256=tPT4fSzT5buiLf3gmxtap1vrfH2HusQOWTluucFFwJ0,2728
124
- flood_adapt/objects/measures/measures.py,sha256=masPh1ryisaShOCf006V8TWvoPV7jDwz3yoHBW8DLOk,18795
124
+ flood_adapt/objects/measures/measures.py,sha256=NPng6jSLdukq_vqxqVZyx5xa7b1kJ1SUeBQuHYhGNwo,19716
125
125
  flood_adapt/objects/projections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
126
  flood_adapt/objects/projections/projections.py,sha256=GCbT2nAGEkiBicVrfuYsw1UYIj9BLj9v0pGnhBI7DZk,4052
127
127
  flood_adapt/objects/scenarios/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -133,8 +133,8 @@ flood_adapt/workflows/benefit_runner.py,sha256=VtYt0sHFymNyErpzOtuN55cKJGVm5hT2a
133
133
  flood_adapt/workflows/floodmap.py,sha256=8PMd9PBep4nkrOtavW_UXeLU15J7AZMk1QEonQxVNk0,3017
134
134
  flood_adapt/workflows/impacts_integrator.py,sha256=zPJrb3Fm6gXPCmlA3vMh-2nmIwH_DWGrJGS1BUDqHLU,2495
135
135
  flood_adapt/workflows/scenario_runner.py,sha256=o6x_p7oF0apmo6Zq-_4uBXVeL6saRJZlIX6lTCPN2Rc,2984
136
- flood_adapt-0.3.10.dist-info/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
137
- flood_adapt-0.3.10.dist-info/METADATA,sha256=l8SV-SXZkzFagTnKzabk7nCyMQW9iQ6zTCFu_VhvqCQ,52534
138
- flood_adapt-0.3.10.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
139
- flood_adapt-0.3.10.dist-info/top_level.txt,sha256=JvzMi6cTcQPEThCfpgMEeVny3ghI1urSH0CCgVIqSzw,12
140
- flood_adapt-0.3.10.dist-info/RECORD,,
136
+ flood_adapt-0.3.11.dist-info/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
137
+ flood_adapt-0.3.11.dist-info/METADATA,sha256=TNhqi_1Yfw4a0axhR5x4WY4sNDNoB5Vxv9vOUPhuOvg,52578
138
+ flood_adapt-0.3.11.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
139
+ flood_adapt-0.3.11.dist-info/top_level.txt,sha256=JvzMi6cTcQPEThCfpgMEeVny3ghI1urSH0CCgVIqSzw,12
140
+ flood_adapt-0.3.11.dist-info/RECORD,,