flood-adapt 0.3.0__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.
Files changed (139) hide show
  1. flood_adapt/__init__.py +22 -0
  2. flood_adapt/adapter/__init__.py +9 -0
  3. flood_adapt/adapter/fiat_adapter.py +1502 -0
  4. flood_adapt/adapter/interface/__init__.py +0 -0
  5. flood_adapt/adapter/interface/hazard_adapter.py +70 -0
  6. flood_adapt/adapter/interface/impact_adapter.py +36 -0
  7. flood_adapt/adapter/interface/model_adapter.py +89 -0
  8. flood_adapt/adapter/interface/offshore.py +19 -0
  9. flood_adapt/adapter/sfincs_adapter.py +1857 -0
  10. flood_adapt/adapter/sfincs_offshore.py +193 -0
  11. flood_adapt/config/__init__.py +0 -0
  12. flood_adapt/config/config.py +245 -0
  13. flood_adapt/config/fiat.py +219 -0
  14. flood_adapt/config/gui.py +224 -0
  15. flood_adapt/config/sfincs.py +336 -0
  16. flood_adapt/config/site.py +124 -0
  17. flood_adapt/database_builder/__init__.py +0 -0
  18. flood_adapt/database_builder/database_builder.py +2175 -0
  19. flood_adapt/database_builder/templates/default_units/imperial.toml +9 -0
  20. flood_adapt/database_builder/templates/default_units/metric.toml +9 -0
  21. flood_adapt/database_builder/templates/green_infra_table/green_infra_lookup_table.csv +10 -0
  22. flood_adapt/database_builder/templates/icons/black_down_48x48.png +0 -0
  23. flood_adapt/database_builder/templates/icons/black_left_48x48.png +0 -0
  24. flood_adapt/database_builder/templates/icons/black_right_48x48.png +0 -0
  25. flood_adapt/database_builder/templates/icons/black_up_48x48.png +0 -0
  26. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-16_white_down.png +0 -0
  27. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-16_white_left.png +0 -0
  28. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-16_white_right.png +0 -0
  29. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-16_white_up.png +0 -0
  30. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-24_black_down.png +0 -0
  31. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-24_black_left.png +0 -0
  32. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-24_black_right.png +0 -0
  33. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-24_black_up.png +0 -0
  34. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-24_white_left.png +0 -0
  35. flood_adapt/database_builder/templates/icons/icons8-triangle-arrow-24_white_right.png +0 -0
  36. flood_adapt/database_builder/templates/icons/white_down_48x48.png +0 -0
  37. flood_adapt/database_builder/templates/icons/white_left_48x48.png +0 -0
  38. flood_adapt/database_builder/templates/icons/white_right_48x48.png +0 -0
  39. flood_adapt/database_builder/templates/icons/white_up_48x48.png +0 -0
  40. flood_adapt/database_builder/templates/infographics/OSM/config_charts.toml +90 -0
  41. flood_adapt/database_builder/templates/infographics/OSM/config_people.toml +57 -0
  42. flood_adapt/database_builder/templates/infographics/OSM/config_risk_charts.toml +121 -0
  43. flood_adapt/database_builder/templates/infographics/OSM/config_roads.toml +65 -0
  44. flood_adapt/database_builder/templates/infographics/OSM/styles.css +45 -0
  45. flood_adapt/database_builder/templates/infographics/US_NSI/config_charts.toml +126 -0
  46. flood_adapt/database_builder/templates/infographics/US_NSI/config_people.toml +60 -0
  47. flood_adapt/database_builder/templates/infographics/US_NSI/config_risk_charts.toml +121 -0
  48. flood_adapt/database_builder/templates/infographics/US_NSI/config_roads.toml +65 -0
  49. flood_adapt/database_builder/templates/infographics/US_NSI/styles.css +45 -0
  50. flood_adapt/database_builder/templates/infographics/images/ambulance.png +0 -0
  51. flood_adapt/database_builder/templates/infographics/images/car.png +0 -0
  52. flood_adapt/database_builder/templates/infographics/images/cart.png +0 -0
  53. flood_adapt/database_builder/templates/infographics/images/firetruck.png +0 -0
  54. flood_adapt/database_builder/templates/infographics/images/hospital.png +0 -0
  55. flood_adapt/database_builder/templates/infographics/images/house.png +0 -0
  56. flood_adapt/database_builder/templates/infographics/images/info.png +0 -0
  57. flood_adapt/database_builder/templates/infographics/images/money.png +0 -0
  58. flood_adapt/database_builder/templates/infographics/images/person.png +0 -0
  59. flood_adapt/database_builder/templates/infographics/images/school.png +0 -0
  60. flood_adapt/database_builder/templates/infographics/images/truck.png +0 -0
  61. flood_adapt/database_builder/templates/infographics/images/walking_person.png +0 -0
  62. flood_adapt/database_builder/templates/infometrics/OSM/metrics_additional_risk_configs.toml +4 -0
  63. flood_adapt/database_builder/templates/infometrics/OSM/with_SVI/infographic_metrics_config.toml +143 -0
  64. flood_adapt/database_builder/templates/infometrics/OSM/with_SVI/infographic_metrics_config_risk.toml +153 -0
  65. flood_adapt/database_builder/templates/infometrics/OSM/without_SVI/infographic_metrics_config.toml +127 -0
  66. flood_adapt/database_builder/templates/infometrics/OSM/without_SVI/infographic_metrics_config_risk.toml +57 -0
  67. flood_adapt/database_builder/templates/infometrics/US_NSI/metrics_additional_risk_configs.toml +4 -0
  68. flood_adapt/database_builder/templates/infometrics/US_NSI/with_SVI/infographic_metrics_config.toml +191 -0
  69. flood_adapt/database_builder/templates/infometrics/US_NSI/with_SVI/infographic_metrics_config_risk.toml +153 -0
  70. flood_adapt/database_builder/templates/infometrics/US_NSI/without_SVI/infographic_metrics_config.toml +178 -0
  71. flood_adapt/database_builder/templates/infometrics/US_NSI/without_SVI/infographic_metrics_config_risk.toml +57 -0
  72. flood_adapt/database_builder/templates/infometrics/mandatory_metrics_config.toml +9 -0
  73. flood_adapt/database_builder/templates/infometrics/mandatory_metrics_config_risk.toml +65 -0
  74. flood_adapt/database_builder/templates/mapbox_layers/bin_colors.toml +5 -0
  75. flood_adapt/database_builder.py +16 -0
  76. flood_adapt/dbs_classes/__init__.py +21 -0
  77. flood_adapt/dbs_classes/database.py +716 -0
  78. flood_adapt/dbs_classes/dbs_benefit.py +97 -0
  79. flood_adapt/dbs_classes/dbs_event.py +91 -0
  80. flood_adapt/dbs_classes/dbs_measure.py +103 -0
  81. flood_adapt/dbs_classes/dbs_projection.py +52 -0
  82. flood_adapt/dbs_classes/dbs_scenario.py +150 -0
  83. flood_adapt/dbs_classes/dbs_static.py +261 -0
  84. flood_adapt/dbs_classes/dbs_strategy.py +147 -0
  85. flood_adapt/dbs_classes/dbs_template.py +302 -0
  86. flood_adapt/dbs_classes/interface/database.py +147 -0
  87. flood_adapt/dbs_classes/interface/element.py +137 -0
  88. flood_adapt/dbs_classes/interface/static.py +47 -0
  89. flood_adapt/flood_adapt.py +1371 -0
  90. flood_adapt/misc/__init__.py +0 -0
  91. flood_adapt/misc/database_user.py +16 -0
  92. flood_adapt/misc/log.py +183 -0
  93. flood_adapt/misc/path_builder.py +54 -0
  94. flood_adapt/misc/utils.py +185 -0
  95. flood_adapt/objects/__init__.py +59 -0
  96. flood_adapt/objects/benefits/__init__.py +0 -0
  97. flood_adapt/objects/benefits/benefits.py +61 -0
  98. flood_adapt/objects/events/__init__.py +0 -0
  99. flood_adapt/objects/events/event_factory.py +135 -0
  100. flood_adapt/objects/events/event_set.py +84 -0
  101. flood_adapt/objects/events/events.py +221 -0
  102. flood_adapt/objects/events/historical.py +55 -0
  103. flood_adapt/objects/events/hurricane.py +64 -0
  104. flood_adapt/objects/events/synthetic.py +48 -0
  105. flood_adapt/objects/forcing/__init__.py +0 -0
  106. flood_adapt/objects/forcing/csv.py +68 -0
  107. flood_adapt/objects/forcing/discharge.py +66 -0
  108. flood_adapt/objects/forcing/forcing.py +142 -0
  109. flood_adapt/objects/forcing/forcing_factory.py +182 -0
  110. flood_adapt/objects/forcing/meteo_handler.py +93 -0
  111. flood_adapt/objects/forcing/netcdf.py +40 -0
  112. flood_adapt/objects/forcing/plotting.py +428 -0
  113. flood_adapt/objects/forcing/rainfall.py +98 -0
  114. flood_adapt/objects/forcing/tide_gauge.py +191 -0
  115. flood_adapt/objects/forcing/time_frame.py +77 -0
  116. flood_adapt/objects/forcing/timeseries.py +552 -0
  117. flood_adapt/objects/forcing/unit_system.py +580 -0
  118. flood_adapt/objects/forcing/waterlevels.py +108 -0
  119. flood_adapt/objects/forcing/wind.py +124 -0
  120. flood_adapt/objects/measures/__init__.py +0 -0
  121. flood_adapt/objects/measures/measure_factory.py +92 -0
  122. flood_adapt/objects/measures/measures.py +506 -0
  123. flood_adapt/objects/object_model.py +68 -0
  124. flood_adapt/objects/projections/__init__.py +0 -0
  125. flood_adapt/objects/projections/projections.py +89 -0
  126. flood_adapt/objects/scenarios/__init__.py +0 -0
  127. flood_adapt/objects/scenarios/scenarios.py +22 -0
  128. flood_adapt/objects/strategies/__init__.py +0 -0
  129. flood_adapt/objects/strategies/strategies.py +68 -0
  130. flood_adapt/workflows/__init__.py +0 -0
  131. flood_adapt/workflows/benefit_runner.py +541 -0
  132. flood_adapt/workflows/floodmap.py +85 -0
  133. flood_adapt/workflows/impacts_integrator.py +82 -0
  134. flood_adapt/workflows/scenario_runner.py +69 -0
  135. flood_adapt-0.3.0.dist-info/LICENSE +21 -0
  136. flood_adapt-0.3.0.dist-info/METADATA +183 -0
  137. flood_adapt-0.3.0.dist-info/RECORD +139 -0
  138. flood_adapt-0.3.0.dist-info/WHEEL +5 -0
  139. flood_adapt-0.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,124 @@
