Skip to content

Commit 76f0554

Browse files
committed
refactor: parse and validate compressor models when used
This makes it possible to provide more context when validating, or more context for generating compressor charts and stages for simplified models. This has the side-effect of only validating used models, while ignoring others. Yaml-validation will still happen for all.
1 parent 69dd9f2 commit 76f0554

21 files changed

Lines changed: 620 additions & 562 deletions

File tree

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
from .base import CompressorModel
2-
from .factory import create_compressor_model

src/libecalc/domain/process/compressor/core/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,9 @@ def get_consumption_type(self) -> ConsumptionType:
9999
def evaluate(
100100
self,
101101
) -> CompressorTrainResult:
102-
return self.evaluate_turbine_based_on_compressor_model_result(
103-
compressor_energy_function_result=self.compressor_model.evaluate()
104-
)
102+
compressor_model_result = self.compressor_model.evaluate()
103+
turbine_result = self.evaluate_turbine_based_on_compressor_model_result(compressor_model_result)
104+
return turbine_result
105105

106106
def evaluate_turbine_based_on_compressor_model_result(
107107
self, compressor_energy_function_result: CompressorTrainResult

src/libecalc/domain/process/compressor/core/factory.py

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
from typing import Any
2-
3-
from libecalc.common.energy_model_type import EnergyModelType
4-
from libecalc.common.logger import logger
5-
from libecalc.domain.infrastructure.energy_components.turbine import Turbine
6-
from libecalc.domain.process.compressor.core.base import CompressorModel, CompressorWithTurbineModel
71
from libecalc.domain.process.compressor.core.sampled import CompressorModelSampled
82
from libecalc.domain.process.compressor.core.train.simplified_train import (
93
CompressorTrainSimplifiedKnownStages,
@@ -24,12 +18,10 @@
2418
CompressorSampled,
2519
CompressorTrainSimplifiedWithKnownStages,
2620
CompressorTrainSimplifiedWithUnknownStages,
27-
CompressorWithTurbine,
2821
SingleSpeedCompressorTrain,
2922
VariableSpeedCompressorTrain,
3023
VariableSpeedCompressorTrainMultipleStreamsAndPressures,
3124
)
32-
from libecalc.domain.process.compressor.dto.model_types import CompressorModelTypes as CompressorModelDTO
3325
from libecalc.domain.process.value_objects.fluid_stream.fluid_factory import FluidFactoryInterface
3426
from libecalc.domain.process.value_objects.fluid_stream.fluid_model import FluidModel
3527
from libecalc.domain.process.value_objects.fluid_stream.multiple_streams_stream import (
@@ -78,27 +70,6 @@ def _create_compressor_train_simplified_with_known_stages(
7870
)
7971

8072

81-
def _create_turbine(turbine_dto: Turbine) -> Turbine:
82-
return Turbine(
83-
loads=turbine_dto.loads,
84-
lower_heating_value=turbine_dto.lower_heating_value,
85-
efficiency_fractions=turbine_dto.efficiency_fractions,
86-
energy_usage_adjustment_constant=turbine_dto._energy_usage_adjustment_constant,
87-
energy_usage_adjustment_factor=turbine_dto._energy_usage_adjustment_factor,
88-
)
89-
90-
91-
def _create_compressor_with_turbine(
92-
compressor_model_dto: CompressorWithTurbine,
93-
) -> CompressorWithTurbineModel:
94-
return CompressorWithTurbineModel(
95-
energy_usage_adjustment_constant=compressor_model_dto.energy_usage_adjustment_constant,
96-
energy_usage_adjustment_factor=compressor_model_dto.energy_usage_adjustment_factor,
97-
compressor_energy_function=create_compressor_model(compressor_model_dto.compressor_train),
98-
turbine_model=_create_turbine(compressor_model_dto.turbine),
99-
)
100-
101-
10273
def _create_single_speed_compressor_train(
10374
compressor_model_dto: SingleSpeedCompressorTrain,
10475
) -> SingleSpeedCompressorTrainCommonShaft:
@@ -205,32 +176,3 @@ def _create_compressor_sampled(compressor_model_dto: CompressorSampled) -> Compr
205176
discharge_pressure_values=compressor_model_dto.discharge_pressure_values,
206177
power_interpolation_values=compressor_model_dto.power_interpolation_values,
207178
)
208-
209-
210-
facility_model_map = {
211-
EnergyModelType.COMPRESSOR_SAMPLED: _create_compressor_sampled,
212-
EnergyModelType.COMPRESSOR_TRAIN_SIMPLIFIED_WITH_KNOWN_STAGES: _create_compressor_train_simplified_with_known_stages,
213-
EnergyModelType.COMPRESSOR_TRAIN_SIMPLIFIED_WITH_UNKNOWN_STAGES: _create_compressor_train_simplified_with_unknown_stages,
214-
EnergyModelType.VARIABLE_SPEED_COMPRESSOR_TRAIN_COMMON_SHAFT: _create_variable_speed_compressor_train,
215-
EnergyModelType.VARIABLE_SPEED_COMPRESSOR_TRAIN_MULTIPLE_STREAMS_AND_PRESSURES: _create_variable_speed_compressor_train_multiple_streams_and_pressures,
216-
EnergyModelType.SINGLE_SPEED_COMPRESSOR_TRAIN_COMMON_SHAFT: _create_single_speed_compressor_train,
217-
EnergyModelType.COMPRESSOR_WITH_TURBINE: _create_compressor_with_turbine,
218-
EnergyModelType.TURBINE: _create_turbine,
219-
}
220-
221-
222-
def _invalid_compressor_model_type(compressor_model_dto: Any) -> None:
223-
try:
224-
msg = f"Unsupported energy model type: {compressor_model_dto.typ}."
225-
logger.error(msg)
226-
raise TypeError(msg)
227-
except AttributeError as e:
228-
msg = "Unsupported energy model type."
229-
logger.exception(msg)
230-
raise TypeError(msg) from e
231-
232-
233-
def create_compressor_model(compressor_model_dto: CompressorModelDTO) -> CompressorModel:
234-
return facility_model_map.get(compressor_model_dto.typ, _invalid_compressor_model_type)( # type: ignore[operator]
235-
compressor_model_dto=compressor_model_dto,
236-
)

src/libecalc/domain/process/compressor/dto/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,3 @@
77
VariableSpeedCompressorTrain,
88
VariableSpeedCompressorTrainMultipleStreamsAndPressures,
99
)
10-
from .with_turbine import CompressorWithTurbine

