Skip to content

Commit

Permalink
chore: make sure all time series are resampled (#533)
Browse files Browse the repository at this point in the history
* chore: make sure all time series are resampled

ECALC-1003
ECALC-1315
  • Loading branch information
frodehk committed Jun 21, 2024
1 parent 0cfe517 commit 9684fe5
Show file tree
Hide file tree
Showing 6 changed files with 880 additions and 2,097 deletions.
42 changes: 17 additions & 25 deletions src/libecalc/application/graph_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:

model_stage_results = []
# Convert rates in stage results from lists to time series:
for stage_result in model.stage_results:
for i, stage_result in enumerate(model.stage_results):
model_stage_result = CompressorModelStageResult(
chart=stage_result.chart,
chart_area_flags=stage_result.chart_area_flags,
Expand Down Expand Up @@ -534,23 +534,19 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
mass_rate_kg_per_hr=TimeSeriesRate(
mass_rate_kg_per_hr=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.mass_rate_kg_per_hr
if stage_result.mass_rate_kg_per_hr is not None
else [math.nan] * len(model.timesteps),
unit=Unit.KILO_PER_HOUR,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
mass_rate_before_asv_kg_per_hr=TimeSeriesRate(
mass_rate_before_asv_kg_per_hr=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.mass_rate_before_asv_kg_per_hr
if stage_result.mass_rate_before_asv_kg_per_hr is not None
else [math.nan] * len(model.timesteps),
unit=Unit.KILO_PER_HOUR,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
power=TimeSeriesRate(
timesteps=model.timesteps,
Expand Down Expand Up @@ -590,23 +586,19 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:
unit=Unit.SPEED_RPM,
),
inlet_stream_condition=CompressorStreamConditionResult(
actual_rate_m3_per_hr=TimeSeriesRate(
actual_rate_m3_per_hr=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.inlet_stream_condition.actual_rate_m3_per_hr
if stage_result.inlet_stream_condition.actual_rate_m3_per_hr is not None
else [math.nan] * len(model.timesteps),
unit=Unit.ACTUAL_VOLUMETRIC_M3_PER_HOUR,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
actual_rate_before_asv_m3_per_hr=TimeSeriesRate(
actual_rate_before_asv_m3_per_hr=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.inlet_stream_condition.actual_rate_before_asv_m3_per_hr
if stage_result.inlet_stream_condition.actual_rate_before_asv_m3_per_hr is not None
else [math.nan] * len(model.timesteps),
unit=Unit.ACTUAL_VOLUMETRIC_M3_PER_HOUR,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
standard_rate_sm3_per_day=TimeSeriesRate(
timesteps=model.timesteps,
Expand Down Expand Up @@ -634,14 +626,12 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:
else [math.nan] * len(model.timesteps),
unit=Unit.NONE,
),
density_kg_per_m3=TimeSeriesRate(
density_kg_per_m3=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.inlet_stream_condition.density_kg_per_m3
if stage_result.inlet_stream_condition.density_kg_per_m3 is not None
else [math.nan] * len(model.timesteps),
unit=Unit.KG_M3,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
pressure=TimeSeriesFloat(
timesteps=model.timesteps,
Expand Down Expand Up @@ -671,25 +661,23 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:
else [math.nan] * len(model.timesteps),
unit=Unit.NONE,
),
timesteps=model.timesteps,
name="Inlet stream condition",
),
outlet_stream_condition=CompressorStreamConditionResult(
actual_rate_m3_per_hr=TimeSeriesRate(
actual_rate_m3_per_hr=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.outlet_stream_condition.actual_rate_m3_per_hr
if stage_result.outlet_stream_condition.actual_rate_m3_per_hr is not None
else [math.nan] * len(model.timesteps),
unit=Unit.ACTUAL_VOLUMETRIC_M3_PER_HOUR,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
actual_rate_before_asv_m3_per_hr=TimeSeriesRate(
actual_rate_before_asv_m3_per_hr=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.outlet_stream_condition.actual_rate_before_asv_m3_per_hr
if stage_result.outlet_stream_condition.actual_rate_before_asv_m3_per_hr is not None
else [math.nan] * len(model.timesteps),
unit=Unit.ACTUAL_VOLUMETRIC_M3_PER_HOUR,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
standard_rate_sm3_per_day=TimeSeriesRate(
timesteps=model.timesteps,
Expand Down Expand Up @@ -717,14 +705,12 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:
else [math.nan] * len(model.timesteps),
unit=Unit.NONE,
),
density_kg_per_m3=TimeSeriesRate(
density_kg_per_m3=TimeSeriesFloat(
timesteps=model.timesteps,
values=stage_result.outlet_stream_condition.density_kg_per_m3
if stage_result.outlet_stream_condition.density_kg_per_m3 is not None
else [math.nan] * len(model.timesteps),
unit=Unit.KG_M3,
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
pressure=TimeSeriesFloat(
timesteps=model.timesteps,
Expand Down Expand Up @@ -754,7 +740,11 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:
else [math.nan] * len(model.timesteps),
unit=Unit.NONE,
),
timesteps=model.timesteps,
name="Outlet stream condition",
),
name=f"Stage {i + 1}",
timesteps=model.timesteps,
)

model_stage_results.append(model_stage_result)
Expand Down Expand Up @@ -818,6 +808,8 @@ def get_asset_result(self) -> libecalc.dto.result.EcalcModelResult:
rate_type=RateType.STREAM_DAY,
regularity=regularity.for_timesteps(model.timesteps).values,
),
timesteps=model.timesteps,
name=model.name,
)
if model.turbine_result is not None
else None
Expand Down
16 changes: 8 additions & 8 deletions src/libecalc/dto/result/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ class PumpModelResult(ConsumerModelResultBase):
is_valid: TimeSeriesBoolean


class TurbineModelResult(EcalcResultBaseModel):
class TurbineModelResult(TabularTimeSeries):
energy_usage_unit: Unit
power_unit: Unit
efficiency: TimeSeriesFloat
Expand All @@ -174,20 +174,20 @@ class TurbineModelResult(EcalcResultBaseModel):
power: TimeSeriesRate


class CompressorStreamConditionResult(EcalcResultBaseModel):
actual_rate_m3_per_hr: TimeSeriesRate
actual_rate_before_asv_m3_per_hr: TimeSeriesRate
class CompressorStreamConditionResult(TabularTimeSeries):
actual_rate_m3_per_hr: TimeSeriesFloat
actual_rate_before_asv_m3_per_hr: TimeSeriesFloat
standard_rate_sm3_per_day: TimeSeriesRate
standard_rate_before_asv_sm3_per_day: TimeSeriesRate
kappa: TimeSeriesFloat
density_kg_per_m3: TimeSeriesRate
density_kg_per_m3: TimeSeriesFloat
pressure: TimeSeriesFloat
pressure_before_choking: TimeSeriesFloat
temperature_kelvin: TimeSeriesFloat
z: TimeSeriesFloat


class CompressorModelStageResult(EcalcResultBaseModel):
class CompressorModelStageResult(TabularTimeSeries):
chart: Optional[Union[SingleSpeedChart, VariableSpeedChart]]
chart_area_flags: List[str]
energy_usage_unit: Unit
Expand All @@ -202,8 +202,8 @@ class CompressorModelStageResult(EcalcResultBaseModel):
polytropic_head_kJ_per_kg: TimeSeriesFloat
asv_recirculation_loss_mw: TimeSeriesRate
energy_usage: TimeSeriesRate
mass_rate_kg_per_hr: TimeSeriesRate
mass_rate_before_asv_kg_per_hr: TimeSeriesRate
mass_rate_kg_per_hr: TimeSeriesFloat
mass_rate_before_asv_kg_per_hr: TimeSeriesFloat
power: TimeSeriesRate
pressure_is_choked: TimeSeriesBoolean
rate_exceeds_maximum: TimeSeriesBoolean
Expand Down
3 changes: 2 additions & 1 deletion src/libecalc/dto/result/tabular_time_series.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def resample(self, freq: Frequency) -> Self:
return self.model_copy()
resampled = self.model_copy()
for attribute, values in self.__dict__.items():
if isinstance(values, TimeSeries):
if isinstance(values, TimeSeries) or isinstance(values, TabularTimeSeries):
resampled.__setattr__(attribute, values.resample(freq=freq))

elif isinstance(values, list):
Expand All @@ -110,6 +110,7 @@ def resample(self, freq: Frequency) -> Self:
else:
# NOTE: Operational settings are not resampled. Should add support?
pass

else:
# NOTE: turbine_result is not resampled. Should add support?
pass
Expand Down
Loading

0 comments on commit 9684fe5

Please sign in to comment.