1
+ import os
2
+ from pathlib import Path
3
+ from typing import Annotated, Any
4
+
5
+ import pandas as pd
6
+ import xarray as xr
7
+
8
+ from flood_adapt.misc.utils import (
9
+ copy_file_to_output_dir,
10
+ validate_file_extension,
11
+ )
12
+ from flood_adapt.objects.forcing import unit_system as us
13
+ from flood_adapt.objects.forcing.forcing import (
14
+ ForcingSource,
15
+ IWind,
16
+ )
17
+ from flood_adapt.objects.forcing.netcdf import validate_netcdf_forcing
18
+ from flood_adapt.objects.forcing.timeseries import (
19
+ CSVTimeseries,
20
+ SyntheticTimeseries,
21
+ TimeFrame,
22
+ TimeseriesFactory,
23
+ )
24
+
25
+
26
+ class WindConstant(IWind):
27
+ source: ForcingSource = ForcingSource.CONSTANT
28
+
29
+ speed: us.UnitfulVelocity
30
+ direction: us.UnitfulDirection
31
+
32
+ def to_dataframe(self, time_frame: TimeFrame) -> pd.DataFrame:
33
+ time = pd.date_range(
34
+ start=time_frame.start_time,
35
+ end=time_frame.end_time,
36
+ freq=time_frame.time_step,
37
+ name="time",
38
+ )
39
+ data = {
40
+ "mag": [self.speed.value for _ in range(len(time))],
41
+ "dir": [self.direction.value for _ in range(len(time))],
42
+ }
43
+ return pd.DataFrame(data=data, index=time)
44
+
45
+
46
+ class WindSynthetic(IWind):
47
+ source: ForcingSource = ForcingSource.SYNTHETIC
48
+
49
+ magnitude: SyntheticTimeseries
50
+ direction: SyntheticTimeseries
51
+
52
+ def to_dataframe(self, time_frame: TimeFrame) -> pd.DataFrame:
53
+ time = pd.date_range(
54
+ start=time_frame.start_time,
55
+ end=time_frame.end_time,
56
+ freq=time_frame.time_step,
57
+ name="time",
58
+ )
59
+
60
+ magnitude = TimeseriesFactory.from_object(self.magnitude).to_dataframe(
61
+ time_frame=time_frame,
62
+ )
63
+
64
+ direction = TimeseriesFactory.from_object(self.direction).to_dataframe(
65
+ time_frame=time_frame,
66
+ )
67
+ return pd.DataFrame(
68
+ index=time,
69
+ data={
70
+ "mag": magnitude.reindex(time).to_numpy().flatten(),
71
+ "dir": direction.reindex(time).to_numpy().flatten(),
72
+ },
73
+ )
74
+
75
+
76
+ class WindTrack(IWind):
77
+ source: ForcingSource = ForcingSource.TRACK
78
+
79
+ path: Annotated[Path, validate_file_extension([".cyc", ".spw"])]
80
+ # path to cyc file, set this when creating it
81
+
82
+ def save_additional(self, output_dir: Path | str | os.PathLike) -> None:
83
+ if self.path:
84
+ self.path = copy_file_to_output_dir(self.path, Path(output_dir))
85
+
86
+
87
+ class WindCSV(IWind):
88
+ source: ForcingSource = ForcingSource.CSV
89
+
90
+ path: Annotated[Path, validate_file_extension([".csv"])]
91
+
92
+ units: dict[str, Any] = {
93
+ "speed": us.UnitTypesVelocity.mps,
94
+ "direction": us.UnitTypesDirection.degrees,
95
+ }
96
+
97
+ def to_dataframe(self, time_frame: TimeFrame) -> pd.DataFrame:
98
+ return CSVTimeseries.load_file(
99
+ path=self.path, units=us.UnitfulVelocity(value=0, units=self.units["speed"])
100
+ ).to_dataframe(time_frame)
101
+
102
+ def save_additional(self, output_dir: Path | str | os.PathLike) -> None:
103
+ self.path = copy_file_to_output_dir(self.path, Path(output_dir))
104
+
105
+
106
+ class WindMeteo(IWind):
107
+ source: ForcingSource = ForcingSource.METEO
108
+
109
+
110
+ class WindNetCDF(IWind):
111
+ source: ForcingSource = ForcingSource.NETCDF
112
+ units: us.UnitTypesVelocity = us.UnitTypesVelocity.mps
113
+
114
+ path: Annotated[Path, validate_file_extension([".nc"])]
115
+
116
+ def read(self) -> xr.Dataset:
117
+ required_vars = ("wind10_v", "wind10_u", "press_msl")
118
+ required_coords = ("time", "lat", "lon")
119
+ with xr.open_dataset(self.path) as ds:
120
+ validated_ds = validate_netcdf_forcing(ds, required_vars, required_coords)
121
+ return validated_ds
122
+
123
+ def save_additional(self, output_dir: Path | str | os.PathLike) -> None:
124
+ self.path = copy_file_to_output_dir(self.path, Path(output_dir))
File without changes
@@ -0,0 +1,92 @@
1
+ import os
2
+ from typing import Union
3
+
4
+ import tomli
5
+
6
+ from flood_adapt.objects.measures.measures import (
7
+ Buyout,
8
+ Elevate,
9
+ FloodProof,
10
+ FloodWall,
11
+ GreenInfrastructure,
12
+ Measure,
13
+ MeasureType,
14
+ Pump,
15
+ )
16
+
17
+
18
+ class MeasureFactory:
19
+ @staticmethod
20
+ def get_measure_type(filepath: Union[str, os.PathLike]):
21
+ """Get a measure type from toml file."""
22
+ with open(filepath, mode="rb") as fp:
23
+ toml = tomli.load(fp)
24
+ type = toml.get("type")
25
+ return MeasureType(type)
26
+
27
+ @staticmethod
28
+ def get_measure_object(filepath: Union[str, os.PathLike]) -> Measure:
29
+ measure_type = MeasureFactory.get_measure_type(filepath)
30
+
31
+ if MeasureType.is_impact(measure_type):
32
+ return ImpactMeasureFactory.get_impact_measure(measure_type).load_file(
33
+ filepath
34
+ )
35
+ elif MeasureType.is_hazard(measure_type):
36
+ return HazardMeasureFactory.get_hazard_measure(measure_type).load_file(
37
+ filepath
38
+ )
39
+ else:
40
+ raise ValueError(f"Measure type {measure_type} not recognized.")
41
+
42
+
43
+ class ImpactMeasureFactory:
44
+ """Simple parser to get the respective measure subclass from a measure type string given in the config file.
45
+
46
+ Args:
47
+ type (str): name of measure type
48
+
49
+ Returns
50
+ -------
51
+ Measure: Measure subclass
52
+ """
53
+
54
+ @staticmethod
55
+ def get_impact_measure(impact_measure: str):
56
+ if impact_measure == "elevate_properties":
57
+ return Elevate
58
+ elif impact_measure == "buyout_properties":
59
+ return Buyout
60
+ elif impact_measure == "floodproof_properties":
61
+ return FloodProof
62
+ else:
63
+ raise ValueError(f"Measure type {impact_measure} not recognized.")
64
+
65
+
66
+ class HazardMeasureFactory:
67
+ """Simple parser to get the respective measure subclass from a measure type string given in the config file.
68
+
69
+ Args:
70
+ type (str): name of measure type
71
+
72
+ Returns
73
+ -------
74
+ Measure: Measure subclass
75
+ """
76
+
77
+ @staticmethod
78
+ def get_hazard_measure(hazard_measure: str):
79
+ if (
80
+ hazard_measure == "floodwall" or hazard_measure == "levee"
81
+ ): # these should use the same class right?
82
+ return FloodWall
83
+ elif (
84
+ hazard_measure == "water_square"
85
+ or hazard_measure == "total_storage"
86
+ or hazard_measure == "greening"
87
+ ):
88
+ return GreenInfrastructure
89
+ elif hazard_measure == "pump":
90
+ return Pump
91
+ else:
92
+ raise ValueError(f"Measure type {hazard_measure} not recognized.")