 
This package contains base classes that are used to construct the models in Buildings.Fluid.
Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).
| Name | Description | 
|---|---|
|  FlowModels | Flow models for pressure drop calculations | 
| IndexWater | Computes the index of the water substance | 
|  PartialResistance | Partial model for a hydraulic resistance | 
|  PartialThreeWayResistance | Flow splitter with partial resistance model at each port | 
This block computes the index that water has in the mass fraction vector X.
If water cannot be found, then the block writes an error message
and terminates the simulation.
| Type | Name | Default | Description | 
|---|---|---|---|
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium model | |
| Type | Name | Description | 
|---|---|---|
| replaceable package Medium | Medium model | |
block IndexWater "Computes the index of the water substance"
  replaceable package Medium =
      Modelica.Media.Interfaces.PartialCondensingGases "Medium model";
protected 
  parameter Integer i_w(fixed=false) "Index for water substance";
initial algorithm 
  // Compute index of species vector that carries the water vapor concentration
  i_w :=-1;
    for i in 1:Medium.nXi loop
      if Modelica.Utilities.Strings.isEqual(string1=Medium.substanceNames[i],
                                            string2="Water",
                                            caseSensitive=false) then
        i_w :=i;
      end if;
    end for;
  assert(i_w > 0, "Substance 'water' is not present in medium '"
                  + Medium.mediumName + "'.\n"
                  + "Change medium model to one that has 'water' as a substance.");
end IndexWater;
 
 Buildings.Fluid.BaseClasses.PartialResistance
Buildings.Fluid.BaseClasses.PartialResistance
 
Partial model for a flow resistance, possible with variable flow coefficient.
Models that extend this class need to implement an equation that relates
m_flow and dp, and they need to assign the parameter
m_flow_turbulent.
See for example Buildings.Fluid.FixedResistances.FixedResistanceDpM for a model that extends this base class.
Extends from Buildings.Fluid.Interfaces.PartialTwoPortInterface (Partial model transporting fluid between two ports without storing mass or energy).
| Type | Name | Default | Description | 
|---|---|---|---|
| replaceable package Medium | PartialMedium | Medium in the component | |
| MassFlowRate | m_flow_turbulent | Turbulent flow if |m_flow| >= m_flow_turbulent [kg/s] | |
| Nominal condition | |||
| MassFlowRate | m_flow_nominal | Nominal mass flow rate [kg/s] | |
| Pressure | dp_nominal | Pressure drop at nominal mass flow rate [Pa] | |
| Assumptions | |||
| Boolean | allowFlowReversal | system.allowFlowReversal | = true to allow flow reversal, false restricts to design direction (port_a -> port_b) | 
| 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 | 
| Boolean | from_dp | false | = true, use m_flow = f(dp) else dp = f(m_flow) | 
| Boolean | linearized | false | = true, use linear relation between m_flow and dp for any flow rate | 
| Diagnostics | |||
| Boolean | show_V_flow | false | = true, if volume flow rate at inflowing port is computed | 
| Boolean | show_T | false | = true, if actual temperature at port is computed (may lead to events) | 
| Type | Name | Description | 
|---|---|---|
| FluidPort_a | port_a | Fluid connector a (positive design flow direction is from port_a to port_b) | 
| FluidPort_b | port_b | Fluid connector b (positive design flow direction is from port_a to port_b) | 
partial model PartialResistance 
  "Partial model for a hydraulic resistance"
    extends Buildings.Fluid.Interfaces.PartialTwoPortInterface(
     show_T=false, show_V_flow=false,
     m_flow(start=0, nominal=m_flow_nominal_pos),
     dp(start=0, nominal=dp_nominal_pos),
     final m_flow_small = 1E-4*abs(m_flow_nominal));
  parameter Boolean from_dp = false 
    "= true, use m_flow = f(dp) else dp = f(m_flow)";
  parameter Modelica.SIunits.Pressure dp_nominal(displayUnit="Pa") 
    "Pressure drop at nominal mass flow rate";
  parameter Boolean homotopyInitialization = true "= true, use homotopy method";
  parameter Boolean linearized = false 
    "= true, use linear relation between m_flow and dp for any flow rate";
  parameter Modelica.SIunits.MassFlowRate m_flow_turbulent(min=0) 
    "Turbulent flow if |m_flow| >= m_flow_turbulent";
