This package contains base classes that are used to construct the models in Buildings.Fluid.MixingVolumes.
Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).Name | Description |
---|---|
PartialMixingVolume | Partial mixing volume with inlet and outlet ports (flow reversal is allowed) |
This is a partial model of an instantaneously mixed volume. It is used as the base class for all fluid volumes of the package Buildings.Fluid.MixingVolumes.
If the model is operated in steady-state and has two fluid ports connected,
then the same energy and mass balance implementation is used as in
steady-state component models, i.e., the use of actualStream
is not used for the properties at the port.
For simple models that uses this model, see Buildings.Fluid.MixingVolumes.
Extends from Buildings.Fluid.Interfaces.LumpedVolumeDeclarations (Declarations for lumped volumes).
Type | Name | Default | Description |
---|---|---|---|
replaceable package Medium | PartialMedium | Medium in the component | |
Volume | V | Volume [m3] | |
Nominal condition | |||
MassFlowRate | m_flow_nominal | Nominal mass flow rate [kg/s] | |
Dynamics | |||
Equations | |||
Dynamics | energyDynamics | Modelica.Fluid.Types.Dynamic... | Formulation of energy balance |
Dynamics | massDynamics | energyDynamics | Formulation of mass balance |
Initialization | |||
AbsolutePressure | p_start | Medium.p_default | Start value of pressure [Pa] |
Temperature | T_start | Medium.T_default | Start value of temperature [K] |
MassFraction | X_start[Medium.nX] | Medium.X_default | Start value of mass fractions m_i/m [kg/kg] |
ExtraProperty | C_start[Medium.nC] | fill(0, Medium.nC) | Start value of trace substances |
ExtraProperty | C_nominal[Medium.nC] | fill(1E-2, Medium.nC) | Nominal value of trace substances. (Set to typical order of magnitude.) |
Advanced | |||
MassFlowRate | m_flow_small | 1E-4*abs(m_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
Boolean | homotopyInitialization | true | = true, use homotopy method |
Assumptions | |||
Boolean | allowFlowReversal | system.allowFlowReversal | = true to allow flow reversal in medium, false restricts to design direction (ports[1] -> ports[2]). Used only if model has two ports. |
Heat transfer | |||
Boolean | prescribedHeatFlowRate | false | Set to true if the model has a prescribed heat flow at its heatPort |
Type | Name | Description |
---|---|---|
VesselFluidPorts_b | ports[nPorts] | Fluid inlets and outlets |
HeatPort_a | heatPort | Heat port connected to outflowing medium |
partial model PartialMixingVolume "Partial mixing volume with inlet and outlet ports (flow reversal is allowed)" outer Modelica.Fluid.System system "System properties"; extends Buildings.Fluid.Interfaces.LumpedVolumeDeclarations; parameter Modelica.SIunits.MassFlowRate m_flow_nominal(min=0) "Nominal mass flow rate"; // Port definitions parameter Integer nPorts=0 "Number of ports"; parameter Modelica.SIunits.MassFlowRate m_flow_small(min=0) = 1E-4*abs(m_flow_nominal) "Small mass flow rate for regularization of zero flow"; parameter Boolean homotopyInitialization = true "= true, use homotopy method"; parameter Boolean allowFlowReversal = system.allowFlowReversal "= true to allow flow reversal in medium, false restricts to design direction (ports[1] -> ports[2]). Used only if model has two ports."; parameter Modelica.SIunits.Volume V "Volume"; parameter Boolean prescribedHeatFlowRate=false "Set to true if the model has a prescribed heat flow at its heatPort";Modelica.Fluid.Vessels.BaseClasses.VesselFluidPorts_b ports[nPorts]( redeclare each package Medium = Medium) "Fluid inlets and outlets"; Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort "Heat port connected to outflowing medium"; Modelica.SIunits.Temperature T "Temperature of the fluid"; Modelica.SIunits.Pressure p "Pressure of the fluid"; Modelica.SIunits.MassFraction Xi[Medium.nXi] "Species concentration of the fluid"; Medium.ExtraProperty C[Medium.nC](nominal=C_nominal) "Trace substance mixture content"; // Models for the steady-state and dynamic energy balance.protected Buildings.Fluid.Interfaces.StaticTwoPortConservationEquation steBal( sensibleOnly = true, redeclare final package Medium=Medium, final m_flow_nominal = m_flow_nominal, final allowFlowReversal = allowFlowReversal, final m_flow_small = m_flow_small, final homotopyInitialization = homotopyInitialization) if useSteadyStateTwoPort "Model for steady-state balance if nPorts=2"; Buildings.Fluid.Interfaces.ConservationEquation dynBal( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final massDynamics=massDynamics, final p_start=p_start, final T_start=T_start, final X_start=X_start, final C_start=C_start, final C_nominal=C_nominal, final fluidVolume = V, m(start=V*rho_start), U(start=V*rho_start*Medium.specificInternalEnergy( state_start)), nPorts=nPorts) if not useSteadyStateTwoPort "Model for dynamic energy balance"; // Density at medium default values, used to compute the size of control volumes parameter Modelica.SIunits.Density rho_default=Medium.density( state=state_default) "Density, used to compute fluid mass"; // Density at start values, used to compute initial values and start guesses parameter Modelica.SIunits.Density rho_start=Medium.density( state=state_start) "Density, used to compute start and guess values"; final parameter Medium.ThermodynamicState state_default = Medium.setState_pTX( T=Medium.T_default, p=Medium.p_default, X=Medium.X_default[1:Medium.nXi]) "Medium state at default values"; final parameter Medium.ThermodynamicState state_start = Medium.setState_pTX( T=T_start, p=p_start, X=X_start[1:Medium.nXi]) "Medium state at start values"; final parameter Boolean useSteadyStateTwoPort=(nPorts == 2) and prescribedHeatFlowRate and ( energyDynamics == Modelica.Fluid.Types.Dynamics.SteadyState) and ( massDynamics == Modelica.Fluid.Types.Dynamics.SteadyState) and ( substanceDynamics == Modelica.Fluid.Types.Dynamics.SteadyState) and ( traceDynamics == Modelica.Fluid.Types.Dynamics.SteadyState) "Flag, true if the model has two ports only and uses a steady state balance"; Modelica.SIunits.HeatFlowRate Q_flow "Heat flow across boundaries or energy source/sink"; // Outputs that are needed to assign the medium properties Modelica.Blocks.Interfaces.RealOutput hOut_internal(unit="J/kg") "Internal connector for leaving temperature of the component"; Modelica.Blocks.Interfaces.RealOutput XiOut_internal[Medium.nXi](each unit="1") "Internal connector for leaving species concentration of the component"; Modelica.Blocks.Interfaces.RealOutput COut_internal[Medium.nC](each unit="1") "Internal connector for leaving trace substances of the component"; equation /////////////////////////////////////////////////////////////////////////// // asserts if not allowFlowReversal then assert(ports[1].m_flow > -m_flow_small, "Model has flow reversal, but the parameter allowFlowReversal is set to false. m_flow_small = " + String(m_flow_small) + " ports[1].m_flow = " + String(ports[1].m_flow) + " "); end if; // actual definition of port variables // If the model computes the energy and mass balances as steady-state, // and if it has only two ports, // then we use the same base class as for all other steady state models. if useSteadyStateTwoPort thenconnect(steBal.port_a, ports[1]); connect(steBal.port_b, ports[2]); connect(hOut_internal, steBal.hOut); connect(XiOut_internal, steBal.XiOut); connect(COut_internal, steBal.COut); elseconnect(dynBal.ports, ports); connect(hOut_internal, dynBal.hOut); connect(XiOut_internal, dynBal.XiOut); connect(COut_internal, dynBal.COut); end if; // Medium properties p = if nPorts > 0 then ports[1].p else p_start; T = Medium.temperature_phX(p=p, h=hOut_internal, X=cat(1,Xi,{1-sum(Xi)})); Xi = XiOut_internal; C = COut_internal; // Port properties heatPort.T = T; heatPort.Q_flow = Q_flow;end PartialMixingVolume;