36 lines
2.3 KiB
Python
36 lines
2.3 KiB
Python
"""Component parameters, ports and output definitions; numerical equations execute in C."""
|
|
from __future__ import annotations
|
|
from collections.abc import Mapping
|
|
from app.simulation.core.base import AlgebraicComponent
|
|
from app.simulation.core.catalog import ComponentDisplaySpec, PortDisplaySpec
|
|
from app.simulation.core.metadata import ParameterDefinition
|
|
from app.simulation.core.medium import IdealGasMedium
|
|
from app.simulation.core.ports import PortDefinition
|
|
from app.simulation.core.port_computation import FLOW_SUPPLY
|
|
|
|
class Orifice(AlgebraicComponent):
|
|
"""Python port of ModelicaModels.Myorifice."""
|
|
MODEL_TYPE = 'orifice'
|
|
MODEL_VERSION = '1.0.0'
|
|
PORTS = (PortDefinition.pneumatic('port_a', nominal_role='inlet', computation=FLOW_SUPPLY), PortDefinition.pneumatic('port_b', nominal_role='outlet', computation=FLOW_SUPPLY))
|
|
PARAMETERS = (ParameterDefinition('K', 1e-05, label='流量系数', quantity='flow_coefficient', unit='kg/(s*Pa^0.5)', minimum=0.0), ParameterDefinition('opening', 1.0, label='开度', minimum=0.0, maximum=1.0))
|
|
RESULT_VARIABLES = ()
|
|
DISPLAY = ComponentDisplaySpec(label='孔板/阀门', library_id='experimental', category_id='flow', symbol='orifice', ports=(PortDisplaySpec('port_a', 'left', order=10), PortDisplaySpec('port_b', 'right', order=20)), order=40)
|
|
|
|
def __init__(self, name: str, opening: float=1.0, K: float=1e-05) -> None:
|
|
super().__init__(name=name)
|
|
self.set_parameter_values({'K': K, 'opening': opening})
|
|
self.opening = opening
|
|
self.K = K
|
|
self.port_a = self.register_declared_port('port_a')
|
|
self.port_b = self.register_declared_port('port_b')
|
|
|
|
@classmethod
|
|
def create(cls, *, name: str, medium: IdealGasMedium, parameters: Mapping[str, float]) -> Orifice:
|
|
return cls(name=name, opening=parameters['opening'], K=parameters['K'])
|
|
|
|
@property
|
|
def K_eff(self) -> float:
|
|
return self.K * max(self.opening, 0.001)
|
|
EQUATIONS = ({'id': '__MODEL__:mass_flow_balance', 'owner': 'component', 'ownerId': '__MODEL__', 'relation': 'sumToZero', 'variables': ['__MODEL__.port_a.m_flow', '__MODEL__.port_b.m_flow'], 'role': 'flow'}, {'id': '__MODEL__:pressure_flow_relation', 'owner': 'component', 'ownerId': '__MODEL__', 'relation': 'constitutive', 'variables': ['__MODEL__.port_a.p', '__MODEL__.port_b.p', '__MODEL__.port_a.m_flow'], 'role': 'flow'})
|