protected 
  parameter Medium.ThermodynamicState sta_default=
     Medium.setState_pTX(T=Medium.T_default, p=Medium.p_default, X=Medium.X_default);
  parameter Modelica.SIunits.DynamicViscosity eta_default=Medium.dynamicViscosity(sta_default) 
    "Dynamic viscosity, used to compute transition to turbulent flow regime";
protected 
  final parameter Modelica.SIunits.MassFlowRate m_flow_nominal_pos = abs(m_flow_nominal) 
    "Absolute value of nominal flow rate";
  final parameter Modelica.SIunits.Pressure dp_nominal_pos = abs(dp_nominal) 
    "Absolute value of nominal pressure";
equation 
  // Isenthalpic state transformation (no storage and no loss of energy)
  port_a.h_outflow = inStream(port_b.h_outflow);
  port_b.h_outflow = inStream(port_a.h_outflow);
  // Mass balance (no storage)
  port_a.m_flow + port_b.m_flow = 0;
  // Transport of substances
  port_a.Xi_outflow = inStream(port_b.Xi_outflow);
  port_b.Xi_outflow = inStream(port_a.Xi_outflow);
  port_a.C_outflow = inStream(port_b.C_outflow);
  port_b.C_outflow = inStream(port_a.C_outflow);
end PartialResistance;
 
 Buildings.Fluid.BaseClasses.PartialThreeWayResistance
Buildings.Fluid.BaseClasses.PartialThreeWayResistance
 