src/libecalc/domain/process/compressor/dto/model_types.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/libecalc/domain/process/compressor/dto/with_turbine.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

src/libecalc/presentation/yaml/domain/reference_service.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
1+
import abc
12
from collections.abc import Iterable
23
from typing import Protocol
34

45
from libecalc.domain.infrastructure.energy_components.generator_set import GeneratorSetModel
56
from libecalc.domain.infrastructure.energy_components.legacy_consumer.tabulated import TabularEnergyFunction
6-
from libecalc.domain.process.compressor.core import CompressorModel
77
from libecalc.domain.process.pump.pump import PumpModel
88
from libecalc.dto import FuelType
9+
from libecalc.presentation.yaml.mappers.yaml_path import YamlPath
10+
from libecalc.presentation.yaml.yaml_types.facility_model.yaml_facility_model import YamlCompressorTabularModel
11+
from libecalc.presentation.yaml.yaml_types.models import (
12+
YamlCompressorChart,
13+
YamlCompressorWithTurbine,
14+
YamlFluidModel,
15+
YamlTurbine,
16+
)
17+
from libecalc.presentation.yaml.yaml_types.models.yaml_compressor_trains import (
18+
YamlSimplifiedVariableSpeedCompressorTrain,
19+
YamlSingleSpeedCompressorTrain,
20+
YamlVariableSpeedCompressorTrain,
21+
YamlVariableSpeedCompressorTrainMultipleStreamsAndPressures,
22+
)
923

1024

