fram-core 0.1.0a1__py3-none-any.whl → 0.1.1__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 (78) hide show
  1. {fram_core-0.1.0a1.dist-info → fram_core-0.1.1.dist-info}/METADATA +6 -5
  2. fram_core-0.1.1.dist-info/RECORD +100 -0
  3. {fram_core-0.1.0a1.dist-info → fram_core-0.1.1.dist-info}/WHEEL +1 -1
  4. framcore/Base.py +22 -3
  5. framcore/Model.py +26 -9
  6. framcore/__init__.py +2 -1
  7. framcore/aggregators/Aggregator.py +30 -11
  8. framcore/aggregators/HydroAggregator.py +37 -25
  9. framcore/aggregators/NodeAggregator.py +65 -30
  10. framcore/aggregators/WindSolarAggregator.py +22 -30
  11. framcore/attributes/Arrow.py +6 -4
  12. framcore/attributes/ElasticDemand.py +13 -13
  13. framcore/attributes/ReservoirCurve.py +3 -17
  14. framcore/attributes/SoftBound.py +2 -5
  15. framcore/attributes/StartUpCost.py +14 -3
  16. framcore/attributes/Storage.py +17 -5
  17. framcore/attributes/TargetBound.py +2 -4
  18. framcore/attributes/__init__.py +2 -4
  19. framcore/attributes/hydro/HydroBypass.py +9 -2
  20. framcore/attributes/hydro/HydroGenerator.py +24 -7
  21. framcore/attributes/hydro/HydroPump.py +32 -10
  22. framcore/attributes/hydro/HydroReservoir.py +4 -4
  23. framcore/attributes/level_profile_attributes.py +250 -53
  24. framcore/components/Component.py +27 -3
  25. framcore/components/Demand.py +18 -4
  26. framcore/components/Flow.py +26 -4
  27. framcore/components/HydroModule.py +45 -4
  28. framcore/components/Node.py +32 -9
  29. framcore/components/Thermal.py +12 -8
  30. framcore/components/Transmission.py +17 -2
  31. framcore/components/wind_solar.py +25 -10
  32. framcore/curves/LoadedCurve.py +0 -9
  33. framcore/expressions/Expr.py +137 -36
  34. framcore/expressions/__init__.py +3 -1
  35. framcore/expressions/_get_constant_from_expr.py +14 -20
  36. framcore/expressions/queries.py +121 -84
  37. framcore/expressions/units.py +30 -3
  38. framcore/fingerprints/fingerprint.py +0 -1
  39. framcore/juliamodels/JuliaModel.py +13 -3
  40. framcore/loaders/loaders.py +0 -2
  41. framcore/metadata/ExprMeta.py +13 -7
  42. framcore/metadata/LevelExprMeta.py +16 -1
  43. framcore/metadata/Member.py +7 -7
  44. framcore/metadata/__init__.py +1 -1
  45. framcore/querydbs/CacheDB.py +1 -1
  46. framcore/solvers/Solver.py +21 -6
  47. framcore/solvers/SolverConfig.py +4 -4
  48. framcore/timeindexes/AverageYearRange.py +9 -2
  49. framcore/timeindexes/ConstantTimeIndex.py +7 -2
  50. framcore/timeindexes/DailyIndex.py +14 -2
  51. framcore/timeindexes/FixedFrequencyTimeIndex.py +105 -53
  52. framcore/timeindexes/HourlyIndex.py +14 -2
  53. framcore/timeindexes/IsoCalendarDay.py +5 -3
  54. framcore/timeindexes/ListTimeIndex.py +103 -23
  55. framcore/timeindexes/ModelYear.py +8 -2
  56. framcore/timeindexes/ModelYears.py +11 -2
  57. framcore/timeindexes/OneYearProfileTimeIndex.py +10 -2
  58. framcore/timeindexes/ProfileTimeIndex.py +14 -3
  59. framcore/timeindexes/SinglePeriodTimeIndex.py +1 -1
  60. framcore/timeindexes/TimeIndex.py +16 -3
  61. framcore/timeindexes/WeeklyIndex.py +14 -2
  62. framcore/{expressions → timeindexes}/_time_vector_operations.py +76 -2
  63. framcore/timevectors/ConstantTimeVector.py +12 -16
  64. framcore/timevectors/LinearTransformTimeVector.py +20 -3
  65. framcore/timevectors/ListTimeVector.py +18 -14
  66. framcore/timevectors/LoadedTimeVector.py +1 -8
  67. framcore/timevectors/ReferencePeriod.py +13 -3
  68. framcore/timevectors/TimeVector.py +26 -12
  69. framcore/utils/__init__.py +0 -1
  70. framcore/utils/get_regional_volumes.py +21 -3
  71. framcore/utils/get_supported_components.py +1 -1
  72. framcore/utils/global_energy_equivalent.py +22 -5
  73. framcore/utils/isolate_subnodes.py +12 -3
  74. framcore/utils/loaders.py +7 -7
  75. framcore/utils/node_flow_utils.py +4 -4
  76. framcore/utils/storage_subsystems.py +3 -4
  77. fram_core-0.1.0a1.dist-info/RECORD +0 -100
  78. {fram_core-0.1.0a1.dist-info → fram_core-0.1.1.dist-info}/licenses/LICENSE.md +0 -0
