fram-core 0.1.0a2__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.
- {fram_core-0.1.0a2.dist-info → fram_core-0.1.1.dist-info}/METADATA +4 -4
- fram_core-0.1.1.dist-info/RECORD +100 -0
- {fram_core-0.1.0a2.dist-info → fram_core-0.1.1.dist-info}/WHEEL +1 -1
- framcore/Base.py +22 -3
- framcore/Model.py +26 -9
- framcore/__init__.py +2 -1
- framcore/aggregators/Aggregator.py +30 -11
- framcore/aggregators/HydroAggregator.py +35 -23
- framcore/aggregators/NodeAggregator.py +65 -30
- framcore/aggregators/WindSolarAggregator.py +22 -30
- framcore/attributes/Arrow.py +6 -4
- framcore/attributes/ElasticDemand.py +13 -13
- framcore/attributes/ReservoirCurve.py +3 -17
- framcore/attributes/SoftBound.py +2 -5
- framcore/attributes/StartUpCost.py +14 -3
- framcore/attributes/Storage.py +17 -5
- framcore/attributes/TargetBound.py +2 -4
- framcore/attributes/__init__.py +2 -4
- framcore/attributes/hydro/HydroBypass.py +9 -2
- framcore/attributes/hydro/HydroGenerator.py +24 -7
- framcore/attributes/hydro/HydroPump.py +32 -10
- framcore/attributes/hydro/HydroReservoir.py +4 -4
- framcore/attributes/level_profile_attributes.py +250 -53
- framcore/components/Component.py +27 -3
- framcore/components/Demand.py +18 -4
- framcore/components/Flow.py +26 -4
- framcore/components/HydroModule.py +45 -4
- framcore/components/Node.py +32 -9
- framcore/components/Thermal.py +12 -8
- framcore/components/Transmission.py +17 -2
- framcore/components/wind_solar.py +25 -10
- framcore/curves/LoadedCurve.py +0 -9
- framcore/expressions/Expr.py +137 -36
- framcore/expressions/__init__.py +3 -1
- framcore/expressions/_get_constant_from_expr.py +14 -20
- framcore/expressions/queries.py +121 -84
- framcore/expressions/units.py +30 -3
- framcore/fingerprints/fingerprint.py +0 -1
- framcore/juliamodels/JuliaModel.py +13 -3
- framcore/loaders/loaders.py +0 -2
- framcore/metadata/ExprMeta.py +13 -7
- framcore/metadata/LevelExprMeta.py +16 -1
- framcore/metadata/Member.py +7 -7
- framcore/metadata/__init__.py +1 -1
- framcore/querydbs/CacheDB.py +1 -1
- framcore/solvers/Solver.py +21 -6
- framcore/solvers/SolverConfig.py +4 -4
- framcore/timeindexes/AverageYearRange.py +9 -2
- framcore/timeindexes/ConstantTimeIndex.py +7 -2
- framcore/timeindexes/DailyIndex.py +14 -2
- framcore/timeindexes/FixedFrequencyTimeIndex.py +105 -53
- framcore/timeindexes/HourlyIndex.py +14 -2
- framcore/timeindexes/IsoCalendarDay.py +5 -3
- framcore/timeindexes/ListTimeIndex.py +103 -23
- framcore/timeindexes/ModelYear.py +8 -2
- framcore/timeindexes/ModelYears.py +11 -2
- framcore/timeindexes/OneYearProfileTimeIndex.py +10 -2
- framcore/timeindexes/ProfileTimeIndex.py +14 -3
- framcore/timeindexes/SinglePeriodTimeIndex.py +1 -1
- framcore/timeindexes/TimeIndex.py +16 -3
- framcore/timeindexes/WeeklyIndex.py +14 -2
- framcore/{expressions → timeindexes}/_time_vector_operations.py +76 -2
- framcore/timevectors/ConstantTimeVector.py +12 -16
- framcore/timevectors/LinearTransformTimeVector.py +20 -3
- framcore/timevectors/ListTimeVector.py +18 -14
- framcore/timevectors/LoadedTimeVector.py +1 -8
- framcore/timevectors/ReferencePeriod.py +13 -3
- framcore/timevectors/TimeVector.py +26 -12
- framcore/utils/__init__.py +0 -1
- framcore/utils/get_regional_volumes.py +21 -3
- framcore/utils/get_supported_components.py +1 -1
- framcore/utils/global_energy_equivalent.py +22 -5
- framcore/utils/isolate_subnodes.py +12 -3
- framcore/utils/loaders.py +7 -7
- framcore/utils/node_flow_utils.py +4 -4
- framcore/utils/storage_subsystems.py +3 -4
- fram_core-0.1.0a2.dist-info/RECORD +0 -100
- {fram_core-0.1.0a2.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
|
-
"""
|
|
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
|
-
|
|
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
|
-
"""
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
-
|
|
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
|
-
"""
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
|
19
|
-
reservoir_curve (ReservoirCurve, optional): The curve describing
|
|
20
|
-
volume (StockVolume, optional):
|
|
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__(
|