1125
class InvalidReferenceException(Exception):
@@ -17,13 +31,40 @@ def __init__(self, reference_type: str, reference: str, available_references: It
1731
super().__init__(f"Invalid {reference_type} reference '{reference}'. {available_message}")
1832

1933

34+
YamlCompressorModel = (
35+
YamlSimplifiedVariableSpeedCompressorTrain
36+
| YamlVariableSpeedCompressorTrain
37+
| YamlSingleSpeedCompressorTrain
38+
| YamlCompressorWithTurbine
39+
| YamlVariableSpeedCompressorTrainMultipleStreamsAndPressures
40+
| YamlCompressorTabularModel
41+
)
42+
43+
2044
class ReferenceService(Protocol):
45+
@abc.abstractmethod
46+
def get_yaml_path(self, reference: str) -> YamlPath: ...
47+
48+
@abc.abstractmethod
49+
def get_fluid(self, reference: str) -> YamlFluidModel: ...
50+
51+
@abc.abstractmethod
52+
def get_turbine(self, reference: str) -> YamlTurbine: ...
53+
54+
@abc.abstractmethod
55+
def get_compressor_chart(self, reference: str) -> YamlCompressorChart: ...
56+
57+
@abc.abstractmethod
2158
def get_fuel_reference(self, reference: str) -> FuelType: ...
2259

60+
@abc.abstractmethod
2361
def get_generator_set_model(self, reference: str) -> GeneratorSetModel: ...
2462

25-
def get_compressor_model(self, reference: str) -> CompressorModel: ...
63+
@abc.abstractmethod
64+
def get_compressor_model(self, reference: str) -> YamlCompressorModel: ...
2665

66+
@abc.abstractmethod
2767
def get_pump_model(self, reference: str) -> PumpModel: ...
2868

69+
@abc.abstractmethod
2970
def get_tabulated_model(self, reference: str) -> TabularEnergyFunction: ...

src/libecalc/presentation/yaml/mappers/component_mapper.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from libecalc.domain.infrastructure.energy_components.installation.installation import InstallationComponent
3232
from libecalc.domain.infrastructure.path_id import PathID
3333
from libecalc.domain.regularity import Regularity
34+
from libecalc.domain.resource import Resources
3435
from libecalc.dto import FuelType
3536
from libecalc.expression.expression import InvalidExpressionError
3637
from libecalc.presentation.yaml.domain.expression_time_series_cable_loss import ExpressionTimeSeriesCableLoss
@@ -181,9 +182,10 @@ def _resolve_fuel(
181182

182183

183184
class ConsumerMapper:
184-
def __init__(self, references: ReferenceService, target_period: Period):
185+
def __init__(self, resources: Resources, references: ReferenceService, target_period: Period):
185186
self.__references = references
186187
self._target_period = target_period
188+
self._resources = resources
187189

188190
def from_yaml_to_domain(
189191
self,
@@ -199,6 +201,8 @@ def from_yaml_to_domain(
199201
default_fuel: str | None = None,
200202
) -> Consumer | None:
201203
energy_usage_model_mapper = ConsumerFunctionMapper(
204+
configuration=configuration,
205+
resources=self._resources,
202206
references=self.__references,
203207
target_period=self._target_period,
204208
expression_evaluator=expression_evaluator,
@@ -311,10 +315,10 @@ def create_error(
311315

312316

313317
class GeneratorSetMapper:
314-
def __init__(self, references: ReferenceService, target_period: Period):
318+
def __init__(self, resources: Resources, references: ReferenceService, target_period: Period):
315319
self.__references = references
316320
self._target_period = target_period
317-
self.__consumer_mapper = ConsumerMapper(references=references, target_period=target_period)
321+
self.__consumer_mapper = ConsumerMapper(resources=resources, references=references, target_period=target_period)
318322

319323
def from_yaml_to_domain(
320324
self,
@@ -450,11 +454,13 @@ def create_error(message: str, key: str | None = None) -> ModelValidationError:
450454

451455

452456
class InstallationMapper:
453-
def __init__(self, references: ReferenceService, target_period: Period):
457+
def __init__(self, resources: Resources, references: ReferenceService, target_period: Period):
454458
self.__references = references
455459
self._target_period = target_period
456-
self.__generator_set_mapper = GeneratorSetMapper(references=references, target_period=target_period)
457-
self.__consumer_mapper = ConsumerMapper(references=references, target_period=target_period)
460+
self.__generator_set_mapper = GeneratorSetMapper(
461+
resources=resources, references=references, target_period=target_period
462+
)
463+
self.__consumer_mapper = ConsumerMapper(resources=resources, references=references, target_period=target_period)
458464

459465
def from_yaml_venting_emitter_to_domain(
460466
self,
@@ -675,13 +681,16 @@ def create_error(message: str, key: str | None = None) -> ModelValidationError:
675681
class EcalcModelMapper:
676682
def __init__(
677683
self,
684+
resources: Resources,
678685
references: ReferenceService,
679686
target_period: Period,
680687
expression_evaluator: ExpressionEvaluator,
681688
mapping_context: MappingContext,
682689
):
683690
self.__references = references
684-
self.__installation_mapper = InstallationMapper(references=references, target_period=target_period)
691+
self.__installation_mapper = InstallationMapper(
692+
resources=resources, references=references, target_period=target_period
693+
)
685694
self.__expression_evaluator = expression_evaluator
686695
self.__mapping_context = mapping_context
687696

0 commit comments

Comments
 (0)