Partial model for flow resistances with three ports such as a flow mixer/splitter or a three way valve.
If dynamicBalance=true, then at the junction of the three flows,
a mixing volume will be present. This will introduce a dynamic energy and momentum
balance, which often breaks algebraic loops. 
The time constant of the mixing volume is determined by the parameter tau.
Extends from Buildings.Fluid.Interfaces.LumpedVolumeDeclarations (Declarations for lumped volumes).
| Type | Name | Default | Description | 
|---|---|---|---|
| replaceable package Medium | PartialMedium | Medium in the component | |
| PartialTwoPortInterface | res1 | redeclare Buildings.Fluid.In... | Partial model, to be replaced with a fluid component | 
| PartialTwoPortInterface | res2 | redeclare Buildings.Fluid.In... | Partial model, to be replaced with a fluid component | 
| PartialTwoPortInterface | res3 | redeclare Buildings.Fluid.In... | Partial model, to be replaced with a fluid component | 
| Dynamics | |||
| Equations | |||
| Dynamics | energyDynamics | Modelica.Fluid.Types.Dynamic... | Formulation of energy balance | 
| Dynamics | massDynamics | energyDynamics | Formulation of mass balance | 
| Boolean | dynamicBalance | true | Set to true to use a dynamic balance, which often leads to smaller systems of equations | 
| MassFlowRate | mDyn_flow_nominal | Nominal mass flow rate for dynamic momentum and energy balance [kg/s] | |
| Nominal condition | |||
| Time | tau | 10 | Time constant at nominal flow for dynamic energy and momentum balance [s] | 
| 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 | |||
| Boolean | from_dp | true | = true, use m_flow = f(dp) else dp = f(m_flow) | 
| Boolean | homotopyInitialization | true | = true, use homotopy method | 
| Type | Name | Description | 
|---|---|---|
| FluidPort_a | port_1 | |
| FluidPort_b | port_2 | |
| FluidPort_a | port_3 | 
partial model PartialThreeWayResistance "Flow splitter with partial resistance model at each port" extends Buildings.Fluid.Interfaces.LumpedVolumeDeclarations; outer Modelica.Fluid.System system "System properties";Modelica.Fluid.Interfaces.FluidPort_a port_1(redeclare package Medium = Medium, m_flow(min=if (portFlowDirection_1 == Modelica.Fluid.Types.PortFlowDirection.Entering) then 0.0 else -Modelica.Constants.inf, max=if (portFlowDirection_1 == Modelica.Fluid.Types.PortFlowDirection.Leaving) then 0.0 else Modelica.Constants.inf)); Modelica.Fluid.Interfaces.FluidPort_b port_2(redeclare package Medium = Medium, m_flow(min=if (portFlowDirection_2 == Modelica.Fluid.Types.PortFlowDirection.Entering) then 0.0 else -Modelica.Constants.inf, max=if (portFlowDirection_2 == Modelica.Fluid.Types.PortFlowDirection.Leaving) then 0.0 else Modelica.Constants.inf)); Modelica.Fluid.Interfaces.FluidPort_a port_3( redeclare package Medium=Medium, m_flow(min=if (portFlowDirection_3==Modelica.Fluid.Types.PortFlowDirection.Entering) then 0.0 else -Modelica.Constants.inf, max=if (portFlowDirection_3==Modelica.Fluid.Types.PortFlowDirection.Leaving) then 0.0 else Modelica.Constants.inf)); parameter Boolean from_dp = true "= true, use m_flow = f(dp) else dp = f(m_flow)"; parameter Boolean homotopyInitialization = true "= true, use homotopy method";replaceable Buildings.Fluid.Interfaces.PartialTwoPortInterface res1(redeclare package Medium = Medium, allowFlowReversal=true, homotopyInitialization=homotopyInitialization) "Partial model, to be replaced with a fluid component"; replaceable Buildings.Fluid.Interfaces.PartialTwoPortInterface res2(redeclare package Medium = Medium, allowFlowReversal=true, homotopyInitialization=homotopyInitialization) "Partial model, to be replaced with a fluid component"; replaceable Buildings.Fluid.Interfaces.PartialTwoPortInterface res3(redeclare package Medium = Medium, allowFlowReversal=true, homotopyInitialization=homotopyInitialization) "Partial model, to be replaced with a fluid component"; protected parameter Modelica.Fluid.Types.PortFlowDirection portFlowDirection_1=Modelica.Fluid.Types.PortFlowDirection.Bidirectional "Flow direction for port_1"; parameter Modelica.Fluid.Types.PortFlowDirection portFlowDirection_2=Modelica.Fluid.Types.PortFlowDirection.Bidirectional "Flow direction for port_2"; parameter Modelica.Fluid.Types.PortFlowDirection portFlowDirection_3=Modelica.Fluid.Types.PortFlowDirection.Bidirectional "Flow direction for port_3";public Buildings.Fluid.Delays.DelayFirstOrder vol( redeclare final package Medium = Medium, final nPorts=3, final tau=tau, final m_flow_nominal=mDyn_flow_nominal, 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 allowFlowReversal=true, final prescribedHeatFlowRate=false) if dynamicBalance "Fluid volume to break algebraic loop"; parameter Boolean dynamicBalance = true "Set to true to use a dynamic balance, which often leads to smaller systems of equations"; parameter Modelica.SIunits.Time tau=10 "Time constant at nominal flow for dynamic energy and momentum balance"; parameter Modelica.SIunits.MassFlowRate mDyn_flow_nominal "Nominal mass flow rate for dynamic momentum and energy balance"; equationconnect(port_1, res1.port_a); connect(res2.port_a, port_2); connect(res3.port_a, port_3); connect(res1.port_b,vol. ports[1]); connect(res2.port_b,vol. ports[2]); connect(res3.port_b,vol. ports[3]); if not dynamicBalance thenconnect(res1.port_b, res3.port_b); connect(res1.port_b, res2.port_b); end if;end PartialThreeWayResistance;