@@ -139,14 +139,13 @@ class Flow(Element):
139
139
flows are inputs and outputs of components
140
140
'''
141
141
142
- # static var:
143
142
_default_size = 1e9 # Großer Gültigkeitsbereich als Standard
144
143
145
144
def __init__ (self ,
146
145
label : str ,
147
- bus : Bus = None , # TODO: Is this for sure Optional?
146
+ bus : Bus ,
148
147
size : Union [Skalar , InvestParameters ] = _default_size ,
149
- fixed_relative_value : Optional [Numeric_TS ] = None , # TODO: Rename?
148
+ fixed_relative_profile : Optional [Numeric_TS ] = None ,
150
149
relative_minimum : Numeric_TS = 0 ,
151
150
relative_maximum : Numeric_TS = 1 ,
152
151
effects_per_flow_hour : Optional [EffectValues ] = None ,
@@ -190,10 +189,10 @@ def __init__(self,
190
189
flow_hours_total_min : TYPE, optional
191
190
minimum flow-hours ("flow-work")
192
191
(if size is not const, maybe load_factor_min fits better for you!)
193
- fixed_relative_value : scalar, array, TimeSeriesData, optional
192
+ fixed_relative_profile : scalar, array, TimeSeriesData, optional
194
193
fixed relative values for flow (if given).
195
- val(t) := fixed_relative_value (t) * size(t)
196
- With this value, the flow-value is no opt-variable anymore;
194
+ val(t) := fixed_relative_profile (t) * size(t)
195
+ With this value, the flow_rate is no opt-variable anymore;
197
196
(relative_minimum u. relative_maximum are making sense anymore)
198
197
used for fixed load profiles, i.g. heat demand, wind-power, solarthermal
199
198
If the load-profile is just an upper limit, use relative_maximum instead.
@@ -204,7 +203,7 @@ def __init__(self,
204
203
self .size = size
205
204
self .relative_minimum = relative_minimum
206
205
self .relative_maximum = relative_maximum
207
- self .fixed_relative_value = fixed_relative_value
206
+ self .fixed_relative_profile = fixed_relative_profile
208
207
209
208
self .load_factor_min = load_factor_min
210
209
self .load_factor_max = load_factor_max
@@ -228,7 +227,7 @@ def create_model(self) -> 'FlowModel':
228
227
def transform_data (self ):
229
228
self .relative_minimum = _create_time_series (f'relative_minimum' , self .relative_minimum , self )
230
229
self .relative_maximum = _create_time_series (f'relative_maximum' , self .relative_maximum , self )
231
- self .fixed_relative_value = _create_time_series (f'fixed_relative_value ' , self .fixed_relative_value , self )
230
+ self .fixed_relative_profile = _create_time_series (f'fixed_relative_profile ' , self .fixed_relative_profile , self )
232
231
self .effects_per_flow_hour = effect_values_to_time_series (f'per_flow_hour' , self .effects_per_flow_hour , self )
233
232
if self .on_off_parameters is not None :
234
233
self .on_off_parameters .transform_data (self )
@@ -245,9 +244,9 @@ def _plausibility_checks(self) -> None:
245
244
if np .any (self .relative_minimum > self .relative_maximum ):
246
245
raise Exception (self .label_full + ': Take care, that relative_minimum <= relative_maximum!' )
247
246
248
- if self .size == Flow ._default_size and self .fixed_relative_value is not None : #Default Size --> Most likely by accident
249
- raise Exception ('Achtung: Wenn fixed_relative_value genutzt wird, muss zugehöriges size definiert werden, '
250
- 'da: value = fixed_relative_value * size!' )
247
+ if self .size == Flow ._default_size and self .fixed_relative_profile is not None : #Default Size --> Most likely by accident
248
+ raise Exception ('Achtung: Wenn fixed_relative_profile genutzt wird, muss zugehöriges size definiert werden, '
249
+ 'da: value = fixed_relative_profile * size!' )
251
250
252
251
@property
253
252
def label_full (self ) -> str :
@@ -283,15 +282,16 @@ def __init__(self, element: Flow):
283
282
def do_modeling (self , system_model : SystemModel ):
284
283
lower_bound , upper_bound , fixed_flow_rate = 0 , None , None # Standard configuration
285
284
if not isinstance (self .element .size , InvestParameters ):
286
- if self .element .fixed_relative_value is not None : # Size is fixed -> flow_rate can be fixed
287
- fixed_flow_rate = self .element .fixed_relative_value .active_data * self .element .size
288
- if self .element .on_off_parameters is None : # Size is fixed and No On-Variable -> Bounds can be set
285
+ if self .element .fixed_relative_profile is not None : # Size is fixed -> flow_rate can be fixed
286
+ lower_bound , upper_bound = None , None # Ignoring bounds
287
+ fixed_flow_rate = self .element .fixed_relative_profile .active_data * self .element .size
288
+ elif self .element .on_off_parameters is None : # Size is fixed, no profile and No On-Variable -> Bounds can be set
289
289
lower_bound = self .element .relative_minimum .active_data * self .element .size
290
290
upper_bound = self .element .relative_maximum .active_data * self .element .size
291
291
292
292
# eq relative_minimum(t) * size <= flow_rate(t) <= relative_maximum(t) * size
293
- self .flow_rate = create_variable ('flow_rate' , self , system_model .nr_of_time_steps , fixed_value = fixed_flow_rate ,
294
- lower_bound = lower_bound , upper_bound = upper_bound ,
293
+ self .flow_rate = create_variable ('flow_rate' , self , system_model .nr_of_time_steps ,
294
+ fixed_value = fixed_flow_rate , lower_bound = lower_bound , upper_bound = upper_bound ,
295
295
previous_values = self .element .previous_flow_rate )
296
296
297
297
# OnOff
@@ -307,6 +307,7 @@ def do_modeling(self, system_model: SystemModel):
307
307
self ._investment = InvestmentModel (self .element , self .element .size ,
308
308
self .flow_rate ,
309
309
self .relative_flow_rate_bounds ,
310
+ self .element .fixed_relative_profile ,
310
311
on_variable = self ._on .on if self ._on is not None else None )
311
312
self ._investment .do_modeling (system_model )
312
313
self .sub_models .append (self ._investment )
@@ -358,19 +359,21 @@ def _create_bounds_for_load_factor(self, system_model: SystemModel):
358
359
359
360
@property
360
361
def absolute_flow_rate_bounds (self ) -> Tuple [Numeric , Numeric ]:
362
+ relative_lower_bound , relative_upper_bound = self .relative_flow_rate_bounds
361
363
if not isinstance (self .element .size , InvestParameters ):
362
- return (self . element . relative_minimum . active_data * self .element .size ,
363
- self . element . relative_maximum . active_data * self .element .size )
364
+ return (relative_lower_bound * self .element .size ,
365
+ relative_upper_bound * self .element .size )
364
366
else :
365
- return (self . element . relative_minimum . active_data * self .element .size .minimum_size ,
366
- self . element . relative_maximum . active_data * self .element .size .maximum_size )
367
+ return (relative_lower_bound * self .element .size .minimum_size ,
368
+ relative_upper_bound * self .element .size .maximum_size )
367
369
368
370
@property
369
371
def relative_flow_rate_bounds (self ) -> Tuple [Numeric , Numeric ]:
370
- if self .element .fixed_relative_value is None :
372
+ if self .element .fixed_relative_profile is None :
371
373
return self .element .relative_minimum .active_data , self .element .relative_maximum .active_data
372
374
else :
373
- return self .element .fixed_relative_value .active_data , self .element .fixed_relative_value .active_data
375
+ return (np .minimum (self .element .fixed_relative_profile .active_data , self .element .relative_minimum .active_data ),
376
+ np .maximum (self .element .fixed_relative_profile .active_data , self .element .relative_maximum .active_data ))
374
377
375
378
376
379
class BusModel (ElementModel ):
0 commit comments