@@ -7,30 +7,48 @@ from framcore.timevectors import TimeVector
7
7
 
8
8
 
9
9
  class HydroGenerator(Base):
10
- """Generator class representing a hydro generator component."""
10
+ """
11
+ Produces power from the main release of a HydroModule.
12
+
13
+ Produces to a power node, and can have variable costs associated with operation. Other attributes are energy equivalent, PQ curve, nominal head
14
+ and tailwater elevation.
15
+
16
+ """
11
17
 
12
18
  def __init__(
13
19
  self,
14
20
  power_node: str,
15
- energy_eq: Conversion, # energy equivalent
21
+ energy_equivalent: Conversion, # energy equivalent
16
22
  pq_curve: Expr | str | Curve | None = None,
17
23
  nominal_head: Expr | str | TimeVector | None = None,
18
24
  tailwater_elevation: Expr | str | TimeVector | None = None,
19
25
  voc: Cost | None = None,
20
26
  production: AvgFlowVolume | None = None,
21
27
  ) -> None:
22
- """Initialize a hydro generator with power node, energy equivalent, and optional parameters."""
28
+ """
29
+ Initialize a HydroGenerator with parameters.
30
+
31
+ Args:
32
+ power_node (str): Node to supply power to.
33
+ energy_equivalent (Conversion): Conversion factor of power produced to water released.
34
+ pq_curve (Expr | str | Curve | None, optional): Expression or curve describing the relationship produced power and water released. Defaults to None.
35
+ nominal_head (Expr | str | TimeVector | None, optional): Vertical distance between upstream and dowstream water level. Defaults to None.
36
+ tailwater_elevation (Expr | str | TimeVector | None, optional): Elevation at the surface where the water exits the turbine. Defaults to None.
37
+ voc (Cost | None, optional): Variable operational costs. Defaults to None.
38
+ production (AvgFlowVolume | None, optional): Result of power volume produced. Defaults to None.
39
+
40
+ """
23
41
  super().__init__()
24
42
 
25
43
  self._check_type(power_node, str)
26
- self._check_type(energy_eq, Conversion)
44
+ self._check_type(energy_equivalent, Conversion)
27
45
  self._check_type(pq_curve, (Expr, str, Curve, type(None)))
28
46
  self._check_type(nominal_head, (Expr, str, TimeVector, type(None)))
29
47
  self._check_type(tailwater_elevation, (Expr, str, TimeVector, type(None)))
30
48
  self._check_type(voc, (Cost, type(None)))
31
49
 
32
50
  self._power_node = power_node
33
- self._energy_eq = energy_eq
51
+ self._energy_eq = energy_equivalent
34
52
  self._pq_curve = ensure_expr(pq_curve)
35
53
  self._nominal_head = ensure_expr(nominal_head, is_level=True)
36
54
  self._tailwater_elevation = ensure_expr(tailwater_elevation, is_level=True)
@@ -49,8 +67,7 @@ class HydroGenerator(Base):
49
67
  self._check_type(power_node, str)
50
68
  self._power_node = power_node
51
69
 
52
- # TODO: change from eq to equivalent
53
- def get_energy_eq(self) -> Conversion:
70
+ def get_energy_equivalent(self) -> Conversion:
54
71
  """Get the energy equivalent of the hydro generator."""
55
72
  return self._energy_eq
56
73
 
@@ -6,7 +6,15 @@ from framcore.timevectors import TimeVector
6
6
 
7
7
 
8
8
  class HydroPump(Base):
9
- """Pump class representing a hydro pump component."""
9
+ """
10
+ Represent a pump associated with a HydroModule.
11
+
12
+ The HydroPump can consume power from a power Node to move water upstream between two HydroModules. It has a max power capacity, and mean energy
13
+ equivalent and water capacity. It can also describe the relationship between head and flow (Q), with min and max head and flow.
14
+
15
+ Results for water and power consumption are stored as AvgFlowVolume attributes.
16
+
17
+ """
10
18
 
11
19
  def __init__(
12
20
  self,
@@ -14,20 +22,35 @@ class HydroPump(Base):
14
22
  from_module: str,
15
23
  to_module: str,
16
24
  water_capacity: FlowVolume,
17
- energy_eq: Conversion,
25
+ energy_equivalent: Conversion,
18
26
  power_capacity: FlowVolume | None = None,
19
27
  head_min: Expr | str | TimeVector | None = None,
20
28
  head_max: Expr | str | TimeVector | None = None,
21
29
  q_min: Expr | str | TimeVector | None = None,
22
30
  q_max: Expr | str | TimeVector | None = None,
23
31
  ) -> None:
