This package contains base classes that are used to construct the models in Buildings.Fluid.Storage.
Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).
Name | Description |
---|---|
Buoyancy | Model to add buoyancy if there is a temperature inversion in the tank |
ThirdOrderStratifier | Model to reduce the numerical dissipation in a tank |
This model outputs a heat flow rate that can be added to fluid volumes in order to emulate buoyancy during a temperature inversion. For simplicity, this model does not compute a buoyancy induced mass flow rate, but rather a heat flow that has the same magnitude as the enthalpy flow associated with the buoyancy induced mass flow rate.
Extends from Buildings.BaseClasses.BaseIcon (Base icon).
Type | Name | Default | Description |
---|---|---|---|
Volume | V | Volume [m3] | |
Integer | nSeg | 2 | Number of volume segments |
Time | tau | Time constant for mixing [s] |
Type | Name | Description |
---|---|---|
HeatPort_a | heatPort[nSeg] | Heat input into the volumes |
model Buoyancy "Model to add buoyancy if there is a temperature inversion in the tank" extends Buildings.BaseClasses.BaseIcon; replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium model"; parameter Modelica.SIunits.Volume V "Volume"; parameter Integer nSeg(min=2) = 2 "Number of volume segments"; parameter Modelica.SIunits.Time tau(min=0) "Time constant for mixing";Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a[nSeg] heatPort "Heat input into the volumes"; Modelica.SIunits.HeatFlowRate[nSeg-1] Q_flow "Heat flow rate from segment i+1 to i"; protected parameter Medium.ThermodynamicState sta0 = Medium.setState_pTX(T=Medium.T_default, p=Medium.p_default, X=Medium.X_default[1:Medium.nXi]); parameter Modelica.SIunits.Density rho_nominal=Medium.density(sta0) "Density, used to compute fluid mass"; parameter Modelica.SIunits.SpecificHeatCapacity cp0=Medium.specificHeatCapacityCp(sta0) "Specific heat capacity"; parameter Real k(unit="W/K") = V*rho_nominal*cp0/tau/nSeg "Proportionality constant, since we use dT instead of dH"; Modelica.SIunits.TemperatureDifference dT[nSeg-1] "Temperature difference between adjoining volumes"; equation for i in 1:nSeg-1 loop dT[i] = heatPort[i+1].T-heatPort[i].T; Q_flow[i] = k*noEvent(smooth(1, if dT[i]>0 then dT[i]^2 else 0)); end for; heatPort[1].Q_flow = -Q_flow[1]; for i in 2:nSeg-1 loop heatPort[i].Q_flow = -Q_flow[i]+Q_flow[i-1]; end for; heatPort[nSeg].Q_flow = Q_flow[nSeg-1];end Buoyancy;
This model reduces the numerical dissipation that is introduced by the standard first-order upwind discretization scheme which is created when connecting fluid volumes in series.
The model is used in conjunction with Modelica.Fluid.Storage.Stratified. It computes a heat flux that needs to be added to each volume of Modelica.Fluid.Storage.Stratified in order to give the results that a third-order upwind discretization scheme (QUICK) would give.
The QUICK method can cause oscillations in the tank temperatures since the high order method introduces numerical dispersion. There are two ways to reduce the oscillations:
alpha
when adding the heat flux into the volume.
hOut[2]
and hOut[nSeg]
. Note: Using it requires nSeg>=4
.
Both approaches are implemented in the model.
The model is used by Buildings.Fluid.Storage.StratifiedEnhanced.
The model requires at least 4 fluid segments. Hence, set nSeg
to 4 or higher.
Extends from Buildings.BaseClasses.BaseIcon (Base icon).
Type | Name | Default | Description |
---|---|---|---|
MassFlowRate | m_flow_small | Small mass flow rate for regularization of zero flow [kg/s] | |
Integer | nSeg | Number of volume segments | |
Real | alpha | 0.5 | Under-relaxation coefficient (1: QUICK; 0: 1st order upwind) |
Type | Name | Description |
---|---|---|
HeatPort_a | heatPort[nSeg] | Heat input into the volumes |
input RealInput | m_flow | Mass flow rate from port a to port b |
input RealInput | H_flow[nSeg + 1] | Enthalpy flow between the volumes |
FluidPort_a | fluidPort[nSeg + 2] | Fluid port, needed to get pressure, temperature and species concentration |
model ThirdOrderStratifier "Model to reduce the numerical dissipation in a tank" extends Buildings.BaseClasses.BaseIcon; replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium model"; parameter Medium.MassFlowRate m_flow_small(min=0) "Small mass flow rate for regularization of zero flow"; parameter Integer nSeg(min=4) "Number of volume segments"; parameter Real alpha( min=0, max=1) = 0.5 "Under-relaxation coefficient (1: QUICK; 0: 1st order upwind)";Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a[nSeg] heatPort "Heat input into the volumes"; Modelica.Blocks.Interfaces.RealInput m_flow "Mass flow rate from port a to port b"; Modelica.Blocks.Interfaces.RealInput[nSeg + 1] H_flow "Enthalpy flow between the volumes"; Modelica.Fluid.Interfaces.FluidPort_a[nSeg + 2] fluidPort(redeclare each package Medium = Medium) "Fluid port, needed to get pressure, temperature and species concentration"; protected Modelica.SIunits.SpecificEnthalpy[nSeg + 1] hOut "Extended vector with new outlet enthalpies to reduce numerical dissipation (at the boundary between two volumes)"; Modelica.SIunits.SpecificEnthalpy[nSeg + 2] h "Extended vector with port enthalpies, needed to simplify loop"; Modelica.SIunits.HeatFlowRate Q_flow[nSeg] "Heat exchange computed using upwind third order discretization scheme"; // Modelica.SIunits.HeatFlowRate Q_flow_upWind // "Heat exchange computed using upwind third order discretization scheme"; //Used to test the energy conservation Real sig "Sign used to implement the third order upwind scheme without triggering a state event"; Real comSig "Sign used to implement the third order upwind scheme without triggering a state event"; parameter Medium.ThermodynamicState sta0=Medium.setState_pTX( T=Medium.T_default, p=Medium.p_default, X=Medium.X_default[1:Medium.nXi]); parameter Modelica.SIunits.SpecificHeatCapacity cp0= Medium.specificHeatCapacityCp(sta0) "Density, used to compute fluid volume"; equation assert(nSeg >= 4, " Number of segments of the enhanced stratified tank should be no less than 4 (nSeg>=4)."); // assign zero flow conditions at port fluidPort[:].m_flow = zeros(nSeg + 2); fluidPort[:].h_outflow = zeros(nSeg + 2); fluidPort[:].Xi_outflow = zeros(nSeg + 2, Medium.nXi); fluidPort[:].C_outflow = zeros(nSeg + 2, Medium.nC); // assign extended enthalpy vectors for i in 1:nSeg + 2 loop h[i] = inStream(fluidPort[i].h_outflow); end for; // Value that transitions between 0 and 1 as the flow reverses. sig = Modelica.Fluid.Utilities.regStep( m_flow, 1, 0, m_flow_small); // at surface between port_a and vol1 comSig = 1 - sig; // at surface between port_a and vol1 hOut[1] = sig*h[1] + comSig*h[2]; // at surface between vol[nSeg] and port_b hOut[nSeg + 1] = sig*h[nSeg + 1] + comSig*h[nSeg + 2]; // Pros: These two equations can further reduce the temperature overshoot by using the upwind // Cons: The minimum of nSeg hase to be 4 instead of 2. hOut[2] = sig*h[2] + comSig*h[3]; // at surface between vol1 and vol2 hOut[nSeg] = sig*h[nSeg] + comSig*h[nSeg + 1]; // at surface between vol[nSeg-1] and vol[nSeg] for i in 3:nSeg - 1 loop // at surface between vol[i-1] and vol[i] // QUICK method hOut[i] = 0.5*(h[i] + h[i + 1]) - comSig*0.125*(h[i + 2] + h[i] - 2*h[i + 1]) - sig*0.125*(h[i - 1] + h[i + 1] - 2*h[i]); // hOut[i] = 0.5*(h[i]+h[i+1]); // Central difference method end for; for i in 1:nSeg loop // difference between QUICK and UPWIND; index of H_flow is same as hOut Q_flow[i] = m_flow*(hOut[i + 1] - hOut[i]) - (H_flow[i + 1] - H_flow[i]); end for; // Q_flow_upWind = sum(Q_flow[i] for i in 1:nSeg); //Used to test the energy conservation for i in 1:nSeg loop // Add the difference back to the volume as heat flow. An under-relaxation is needed to reduce // oscillations caused by high order method heatPort[i].Q_flow = Q_flow[i]*alpha; end for;end ThirdOrderStratifier;