24
- """Initialize a hydro pump with power node, modules, capacity, energy equivalent, and optional parameters."""
32
+ """
33
+ Initialize a HydroPump object parameters.
34
+
35
+ Args:
36
+ power_node (str): Node to take power from when operating.
37
+ from_module (str): Source HydroModule to move water from.
38
+ to_module (str): Destination HydroModule to move water to.
39
+ water_capacity (FlowVolume): Max pumped water volume given the mean energy equivalent and power capacity.
40
+ energy_equivalent (Conversion): Mean conversion factor between power consumed and volume of water moved.
41
+ power_capacity (FlowVolume | None, optional): Max power consumed. Defaults to None.
42
+ head_min (Expr | str | TimeVector | None, optional): Minimum elevation difference between upstream and downstream water level. Defaults to None.
43
+ head_max (Expr | str | TimeVector | None, optional): Maximum elevation difference between upstream and downstream water level. Defaults to None.
44
+ q_min (Expr | str | TimeVector | None, optional): Maximum water flow at head_min. Defaults to None.
45
+ q_max (Expr | str | TimeVector | None, optional): Maximum water flow at head_max. Defaults to None.
46
+
47
+ """
25
48
  super().__init__()
26
49
  self._check_type(power_node, str)
27
50
  self._check_modules(from_module, to_module) # checks types and that they are not the same.
28
51
  self._check_type(water_capacity, FlowVolume)
29
- self._check_type(power_capacity, FlowVolume)
30
- self._check_type(energy_eq, Conversion)
52
+ self._check_type(power_capacity, (FlowVolume, type(None)))
53
+ self._check_type(energy_equivalent, Conversion)
31
54
  self._check_type(head_min, (Expr, str, TimeVector, type(None)))
32
55
  self._check_type(head_max, (Expr, str, TimeVector, type(None)))
33
56
  self._check_type(q_min, (Expr, str, TimeVector, type(None)))
@@ -37,7 +60,7 @@ class HydroPump(Base):
37
60
  self._from_module = from_module
38
61
  self._to_module = to_module
39
62
  self._water_capacity = water_capacity
40
- self._energy_eq = energy_eq
63
+ self._energy_eq = energy_equivalent
41
64
  self._power_capacity = power_capacity
42
65
 
43
66
  self._hmin = ensure_expr(head_min, is_level=True)
@@ -48,7 +71,6 @@ class HydroPump(Base):
48
71
  self._water_consumption = AvgFlowVolume()
49
72
  self._power_consumption = AvgFlowVolume()
50
73
 
51
- # TODO: change to water capacity
52
74
  def get_water_capacity(self) -> FlowVolume:
53
75
  """Get the capacity of the pump unit."""
54
76
  return self._water_capacity
@@ -74,7 +96,8 @@ class HydroPump(Base):
74
96
  """Get the module to which the pump unit is pumping."""
75
97
  return self._to_module
76
98
 
77
- # TODO: should be split in two
99
+ # TODO: should be split in two? Keep in mind we check that the to and from modules are not the same. So if we split this user might run into issues if
100
+ # trying to first set from_module to to_module then change to_module.
78
101
  def set_modules(self, from_module: str, to_module: str) -> None:
79
102
  """Set the modules for the pump unit."""
80
103
  self._check_modules(from_module, to_module)
@@ -104,8 +127,7 @@ class HydroPump(Base):
104
127
  raise RuntimeError(message)
105
128
 
106
129
  # other parameters
107
- # TODO: change from eq to equivalent
108
- def get_energy_eq(self) -> Conversion:
130
+ def get_energy_equivalent(self) -> Conversion:
109
131
  """Get the energy equivalent of hydro pump."""
110
132
  return self._energy_eq
111
133
 
@@ -3,7 +3,7 @@ from framcore.attributes.Storage import Storage
3
3
 
4
4
 
5
5
  class HydroReservoir(Storage):
6
- """Reservoir class representing a hydro reservoir attribute."""
6
+ """Represent a hydro reservoir of a HydroModule."""
7
7
 
8
8
  def __init__(
9
9
  self,
@@ -15,9 +15,9 @@ class HydroReservoir(Storage):
15
15
  Initialize a HydroReservoir instance.
16
16
 
17
17
  Args:
18
- capacity (StockVolume): The total storage capacity of the reservoir.
19
- reservoir_curve (ReservoirCurve, optional): The curve describing reservoir characteristics.
20
- volume (StockVolume, optional): The current volume of water in the reservoir.
18
+ capacity (StockVolume): The maximum storage capacity of the reservoir.
19
+ reservoir_curve (ReservoirCurve, optional): The curve describing water level elevation to volume characteristics.
20
+ volume (StockVolume, optional): Volume of water in the reservoir.
21
21
 
22
22
  """
23
23
  super().__init__(