From 4c4c23292614007fe05d454a00d0d85b25a89493 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 29 Nov 2022 19:16:20 +0100 Subject: [PATCH 01/34] add pool model (incl. example) #1407 --- AixLib/Fluid/Pool.mo | 890 ++++++++++++++++++ AixLib/Fluid/Pools/BaseClasses.mo | 255 +++++ AixLib/Fluid/Pools/Example.mo | 88 ++ AixLib/Fluid/Pools/IndoorSwimmingPool.mo | 545 +++++++++++ AixLib/Fluid/Pools/package.order | 3 + AixLib/Fluid/package.order | 1 + .../Images/Fluid/Pools/icon_schwimmbecken.jpg | Bin 0 -> 38059 bytes 7 files changed, 1782 insertions(+) create mode 100644 AixLib/Fluid/Pool.mo create mode 100644 AixLib/Fluid/Pools/BaseClasses.mo create mode 100644 AixLib/Fluid/Pools/Example.mo create mode 100644 AixLib/Fluid/Pools/IndoorSwimmingPool.mo create mode 100644 AixLib/Fluid/Pools/package.order create mode 100644 AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg diff --git a/AixLib/Fluid/Pool.mo b/AixLib/Fluid/Pool.mo new file mode 100644 index 0000000000..fbe61d3d96 --- /dev/null +++ b/AixLib/Fluid/Pool.mo @@ -0,0 +1,890 @@ +within AixLib.Fluid; +package Pool + model IndoorSwimmingPool + parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord poolParam + "Choose setup for this pool" annotation (choicesAllMatching=true); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + // Water transfer coefficients according to VDI 2089 Blatt 1 + parameter Real beta_nonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); + parameter Real beta_cover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" + annotation (Dialog(group="Water transfer coefficients")); + parameter Real beta_wavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" + annotation (Dialog(group="Water transfer coefficients")); + + // Parameter and variables for evaporation + constant Modelica.Units.SI.SpecificHeatCapacity R_D=461.52 + "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) + final parameter Modelica.Units.SI.SpecificEnergy h_vapor= + AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.T_pool) + "Latent heat of evaporating water"; + Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) + "mass flow rate between pool water and air due to evaporation"; + Modelica.Units.SI.Pressure psat_T_pool= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + poolWater.T) "Saturation pressure at pool temperature"; + Modelica.Units.SI.Pressure psat_T_Air= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + TAir) "Saturation pressure at air temperature"; + Real phi "Relative humidity"; + + // Pump + parameter Modelica.Units.SI.Pressure pumpHead=170000 + "Expected average flow resistance of water cycle"; + + // Pool circulation flow rate + final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= + poolParam.V_flow_nominal*rhoWater_default + "Nominal circulation mass flow rate to the pool"; + final parameter Modelica.Units.SI.MassFlowRate m_flow_partial= + poolParam.V_flow_partial*rhoWater_default + "Partial circulation mass flow rate to pool during non operating hours"; + Modelica.Units.SI.MassFlowRate m_flow_toPool(start=0.0) + "Actual circulation mass flow rate to the pool"; + + // Fresh water and water recycling + final parameter Modelica.Units.SI.Efficiency eps=if poolParam.use_HRS then + poolParam.efficiencyHRS else 0; + Modelica.Units.SI.MassFlowRate m_flow_freshWater(start=0.0) + "Mass flow of fresh water supplied to pool circulation system"; + + // Convection and Radiation at pool water surface + parameter Modelica.Units.SI.CoefficientOfHeatTransfer alpha_Air=3.5 + "Coefficient of heat transfer between the water surface and the room air"; + // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area + parameter Real epsilon = 0.9*0.95 + "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; + + AixLib.Fluid.MixingVolumes.MixingVolume Storage( + redeclare package Medium = WaterMedium, + T_start=poolParam.T_pool, + m_flow_nominal=m_flow_nominal, + V=poolParam.V_storage, + nPorts=4) annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); + + AixLib.Fluid.Sources.Boundary_pT Sinc( + redeclare package Medium = WaterMedium, nPorts=1) + annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); + AixLib.Fluid.MixingVolumes.MixingVolume poolWater( + redeclare package Medium = WaterMedium, + T_start=poolParam.T_pool, + m_flow_nominal=m_flow_nominal, + V=poolParam.V_pool, + nPorts=3) + annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); + + Modelica.Blocks.Sources.RealExpression PoolWater(y=m_flow_toPool) + annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); + Modelica.Blocks.Interfaces.RealOutput QPool if poolParam.use_idealHeater + "Heat flow rate to maintain the pool at the set temperature" annotation ( + Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( + extent={{98,-16},{118,4}}))); + + AixLib.Fluid.Movers.BaseClasses.IdealSource Evaporation( + redeclare package Medium = WaterMedium, + m_flow_small=0.00001, + control_m_flow=true) annotation (Placement(transformation( + extent={{6,-6},{-6,6}}, + rotation=0, + origin={-30,26}))); + Modelica.Blocks.Sources.RealExpression m_Eavporation(y=m_flow_evap) + annotation (Placement(transformation(extent={{9,-9},{-9,9}}, + rotation=180, + origin={-81,41}))); + AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( + redeclare package Medium1 = WaterMedium, + redeclare package Medium2 = WaterMedium, + m1_flow_nominal=poolParam.m_flow_out*1.5, + m2_flow_nominal=poolParam.m_flow_out, + dp1_nominal(displayUnit="bar") = 100000, + dp2_nominal(displayUnit="bar") = 100000, + eps=eps) + annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=90, + origin={-33,-73}))); + Modelica.Blocks.Interfaces.RealInput openingHours + "Input profile for opening hours" + annotation (Placement(transformation(extent={{-118,-70},{-94,-46}}), + iconTransformation(extent={{-118,-70},{-94,-46}}))); + Modelica.Blocks.Interfaces.RealInput persons "Input profile for persons" + annotation (Placement(transformation(extent={{-118,-38},{-92,-12}}), + iconTransformation(extent={{-118,-38},{-92,-12}}))); + + Modelica.Blocks.Interfaces.RealInput TAir( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of the surrounding room air" annotation ( + Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}),iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}))); + Modelica.Blocks.Interfaces.RealInput X_w "Absolute humidty of the room Air" annotation (Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}), iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}))); + + AixLib.ThermalZones.ReducedOrder.Multizone.BaseClasses.AbsToRelHum absToRelHum + "Calculation of the relative humidity of the room air " annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=-90, + origin={-59,77}))); + + Modelica.Blocks.Sources.RealExpression FreshWater(y=m_flow_freshWater) annotation (Placement(transformation(extent={{-62,-78}, + {-48,-62}}))); + + AixLib.Fluid.Sources.Boundary_pT SincEvaporation( + redeclare package Medium = WaterMedium, nPorts=1) annotation (Placement(transformation(extent={{6,-6},{ + -6,6}}, + rotation=180, + origin={-64,26}))); + + Modelica.Fluid.Interfaces.FluidPort_b fromPool(redeclare package Medium = + WaterMedium) if poolParam.use_idealHeater == false + "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-64},{110,-44}}), + iconTransformation(extent={{90,-64},{110,-44}}))); + + Modelica.Fluid.Interfaces.FluidPort_a toPool(redeclare package Medium = + WaterMedium) if poolParam.use_idealHeater == false + "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-40},{110,-20}}), + iconTransformation(extent={{90,-40},{110,-20}}))); + + .AixLib.Fluid.Pool.BaseClasses.waveMachine waveMachine( + h_wave=poolParam.h_wave, + w_wave=poolParam.w_wave, + wavePool_startTime=poolParam.wavePool_startTime, + wavePool_period=poolParam.wavePool_period, + wavePool_width=poolParam.wavePool_width) if poolParam.use_wavePool + annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPoolSurface + "Air Temperature in Zone" annotation (Placement(transformation(extent={{56,86}, + {80,110}}), + iconTransformation(extent={{64,94},{84,114}}))); + + AixLib.Utilities.Interfaces.RadPort radPoolSurface + "Mean Radiation Temperature of surrounding walls" annotation (Placement( + transformation( + extent={{-8,-9},{8,9}}, + rotation=-90, + origin={39,100}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=-90, + origin={30,100}))); + + Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( + final Gr=epsilon*poolParam.A_pool) + "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( + extent={{-7,-7},{7,7}}, + rotation=90, + origin={39,73}))); + + Modelica.Thermal.HeatTransfer.Components.Convection convWaterSurface + "Convection at the watersurface" annotation (Placement(transformation( + extent={{-7,7},{7,-7}}, + rotation=90, + origin={67,75}))); + + Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=alpha_Air*poolParam.A_pool) + "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, + {82,84}}))); + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, + {12,68}}))); + + Modelica.Blocks.Math.Gain hEvapLatentHeatGain(final k=h_vapor) + "Calculation of heat flow rate due to evaporation" annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-44,52}))); + + Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater + "Flow rate of added fresh water to the pool and water treatment system" annotation (Placement(transformation(extent={{98,-102}, + {118,-82}}), + iconTransformation(extent={{98,-102},{118,-82}}))); + + AixLib.Fluid.Pool.BaseClasses.HeatTransferConduction heatTransferConduction( + AInnerPoolWall=poolParam.AInnerPoolWall, + APoolWallWithEarthContact=poolParam.APoolWallWithEarthContact, + APoolFloorWithEarthContact=poolParam.APoolFloorWithEarthContact, + AInnerPoolFloor=poolParam.AInnerPoolFloor, + hConWaterHorizontal=poolParam.hConWaterHorizontal, + hConWaterVertical=poolParam.hConWaterVertical, + PoolWall=poolParam.PoolWallParam) + "Model to depict the heat flow rate through the pool walls to the bordering room/soil" + annotation (Placement(transformation(extent={{64,32},{80,48}}))); + + Modelica.Blocks.Math.Gain minus1Gain(final k=-1) annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-20,60}))); + + Modelica.Blocks.Interfaces.RealOutput QEvap(final quantity="HeatFlowRate", + final unit="W") + "Heat needed to compensate losses" annotation (Placement(transformation(extent={{-92,46}, + {-122,76}}), + iconTransformation(extent={{-94,46},{-114,66}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of Soil" annotation (Placement( + transformation( + extent={{-13,-13},{13,13}}, + rotation=180, + origin={105,49}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=180, + origin={103,47}))); + + Modelica.Blocks.Interfaces.RealOutput PPool( + final quantity="Power", + final unit="W") + "Output eletric energy needed for pool operation" annotation (Placement(transformation(extent={{98,-86}, + {118,-66}}), + iconTransformation(extent={{98,-86},{118,-66}}))); + + Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavePool then 2 else 1) + "Add electric power of pump and the optional wave pool" + annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); + Sources.MassFlowSource_T boundary( + redeclare package Medium = WaterMedium, + use_m_flow_in=true, + T=283.15, + nPorts=1) + annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); + Modelica.Blocks.Sources.RealExpression ReadPoolTemp(y=poolWater.T) + annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=180, + origin={72,16}))); + Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" + annotation (Placement(transformation(extent={{98,6},{118,26}}), + iconTransformation(extent={{98,6},{118,26}}))); + + final parameter Modelica.Units.SI.Density rhoWater_default= + WaterMedium.density_pTX( + p=WaterMedium.p_default, + T=273.15 + 30, + X=WaterMedium.X_default) "Default medium density"; + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater + annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); + Controls.Continuous.LimPID PI( + k=1000, + yMax=100000000, + yMin=0, + controllerType=Modelica.Blocks.Types.SimpleController.PI, + Ti=5, + Td=0.1) annotation(Placement(transformation(extent={{-4,-4}, + {4,4}}, + rotation=180, + origin={66,-16}))); + Modelica.Blocks.Sources.RealExpression SetTemperature(y=poolParam.T_pool) + if poolParam.use_idealHeater + annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); + Controls.Continuous.LimPID PI1( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.1, + Ti=5, + yMax=m_flow_nominal/0.9, + yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); + Movers.FlowControlled_m_flow CirculationPump( + redeclare package Medium = WaterMedium, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + T_start=poolParam.T_pool, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + redeclare Movers.Data.Generic per, + inputType=AixLib.Fluid.Types.InputType.Continuous, + addPowerToMedium=false, + nominalValuesDefineDefaultPressureCurve=true, + dp_nominal=pumpHead, + m_flow_start=m_flow_nominal) + annotation (Placement(transformation(extent={{-8,-8},{8,8}}, + rotation=0, + origin={0,-68}))); + Sensors.MassFlowRate senMasFlo(redeclare package Medium = + WaterMedium, allowFlowReversal=false) + annotation (Placement(transformation(extent={{-6,-6},{6,6}}, + rotation=0, + origin={22,-68}))); + FixedResistances.PressureDrop res( + redeclare package Medium = WaterMedium, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + show_T=false, + from_dp=false, + dp_nominal=pumpHead - poolParam.dpHeatExchangerPool, + homotopyInitialization=true, + linearized=false, + deltaM=0.3) + annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); + equation + // Fresh water and water recycling + if poolParam.use_waterRecycling then + m_flow_freshWater=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); + else + m_flow_freshWater=poolParam.m_flow_out + m_flow_evap; + end if; + + // Pool circulation flow rate + if poolParam.use_partialLoad then + if openingHours > 0 then + m_flow_toPool = m_flow_nominal; + else + m_flow_toPool = m_flow_partial; + end if; + else + m_flow_toPool = m_flow_nominal; + end if; + + // Evaporation according to VDI 2089 sheet 1, formula (1) + phi=absToRelHum.relHum; + if psat_T_pool-phi*psat_T_Air<0 then + m_flow_evap=0.0; + else + if openingHours > 0 then + if persons > 0 then + m_flow_evap =persons*(poolParam.beta_inUse/(R_D*0.5*(poolWater.T + + TAir))*(psat_T_pool - phi*psat_T_Air)*poolParam.A_pool); + else + m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; + end if; + else + if poolParam.use_poolCover then + m_flow_evap = beta_cover /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; + else + m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; + end if; + end if; + end if; + + if poolParam.use_idealHeater then + connect(res.port_b, poolWater.ports[1]) annotation (Line(points={{44,-68}, + {54,-68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, + color={0,127,255})); + else + connect(poolWater.ports[1], toPool) annotation (Line( + points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + connect(fromPool, res.port_b) annotation (Line( + points={{100,-54},{78,-54},{78,-68},{44,-68}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + end if; + + connect(poolWater.ports[3], Evaporation.port_a) annotation (Line(points={{2.66667, + -10},{2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); + + connect(Storage.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, + -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); + connect(Storage.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, + -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); + connect(Storage.ports[4], CirculationPump.port_a) annotation (Line(points={{-26.5, + -56},{-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); + connect(Storage.ports[1], poolWater.ports[2]) annotation (Line(points={{-29.5, + -56},{-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127, + 255})); + + connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, + {-62,88},{-67,88},{-67,103}},color={0,0,127})); + connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, + {-56,88},{-29,88},{-29,103}}, color={0,0,127})); + connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, + {-30,-88},{22,-88}}, color={0,127,255})); + connect(Evaporation.port_b, SincEvaporation.ports[1]) + annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); + connect(m_Eavporation.y, Evaporation.m_flow_in) annotation (Line(points={{-71.1, + 41},{-26.4,41},{-26.4,30.8}}, color={0,0,127})); + connect(radWaterSurface.port_b, radPoolSurface) annotation (Line(points={{39,80}, + {39,100}}, color={191,0,0})); + connect(convWaterSurface.fluid, convPoolSurface) annotation (Line(points={{67,82}, + {68,82},{68,98}}, color={191,0,0})); + connect(convWaterSurface.solid, poolWater.heatPort) annotation (Line(points={{67,68}, + {66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); + connect(radWaterSurface.port_a, poolWater.heatPort) annotation (Line(points={{39,66}, + {38,66},{38,0},{14,0}}, color={191,0,0})); + connect(preHeatFlowEvapLoss.port, poolWater.heatPort) annotation (Line(points={{12,60}, + {26,60},{26,0},{14,0}}, color={191,0,0})); + connect(m_Eavporation.y, hEvapLatentHeatGain.u) annotation (Line(points={{-71.1, + 41},{-58,41},{-58,52},{-48.8,52}}, + color={0,0,127})); + connect(heatTransferConduction.heatport_a, poolWater.heatPort) annotation ( + Line(points={{63.76,39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); + connect(hEvapLatentHeatGain.y, minus1Gain.u) annotation (Line(points={{-39.6, + 52},{-34,52},{-34,60},{-24.8,60}}, color={0,0,127})); + connect(hEvapLatentHeatGain.y, QEvap) annotation (Line(points={{-39.6,52},{-34, + 52},{-34,61},{-107,61}}, color={0,0,127})); + connect(heatTransferConduction.TSoil, TSoil) annotation (Line(points={{80.48,42.88}, + {82,42.88},{82,49},{105,49}}, color={0,0,127})); + connect(convPoolSurface, convPoolSurface) annotation (Line(points={{68,98},{68, + 98}}, color={191,0,0})); + connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, + {74,75}}, color={0,0,127})); + connect(minus1Gain.y, preHeatFlowEvapLoss.Q_flow) annotation (Line(points={{-15.6, + 60},{-4,60}}, color={0,0,127})); + + connect(boundary.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, + {-40,-78},{-36,-78}}, color={0,127, + 255})); + connect(waveMachine.open, openingHours) annotation (Line(points={{-93.28, + -87},{-98,-87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, + color={0,0,127})); + connect(ReadPoolTemp.y, T_Pool) + annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); + + connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, + {54,-12},{48,-12}}, color={0,0,127})); + connect(idealHeater.port, poolWater.heatPort) annotation (Line(points={{32,-12}, + {24,-12},{24,0},{14,0}}, color={191,0,0})); + connect(SetTemperature.y, PI.u_s) + annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); + connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, + -16}}, color={0,0,127})); + connect(boundary.m_flow_in, FreshWater.y) annotation (Line(points={{-53.2,-83.2}, + {-60,-83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); + connect(FreshWater.y, MFlowFreshWater) annotation (Line(points={{-47.3,-70},{-42, + -70},{-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, + color={0,0,127})); + connect(Evaporation.port_b, Evaporation.port_a) annotation (Line( + points={{-36,26},{-30,26},{-24,26}}, + color={0,127,255}, + smooth=Smooth.Bezier)); + connect(CirculationPump.port_b, senMasFlo.port_a) + annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); + connect(senMasFlo.port_b, res.port_a) + annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); + connect(PI1.y, CirculationPump.m_flow_in) + annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); + connect(PI1.u_s, PoolWater.y) + annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); + connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, + {13,-58},{13,-55}}, color={0,0,127})); + + connect(elPower.u[1], CirculationPump.P) annotation (Line(points={{72,-76},{62, + -76},{62,-60.8},{8.8,-60.8}}, color={0,0,127})); + connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); + connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, + -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, + color={0,0,127})); + + connect(PI.u_m, ReadPoolTemp.y) annotation (Line(points={{66,-11.2},{66,4},{92, + 4},{92,16},{83,16}}, color={0,0,127})); + annotation (Line( + points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), + Line(points={{18.4,-40}, + {18,-40},{18,-44},{-100,-44}}, color={0,127,255}), + Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-50,82}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-60,80})), + Icon(coordinateSystem(preserveAspectRatio=false), + graphics={ + Rectangle( + extent={{98,98},{-98,-98}}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Bitmap(extent={{-94,-150},{96,58}}, fileName="modelica://AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg")}), + Diagram(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-100,2},{100,100}}, + lineColor={0,128,255}, + fillColor={170,213,255}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,12},{-6,0}}, + textColor={85,85,255}, + textStyle={TextStyle.Bold}, + horizontalAlignment=TextAlignment.Left, + textString="Heat and mass exchange +at pool surface or pool walls +"), Rectangle( + extent={{-66,-98},{100,-2}}, + lineColor={0,0,127}, + fillColor={155,195,232}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Rectangle( + extent={{-100,-98},{-68,-2}}, + lineColor={95,95,95}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,-6},{-72,-14}}, + textColor={95,95,95}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Pool +operation"), + Text( + extent={{-64,-2},{-22,-24}}, + textColor={0,0,127}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Water treatment +circuit +")})); + end IndoorSwimmingPool; + + package BaseClasses + extends Modelica.Icons.BasesPackage; + + model HeatTransferConduction + "Heat transfer due to conduction through pool walls" + parameter Modelica.Units.SI.Area AInnerPoolWall; + parameter Modelica.Units.SI.Area APoolWallWithEarthContact; + parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; + parameter Modelica.Units.SI.Area AInnerPoolFloor; + + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; + + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter + "Generate Heat Flow for earth contact" annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={74,-28}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport_a + "Inlet for heattransfer" annotation (Placement(transformation(extent={{-116, + -14},{-90,12}}), + iconTransformation(extent={{-116,-14},{-90,12}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil "Temperature of Soil" annotation (Placement(transformation(extent={{130,-48}, + {90,-8}}), + iconTransformation(extent={{126,16},{86,56}}))); + + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolFloor( + A=AInnerPoolFloor, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-10,-34},{18,-10}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( + hCon_const=hConWaterHorizontal, + A=AInnerPoolFloor, + calcMethod=3, + surfaceOrientation=1) + annotation (Placement(transformation( + origin={-48,-22}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( + hCon_const=hConWaterVertical, + A=APoolWallWithEarthContact, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-54,40}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolWallWithEarthContact( + A=APoolWallWithEarthContact, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-6,26},{22,54}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( + hCon_const=hConWaterHorizontal, + A=APoolFloorWithEarthContact, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-52,-60}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolFloorWithEarthContact( + A=APoolFloorWithEarthContact, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-10,-72},{14,-50}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow + prescribedHeatFlow1 "Generate Heat Flow for earth contact" + annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={44,12}))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolWall( + A=AInnerPoolWall, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-6,64},{22,92}}))); + Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) + "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" + annotation (Placement(transformation(extent={{96,2},{76,22}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( + hCon_const=hConWaterVertical, + A=AInnerPoolWall, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-54,78}, + extent={{-10,-10},{10,10}}, + rotation=180))); + replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall + annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); + equation + connect(HeatFlowOuter.T, TSoil) + annotation (Line(points={{81.2,-28},{110,-28}}, color={0,0,127})); + connect(heatport_a, heatport_a) + annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) + annotation (Line(points={{-38,-22},{-10,-22}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( + Line(points={{14,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) + annotation (Line(points={{-10,-61},{-10,-60},{-42,-60}}, color={191,0,0})); + connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{22,78},{30,78},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( + points={{-64,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( + points={{-58,-22},{-72,-22},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( + points={{-62,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) + annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); + connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( + points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); + connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{18,-22},{30,-22},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) + annotation (Line(points={{-44,40},{-6,40}}, color={191,0,0})); + connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( + Line(points={{-6,78},{-44,78}}, color={191,0,0})); + connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( + points={{-64,78},{-72,78},{-72,-1},{-103,-1}},color={191,0,0})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-80,58},{28,-26}}, + lineColor={28,108,200}, + fillColor={28,108,200}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{28,68},{48,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Rectangle( + extent={{-86,-26},{30,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Polygon( + points={{-16,-10},{-4,6},{58,-52},{46,-62},{-16,-10}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Polygon( + points={{32,-68},{36,-66},{62,-38},{76,-78},{32,-68}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0})}), + Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

This model is a base model to calculate the heat transfer through pool walls. The pool walls are sorted by: vertical walls with earth contact, pool floor with earth contact and the sum of walls and pool floor without earth contact.

+")); + end HeatTransferConduction; + + model waveMachine "Calculate energy demands of a wave machine" + + parameter Modelica.Units.SI.Length h_wave "Height of generated wave"; + parameter Modelica.Units.SI.Length w_wave + "Width of wave machine outlet/of generated wave"; + parameter Modelica.Units.SI.Time wavePool_startTime + "Start time of first wave cycle"; + parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; + parameter Real wavePool_width "Length of wave generation within cycling period"; + + Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) + "If input = 1, then true, else no waves generated" + annotation (Placement(transformation(extent={{-58,-8},{-42,8}}))); + Modelica.Blocks.Tables.CombiTable1Dv tablePWave( + y(unit="W/m"), + tableOnFile=false, + table=[0,0; 0.7,3500; 0.9,6000; 1.3,12000], + extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) + "Estimate consumed power per width to generate wave of a certain heigth; " + annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); + Modelica.Blocks.Sources.RealExpression get_h_wave(y=h_wave) + "Get height of generated wave" + annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); + Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" + annotation (Placement(transformation(extent={{-136,-20},{-96,20}}))); + Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") + "Power consumption of wave machine" + annotation (Placement(transformation(extent={{96,-10},{116,10}}))); + Modelica.Blocks.Math.Gain multiply(k=w_wave) "Multply by width of wave" + annotation (Placement(transformation(extent={{0,52},{16,68}}))); + Modelica.Blocks.Sources.Constant zero(k=0) + "no output if wave machine is off" + annotation (Placement(transformation(extent={{-14,-78},{0,-64}}))); + Modelica.Blocks.Logical.Switch switchWaveMachine + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); + Modelica.Blocks.Logical.And and1 + annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); + Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( + width=wavePool_width, + period=wavePool_period, + startTime=wavePool_startTime) + annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); + equation + connect(get_h_wave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, + 60}}, color={0,0,127})); + connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, + color={0,0,127})); + connect(open, useWavePool.u) + annotation (Line(points={{-116,0},{-59.6,0}}, color={0,0,127})); + connect(switchWaveMachine.y, PWaveMachine) annotation (Line(points={{81,0},{ + 106,0}}, color={0,0,127})); + connect(multiply.y, switchWaveMachine.u1) + annotation (Line(points={{16.8,60},{42,60},{42,8},{58,8}}, + color={0,0,127})); + connect(zero.y, switchWaveMachine.u3) annotation (Line(points={{0.7,-71},{52,-71}, + {52,-8},{58,-8}}, color={0,0,127})); + connect(PWaveMachine, PWaveMachine) annotation (Line( + points={{106,0},{101,0},{101,0},{106,0}}, + color={0,0,127}, + smooth=Smooth.Bezier)); + connect(useWavePool.y, and1.u1) + annotation (Line(points={{-41.2,0},{-10,0}}, color={255,0,255})); + connect(and1.y, switchWaveMachine.u2) + annotation (Line(points={{13,0},{58,0}}, color={255,0,255})); + connect(wavePoolCycle.y, and1.u2) annotation (Line(points={{-39,-40},{-24,-40}, + {-24,-8},{-10,-8}}, color={255,0,255})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}), + Line( + points={{-98,0},{-52,62},{-2,-24},{50,60},{100,-2}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-18},{-52,44},{-2,-42},{50,42},{98,-20}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-36},{-52,26},{-2,-60},{50,24},{96,-36}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1)}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

Model to calculate the energy demand of a wavemachine. Based on values of:

+ +")); + end waveMachine; + end BaseClasses; + + package Example + extends Modelica.Icons.ExamplesPackage; + + model IndoorSwimmingPool + extends Modelica.Icons.Example; + Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater + "Flow rate of added fresh water to the pool and water treatment system" + annotation (Placement(transformation(extent={{98,-96},{126,-68}}), + iconTransformation(extent={{98,-96},{126,-68}}))); + .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= + AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool(), + redeclare package WaterMedium = WaterMedium) + annotation (Placement(transformation(extent={{-38,-36},{30,38}}))); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) + annotation (Placement(transformation(extent={{96,44},{80,60}}))); + Modelica.Blocks.Sources.RealExpression X_W(y=14.3) + annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); + Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) + annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); + Modelica.Blocks.Sources.Pulse pulse( + amplitude=1, + width=13/15, + period=(24 - 7)*3600, + offset=0, + startTime=3600*7) + annotation (Placement(transformation(extent={{-94,-50},{-80,-36}}))); + Modelica.Blocks.Sources.Trapezoid Person( + amplitude=0.5, + rising=7*3600, + width=1*3600, + falling=7*3600, + period=17*3600, + offset=0.3, + startTime=7*3600) + annotation (Placement(transformation(extent={{-96,-16},{-80,0}}))); + Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( + transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ + {-86,16},{-118,48}}))); + Modelica.Blocks.Interfaces.RealOutput PPool + "Output eletric energy needed for pool operation" annotation (Placement( + transformation(extent={{98,-62},{124,-36}}),iconTransformation(extent={{98,-62}, + {124,-36}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature + prescribedTemperature + annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); + Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" + annotation (Placement(transformation(extent={{98,8},{118,28}}))); + Modelica.Blocks.Interfaces.RealOutput QPool + "Heat flow rate to maintain the pool at the set temperature" + annotation (Placement(transformation(extent={{98,-20},{122,4}}), + iconTransformation(extent={{98,-20},{122,4}}))); + equation + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52}, + {40,52},{40,18.39},{31.02,18.39}}, + color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-13.86,39.11},{-12, + 39.11},{-12,62},{-69.2,62}}, color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-26.78,39.11}, + {-26.78,80},{-69.2,80}}, color={0,0,127})); + connect(pulse.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, + -43},{-50,-43},{-50,-20.46},{-40.04,-20.46}}, color={0,0,127})); + connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.2,-8}, + {-48,-8},{-48,-8.25},{-39.7,-8.25}}, color={0,0,127})); + connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-39.36,21.72},{ + -39.36,22},{-66,22},{-66,32},{-102,32}}, color={0,0,127})); + connect(indoorSwimming.PPool, PPool) annotation (Line(points={{32.72, + -27.12},{32.72,-26},{96,-26},{96,-49},{111,-49}}, color={0,0,127})); + connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( + points={{32.72,-33.04},{32.72,-82},{112,-82}}, color={0,0,127})); + connect(prescribedTemperature.T, T_Air.y) + annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); + connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) + annotation (Line(points={{-4,80},{21.16,80},{21.16,39.48}}, color={191,0,0})); + connect(indoorSwimming.T_Pool, T_Pool) annotation (Line(points={{32.72, + 6.92},{92,6.92},{92,18},{108,18}}, color={0,0,127})); + connect(MFlowFreshWater, MFlowFreshWater) + annotation (Line(points={{112,-82},{112,-82}}, color={0,0,127})); + connect(indoorSwimming.QPool, QPool) annotation (Line(points={{32.72, + -1.22},{32.72,0},{92,0},{92,-8},{110,-8}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=1080000, __Dymola_Algorithm="Dassl")); + end IndoorSwimmingPool; + end Example; +end Pool; diff --git a/AixLib/Fluid/Pools/BaseClasses.mo b/AixLib/Fluid/Pools/BaseClasses.mo new file mode 100644 index 0000000000..ad2d09fcad --- /dev/null +++ b/AixLib/Fluid/Pools/BaseClasses.mo @@ -0,0 +1,255 @@ +within AixLib.Fluid.Pools; +package BaseClasses + extends Modelica.Icons.BasesPackage; + + model HeatTransferConduction + "Heat transfer due to conduction through pool walls" + parameter Modelica.Units.SI.Area AInnerPoolWall; + parameter Modelica.Units.SI.Area APoolWallWithEarthContact; + parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; + parameter Modelica.Units.SI.Area AInnerPoolFloor; + + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; + + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter + "Generate Heat Flow for earth contact" annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={74,-28}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport_a + "Inlet for heattransfer" annotation (Placement(transformation(extent={{-116, + -14},{-90,12}}), + iconTransformation(extent={{-116,-14},{-90,12}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil "Temperature of Soil" annotation (Placement(transformation(extent={{130,-48}, + {90,-8}}), + iconTransformation(extent={{126,16},{86,56}}))); + + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolFloor( + A=AInnerPoolFloor, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-10,-34},{18,-10}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( + hCon_const=hConWaterHorizontal, + A=AInnerPoolFloor, + calcMethod=3, + surfaceOrientation=1) + annotation (Placement(transformation( + origin={-48,-22}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( + hCon_const=hConWaterVertical, + A=APoolWallWithEarthContact, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-54,40}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolWallWithEarthContact( + A=APoolWallWithEarthContact, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-6,26},{22,54}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( + hCon_const=hConWaterHorizontal, + A=APoolFloorWithEarthContact, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-52,-60}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolFloorWithEarthContact( + A=APoolFloorWithEarthContact, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-10,-72},{14,-50}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow + prescribedHeatFlow1 "Generate Heat Flow for earth contact" + annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={44,12}))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolWall( + A=AInnerPoolWall, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-6,64},{22,92}}))); + Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) + "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" + annotation (Placement(transformation(extent={{96,2},{76,22}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( + hCon_const=hConWaterVertical, + A=AInnerPoolWall, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-54,78}, + extent={{-10,-10},{10,10}}, + rotation=180))); + replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall + annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); + equation + connect(HeatFlowOuter.T, TSoil) + annotation (Line(points={{81.2,-28},{110,-28}}, color={0,0,127})); + connect(heatport_a, heatport_a) + annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) + annotation (Line(points={{-38,-22},{-10,-22}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( + Line(points={{14,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) + annotation (Line(points={{-10,-61},{-10,-60},{-42,-60}}, color={191,0,0})); + connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{22,78},{30,78},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( + points={{-64,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( + points={{-58,-22},{-72,-22},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( + points={{-62,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) + annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); + connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( + points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); + connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{18,-22},{30,-22},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) + annotation (Line(points={{-44,40},{-6,40}}, color={191,0,0})); + connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( + Line(points={{-6,78},{-44,78}}, color={191,0,0})); + connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( + points={{-64,78},{-72,78},{-72,-1},{-103,-1}},color={191,0,0})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-80,58},{28,-26}}, + lineColor={28,108,200}, + fillColor={28,108,200}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{28,68},{48,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Rectangle( + extent={{-86,-26},{30,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Polygon( + points={{-16,-10},{-4,6},{58,-52},{46,-62},{-16,-10}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Polygon( + points={{32,-68},{36,-66},{62,-38},{76,-78},{32,-68}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0})}), + Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

This model is a base model to calculate the heat transfer through pool walls. The pool walls are sorted by: vertical walls with earth contact, pool floor with earth contact and the sum of walls and pool floor without earth contact.

+")); + end HeatTransferConduction; + + model waveMachine "Calculate energy demands of a wave machine" + + parameter Modelica.Units.SI.Length h_wave "Height of generated wave"; + parameter Modelica.Units.SI.Length w_wave + "Width of wave machine outlet/of generated wave"; + parameter Modelica.Units.SI.Time wavePool_startTime + "Start time of first wave cycle"; + parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; + parameter Real wavePool_width "Length of wave generation within cycling period"; + + Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) + "If input = 1, then true, else no waves generated" + annotation (Placement(transformation(extent={{-58,-8},{-42,8}}))); + Modelica.Blocks.Tables.CombiTable1Dv tablePWave( + y(unit="W/m"), + tableOnFile=false, + table=[0,0; 0.7,3500; 0.9,6000; 1.3,12000], + extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) + "Estimate consumed power per width to generate wave of a certain heigth; " + annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); + Modelica.Blocks.Sources.RealExpression get_h_wave(y=h_wave) + "Get height of generated wave" + annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); + Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" + annotation (Placement(transformation(extent={{-136,-20},{-96,20}}))); + Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") + "Power consumption of wave machine" + annotation (Placement(transformation(extent={{96,-10},{116,10}}))); + Modelica.Blocks.Math.Gain multiply(k=w_wave) "Multply by width of wave" + annotation (Placement(transformation(extent={{0,52},{16,68}}))); + Modelica.Blocks.Sources.Constant zero(k=0) + "no output if wave machine is off" + annotation (Placement(transformation(extent={{-14,-78},{0,-64}}))); + Modelica.Blocks.Logical.Switch switchWaveMachine + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); + Modelica.Blocks.Logical.And and1 + annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); + Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( + width=wavePool_width, + period=wavePool_period, + startTime=wavePool_startTime) + annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); + equation + connect(get_h_wave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, + 60}}, color={0,0,127})); + connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, + color={0,0,127})); + connect(open, useWavePool.u) + annotation (Line(points={{-116,0},{-59.6,0}}, color={0,0,127})); + connect(switchWaveMachine.y, PWaveMachine) annotation (Line(points={{81,0},{ + 106,0}}, color={0,0,127})); + connect(multiply.y, switchWaveMachine.u1) + annotation (Line(points={{16.8,60},{42,60},{42,8},{58,8}}, + color={0,0,127})); + connect(zero.y, switchWaveMachine.u3) annotation (Line(points={{0.7,-71},{52,-71}, + {52,-8},{58,-8}}, color={0,0,127})); + connect(PWaveMachine, PWaveMachine) annotation (Line( + points={{106,0},{101,0},{101,0},{106,0}}, + color={0,0,127}, + smooth=Smooth.Bezier)); + connect(useWavePool.y, and1.u1) + annotation (Line(points={{-41.2,0},{-10,0}}, color={255,0,255})); + connect(and1.y, switchWaveMachine.u2) + annotation (Line(points={{13,0},{58,0}}, color={255,0,255})); + connect(wavePoolCycle.y, and1.u2) annotation (Line(points={{-39,-40},{-24,-40}, + {-24,-8},{-10,-8}}, color={255,0,255})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}), + Line( + points={{-98,0},{-52,62},{-2,-24},{50,60},{100,-2}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-18},{-52,44},{-2,-42},{50,42},{98,-20}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-36},{-52,26},{-2,-60},{50,24},{96,-36}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1)}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

Model to calculate the energy demand of a wavemachine. Based on values of:

+ +")); + end waveMachine; +end BaseClasses; diff --git a/AixLib/Fluid/Pools/Example.mo b/AixLib/Fluid/Pools/Example.mo new file mode 100644 index 0000000000..c02b775c4a --- /dev/null +++ b/AixLib/Fluid/Pools/Example.mo @@ -0,0 +1,88 @@ +within AixLib.Fluid.Pools; +package Example + extends Modelica.Icons.ExamplesPackage; + + model IndoorSwimmingPool + extends Modelica.Icons.Example; + Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater + "Flow rate of added fresh water to the pool and water treatment system" + annotation (Placement(transformation(extent={{98,-96},{126,-68}}), + iconTransformation(extent={{98,-96},{126,-68}}))); + .AixLib.Fluid.Pools.IndoorSwimmingPool indoorSwimming(poolParam= + AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool(), + redeclare package WaterMedium = WaterMedium) + annotation (Placement(transformation(extent={{-38,-36},{30,38}}))); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) + annotation (Placement(transformation(extent={{96,44},{80,60}}))); + Modelica.Blocks.Sources.RealExpression X_W(y=14.3) + annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); + Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) + annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); + Modelica.Blocks.Sources.Pulse pulse( + amplitude=1, + width=13/15, + period=(24 - 7)*3600, + offset=0, + startTime=3600*7) + annotation (Placement(transformation(extent={{-94,-50},{-80,-36}}))); + Modelica.Blocks.Sources.Trapezoid Person( + amplitude=0.5, + rising=7*3600, + width=1*3600, + falling=7*3600, + period=17*3600, + offset=0.3, + startTime=7*3600) + annotation (Placement(transformation(extent={{-96,-16},{-80,0}}))); + Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( + transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ + {-86,16},{-118,48}}))); + Modelica.Blocks.Interfaces.RealOutput PPool + "Output eletric energy needed for pool operation" annotation (Placement( + transformation(extent={{98,-62},{124,-36}}),iconTransformation(extent={{98,-62}, + {124,-36}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature + prescribedTemperature + annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); + Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" + annotation (Placement(transformation(extent={{98,8},{118,28}}))); + Modelica.Blocks.Interfaces.RealOutput QPool + "Heat flow rate to maintain the pool at the set temperature" annotation ( + Placement(transformation(extent={{98,-20},{122,4}}), iconTransformation( + extent={{98,-20},{122,4}}))); + equation + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52},{ + 40,52},{40,18.39},{31.02,18.39}}, + color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-13.86,39.11},{-12, + 39.11},{-12,62},{-69.2,62}}, color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-26.78,39.11}, + {-26.78,80},{-69.2,80}}, color={0,0,127})); + connect(pulse.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, + -43},{-50,-43},{-50,-20.46},{-40.04,-20.46}}, color={0,0,127})); + connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.2,-8}, + {-48,-8},{-48,-8.25},{-39.7,-8.25}}, color={0,0,127})); + connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-39.36,21.72},{ + -39.36,22},{-66,22},{-66,32},{-102,32}}, color={0,0,127})); + connect(indoorSwimming.PPool, PPool) annotation (Line(points={{32.72,-27.12}, + {32.72,-26},{96,-26},{96,-49},{111,-49}}, color={0,0,127})); + connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( + points={{32.72,-33.04},{32.72,-82},{112,-82}}, color={0,0,127})); + connect(prescribedTemperature.T, T_Air.y) + annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); + connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) + annotation (Line(points={{-4,80},{21.16,80},{21.16,39.48}}, color={191,0,0})); + connect(indoorSwimming.T_Pool, T_Pool) annotation (Line(points={{32.72,6.92}, + {92,6.92},{92,18},{108,18}}, color={0,0,127})); + connect(MFlowFreshWater, MFlowFreshWater) + annotation (Line(points={{112,-82},{112,-82}}, color={0,0,127})); + connect(indoorSwimming.QPool, QPool) annotation (Line(points={{32.72,-1.22}, + {32.72,0},{92,0},{92,-8},{110,-8}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=1080000, __Dymola_Algorithm="Dassl")); + end IndoorSwimmingPool; +end Example; diff --git a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo new file mode 100644 index 0000000000..f17823024e --- /dev/null +++ b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo @@ -0,0 +1,545 @@ +within AixLib.Fluid.Pools; +model IndoorSwimmingPool + parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord poolParam + "Choose setup for this pool" annotation (choicesAllMatching=true); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + // Water transfer coefficients according to VDI 2089 Blatt 1 + parameter Real beta_nonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); + parameter Real beta_cover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" + annotation (Dialog(group="Water transfer coefficients")); + parameter Real beta_wavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" + annotation (Dialog(group="Water transfer coefficients")); + + // Parameter and variables for evaporation + constant Modelica.Units.SI.SpecificHeatCapacity R_D=461.52 + "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) + final parameter Modelica.Units.SI.SpecificEnergy h_vapor= + AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.T_pool) + "Latent heat of evaporating water"; + Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) + "mass flow rate between pool water and air due to evaporation"; + Modelica.Units.SI.Pressure psat_T_pool= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + poolWater.T) "Saturation pressure at pool temperature"; + Modelica.Units.SI.Pressure psat_T_Air= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + TAir) "Saturation pressure at air temperature"; + Real phi "Relative humidity"; + + // Pump + parameter Modelica.Units.SI.Pressure pumpHead=170000 + "Expected average flow resistance of water cycle"; + + // Pool circulation flow rate + final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= + poolParam.V_flow_nominal*rhoWater_default + "Nominal circulation mass flow rate to the pool"; + final parameter Modelica.Units.SI.MassFlowRate m_flow_partial= + poolParam.V_flow_partial*rhoWater_default + "Partial circulation mass flow rate to pool during non operating hours"; + Modelica.Units.SI.MassFlowRate m_flow_toPool(start=0.0) + "Actual circulation mass flow rate to the pool"; + + // Fresh water and water recycling + final parameter Modelica.Units.SI.Efficiency eps=if poolParam.use_HRS then + poolParam.efficiencyHRS else 0; + Modelica.Units.SI.MassFlowRate m_flow_freshWater(start=0.0) + "Mass flow of fresh water supplied to pool circulation system"; + + // Convection and Radiation at pool water surface + parameter Modelica.Units.SI.CoefficientOfHeatTransfer alpha_Air=3.5 + "Coefficient of heat transfer between the water surface and the room air"; + // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area + parameter Real epsilon = 0.9*0.95 + "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; + + AixLib.Fluid.MixingVolumes.MixingVolume Storage( + redeclare package Medium = WaterMedium, + T_start=poolParam.T_pool, + m_flow_nominal=m_flow_nominal, + V=poolParam.V_storage, + nPorts=4) annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); + + AixLib.Fluid.Sources.Boundary_pT Sinc( + redeclare package Medium = WaterMedium, nPorts=1) + annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); + AixLib.Fluid.MixingVolumes.MixingVolume poolWater( + redeclare package Medium = WaterMedium, + T_start=poolParam.T_pool, + m_flow_nominal=m_flow_nominal, + V=poolParam.V_pool, + nPorts=3) + annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); + + Modelica.Blocks.Sources.RealExpression PoolWater(y=m_flow_toPool) + annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); + Modelica.Blocks.Interfaces.RealOutput QPool if poolParam.use_idealHeater + "Heat flow rate to maintain the pool at the set temperature" annotation ( + Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( + extent={{98,-16},{118,4}}))); + + AixLib.Fluid.Movers.BaseClasses.IdealSource Evaporation( + redeclare package Medium = WaterMedium, + m_flow_small=0.00001, + control_m_flow=true) annotation (Placement(transformation( + extent={{6,-6},{-6,6}}, + rotation=0, + origin={-30,26}))); + Modelica.Blocks.Sources.RealExpression m_Eavporation(y=m_flow_evap) + annotation (Placement(transformation(extent={{9,-9},{-9,9}}, + rotation=180, + origin={-81,41}))); + AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( + redeclare package Medium1 = WaterMedium, + redeclare package Medium2 = WaterMedium, + m1_flow_nominal=poolParam.m_flow_out*1.5, + m2_flow_nominal=poolParam.m_flow_out, + dp1_nominal(displayUnit="bar") = 100000, + dp2_nominal(displayUnit="bar") = 100000, + eps=eps) + annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=90, + origin={-33,-73}))); + Modelica.Blocks.Interfaces.RealInput openingHours + "Input profile for opening hours" + annotation (Placement(transformation(extent={{-118,-70},{-94,-46}}), + iconTransformation(extent={{-118,-70},{-94,-46}}))); + Modelica.Blocks.Interfaces.RealInput persons "Input profile for persons" + annotation (Placement(transformation(extent={{-118,-38},{-92,-12}}), + iconTransformation(extent={{-118,-38},{-92,-12}}))); + + Modelica.Blocks.Interfaces.RealInput TAir( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of the surrounding room air" annotation ( + Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}),iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}))); + Modelica.Blocks.Interfaces.RealInput X_w "Absolute humidty of the room Air" annotation (Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}), iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}))); + + AixLib.ThermalZones.ReducedOrder.Multizone.BaseClasses.AbsToRelHum absToRelHum + "Calculation of the relative humidity of the room air " annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=-90, + origin={-59,77}))); + + Modelica.Blocks.Sources.RealExpression FreshWater(y=m_flow_freshWater) annotation (Placement(transformation(extent={{-62,-78}, + {-48,-62}}))); + + AixLib.Fluid.Sources.Boundary_pT SincEvaporation( + redeclare package Medium = WaterMedium, nPorts=1) annotation (Placement(transformation(extent={{6,-6},{ + -6,6}}, + rotation=180, + origin={-64,26}))); + + Modelica.Fluid.Interfaces.FluidPort_b fromPool(redeclare package Medium = + WaterMedium) if poolParam.use_idealHeater == false + "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-64},{110,-44}}), + iconTransformation(extent={{90,-64},{110,-44}}))); + + Modelica.Fluid.Interfaces.FluidPort_a toPool(redeclare package Medium = + WaterMedium) if poolParam.use_idealHeater == false + "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-40},{110,-20}}), + iconTransformation(extent={{90,-40},{110,-20}}))); + + .AixLib.Fluid.Pools.BaseClasses.waveMachine waveMachine( + h_wave=poolParam.h_wave, + w_wave=poolParam.w_wave, + wavePool_startTime=poolParam.wavePool_startTime, + wavePool_period=poolParam.wavePool_period, + wavePool_width=poolParam.wavePool_width) if poolParam.use_wavePool + annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPoolSurface + "Air Temperature in Zone" annotation (Placement(transformation(extent={{56,86}, + {80,110}}), + iconTransformation(extent={{64,94},{84,114}}))); + + AixLib.Utilities.Interfaces.RadPort radPoolSurface + "Mean Radiation Temperature of surrounding walls" annotation (Placement( + transformation( + extent={{-8,-9},{8,9}}, + rotation=-90, + origin={39,100}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=-90, + origin={30,100}))); + + Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( + final Gr=epsilon*poolParam.A_pool) + "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( + extent={{-7,-7},{7,7}}, + rotation=90, + origin={39,73}))); + + Modelica.Thermal.HeatTransfer.Components.Convection convWaterSurface + "Convection at the watersurface" annotation (Placement(transformation( + extent={{-7,7},{7,-7}}, + rotation=90, + origin={67,75}))); + + Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=alpha_Air*poolParam.A_pool) + "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, + {82,84}}))); + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, + {12,68}}))); + + Modelica.Blocks.Math.Gain hEvapLatentHeatGain(final k=h_vapor) + "Calculation of heat flow rate due to evaporation" annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-44,52}))); + + Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater + "Flow rate of added fresh water to the pool and water treatment system" annotation (Placement(transformation(extent={{98,-102}, + {118,-82}}), + iconTransformation(extent={{98,-102},{118,-82}}))); + + AixLib.Fluid.Pools.BaseClasses.HeatTransferConduction heatTransferConduction( + AInnerPoolWall=poolParam.AInnerPoolWall, + APoolWallWithEarthContact=poolParam.APoolWallWithEarthContact, + APoolFloorWithEarthContact=poolParam.APoolFloorWithEarthContact, + AInnerPoolFloor=poolParam.AInnerPoolFloor, + hConWaterHorizontal=poolParam.hConWaterHorizontal, + hConWaterVertical=poolParam.hConWaterVertical, + PoolWall=poolParam.PoolWallParam) + "Model to depict the heat flow rate through the pool walls to the bordering room/soil" + annotation (Placement(transformation(extent={{64,32},{80,48}}))); + + Modelica.Blocks.Math.Gain minus1Gain(final k=-1) annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-20,60}))); + + Modelica.Blocks.Interfaces.RealOutput QEvap(final quantity="HeatFlowRate", + final unit="W") + "Heat needed to compensate losses" annotation (Placement(transformation(extent={{-92,46}, + {-122,76}}), + iconTransformation(extent={{-94,46},{-114,66}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of Soil" annotation (Placement( + transformation( + extent={{-13,-13},{13,13}}, + rotation=180, + origin={105,49}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=180, + origin={103,47}))); + + Modelica.Blocks.Interfaces.RealOutput PPool( + final quantity="Power", + final unit="W") + "Output eletric energy needed for pool operation" annotation (Placement(transformation(extent={{98,-86}, + {118,-66}}), + iconTransformation(extent={{98,-86},{118,-66}}))); + + Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavePool then 2 else 1) + "Add electric power of pump and the optional wave pool" + annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); + Sources.MassFlowSource_T boundary( + redeclare package Medium = WaterMedium, + use_m_flow_in=true, + T=283.15, + nPorts=1) + annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); + Modelica.Blocks.Sources.RealExpression ReadPoolTemp(y=poolWater.T) + annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=180, + origin={72,16}))); + Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" + annotation (Placement(transformation(extent={{98,6},{118,26}}), + iconTransformation(extent={{98,6},{118,26}}))); + + final parameter Modelica.Units.SI.Density rhoWater_default= + WaterMedium.density_pTX( + p=WaterMedium.p_default, + T=273.15 + 30, + X=WaterMedium.X_default) "Default medium density"; + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater + annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); + Controls.Continuous.LimPID PI( + k=1000, + yMax=100000000, + yMin=0, + controllerType=Modelica.Blocks.Types.SimpleController.PI, + Ti=5, + Td=0.1) annotation(Placement(transformation(extent={{-4,-4}, + {4,4}}, + rotation=180, + origin={66,-16}))); + Modelica.Blocks.Sources.RealExpression SetTemperature(y=poolParam.T_pool) + if poolParam.use_idealHeater + annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); + Controls.Continuous.LimPID PI1( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.1, + Ti=5, + yMax=m_flow_nominal/0.9, + yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); + Movers.FlowControlled_m_flow CirculationPump( + redeclare package Medium = WaterMedium, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + T_start=poolParam.T_pool, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + redeclare Movers.Data.Generic per, + inputType=AixLib.Fluid.Types.InputType.Continuous, + addPowerToMedium=false, + nominalValuesDefineDefaultPressureCurve=true, + dp_nominal=pumpHead, + m_flow_start=m_flow_nominal) + annotation (Placement(transformation(extent={{-8,-8},{8,8}}, + rotation=0, + origin={0,-68}))); + Sensors.MassFlowRate senMasFlo(redeclare package Medium = + WaterMedium, allowFlowReversal=false) + annotation (Placement(transformation(extent={{-6,-6},{6,6}}, + rotation=0, + origin={22,-68}))); + FixedResistances.PressureDrop res( + redeclare package Medium = WaterMedium, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + show_T=false, + from_dp=false, + dp_nominal=pumpHead - poolParam.dpHeatExchangerPool, + homotopyInitialization=true, + linearized=false, + deltaM=0.3) + annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); +equation + // Fresh water and water recycling + if poolParam.use_waterRecycling then + m_flow_freshWater=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); + else + m_flow_freshWater=poolParam.m_flow_out + m_flow_evap; + end if; + + // Pool circulation flow rate + if poolParam.use_partialLoad then + if openingHours > 0 then + m_flow_toPool = m_flow_nominal; + else + m_flow_toPool = m_flow_partial; + end if; + else + m_flow_toPool = m_flow_nominal; + end if; + + // Evaporation according to VDI 2089 sheet 1, formula (1) + phi=absToRelHum.relHum; + if psat_T_pool-phi*psat_T_Air<0 then + m_flow_evap=0.0; + else + if openingHours > 0 then + if persons > 0 then + m_flow_evap =persons*(poolParam.beta_inUse/(R_D*0.5*(poolWater.T + + TAir))*(psat_T_pool - phi*psat_T_Air)*poolParam.A_pool); + else + m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; + end if; + else + if poolParam.use_poolCover then + m_flow_evap = beta_cover /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; + else + m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; + end if; + end if; + end if; + + if poolParam.use_idealHeater then + connect(res.port_b, poolWater.ports[1]) annotation (Line(points={{44,-68}, + {54,-68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, + color={0,127,255})); + else + connect(poolWater.ports[1], toPool) annotation (Line( + points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + connect(fromPool, res.port_b) annotation (Line( + points={{100,-54},{78,-54},{78,-68},{44,-68}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + end if; + + connect(poolWater.ports[3], Evaporation.port_a) annotation (Line(points={{2.66667, + -10},{2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); + + connect(Storage.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, + -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); + connect(Storage.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, + -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); + connect(Storage.ports[4], CirculationPump.port_a) annotation (Line(points={{-26.5, + -56},{-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); + connect(Storage.ports[1], poolWater.ports[2]) annotation (Line(points={{-29.5, + -56},{-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127, + 255})); + + connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, + {-62,88},{-67,88},{-67,103}},color={0,0,127})); + connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, + {-56,88},{-29,88},{-29,103}}, color={0,0,127})); + connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, + {-30,-88},{22,-88}}, color={0,127,255})); + connect(Evaporation.port_b, SincEvaporation.ports[1]) + annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); + connect(m_Eavporation.y, Evaporation.m_flow_in) annotation (Line(points={{-71.1, + 41},{-26.4,41},{-26.4,30.8}}, color={0,0,127})); + connect(radWaterSurface.port_b, radPoolSurface) annotation (Line(points={{39,80}, + {39,100}}, color={191,0,0})); + connect(convWaterSurface.fluid, convPoolSurface) annotation (Line(points={{67,82}, + {68,82},{68,98}}, color={191,0,0})); + connect(convWaterSurface.solid, poolWater.heatPort) annotation (Line(points={{67,68}, + {66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); + connect(radWaterSurface.port_a, poolWater.heatPort) annotation (Line(points={{39,66}, + {38,66},{38,0},{14,0}}, color={191,0,0})); + connect(preHeatFlowEvapLoss.port, poolWater.heatPort) annotation (Line(points={{12,60}, + {26,60},{26,0},{14,0}}, color={191,0,0})); + connect(m_Eavporation.y, hEvapLatentHeatGain.u) annotation (Line(points={{-71.1, + 41},{-58,41},{-58,52},{-48.8,52}}, + color={0,0,127})); + connect(heatTransferConduction.heatport_a, poolWater.heatPort) annotation ( + Line(points={{63.76,39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); + connect(hEvapLatentHeatGain.y, minus1Gain.u) annotation (Line(points={{-39.6, + 52},{-34,52},{-34,60},{-24.8,60}}, color={0,0,127})); + connect(hEvapLatentHeatGain.y, QEvap) annotation (Line(points={{-39.6,52},{-34, + 52},{-34,61},{-107,61}}, color={0,0,127})); + connect(heatTransferConduction.TSoil, TSoil) annotation (Line(points={{80.48,42.88}, + {82,42.88},{82,49},{105,49}}, color={0,0,127})); + connect(convPoolSurface, convPoolSurface) annotation (Line(points={{68,98},{68, + 98}}, color={191,0,0})); + connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, + {74,75}}, color={0,0,127})); + connect(minus1Gain.y, preHeatFlowEvapLoss.Q_flow) annotation (Line(points={{-15.6, + 60},{-4,60}}, color={0,0,127})); + + connect(boundary.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, + {-40,-78},{-36,-78}}, color={0,127, + 255})); + connect(waveMachine.open, openingHours) annotation (Line(points={{-93.28,-87}, + {-98,-87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, + color={0,0,127})); + connect(ReadPoolTemp.y, T_Pool) + annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); + + connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, + {54,-12},{48,-12}}, color={0,0,127})); + connect(idealHeater.port, poolWater.heatPort) annotation (Line(points={{32,-12}, + {24,-12},{24,0},{14,0}}, color={191,0,0})); + connect(SetTemperature.y, PI.u_s) + annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); + connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, + -16}}, color={0,0,127})); + connect(boundary.m_flow_in, FreshWater.y) annotation (Line(points={{-53.2,-83.2}, + {-60,-83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); + connect(FreshWater.y, MFlowFreshWater) annotation (Line(points={{-47.3,-70},{-42, + -70},{-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, + color={0,0,127})); + connect(Evaporation.port_b, Evaporation.port_a) annotation (Line( + points={{-36,26},{-30,26},{-24,26}}, + color={0,127,255}, + smooth=Smooth.Bezier)); + connect(CirculationPump.port_b, senMasFlo.port_a) + annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); + connect(senMasFlo.port_b, res.port_a) + annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); + connect(PI1.y, CirculationPump.m_flow_in) + annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); + connect(PI1.u_s, PoolWater.y) + annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); + connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, + {13,-58},{13,-55}}, color={0,0,127})); + + connect(elPower.u[1], CirculationPump.P) annotation (Line(points={{72,-76},{62, + -76},{62,-60.8},{8.8,-60.8}}, color={0,0,127})); + connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); + connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, + -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, + color={0,0,127})); + + connect(PI.u_m, ReadPoolTemp.y) annotation (Line(points={{66,-11.2},{66,4},{92, + 4},{92,16},{83,16}}, color={0,0,127})); + annotation (Line( + points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), + Line(points={{18.4,-40}, + {18,-40},{18,-44},{-100,-44}}, color={0,127,255}), + Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-50,82}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-60,80})), + Icon(coordinateSystem(preserveAspectRatio=false), + graphics={ + Rectangle( + extent={{98,98},{-98,-98}}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Bitmap(extent={{-94,-150},{96,58}}, fileName="modelica://AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg")}), + Diagram(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-100,2},{100,100}}, + lineColor={0,128,255}, + fillColor={170,213,255}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,12},{-6,0}}, + textColor={85,85,255}, + textStyle={TextStyle.Bold}, + horizontalAlignment=TextAlignment.Left, + textString="Heat and mass exchange +at pool surface or pool walls +"), Rectangle( + extent={{-66,-98},{100,-2}}, + lineColor={0,0,127}, + fillColor={155,195,232}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Rectangle( + extent={{-100,-98},{-68,-2}}, + lineColor={95,95,95}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,-6},{-72,-14}}, + textColor={95,95,95}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Pool +operation"), + Text( + extent={{-64,-2},{-22,-24}}, + textColor={0,0,127}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Water treatment +circuit +")})); +end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pools/package.order b/AixLib/Fluid/Pools/package.order new file mode 100644 index 0000000000..29476d67bf --- /dev/null +++ b/AixLib/Fluid/Pools/package.order @@ -0,0 +1,3 @@ +IndoorSwimmingPool +BaseClasses +Example diff --git a/AixLib/Fluid/package.order b/AixLib/Fluid/package.order index aa0e98cd8f..f1b354885d 100644 --- a/AixLib/Fluid/package.order +++ b/AixLib/Fluid/package.order @@ -13,6 +13,7 @@ Humidifiers MassExchangers MixingVolumes Movers +Pool Sensors Solar Sources diff --git a/AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg b/AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg new file mode 100644 index 0000000000000000000000000000000000000000..264c6e398fdb9ad43cd447461324cacf1021580c GIT binary patch literal 38059 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 J?@7F-{|AI!RtNw9 literal 0 HcmV?d00001 From 2c54634a87db47d83f37da6013c7d8a56de71400 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 29 Nov 2022 19:17:10 +0100 Subject: [PATCH 02/34] add data base for swimming pools (base record and different pool types) #1407 --- AixLib/DataBase/Pools.mo | 236 ++++++++++++++++++++++++++++++++++ AixLib/DataBase/package.order | 1 + 2 files changed, 237 insertions(+) create mode 100644 AixLib/DataBase/Pools.mo diff --git a/AixLib/DataBase/Pools.mo b/AixLib/DataBase/Pools.mo new file mode 100644 index 0000000000..5cff3b7c66 --- /dev/null +++ b/AixLib/DataBase/Pools.mo @@ -0,0 +1,236 @@ +within AixLib.DataBase; +package Pools + record IndoorSwimmingPoolBaseRecord + extends Modelica.Icons.Record; + + parameter Modelica.Units.SI.Temperature T_pool + "Set water temperature of swimming pool"; + parameter Modelica.Units.SI.Volume V_pool "Volume of pool water"; + parameter Modelica.Units.SI.Area A_pool(min=0) + "Area of water surface of swimming pool"; + parameter Modelica.Units.SI.Length d_pool(min=0) + "Average depth of swimming pool"; + parameter Modelica.Units.SI.Volume V_storage + "Usable Volume of water storage, DIN 19643-1"; + + // parameter for pool water circulation + parameter Modelica.Units.SI.VolumeFlowRate V_flow_nominal(min=0.001) + "Circulation volume flow rate"; + parameter Modelica.Units.SI.VolumeFlowRate V_flow_partial(min=0) + "In the case of partial load: circulation volume flow rate during non-opening hours, DIN 19643-1"; + parameter Boolean use_partialLoad=false "Partial load operation implemented for non opening hours?"; + parameter Boolean use_idealHeater=true "Include an ideal heat exchanger into the circulation system"; + parameter Modelica.Units.SI.PressureDifference dpHeatExchangerPool + "Pressure drop of heat exchanger, should be zero for an indeal heated pool"; + + // parameter for evaporation + parameter Real beta_inUse(unit="m/s") "Water transfer coefficient during opening hours if pool is used, VDI 2089"; + parameter Boolean use_poolCover=false "Pool covered during non opening hours"; + + + // parameter for fresh water + parameter Boolean use_waterRecycling= false "Recycled water used for refilling pool water?"; + parameter Real x_recycling(min=0) "Percentage of refilling water provided by recycled pool water, DIN 19643-1: <= 0,8"; + parameter Modelica.Units.SI.MassFlowRate m_flow_out(min=0.0001) + "Waterexchange due to people in the pool, DIN 19643-1"; + parameter Boolean use_HRS=false "Is a heat recovery system physically integrated?"; + parameter Modelica.Units.SI.Efficiency efficiencyHRS + "Effieciency of heat recovery system"; + + + // Wave mode + parameter Boolean use_wavePool=false "Is there a wave machine installed?"; + parameter Modelica.Units.SI.Length h_wave "Height of generatedwave"; + parameter Modelica.Units.SI.Length w_wave + "Width of generated wave/ width of wave machine outlet"; + parameter Modelica.Units.SI.Time wavePool_startTime + "Start time of first wave cycle"; + parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; + parameter Real wavePool_width "Length of wave generation within cycling period"; + + + // Pool Walls + parameter Modelica.Units.SI.Area AInnerPoolWall; + parameter Modelica.Units.SI.Area APoolWallWithEarthContact; + parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; + parameter Modelica.Units.SI.Area AInnerPoolFloor; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; + //replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam; + replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition + PoolWallParam constrainedby AixLib.DataBase.Walls.WallBaseDataDefinition + annotation (choicesAllMatching=true, Placement(transformation(extent={{48,-98},{68,-78}}))); + + + annotation (Documentation(info=" + + This is the base definition of indoor swimming pool records used in AixLib.Fluid.Pools.IndoorSwimmingPool. + It aggregates all parameters at one record to enhance usability, + exchanging entire datasets and automatic generation of these + datasets. +

References

+
    +
  • German Association of Engineers: Guideline VDI 2089-1, January 2010: Building Services in swimming baths - Indoor Pools
  • +
  • German Institute for Standardization DIN 19643-1, November 2012: Treatment of water of swimming pools and baths - Part 1 General Requirements
  • +
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • +
+")); + end IndoorSwimmingPoolBaseRecord; + + record IndoorSwimmingPoolDummy + "This is a dummy record with non-physical parameter values." + extends IndoorSwimmingPoolBaseRecord( + T_pool = Modelica.Constants.eps, + V_pool= Modelica.Constants.inf, + A_pool = Modelica.Constants.inf, + d_pool = Modelica.Constants.inf, + V_storage = Modelica.Constants.inf, + V_flow_nominal = Modelica.Constants.inf, + V_flow_partial = Modelica.Constants.inf, + use_partialLoad = false, + use_idealHeater = true, + dpHeatExchangerPool = Modelica.Constants.inf, + beta_inUse = Modelica.Constants.inf, + use_poolCover = false, + use_waterRecycling = false, + x_recycling = Modelica.Constants.inf, + m_flow_out = Modelica.Constants.inf, + use_HRS = false, + efficiencyHRS = Modelica.Constants.eps, + use_wavePool = false, + h_wave = Modelica.Constants.inf, + w_wave = Modelica.Constants.inf, + wavePool_period = Modelica.Constants.eps, + wavePool_startTime = Modelica.Constants.eps, + wavePool_width = Modelica.Constants.eps, + AInnerPoolWall = Modelica.Constants.inf, + APoolWallWithEarthContact = Modelica.Constants.inf, + APoolFloorWithEarthContact = Modelica.Constants.inf, + AInnerPoolFloor = Modelica.Constants.inf, + hConWaterHorizontal = Modelica.Constants.inf, + hConWaterVertical = Modelica.Constants.inf, + PoolWallParam= AixLib.DataBase.Pools.SwimmingPoolWall.WallDummy()); + annotation (Documentation(info=" +

This record is a place holder for zones without swimming pools to avoid error messages.

+")); + end IndoorSwimmingPoolDummy; + + package TypesOfIndoorSwimmingPools + record SportPool "Pool which is mainly used by sport swimmers" + extends IndoorSwimmingPoolBaseRecord( + T_pool=301.15, + V_pool=942.956, + A_pool=416.5, + d_pool=2.2640000000000002, + V_storage=69.333925940005700, + V_flow_nominal=0.0856995884773662, + V_flow_partial=0.023144444444444443, + use_partialLoad=true, + use_idealHeater=true, + dpHeatExchangerPool = 0, + beta_inUse=0.011111111111111112, + use_poolCover=false, + use_waterRecycling=false, + x_recycling=0.0, + m_flow_out=0.170038866026520, + use_HRS=true, + efficiencyHRS=0.8, + use_wavePool=false, + h_wave=0, + w_wave=0, + wavePool_period=1800, + wavePool_startTime=0, + wavePool_width=10/30*100, + AInnerPoolWall=21.658, + APoolWallWithEarthContact=143.32, + APoolFloorWithEarthContact=559.82, + AInnerPoolFloor=0.001, + hConWaterHorizontal=50.0, + hConWaterVertical=5200.0, + PoolWallParam= + AixLib.DataBase.Pools.SwimmingPoolWall.ConcreteIsulationConstruction()); + + annotation (Documentation(info=" +

The swimming pool "SportPool" describes a typical indoor swimming pool, which is mainly used for sport swimming.

+")); + end SportPool; + + record ChildrensPool "Pool which is mainly used by children" + + extends IndoorSwimmingPoolBaseRecord( + T_pool=303.15, + V_pool=126.8, + A_pool=125.0, + d_pool=0.9303008070432868, + V_storage=69.333925940005700, + V_flow_nominal=0.028045267489711933, + V_flow_partial=0.0125, + use_partialLoad=true, + use_idealHeater=true, + dpHeatExchangerPool = 0, + beta_inUse=0.011111111111111112, + use_poolCover=false, + use_waterRecycling=false, + x_recycling=0.0, + m_flow_out=0.055645372003397, + use_HRS=true, + efficiencyHRS=0.8, + use_wavePool=false, + h_wave=0, + w_wave=0, + wavePool_period=1800, + wavePool_startTime=0, + wavePool_width=0, + AInnerPoolWall=0.001, + APoolWallWithEarthContact=156.5, + APoolFloorWithEarthContact=156.5, + AInnerPoolFloor=0.001, + hConWaterHorizontal=50.0, + hConWaterVertical=5200.0, + PoolWallParam= + AixLib.DataBase.Pools.SwimmingPoolWall.ConcreteIsulationConstruction()); + annotation (Documentation(info=" +

The swimming pool "ChildrensPool" describes a typical indoor swimming pool, which is mainly used by children and to teach children swimming.

+")); + end ChildrensPool; + end TypesOfIndoorSwimmingPools; + + package SwimmingPoolWall + record WallDummy + extends AixLib.DataBase.Walls.WallBaseDataDefinition( + n(min=1) = 1 "Number of wall layers", + d={1} "Thickness of wall layers", + rho={1} "Density of wall layers", + lambda={1} "Thermal conductivity of wall layers", + c={1} "Specific heat capacity of wall layers", + eps=1 "Emissivity of inner wall surface"); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); + end WallDummy; + + record ConcreteIsulationConstruction "Concrete pool construction with isolation" + extends AixLib.DataBase.Walls.WallBaseDataDefinition( + n(min=1) = 3 "Number of wall layers", + d={0.05,0.2,0.1} "Thickness of wall layers", + rho={1940,2330,30} "Density of wall layers", + lambda={1.4,2.1,0.035} "Thermal conductivity of wall layers", + c={0.0001,0.001,0.00138} "Specific heat capacity of wall layers", + eps=0.9 "Emissivity of inner wall surface"); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); + end ConcreteIsulationConstruction; + + record StainlessSteelConstruction + extends AixLib.DataBase.Walls.WallBaseDataDefinition( + n(min=1) = 1 "Number of wall layers", + d={0.05} "Thickness of wall layers", + rho={7900} "Density of wall layers", + lambda={15} "Thermal conductivity of wall layers", + c={500} "Specific heat capacity of wall layers", + eps=0.9 "Emissivity of inner wall surface"); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); + end StainlessSteelConstruction; + end SwimmingPoolWall; +end Pools; diff --git a/AixLib/DataBase/package.order b/AixLib/DataBase/package.order index 6fb02d10f1..95961bb866 100644 --- a/AixLib/DataBase/package.order +++ b/AixLib/DataBase/package.order @@ -5,6 +5,7 @@ Chiller HeatPump Media Pipes +Pools Profiles Pumps Radiators From 6993187187e55613ef14cf40e85f72bf3e96fd5c Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 29 Nov 2022 19:18:58 +0100 Subject: [PATCH 03/34] change package structure for pool data base #1407 --- AixLib/DataBase/Pools.mo | 236 ------------------ .../Pools/IndoorSwimmingPoolBaseRecord.mo | 74 ++++++ .../DataBase/Pools/IndoorSwimmingPoolDummy.mo | 38 +++ .../ConcreteIsulationConstruction.mo | 12 + .../StainlessSteelConstruction.mo | 12 + .../Pools/SwimmingPoolWalls/WallDummy.mo | 12 + .../Pools/SwimmingPoolWalls/package.mo | 3 + .../Pools/SwimmingPoolWalls/package.order | 3 + .../ChildrensPool.mo | 39 +++ .../TypesOfIndoorSwimmingPools/SportPool.mo | 39 +++ .../TypesOfIndoorSwimmingPools/package.mo | 3 + .../TypesOfIndoorSwimmingPools/package.order | 2 + AixLib/DataBase/Pools/package.mo | 3 + AixLib/DataBase/Pools/package.order | 4 + 14 files changed, 244 insertions(+), 236 deletions(-) delete mode 100644 AixLib/DataBase/Pools.mo create mode 100644 AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo create mode 100644 AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo create mode 100644 AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteIsulationConstruction.mo create mode 100644 AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo create mode 100644 AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo create mode 100644 AixLib/DataBase/Pools/SwimmingPoolWalls/package.mo create mode 100644 AixLib/DataBase/Pools/SwimmingPoolWalls/package.order create mode 100644 AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo create mode 100644 AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo create mode 100644 AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo create mode 100644 AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.order create mode 100644 AixLib/DataBase/Pools/package.mo create mode 100644 AixLib/DataBase/Pools/package.order diff --git a/AixLib/DataBase/Pools.mo b/AixLib/DataBase/Pools.mo deleted file mode 100644 index 5cff3b7c66..0000000000 --- a/AixLib/DataBase/Pools.mo +++ /dev/null @@ -1,236 +0,0 @@ -within AixLib.DataBase; -package Pools - record IndoorSwimmingPoolBaseRecord - extends Modelica.Icons.Record; - - parameter Modelica.Units.SI.Temperature T_pool - "Set water temperature of swimming pool"; - parameter Modelica.Units.SI.Volume V_pool "Volume of pool water"; - parameter Modelica.Units.SI.Area A_pool(min=0) - "Area of water surface of swimming pool"; - parameter Modelica.Units.SI.Length d_pool(min=0) - "Average depth of swimming pool"; - parameter Modelica.Units.SI.Volume V_storage - "Usable Volume of water storage, DIN 19643-1"; - - // parameter for pool water circulation - parameter Modelica.Units.SI.VolumeFlowRate V_flow_nominal(min=0.001) - "Circulation volume flow rate"; - parameter Modelica.Units.SI.VolumeFlowRate V_flow_partial(min=0) - "In the case of partial load: circulation volume flow rate during non-opening hours, DIN 19643-1"; - parameter Boolean use_partialLoad=false "Partial load operation implemented for non opening hours?"; - parameter Boolean use_idealHeater=true "Include an ideal heat exchanger into the circulation system"; - parameter Modelica.Units.SI.PressureDifference dpHeatExchangerPool - "Pressure drop of heat exchanger, should be zero for an indeal heated pool"; - - // parameter for evaporation - parameter Real beta_inUse(unit="m/s") "Water transfer coefficient during opening hours if pool is used, VDI 2089"; - parameter Boolean use_poolCover=false "Pool covered during non opening hours"; - - - // parameter for fresh water - parameter Boolean use_waterRecycling= false "Recycled water used for refilling pool water?"; - parameter Real x_recycling(min=0) "Percentage of refilling water provided by recycled pool water, DIN 19643-1: <= 0,8"; - parameter Modelica.Units.SI.MassFlowRate m_flow_out(min=0.0001) - "Waterexchange due to people in the pool, DIN 19643-1"; - parameter Boolean use_HRS=false "Is a heat recovery system physically integrated?"; - parameter Modelica.Units.SI.Efficiency efficiencyHRS - "Effieciency of heat recovery system"; - - - // Wave mode - parameter Boolean use_wavePool=false "Is there a wave machine installed?"; - parameter Modelica.Units.SI.Length h_wave "Height of generatedwave"; - parameter Modelica.Units.SI.Length w_wave - "Width of generated wave/ width of wave machine outlet"; - parameter Modelica.Units.SI.Time wavePool_startTime - "Start time of first wave cycle"; - parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; - parameter Real wavePool_width "Length of wave generation within cycling period"; - - - // Pool Walls - parameter Modelica.Units.SI.Area AInnerPoolWall; - parameter Modelica.Units.SI.Area APoolWallWithEarthContact; - parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; - parameter Modelica.Units.SI.Area AInnerPoolFloor; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; - //replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam; - replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition - PoolWallParam constrainedby AixLib.DataBase.Walls.WallBaseDataDefinition - annotation (choicesAllMatching=true, Placement(transformation(extent={{48,-98},{68,-78}}))); - - - annotation (Documentation(info=" - - This is the base definition of indoor swimming pool records used in AixLib.Fluid.Pools.IndoorSwimmingPool. - It aggregates all parameters at one record to enhance usability, - exchanging entire datasets and automatic generation of these - datasets. -

References

-
    -
  • German Association of Engineers: Guideline VDI 2089-1, January 2010: Building Services in swimming baths - Indoor Pools
  • -
  • German Institute for Standardization DIN 19643-1, November 2012: Treatment of water of swimming pools and baths - Part 1 General Requirements
  • -
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • -
-")); - end IndoorSwimmingPoolBaseRecord; - - record IndoorSwimmingPoolDummy - "This is a dummy record with non-physical parameter values." - extends IndoorSwimmingPoolBaseRecord( - T_pool = Modelica.Constants.eps, - V_pool= Modelica.Constants.inf, - A_pool = Modelica.Constants.inf, - d_pool = Modelica.Constants.inf, - V_storage = Modelica.Constants.inf, - V_flow_nominal = Modelica.Constants.inf, - V_flow_partial = Modelica.Constants.inf, - use_partialLoad = false, - use_idealHeater = true, - dpHeatExchangerPool = Modelica.Constants.inf, - beta_inUse = Modelica.Constants.inf, - use_poolCover = false, - use_waterRecycling = false, - x_recycling = Modelica.Constants.inf, - m_flow_out = Modelica.Constants.inf, - use_HRS = false, - efficiencyHRS = Modelica.Constants.eps, - use_wavePool = false, - h_wave = Modelica.Constants.inf, - w_wave = Modelica.Constants.inf, - wavePool_period = Modelica.Constants.eps, - wavePool_startTime = Modelica.Constants.eps, - wavePool_width = Modelica.Constants.eps, - AInnerPoolWall = Modelica.Constants.inf, - APoolWallWithEarthContact = Modelica.Constants.inf, - APoolFloorWithEarthContact = Modelica.Constants.inf, - AInnerPoolFloor = Modelica.Constants.inf, - hConWaterHorizontal = Modelica.Constants.inf, - hConWaterVertical = Modelica.Constants.inf, - PoolWallParam= AixLib.DataBase.Pools.SwimmingPoolWall.WallDummy()); - annotation (Documentation(info=" -

This record is a place holder for zones without swimming pools to avoid error messages.

-")); - end IndoorSwimmingPoolDummy; - - package TypesOfIndoorSwimmingPools - record SportPool "Pool which is mainly used by sport swimmers" - extends IndoorSwimmingPoolBaseRecord( - T_pool=301.15, - V_pool=942.956, - A_pool=416.5, - d_pool=2.2640000000000002, - V_storage=69.333925940005700, - V_flow_nominal=0.0856995884773662, - V_flow_partial=0.023144444444444443, - use_partialLoad=true, - use_idealHeater=true, - dpHeatExchangerPool = 0, - beta_inUse=0.011111111111111112, - use_poolCover=false, - use_waterRecycling=false, - x_recycling=0.0, - m_flow_out=0.170038866026520, - use_HRS=true, - efficiencyHRS=0.8, - use_wavePool=false, - h_wave=0, - w_wave=0, - wavePool_period=1800, - wavePool_startTime=0, - wavePool_width=10/30*100, - AInnerPoolWall=21.658, - APoolWallWithEarthContact=143.32, - APoolFloorWithEarthContact=559.82, - AInnerPoolFloor=0.001, - hConWaterHorizontal=50.0, - hConWaterVertical=5200.0, - PoolWallParam= - AixLib.DataBase.Pools.SwimmingPoolWall.ConcreteIsulationConstruction()); - - annotation (Documentation(info=" -

The swimming pool "SportPool" describes a typical indoor swimming pool, which is mainly used for sport swimming.

-")); - end SportPool; - - record ChildrensPool "Pool which is mainly used by children" - - extends IndoorSwimmingPoolBaseRecord( - T_pool=303.15, - V_pool=126.8, - A_pool=125.0, - d_pool=0.9303008070432868, - V_storage=69.333925940005700, - V_flow_nominal=0.028045267489711933, - V_flow_partial=0.0125, - use_partialLoad=true, - use_idealHeater=true, - dpHeatExchangerPool = 0, - beta_inUse=0.011111111111111112, - use_poolCover=false, - use_waterRecycling=false, - x_recycling=0.0, - m_flow_out=0.055645372003397, - use_HRS=true, - efficiencyHRS=0.8, - use_wavePool=false, - h_wave=0, - w_wave=0, - wavePool_period=1800, - wavePool_startTime=0, - wavePool_width=0, - AInnerPoolWall=0.001, - APoolWallWithEarthContact=156.5, - APoolFloorWithEarthContact=156.5, - AInnerPoolFloor=0.001, - hConWaterHorizontal=50.0, - hConWaterVertical=5200.0, - PoolWallParam= - AixLib.DataBase.Pools.SwimmingPoolWall.ConcreteIsulationConstruction()); - annotation (Documentation(info=" -

The swimming pool "ChildrensPool" describes a typical indoor swimming pool, which is mainly used by children and to teach children swimming.

-")); - end ChildrensPool; - end TypesOfIndoorSwimmingPools; - - package SwimmingPoolWall - record WallDummy - extends AixLib.DataBase.Walls.WallBaseDataDefinition( - n(min=1) = 1 "Number of wall layers", - d={1} "Thickness of wall layers", - rho={1} "Density of wall layers", - lambda={1} "Thermal conductivity of wall layers", - c={1} "Specific heat capacity of wall layers", - eps=1 "Emissivity of inner wall surface"); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false))); - end WallDummy; - - record ConcreteIsulationConstruction "Concrete pool construction with isolation" - extends AixLib.DataBase.Walls.WallBaseDataDefinition( - n(min=1) = 3 "Number of wall layers", - d={0.05,0.2,0.1} "Thickness of wall layers", - rho={1940,2330,30} "Density of wall layers", - lambda={1.4,2.1,0.035} "Thermal conductivity of wall layers", - c={0.0001,0.001,0.00138} "Specific heat capacity of wall layers", - eps=0.9 "Emissivity of inner wall surface"); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false))); - end ConcreteIsulationConstruction; - - record StainlessSteelConstruction - extends AixLib.DataBase.Walls.WallBaseDataDefinition( - n(min=1) = 1 "Number of wall layers", - d={0.05} "Thickness of wall layers", - rho={7900} "Density of wall layers", - lambda={15} "Thermal conductivity of wall layers", - c={500} "Specific heat capacity of wall layers", - eps=0.9 "Emissivity of inner wall surface"); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false))); - end StainlessSteelConstruction; - end SwimmingPoolWall; -end Pools; diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo new file mode 100644 index 0000000000..552f40a177 --- /dev/null +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo @@ -0,0 +1,74 @@ +within AixLib.DataBase.Pools; +record IndoorSwimmingPoolBaseRecord + extends Modelica.Icons.Record; + + parameter Modelica.Units.SI.Temperature T_pool + "Set water temperature of swimming pool"; + parameter Modelica.Units.SI.Volume V_pool "Volume of pool water"; + parameter Modelica.Units.SI.Area A_pool(min=0) + "Area of water surface of swimming pool"; + parameter Modelica.Units.SI.Length d_pool(min=0) + "Average depth of swimming pool"; + parameter Modelica.Units.SI.Volume V_storage + "Usable Volume of water storage, DIN 19643-1"; + + // parameter for pool water circulation + parameter Modelica.Units.SI.VolumeFlowRate V_flow_nominal(min=0.001) + "Circulation volume flow rate"; + parameter Modelica.Units.SI.VolumeFlowRate V_flow_partial(min=0) + "In the case of partial load: circulation volume flow rate during non-opening hours, DIN 19643-1"; + parameter Boolean use_partialLoad=false "Partial load operation implemented for non opening hours?"; + parameter Boolean use_idealHeater=true "Include an ideal heat exchanger into the circulation system"; + parameter Modelica.Units.SI.PressureDifference dpHeatExchangerPool + "Pressure drop of heat exchanger, should be zero for an indeal heated pool"; + + // parameter for evaporation + parameter Real beta_inUse(unit="m/s") "Water transfer coefficient during opening hours if pool is used, VDI 2089"; + parameter Boolean use_poolCover=false "Pool covered during non opening hours"; + + // parameter for fresh water + parameter Boolean use_waterRecycling= false "Recycled water used for refilling pool water?"; + parameter Real x_recycling(min=0) "Percentage of refilling water provided by recycled pool water, DIN 19643-1: <= 0,8"; + parameter Modelica.Units.SI.MassFlowRate m_flow_out(min=0.0001) + "Waterexchange due to people in the pool, DIN 19643-1"; + parameter Boolean use_HRS=false "Is a heat recovery system physically integrated?"; + parameter Modelica.Units.SI.Efficiency efficiencyHRS + "Effieciency of heat recovery system"; + + // Wave mode + parameter Boolean use_wavePool=false "Is there a wave machine installed?"; + parameter Modelica.Units.SI.Length h_wave "Height of generatedwave"; + parameter Modelica.Units.SI.Length w_wave + "Width of generated wave/ width of wave machine outlet"; + parameter Modelica.Units.SI.Time wavePool_startTime + "Start time of first wave cycle"; + parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; + parameter Real wavePool_width "Length of wave generation within cycling period"; + + // Pool Walls + parameter Modelica.Units.SI.Area AInnerPoolWall; + parameter Modelica.Units.SI.Area APoolWallWithEarthContact; + parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; + parameter Modelica.Units.SI.Area AInnerPoolFloor; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; + //replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam; + replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition + PoolWallParam constrainedby AixLib.DataBase.Walls.WallBaseDataDefinition + annotation (choicesAllMatching=true, Placement(transformation(extent={{48,-98},{68,-78}}))); + + annotation (Documentation(info=" + + This is the base definition of indoor swimming pool records used in AixLib.Fluid.Pools.IndoorSwimmingPool. + It aggregates all parameters at one record to enhance usability, + exchanging entire datasets and automatic generation of these + datasets. +

References

+
    +
  • German Association of Engineers: Guideline VDI 2089-1, January 2010: Building Services in swimming baths - Indoor Pools
  • +
  • German Institute for Standardization DIN 19643-1, November 2012: Treatment of water of swimming pools and baths - Part 1 General Requirements
  • +
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • +
+")); +end IndoorSwimmingPoolBaseRecord; diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo new file mode 100644 index 0000000000..a78c913d59 --- /dev/null +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo @@ -0,0 +1,38 @@ +within AixLib.DataBase.Pools; +record IndoorSwimmingPoolDummy + "This is a dummy record with non-physical parameter values." + extends IndoorSwimmingPoolBaseRecord( + T_pool=Modelica.Constants.eps, + V_pool=Modelica.Constants.inf, + A_pool=Modelica.Constants.inf, + d_pool=Modelica.Constants.inf, + V_storage=Modelica.Constants.inf, + V_flow_nominal=Modelica.Constants.inf, + V_flow_partial=Modelica.Constants.inf, + use_partialLoad=false, + use_idealHeater=true, + dpHeatExchangerPool=Modelica.Constants.inf, + beta_inUse=Modelica.Constants.inf, + use_poolCover=false, + use_waterRecycling=false, + x_recycling=Modelica.Constants.inf, + m_flow_out=Modelica.Constants.inf, + use_HRS=false, + efficiencyHRS=Modelica.Constants.eps, + use_wavePool=false, + h_wave=Modelica.Constants.inf, + w_wave=Modelica.Constants.inf, + wavePool_period=Modelica.Constants.eps, + wavePool_startTime=Modelica.Constants.eps, + wavePool_width=Modelica.Constants.eps, + AInnerPoolWall=Modelica.Constants.inf, + APoolWallWithEarthContact=Modelica.Constants.inf, + APoolFloorWithEarthContact=Modelica.Constants.inf, + AInnerPoolFloor=Modelica.Constants.inf, + hConWaterHorizontal=Modelica.Constants.inf, + hConWaterVertical=Modelica.Constants.inf, + PoolWallParam=AixLib.DataBase.Pools.SwimmingPoolWalls.WallDummy()); + annotation (Documentation(info=" +

This record is a place holder for zones without swimming pools to avoid error messages.

+")); +end IndoorSwimmingPoolDummy; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteIsulationConstruction.mo b/AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteIsulationConstruction.mo new file mode 100644 index 0000000000..34682e9abc --- /dev/null +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteIsulationConstruction.mo @@ -0,0 +1,12 @@ +within AixLib.DataBase.Pools.SwimmingPoolWalls; +record ConcreteIsulationConstruction "Concrete pool construction with isolation" + extends AixLib.DataBase.Walls.WallBaseDataDefinition( + n(min=1) = 3 "Number of wall layers", + d={0.05,0.2,0.1} "Thickness of wall layers", + rho={1940,2330,30} "Density of wall layers", + lambda={1.4,2.1,0.035} "Thermal conductivity of wall layers", + c={0.0001,0.001,0.00138} "Specific heat capacity of wall layers", + eps=0.9 "Emissivity of inner wall surface"); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); +end ConcreteIsulationConstruction; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo b/AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo new file mode 100644 index 0000000000..a2957d849c --- /dev/null +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo @@ -0,0 +1,12 @@ +within AixLib.DataBase.Pools.SwimmingPoolWalls; +record StainlessSteelConstruction + extends AixLib.DataBase.Walls.WallBaseDataDefinition( + n(min=1) = 1 "Number of wall layers", + d={0.05} "Thickness of wall layers", + rho={7900} "Density of wall layers", + lambda={15} "Thermal conductivity of wall layers", + c={500} "Specific heat capacity of wall layers", + eps=0.9 "Emissivity of inner wall surface"); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); +end StainlessSteelConstruction; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo b/AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo new file mode 100644 index 0000000000..b774b05586 --- /dev/null +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo @@ -0,0 +1,12 @@ +within AixLib.DataBase.Pools.SwimmingPoolWalls; +record WallDummy + extends AixLib.DataBase.Walls.WallBaseDataDefinition( + n(min=1) = 1 "Number of wall layers", + d={1} "Thickness of wall layers", + rho={1} "Density of wall layers", + lambda={1} "Thermal conductivity of wall layers", + c={1} "Specific heat capacity of wall layers", + eps=1 "Emissivity of inner wall surface"); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); +end WallDummy; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/package.mo b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.mo new file mode 100644 index 0000000000..f30a5470d1 --- /dev/null +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.mo @@ -0,0 +1,3 @@ +within AixLib.DataBase.Pools; +package SwimmingPoolWalls +end SwimmingPoolWalls; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order new file mode 100644 index 0000000000..c6511d0fb9 --- /dev/null +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order @@ -0,0 +1,3 @@ +WallDummy +ConcreteIsulationConstruction +StainlessSteelConstruction diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo new file mode 100644 index 0000000000..e1fd40eda7 --- /dev/null +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo @@ -0,0 +1,39 @@ +within AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools; +record ChildrensPool "Pool which is mainly used by children" + + extends IndoorSwimmingPoolBaseRecord( + T_pool=303.15, + V_pool=126.8, + A_pool=125.0, + d_pool=0.9303008070432868, + V_storage=69.333925940005700, + V_flow_nominal=0.028045267489711933, + V_flow_partial=0.0125, + use_partialLoad=true, + use_idealHeater=true, + dpHeatExchangerPool=0, + beta_inUse=0.011111111111111112, + use_poolCover=false, + use_waterRecycling=false, + x_recycling=0.0, + m_flow_out=0.055645372003397, + use_HRS=true, + efficiencyHRS=0.8, + use_wavePool=false, + h_wave=0, + w_wave=0, + wavePool_period=1800, + wavePool_startTime=0, + wavePool_width=0, + AInnerPoolWall=0.001, + APoolWallWithEarthContact=156.5, + APoolFloorWithEarthContact=156.5, + AInnerPoolFloor=0.001, + hConWaterHorizontal=50.0, + hConWaterVertical=5200.0, + PoolWallParam= + AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteIsulationConstruction()); +annotation (Documentation(info=" +

The swimming pool "ChildrensPool" describes a typical indoor swimming pool, which is mainly used by children and to teach children swimming.

+")); +end ChildrensPool; diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo new file mode 100644 index 0000000000..fb05d4aedc --- /dev/null +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo @@ -0,0 +1,39 @@ +within AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools; +record SportPool "Pool which is mainly used by sport swimmers" + extends IndoorSwimmingPoolBaseRecord( + T_pool=301.15, + V_pool=942.956, + A_pool=416.5, + d_pool=2.2640000000000002, + V_storage=69.333925940005700, + V_flow_nominal=0.0856995884773662, + V_flow_partial=0.023144444444444443, + use_partialLoad=true, + use_idealHeater=true, + dpHeatExchangerPool=0, + beta_inUse=0.011111111111111112, + use_poolCover=false, + use_waterRecycling=false, + x_recycling=0.0, + m_flow_out=0.170038866026520, + use_HRS=true, + efficiencyHRS=0.8, + use_wavePool=false, + h_wave=0, + w_wave=0, + wavePool_period=1800, + wavePool_startTime=0, + wavePool_width=10/30*100, + AInnerPoolWall=21.658, + APoolWallWithEarthContact=143.32, + APoolFloorWithEarthContact=559.82, + AInnerPoolFloor=0.001, + hConWaterHorizontal=50.0, + hConWaterVertical=5200.0, + PoolWallParam= + AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteIsulationConstruction()); + + annotation (Documentation(info=" +

The swimming pool "SportPool" describes a typical indoor swimming pool, which is mainly used for sport swimming.

+")); +end SportPool; diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo new file mode 100644 index 0000000000..5994359dda --- /dev/null +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo @@ -0,0 +1,3 @@ +within AixLib.DataBase.Pools; +package TypesOfIndoorSwimmingPools +end TypesOfIndoorSwimmingPools; diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.order b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.order new file mode 100644 index 0000000000..b3e9bf8414 --- /dev/null +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.order @@ -0,0 +1,2 @@ +SportPool +ChildrensPool diff --git a/AixLib/DataBase/Pools/package.mo b/AixLib/DataBase/Pools/package.mo new file mode 100644 index 0000000000..a508758aed --- /dev/null +++ b/AixLib/DataBase/Pools/package.mo @@ -0,0 +1,3 @@ +within AixLib.DataBase; +package Pools +end Pools; diff --git a/AixLib/DataBase/Pools/package.order b/AixLib/DataBase/Pools/package.order new file mode 100644 index 0000000000..159d4643c5 --- /dev/null +++ b/AixLib/DataBase/Pools/package.order @@ -0,0 +1,4 @@ +IndoorSwimmingPoolBaseRecord +IndoorSwimmingPoolDummy +TypesOfIndoorSwimmingPools +SwimmingPoolWalls From 5130e769a7eda77fa0481d0d7f1f4797241f15c8 Mon Sep 17 00:00:00 2001 From: Larissa Date: Wed, 30 Nov 2022 17:39:22 +0100 Subject: [PATCH 04/34] Add example without ideal heater and correct corresponding errors #1407 --- AixLib/Fluid/Pool.mo | 890 ------------------ .../BaseClasses/HeatTransferConduction.mo | 158 ++++ AixLib/Fluid/Pool/BaseClasses/package.mo | 6 + AixLib/Fluid/Pool/BaseClasses/package.order | 2 + AixLib/Fluid/Pool/BaseClasses/waveMachine.mo | 93 ++ .../Fluid/Pool/Examples/IndoorSwimmingPool.mo | 83 ++ ...IndoorSwimmingPoolExternalHeatingSystem.mo | 118 +++ AixLib/Fluid/Pool/Examples/package.mo | 9 + AixLib/Fluid/Pool/Examples/package.order | 2 + AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 546 +++++++++++ AixLib/Fluid/Pool/package.mo | 7 + AixLib/Fluid/Pool/package.order | 3 + 12 files changed, 1027 insertions(+), 890 deletions(-) delete mode 100644 AixLib/Fluid/Pool.mo create mode 100644 AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo create mode 100644 AixLib/Fluid/Pool/BaseClasses/package.mo create mode 100644 AixLib/Fluid/Pool/BaseClasses/package.order create mode 100644 AixLib/Fluid/Pool/BaseClasses/waveMachine.mo create mode 100644 AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo create mode 100644 AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo create mode 100644 AixLib/Fluid/Pool/Examples/package.mo create mode 100644 AixLib/Fluid/Pool/Examples/package.order create mode 100644 AixLib/Fluid/Pool/IndoorSwimmingPool.mo create mode 100644 AixLib/Fluid/Pool/package.mo create mode 100644 AixLib/Fluid/Pool/package.order diff --git a/AixLib/Fluid/Pool.mo b/AixLib/Fluid/Pool.mo deleted file mode 100644 index fbe61d3d96..0000000000 --- a/AixLib/Fluid/Pool.mo +++ /dev/null @@ -1,890 +0,0 @@ -within AixLib.Fluid; -package Pool - model IndoorSwimmingPool - parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord poolParam - "Choose setup for this pool" annotation (choicesAllMatching=true); - - replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); - - // Water transfer coefficients according to VDI 2089 Blatt 1 - parameter Real beta_nonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); - parameter Real beta_cover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" - annotation (Dialog(group="Water transfer coefficients")); - parameter Real beta_wavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" - annotation (Dialog(group="Water transfer coefficients")); - - // Parameter and variables for evaporation - constant Modelica.Units.SI.SpecificHeatCapacity R_D=461.52 - "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) - final parameter Modelica.Units.SI.SpecificEnergy h_vapor= - AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.T_pool) - "Latent heat of evaporating water"; - Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) - "mass flow rate between pool water and air due to evaporation"; - Modelica.Units.SI.Pressure psat_T_pool= - Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( - poolWater.T) "Saturation pressure at pool temperature"; - Modelica.Units.SI.Pressure psat_T_Air= - Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( - TAir) "Saturation pressure at air temperature"; - Real phi "Relative humidity"; - - // Pump - parameter Modelica.Units.SI.Pressure pumpHead=170000 - "Expected average flow resistance of water cycle"; - - // Pool circulation flow rate - final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= - poolParam.V_flow_nominal*rhoWater_default - "Nominal circulation mass flow rate to the pool"; - final parameter Modelica.Units.SI.MassFlowRate m_flow_partial= - poolParam.V_flow_partial*rhoWater_default - "Partial circulation mass flow rate to pool during non operating hours"; - Modelica.Units.SI.MassFlowRate m_flow_toPool(start=0.0) - "Actual circulation mass flow rate to the pool"; - - // Fresh water and water recycling - final parameter Modelica.Units.SI.Efficiency eps=if poolParam.use_HRS then - poolParam.efficiencyHRS else 0; - Modelica.Units.SI.MassFlowRate m_flow_freshWater(start=0.0) - "Mass flow of fresh water supplied to pool circulation system"; - - // Convection and Radiation at pool water surface - parameter Modelica.Units.SI.CoefficientOfHeatTransfer alpha_Air=3.5 - "Coefficient of heat transfer between the water surface and the room air"; - // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area - parameter Real epsilon = 0.9*0.95 - "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; - - AixLib.Fluid.MixingVolumes.MixingVolume Storage( - redeclare package Medium = WaterMedium, - T_start=poolParam.T_pool, - m_flow_nominal=m_flow_nominal, - V=poolParam.V_storage, - nPorts=4) annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); - - AixLib.Fluid.Sources.Boundary_pT Sinc( - redeclare package Medium = WaterMedium, nPorts=1) - annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); - AixLib.Fluid.MixingVolumes.MixingVolume poolWater( - redeclare package Medium = WaterMedium, - T_start=poolParam.T_pool, - m_flow_nominal=m_flow_nominal, - V=poolParam.V_pool, - nPorts=3) - annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); - - Modelica.Blocks.Sources.RealExpression PoolWater(y=m_flow_toPool) - annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); - Modelica.Blocks.Interfaces.RealOutput QPool if poolParam.use_idealHeater - "Heat flow rate to maintain the pool at the set temperature" annotation ( - Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( - extent={{98,-16},{118,4}}))); - - AixLib.Fluid.Movers.BaseClasses.IdealSource Evaporation( - redeclare package Medium = WaterMedium, - m_flow_small=0.00001, - control_m_flow=true) annotation (Placement(transformation( - extent={{6,-6},{-6,6}}, - rotation=0, - origin={-30,26}))); - Modelica.Blocks.Sources.RealExpression m_Eavporation(y=m_flow_evap) - annotation (Placement(transformation(extent={{9,-9},{-9,9}}, - rotation=180, - origin={-81,41}))); - AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( - redeclare package Medium1 = WaterMedium, - redeclare package Medium2 = WaterMedium, - m1_flow_nominal=poolParam.m_flow_out*1.5, - m2_flow_nominal=poolParam.m_flow_out, - dp1_nominal(displayUnit="bar") = 100000, - dp2_nominal(displayUnit="bar") = 100000, - eps=eps) - annotation (Placement(transformation( - extent={{-5,-5},{5,5}}, - rotation=90, - origin={-33,-73}))); - Modelica.Blocks.Interfaces.RealInput openingHours - "Input profile for opening hours" - annotation (Placement(transformation(extent={{-118,-70},{-94,-46}}), - iconTransformation(extent={{-118,-70},{-94,-46}}))); - Modelica.Blocks.Interfaces.RealInput persons "Input profile for persons" - annotation (Placement(transformation(extent={{-118,-38},{-92,-12}}), - iconTransformation(extent={{-118,-38},{-92,-12}}))); - - Modelica.Blocks.Interfaces.RealInput TAir( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") "Temperature of the surrounding room air" annotation ( - Placement(transformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-67,103}),iconTransformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-67,103}))); - Modelica.Blocks.Interfaces.RealInput X_w "Absolute humidty of the room Air" annotation (Placement(transformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-29,103}), iconTransformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-29,103}))); - - AixLib.ThermalZones.ReducedOrder.Multizone.BaseClasses.AbsToRelHum absToRelHum - "Calculation of the relative humidity of the room air " annotation (Placement(transformation( - extent={{-5,-5},{5,5}}, - rotation=-90, - origin={-59,77}))); - - Modelica.Blocks.Sources.RealExpression FreshWater(y=m_flow_freshWater) annotation (Placement(transformation(extent={{-62,-78}, - {-48,-62}}))); - - AixLib.Fluid.Sources.Boundary_pT SincEvaporation( - redeclare package Medium = WaterMedium, nPorts=1) annotation (Placement(transformation(extent={{6,-6},{ - -6,6}}, - rotation=180, - origin={-64,26}))); - - Modelica.Fluid.Interfaces.FluidPort_b fromPool(redeclare package Medium = - WaterMedium) if poolParam.use_idealHeater == false - "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" - annotation (Placement(transformation(extent={{90,-64},{110,-44}}), - iconTransformation(extent={{90,-64},{110,-44}}))); - - Modelica.Fluid.Interfaces.FluidPort_a toPool(redeclare package Medium = - WaterMedium) if poolParam.use_idealHeater == false - "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" - annotation (Placement(transformation(extent={{90,-40},{110,-20}}), - iconTransformation(extent={{90,-40},{110,-20}}))); - - .AixLib.Fluid.Pool.BaseClasses.waveMachine waveMachine( - h_wave=poolParam.h_wave, - w_wave=poolParam.w_wave, - wavePool_startTime=poolParam.wavePool_startTime, - wavePool_period=poolParam.wavePool_period, - wavePool_width=poolParam.wavePool_width) if poolParam.use_wavePool - annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); - - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPoolSurface - "Air Temperature in Zone" annotation (Placement(transformation(extent={{56,86}, - {80,110}}), - iconTransformation(extent={{64,94},{84,114}}))); - - AixLib.Utilities.Interfaces.RadPort radPoolSurface - "Mean Radiation Temperature of surrounding walls" annotation (Placement( - transformation( - extent={{-8,-9},{8,9}}, - rotation=-90, - origin={39,100}), iconTransformation( - extent={{-11,-11},{11,11}}, - rotation=-90, - origin={30,100}))); - - Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( - final Gr=epsilon*poolParam.A_pool) - "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( - extent={{-7,-7},{7,7}}, - rotation=90, - origin={39,73}))); - - Modelica.Thermal.HeatTransfer.Components.Convection convWaterSurface - "Convection at the watersurface" annotation (Placement(transformation( - extent={{-7,7},{7,-7}}, - rotation=90, - origin={67,75}))); - - Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=alpha_Air*poolParam.A_pool) - "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, - {82,84}}))); - - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, - {12,68}}))); - - Modelica.Blocks.Math.Gain hEvapLatentHeatGain(final k=h_vapor) - "Calculation of heat flow rate due to evaporation" annotation (Placement( - transformation( - extent={{-4,-4},{4,4}}, - rotation=0, - origin={-44,52}))); - - Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater - "Flow rate of added fresh water to the pool and water treatment system" annotation (Placement(transformation(extent={{98,-102}, - {118,-82}}), - iconTransformation(extent={{98,-102},{118,-82}}))); - - AixLib.Fluid.Pool.BaseClasses.HeatTransferConduction heatTransferConduction( - AInnerPoolWall=poolParam.AInnerPoolWall, - APoolWallWithEarthContact=poolParam.APoolWallWithEarthContact, - APoolFloorWithEarthContact=poolParam.APoolFloorWithEarthContact, - AInnerPoolFloor=poolParam.AInnerPoolFloor, - hConWaterHorizontal=poolParam.hConWaterHorizontal, - hConWaterVertical=poolParam.hConWaterVertical, - PoolWall=poolParam.PoolWallParam) - "Model to depict the heat flow rate through the pool walls to the bordering room/soil" - annotation (Placement(transformation(extent={{64,32},{80,48}}))); - - Modelica.Blocks.Math.Gain minus1Gain(final k=-1) annotation (Placement( - transformation( - extent={{-4,-4},{4,4}}, - rotation=0, - origin={-20,60}))); - - Modelica.Blocks.Interfaces.RealOutput QEvap(final quantity="HeatFlowRate", - final unit="W") - "Heat needed to compensate losses" annotation (Placement(transformation(extent={{-92,46}, - {-122,76}}), - iconTransformation(extent={{-94,46},{-114,66}}))); - - Modelica.Blocks.Interfaces.RealInput TSoil( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") "Temperature of Soil" annotation (Placement( - transformation( - extent={{-13,-13},{13,13}}, - rotation=180, - origin={105,49}), iconTransformation( - extent={{-11,-11},{11,11}}, - rotation=180, - origin={103,47}))); - - Modelica.Blocks.Interfaces.RealOutput PPool( - final quantity="Power", - final unit="W") - "Output eletric energy needed for pool operation" annotation (Placement(transformation(extent={{98,-86}, - {118,-66}}), - iconTransformation(extent={{98,-86},{118,-66}}))); - - Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavePool then 2 else 1) - "Add electric power of pump and the optional wave pool" - annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); - Sources.MassFlowSource_T boundary( - redeclare package Medium = WaterMedium, - use_m_flow_in=true, - T=283.15, - nPorts=1) - annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); - Modelica.Blocks.Sources.RealExpression ReadPoolTemp(y=poolWater.T) - annotation (Placement(transformation( - extent={{10,-10},{-10,10}}, - rotation=180, - origin={72,16}))); - Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" - annotation (Placement(transformation(extent={{98,6},{118,26}}), - iconTransformation(extent={{98,6},{118,26}}))); - - final parameter Modelica.Units.SI.Density rhoWater_default= - WaterMedium.density_pTX( - p=WaterMedium.p_default, - T=273.15 + 30, - X=WaterMedium.X_default) "Default medium density"; - - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater - annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); - Controls.Continuous.LimPID PI( - k=1000, - yMax=100000000, - yMin=0, - controllerType=Modelica.Blocks.Types.SimpleController.PI, - Ti=5, - Td=0.1) annotation(Placement(transformation(extent={{-4,-4}, - {4,4}}, - rotation=180, - origin={66,-16}))); - Modelica.Blocks.Sources.RealExpression SetTemperature(y=poolParam.T_pool) - if poolParam.use_idealHeater - annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); - Controls.Continuous.LimPID PI1( - controllerType=Modelica.Blocks.Types.SimpleController.PI, - k=0.1, - Ti=5, - yMax=m_flow_nominal/0.9, - yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); - Movers.FlowControlled_m_flow CirculationPump( - redeclare package Medium = WaterMedium, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - T_start=poolParam.T_pool, - allowFlowReversal=false, - m_flow_nominal=m_flow_nominal, - redeclare Movers.Data.Generic per, - inputType=AixLib.Fluid.Types.InputType.Continuous, - addPowerToMedium=false, - nominalValuesDefineDefaultPressureCurve=true, - dp_nominal=pumpHead, - m_flow_start=m_flow_nominal) - annotation (Placement(transformation(extent={{-8,-8},{8,8}}, - rotation=0, - origin={0,-68}))); - Sensors.MassFlowRate senMasFlo(redeclare package Medium = - WaterMedium, allowFlowReversal=false) - annotation (Placement(transformation(extent={{-6,-6},{6,6}}, - rotation=0, - origin={22,-68}))); - FixedResistances.PressureDrop res( - redeclare package Medium = WaterMedium, - allowFlowReversal=false, - m_flow_nominal=m_flow_nominal, - show_T=false, - from_dp=false, - dp_nominal=pumpHead - poolParam.dpHeatExchangerPool, - homotopyInitialization=true, - linearized=false, - deltaM=0.3) - annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); - equation - // Fresh water and water recycling - if poolParam.use_waterRecycling then - m_flow_freshWater=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); - else - m_flow_freshWater=poolParam.m_flow_out + m_flow_evap; - end if; - - // Pool circulation flow rate - if poolParam.use_partialLoad then - if openingHours > 0 then - m_flow_toPool = m_flow_nominal; - else - m_flow_toPool = m_flow_partial; - end if; - else - m_flow_toPool = m_flow_nominal; - end if; - - // Evaporation according to VDI 2089 sheet 1, formula (1) - phi=absToRelHum.relHum; - if psat_T_pool-phi*psat_T_Air<0 then - m_flow_evap=0.0; - else - if openingHours > 0 then - if persons > 0 then - m_flow_evap =persons*(poolParam.beta_inUse/(R_D*0.5*(poolWater.T + - TAir))*(psat_T_pool - phi*psat_T_Air)*poolParam.A_pool); - else - m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; - end if; - else - if poolParam.use_poolCover then - m_flow_evap = beta_cover /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; - else - m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; - end if; - end if; - end if; - - if poolParam.use_idealHeater then - connect(res.port_b, poolWater.ports[1]) annotation (Line(points={{44,-68}, - {54,-68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, - color={0,127,255})); - else - connect(poolWater.ports[1], toPool) annotation (Line( - points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, - color={0,127,255}, - pattern=LinePattern.Dash)); - connect(fromPool, res.port_b) annotation (Line( - points={{100,-54},{78,-54},{78,-68},{44,-68}}, - color={0,127,255}, - pattern=LinePattern.Dash)); - end if; - - connect(poolWater.ports[3], Evaporation.port_a) annotation (Line(points={{2.66667, - -10},{2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); - - connect(Storage.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, - -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); - connect(Storage.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, - -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); - connect(Storage.ports[4], CirculationPump.port_a) annotation (Line(points={{-26.5, - -56},{-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); - connect(Storage.ports[1], poolWater.ports[2]) annotation (Line(points={{-29.5, - -56},{-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127, - 255})); - - connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, - {-62,88},{-67,88},{-67,103}},color={0,0,127})); - connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, - {-56,88},{-29,88},{-29,103}}, color={0,0,127})); - connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, - {-30,-88},{22,-88}}, color={0,127,255})); - connect(Evaporation.port_b, SincEvaporation.ports[1]) - annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); - connect(m_Eavporation.y, Evaporation.m_flow_in) annotation (Line(points={{-71.1, - 41},{-26.4,41},{-26.4,30.8}}, color={0,0,127})); - connect(radWaterSurface.port_b, radPoolSurface) annotation (Line(points={{39,80}, - {39,100}}, color={191,0,0})); - connect(convWaterSurface.fluid, convPoolSurface) annotation (Line(points={{67,82}, - {68,82},{68,98}}, color={191,0,0})); - connect(convWaterSurface.solid, poolWater.heatPort) annotation (Line(points={{67,68}, - {66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); - connect(radWaterSurface.port_a, poolWater.heatPort) annotation (Line(points={{39,66}, - {38,66},{38,0},{14,0}}, color={191,0,0})); - connect(preHeatFlowEvapLoss.port, poolWater.heatPort) annotation (Line(points={{12,60}, - {26,60},{26,0},{14,0}}, color={191,0,0})); - connect(m_Eavporation.y, hEvapLatentHeatGain.u) annotation (Line(points={{-71.1, - 41},{-58,41},{-58,52},{-48.8,52}}, - color={0,0,127})); - connect(heatTransferConduction.heatport_a, poolWater.heatPort) annotation ( - Line(points={{63.76,39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); - connect(hEvapLatentHeatGain.y, minus1Gain.u) annotation (Line(points={{-39.6, - 52},{-34,52},{-34,60},{-24.8,60}}, color={0,0,127})); - connect(hEvapLatentHeatGain.y, QEvap) annotation (Line(points={{-39.6,52},{-34, - 52},{-34,61},{-107,61}}, color={0,0,127})); - connect(heatTransferConduction.TSoil, TSoil) annotation (Line(points={{80.48,42.88}, - {82,42.88},{82,49},{105,49}}, color={0,0,127})); - connect(convPoolSurface, convPoolSurface) annotation (Line(points={{68,98},{68, - 98}}, color={191,0,0})); - connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, - {74,75}}, color={0,0,127})); - connect(minus1Gain.y, preHeatFlowEvapLoss.Q_flow) annotation (Line(points={{-15.6, - 60},{-4,60}}, color={0,0,127})); - - connect(boundary.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, - {-40,-78},{-36,-78}}, color={0,127, - 255})); - connect(waveMachine.open, openingHours) annotation (Line(points={{-93.28, - -87},{-98,-87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, - color={0,0,127})); - connect(ReadPoolTemp.y, T_Pool) - annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); - - connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, - {54,-12},{48,-12}}, color={0,0,127})); - connect(idealHeater.port, poolWater.heatPort) annotation (Line(points={{32,-12}, - {24,-12},{24,0},{14,0}}, color={191,0,0})); - connect(SetTemperature.y, PI.u_s) - annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); - connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, - -16}}, color={0,0,127})); - connect(boundary.m_flow_in, FreshWater.y) annotation (Line(points={{-53.2,-83.2}, - {-60,-83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); - connect(FreshWater.y, MFlowFreshWater) annotation (Line(points={{-47.3,-70},{-42, - -70},{-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, - color={0,0,127})); - connect(Evaporation.port_b, Evaporation.port_a) annotation (Line( - points={{-36,26},{-30,26},{-24,26}}, - color={0,127,255}, - smooth=Smooth.Bezier)); - connect(CirculationPump.port_b, senMasFlo.port_a) - annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); - connect(senMasFlo.port_b, res.port_a) - annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); - connect(PI1.y, CirculationPump.m_flow_in) - annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); - connect(PI1.u_s, PoolWater.y) - annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); - connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, - {13,-58},{13,-55}}, color={0,0,127})); - - connect(elPower.u[1], CirculationPump.P) annotation (Line(points={{72,-76},{62, - -76},{62,-60.8},{8.8,-60.8}}, color={0,0,127})); - connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); - connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, - -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, - color={0,0,127})); - - connect(PI.u_m, ReadPoolTemp.y) annotation (Line(points={{66,-11.2},{66,4},{92, - 4},{92,16},{83,16}}, color={0,0,127})); - annotation (Line( - points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), - Line(points={{18.4,-40}, - {18,-40},{18,-44},{-100,-44}}, color={0,127,255}), - Placement(transformation( - extent={{-20,-20},{20,20}}, - rotation=-90, - origin={-50,82}), iconTransformation( - extent={{-20,-20},{20,20}}, - rotation=-90, - origin={-60,80})), - Icon(coordinateSystem(preserveAspectRatio=false), - graphics={ - Rectangle( - extent={{98,98},{-98,-98}}, - fillColor={215,215,215}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Bitmap(extent={{-94,-150},{96,58}}, fileName="modelica://AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg")}), - Diagram(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-100,2},{100,100}}, - lineColor={0,128,255}, - fillColor={170,213,255}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Text( - extent={{-98,12},{-6,0}}, - textColor={85,85,255}, - textStyle={TextStyle.Bold}, - horizontalAlignment=TextAlignment.Left, - textString="Heat and mass exchange -at pool surface or pool walls -"), Rectangle( - extent={{-66,-98},{100,-2}}, - lineColor={0,0,127}, - fillColor={155,195,232}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Rectangle( - extent={{-100,-98},{-68,-2}}, - lineColor={95,95,95}, - fillColor={215,215,215}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Text( - extent={{-98,-6},{-72,-14}}, - textColor={95,95,95}, - horizontalAlignment=TextAlignment.Left, - textStyle={TextStyle.Bold}, - textString="Pool -operation"), - Text( - extent={{-64,-2},{-22,-24}}, - textColor={0,0,127}, - horizontalAlignment=TextAlignment.Left, - textStyle={TextStyle.Bold}, - textString="Water treatment -circuit -")})); - end IndoorSwimmingPool; - - package BaseClasses - extends Modelica.Icons.BasesPackage; - - model HeatTransferConduction - "Heat transfer due to conduction through pool walls" - parameter Modelica.Units.SI.Area AInnerPoolWall; - parameter Modelica.Units.SI.Area APoolWallWithEarthContact; - parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; - parameter Modelica.Units.SI.Area AInnerPoolFloor; - - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; - - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter - "Generate Heat Flow for earth contact" annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=180, - origin={74,-28}))); - - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport_a - "Inlet for heattransfer" annotation (Placement(transformation(extent={{-116, - -14},{-90,12}}), - iconTransformation(extent={{-116,-14},{-90,12}}))); - - Modelica.Blocks.Interfaces.RealInput TSoil "Temperature of Soil" annotation (Placement(transformation(extent={{130,-48}, - {90,-8}}), - iconTransformation(extent={{126,16},{86,56}}))); - - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - InnerPoolFloor( - A=AInnerPoolFloor, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-10,-34},{18,-10}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( - hCon_const=hConWaterHorizontal, - A=AInnerPoolFloor, - calcMethod=3, - surfaceOrientation=1) - annotation (Placement(transformation( - origin={-48,-22}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( - hCon_const=hConWaterVertical, - A=APoolWallWithEarthContact, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-54,40}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - PoolWallWithEarthContact( - A=APoolWallWithEarthContact, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-6,26},{22,54}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( - hCon_const=hConWaterHorizontal, - A=APoolFloorWithEarthContact, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-52,-60}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - PoolFloorWithEarthContact( - A=APoolFloorWithEarthContact, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-10,-72},{14,-50}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow - prescribedHeatFlow1 "Generate Heat Flow for earth contact" - annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=180, - origin={44,12}))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - InnerPoolWall( - A=AInnerPoolWall, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-6,64},{22,92}}))); - Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) - "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" - annotation (Placement(transformation(extent={{96,2},{76,22}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( - hCon_const=hConWaterVertical, - A=AInnerPoolWall, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-54,78}, - extent={{-10,-10},{10,10}}, - rotation=180))); - replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall - annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); - equation - connect(HeatFlowOuter.T, TSoil) - annotation (Line(points={{81.2,-28},{110,-28}}, color={0,0,127})); - connect(heatport_a, heatport_a) - annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) - annotation (Line(points={{-38,-22},{-10,-22}}, color={191,0,0})); - connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( - Line(points={{14,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); - connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) - annotation (Line(points={{-10,-61},{-10,-60},{-42,-60}}, color={191,0,0})); - connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{22,78},{30,78},{30,12},{38,12}}, color={191,0,0})); - connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( - points={{-64,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( - points={{-58,-22},{-72,-22},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( - points={{-62,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) - annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); - connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( - points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); - connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{18,-22},{30,-22},{30,12},{38,12}}, color={191,0,0})); - connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) - annotation (Line(points={{-44,40},{-6,40}}, color={191,0,0})); - connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( - Line(points={{-6,78},{-44,78}}, color={191,0,0})); - connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( - points={{-64,78},{-72,78},{-72,-1},{-103,-1}},color={191,0,0})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-80,58},{28,-26}}, - lineColor={28,108,200}, - fillColor={28,108,200}, - fillPattern=FillPattern.Solid), - Rectangle( - extent={{28,68},{48,-46}}, - lineColor={135,135,135}, - fillColor={175,175,175}, - fillPattern=FillPattern.Forward), - Rectangle( - extent={{-86,-26},{30,-46}}, - lineColor={135,135,135}, - fillColor={175,175,175}, - fillPattern=FillPattern.Forward), - Polygon( - points={{-16,-10},{-4,6},{58,-52},{46,-62},{-16,-10}}, - lineColor={238,46,47}, - fillColor={238,46,47}, - fillPattern=FillPattern.Solid), - Polygon( - points={{32,-68},{36,-66},{62,-38},{76,-78},{32,-68}}, - lineColor={238,46,47}, - fillColor={238,46,47}, - fillPattern=FillPattern.Solid), - Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0})}), - Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -

This model is a base model to calculate the heat transfer through pool walls. The pool walls are sorted by: vertical walls with earth contact, pool floor with earth contact and the sum of walls and pool floor without earth contact.

-")); - end HeatTransferConduction; - - model waveMachine "Calculate energy demands of a wave machine" - - parameter Modelica.Units.SI.Length h_wave "Height of generated wave"; - parameter Modelica.Units.SI.Length w_wave - "Width of wave machine outlet/of generated wave"; - parameter Modelica.Units.SI.Time wavePool_startTime - "Start time of first wave cycle"; - parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; - parameter Real wavePool_width "Length of wave generation within cycling period"; - - Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) - "If input = 1, then true, else no waves generated" - annotation (Placement(transformation(extent={{-58,-8},{-42,8}}))); - Modelica.Blocks.Tables.CombiTable1Dv tablePWave( - y(unit="W/m"), - tableOnFile=false, - table=[0,0; 0.7,3500; 0.9,6000; 1.3,12000], - extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) - "Estimate consumed power per width to generate wave of a certain heigth; " - annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); - Modelica.Blocks.Sources.RealExpression get_h_wave(y=h_wave) - "Get height of generated wave" - annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); - Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" - annotation (Placement(transformation(extent={{-136,-20},{-96,20}}))); - Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") - "Power consumption of wave machine" - annotation (Placement(transformation(extent={{96,-10},{116,10}}))); - Modelica.Blocks.Math.Gain multiply(k=w_wave) "Multply by width of wave" - annotation (Placement(transformation(extent={{0,52},{16,68}}))); - Modelica.Blocks.Sources.Constant zero(k=0) - "no output if wave machine is off" - annotation (Placement(transformation(extent={{-14,-78},{0,-64}}))); - Modelica.Blocks.Logical.Switch switchWaveMachine - annotation (Placement(transformation(extent={{60,-10},{80,10}}))); - Modelica.Blocks.Logical.And and1 - annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); - Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( - width=wavePool_width, - period=wavePool_period, - startTime=wavePool_startTime) - annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); - equation - connect(get_h_wave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, - 60}}, color={0,0,127})); - connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, - color={0,0,127})); - connect(open, useWavePool.u) - annotation (Line(points={{-116,0},{-59.6,0}}, color={0,0,127})); - connect(switchWaveMachine.y, PWaveMachine) annotation (Line(points={{81,0},{ - 106,0}}, color={0,0,127})); - connect(multiply.y, switchWaveMachine.u1) - annotation (Line(points={{16.8,60},{42,60},{42,8},{58,8}}, - color={0,0,127})); - connect(zero.y, switchWaveMachine.u3) annotation (Line(points={{0.7,-71},{52,-71}, - {52,-8},{58,-8}}, color={0,0,127})); - connect(PWaveMachine, PWaveMachine) annotation (Line( - points={{106,0},{101,0},{101,0},{106,0}}, - color={0,0,127}, - smooth=Smooth.Bezier)); - connect(useWavePool.y, and1.u1) - annotation (Line(points={{-41.2,0},{-10,0}}, color={255,0,255})); - connect(and1.y, switchWaveMachine.u2) - annotation (Line(points={{13,0},{58,0}}, color={255,0,255})); - connect(wavePoolCycle.y, and1.u2) annotation (Line(points={{-39,-40},{-24,-40}, - {-24,-8},{-10,-8}}, color={255,0,255})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}), - Line( - points={{-98,0},{-52,62},{-2,-24},{50,60},{100,-2}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1), - Line( - points={{-98,-18},{-52,44},{-2,-42},{50,42},{98,-20}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1), - Line( - points={{-98,-36},{-52,26},{-2,-60},{50,24},{96,-36}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1)}), Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -

Model to calculate the energy demand of a wavemachine. Based on values of:

-
    -
  • German Association for the Recreational and Medicinal Bath Industry (Deutsche Gesellschaft für das Badewesen DGfdB), April 2015 : Richtlinien für den Bäderbau
  • -
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • -
-")); - end waveMachine; - end BaseClasses; - - package Example - extends Modelica.Icons.ExamplesPackage; - - model IndoorSwimmingPool - extends Modelica.Icons.Example; - Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater - "Flow rate of added fresh water to the pool and water treatment system" - annotation (Placement(transformation(extent={{98,-96},{126,-68}}), - iconTransformation(extent={{98,-96},{126,-68}}))); - .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= - AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool(), - redeclare package WaterMedium = WaterMedium) - annotation (Placement(transformation(extent={{-38,-36},{30,38}}))); - - replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); - - Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) - annotation (Placement(transformation(extent={{96,44},{80,60}}))); - Modelica.Blocks.Sources.RealExpression X_W(y=14.3) - annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); - Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) - annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); - Modelica.Blocks.Sources.Pulse pulse( - amplitude=1, - width=13/15, - period=(24 - 7)*3600, - offset=0, - startTime=3600*7) - annotation (Placement(transformation(extent={{-94,-50},{-80,-36}}))); - Modelica.Blocks.Sources.Trapezoid Person( - amplitude=0.5, - rising=7*3600, - width=1*3600, - falling=7*3600, - period=17*3600, - offset=0.3, - startTime=7*3600) - annotation (Placement(transformation(extent={{-96,-16},{-80,0}}))); - Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( - transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ - {-86,16},{-118,48}}))); - Modelica.Blocks.Interfaces.RealOutput PPool - "Output eletric energy needed for pool operation" annotation (Placement( - transformation(extent={{98,-62},{124,-36}}),iconTransformation(extent={{98,-62}, - {124,-36}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature - prescribedTemperature - annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); - Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" - annotation (Placement(transformation(extent={{98,8},{118,28}}))); - Modelica.Blocks.Interfaces.RealOutput QPool - "Heat flow rate to maintain the pool at the set temperature" - annotation (Placement(transformation(extent={{98,-20},{122,4}}), - iconTransformation(extent={{98,-20},{122,4}}))); - equation - connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52}, - {40,52},{40,18.39},{31.02,18.39}}, - color={0,0,127})); - connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-13.86,39.11},{-12, - 39.11},{-12,62},{-69.2,62}}, color={0,0,127})); - connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-26.78,39.11}, - {-26.78,80},{-69.2,80}}, color={0,0,127})); - connect(pulse.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, - -43},{-50,-43},{-50,-20.46},{-40.04,-20.46}}, color={0,0,127})); - connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.2,-8}, - {-48,-8},{-48,-8.25},{-39.7,-8.25}}, color={0,0,127})); - connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-39.36,21.72},{ - -39.36,22},{-66,22},{-66,32},{-102,32}}, color={0,0,127})); - connect(indoorSwimming.PPool, PPool) annotation (Line(points={{32.72, - -27.12},{32.72,-26},{96,-26},{96,-49},{111,-49}}, color={0,0,127})); - connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( - points={{32.72,-33.04},{32.72,-82},{112,-82}}, color={0,0,127})); - connect(prescribedTemperature.T, T_Air.y) - annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); - connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) - annotation (Line(points={{-4,80},{21.16,80},{21.16,39.48}}, color={191,0,0})); - connect(indoorSwimming.T_Pool, T_Pool) annotation (Line(points={{32.72, - 6.92},{92,6.92},{92,18},{108,18}}, color={0,0,127})); - connect(MFlowFreshWater, MFlowFreshWater) - annotation (Line(points={{112,-82},{112,-82}}, color={0,0,127})); - connect(indoorSwimming.QPool, QPool) annotation (Line(points={{32.72, - -1.22},{32.72,0},{92,0},{92,-8},{110,-8}}, color={0,0,127})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=1080000, __Dymola_Algorithm="Dassl")); - end IndoorSwimmingPool; - end Example; -end Pool; diff --git a/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo b/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo new file mode 100644 index 0000000000..eb43f1a31f --- /dev/null +++ b/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo @@ -0,0 +1,158 @@ +within AixLib.Fluid.Pool.BaseClasses; +model HeatTransferConduction + "Heat transfer due to conduction through pool walls" + parameter Modelica.Units.SI.Area AInnerPoolWall; + parameter Modelica.Units.SI.Area APoolWallWithEarthContact; + parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; + parameter Modelica.Units.SI.Area AInnerPoolFloor; + + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; + + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter + "Generate Heat Flow for earth contact" annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={74,-28}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport_a + "Inlet for heattransfer" annotation (Placement(transformation(extent={{-116, + -14},{-90,12}}), + iconTransformation(extent={{-116,-14},{-90,12}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil "Temperature of Soil" annotation (Placement(transformation(extent={{130,-48}, + {90,-8}}), + iconTransformation(extent={{126,16},{86,56}}))); + + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolFloor( + A=AInnerPoolFloor, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-10,-34},{18,-10}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( + hCon_const=hConWaterHorizontal, + A=AInnerPoolFloor, + calcMethod=3, + surfaceOrientation=1) + annotation (Placement(transformation( + origin={-48,-22}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( + hCon_const=hConWaterVertical, + A=APoolWallWithEarthContact, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-54,40}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolWallWithEarthContact( + A=APoolWallWithEarthContact, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-6,26},{22,54}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( + hCon_const=hConWaterHorizontal, + A=APoolFloorWithEarthContact, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-52,-60}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolFloorWithEarthContact( + A=APoolFloorWithEarthContact, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-10,-72},{14,-50}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow + prescribedHeatFlow1 "Generate Heat Flow for earth contact" + annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={44,12}))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolWall( + A=AInnerPoolWall, + wallRec=PoolWall, + T_start=fill((0), (PoolWall.n))) + annotation (Placement(transformation(extent={{-6,64},{22,92}}))); + Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) + "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" + annotation (Placement(transformation(extent={{96,2},{76,22}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( + hCon_const=hConWaterVertical, + A=AInnerPoolWall, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-54,78}, + extent={{-10,-10},{10,10}}, + rotation=180))); + replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall + annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); +equation + connect(HeatFlowOuter.T, TSoil) + annotation (Line(points={{81.2,-28},{110,-28}}, color={0,0,127})); + connect(heatport_a, heatport_a) + annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) + annotation (Line(points={{-38,-22},{-10,-22}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( + Line(points={{14,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) + annotation (Line(points={{-10,-61},{-10,-60},{-42,-60}}, color={191,0,0})); + connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{22,78},{30,78},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( + points={{-64,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( + points={{-58,-22},{-72,-22},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( + points={{-62,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) + annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); + connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( + points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); + connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{18,-22},{30,-22},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) + annotation (Line(points={{-44,40},{-6,40}}, color={191,0,0})); + connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( + Line(points={{-6,78},{-44,78}}, color={191,0,0})); + connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( + points={{-64,78},{-72,78},{-72,-1},{-103,-1}},color={191,0,0})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-80,58},{28,-26}}, + lineColor={28,108,200}, + fillColor={28,108,200}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{28,68},{48,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Rectangle( + extent={{-86,-26},{30,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Polygon( + points={{-16,-10},{-4,6},{58,-52},{46,-62},{-16,-10}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Polygon( + points={{32,-68},{36,-66},{62,-38},{76,-78},{32,-68}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0})}), + Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

This model is a base model to calculate the heat transfer through pool walls. The pool walls are sorted by: vertical walls with earth contact, pool floor with earth contact and the sum of walls and pool floor without earth contact.

+")); +end HeatTransferConduction; diff --git a/AixLib/Fluid/Pool/BaseClasses/package.mo b/AixLib/Fluid/Pool/BaseClasses/package.mo new file mode 100644 index 0000000000..3763078530 --- /dev/null +++ b/AixLib/Fluid/Pool/BaseClasses/package.mo @@ -0,0 +1,6 @@ +within AixLib.Fluid.Pool; +package BaseClasses + extends Modelica.Icons.BasesPackage; + + +end BaseClasses; diff --git a/AixLib/Fluid/Pool/BaseClasses/package.order b/AixLib/Fluid/Pool/BaseClasses/package.order new file mode 100644 index 0000000000..c1967ace29 --- /dev/null +++ b/AixLib/Fluid/Pool/BaseClasses/package.order @@ -0,0 +1,2 @@ +HeatTransferConduction +waveMachine diff --git a/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo b/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo new file mode 100644 index 0000000000..a453c2442f --- /dev/null +++ b/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo @@ -0,0 +1,93 @@ +within AixLib.Fluid.Pool.BaseClasses; +model waveMachine "Calculate energy demands of a wave machine" + + parameter Modelica.Units.SI.Length h_wave "Height of generated wave"; + parameter Modelica.Units.SI.Length w_wave + "Width of wave machine outlet/of generated wave"; + parameter Modelica.Units.SI.Time wavePool_startTime + "Start time of first wave cycle"; + parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; + parameter Real wavePool_width "Length of wave generation within cycling period"; + + Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) + "If input = 1, then true, else no waves generated" + annotation (Placement(transformation(extent={{-58,-8},{-42,8}}))); + Modelica.Blocks.Tables.CombiTable1Dv tablePWave( + y(unit="W/m"), + tableOnFile=false, + table=[0,0; 0.7,3500; 0.9,6000; 1.3,12000], + extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) + "Estimate consumed power per width to generate wave of a certain heigth; " + annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); + Modelica.Blocks.Sources.RealExpression get_h_wave(y=h_wave) + "Get height of generated wave" + annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); + Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" + annotation (Placement(transformation(extent={{-136,-20},{-96,20}}))); + Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") + "Power consumption of wave machine" + annotation (Placement(transformation(extent={{96,-10},{116,10}}))); + Modelica.Blocks.Math.Gain multiply(k=w_wave) "Multply by width of wave" + annotation (Placement(transformation(extent={{0,52},{16,68}}))); + Modelica.Blocks.Sources.Constant zero(k=0) + "no output if wave machine is off" + annotation (Placement(transformation(extent={{-14,-78},{0,-64}}))); + Modelica.Blocks.Logical.Switch switchWaveMachine + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); + Modelica.Blocks.Logical.And and1 + annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); + Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( + width=wavePool_width, + period=wavePool_period, + startTime=wavePool_startTime) + annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); +equation + connect(get_h_wave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, + 60}}, color={0,0,127})); + connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, + color={0,0,127})); + connect(open, useWavePool.u) + annotation (Line(points={{-116,0},{-59.6,0}}, color={0,0,127})); + connect(switchWaveMachine.y, PWaveMachine) annotation (Line(points={{81,0},{ + 106,0}}, color={0,0,127})); + connect(multiply.y, switchWaveMachine.u1) + annotation (Line(points={{16.8,60},{42,60},{42,8},{58,8}}, + color={0,0,127})); + connect(zero.y, switchWaveMachine.u3) annotation (Line(points={{0.7,-71},{52,-71}, + {52,-8},{58,-8}}, color={0,0,127})); + connect(PWaveMachine, PWaveMachine) annotation (Line( + points={{106,0},{101,0},{101,0},{106,0}}, + color={0,0,127}, + smooth=Smooth.Bezier)); + connect(useWavePool.y, and1.u1) + annotation (Line(points={{-41.2,0},{-10,0}}, color={255,0,255})); + connect(and1.y, switchWaveMachine.u2) + annotation (Line(points={{13,0},{58,0}}, color={255,0,255})); + connect(wavePoolCycle.y, and1.u2) annotation (Line(points={{-39,-40},{-24,-40}, + {-24,-8},{-10,-8}}, color={255,0,255})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}), + Line( + points={{-98,0},{-52,62},{-2,-24},{50,60},{100,-2}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-18},{-52,44},{-2,-42},{50,42},{98,-20}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-36},{-52,26},{-2,-60},{50,24},{96,-36}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1)}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

Model to calculate the energy demand of a wavemachine. Based on values of:

+
    +
  • German Association for the Recreational and Medicinal Bath Industry (Deutsche Gesellschaft für das Badewesen DGfdB), April 2015 : Richtlinien für den Bäderbau
  • +
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • +
+")); +end waveMachine; diff --git a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo new file mode 100644 index 0000000000..02a68f59c1 --- /dev/null +++ b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo @@ -0,0 +1,83 @@ +within AixLib.Fluid.Pool.Examples; +model IndoorSwimmingPool + extends Modelica.Icons.Example; + Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater + "Flow rate of added fresh water to the pool and water treatment system" + annotation (Placement(transformation(extent={{98,-96},{126,-68}}), + iconTransformation(extent={{98,-96},{126,-68}}))); + .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= + AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool(), + redeclare package WaterMedium = WaterMedium) + annotation (Placement(transformation(extent={{-38,-36},{30,38}}))); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) + annotation (Placement(transformation(extent={{96,44},{80,60}}))); + Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) + annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); + Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) + annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); + Modelica.Blocks.Sources.Pulse Opening( + amplitude=1, + width=(13/15)*100, + period=(24 - 7)*3600, + offset=0, + startTime=3600*7) + annotation (Placement(transformation(extent={{-94,-46},{-80,-32}}))); + Modelica.Blocks.Sources.Trapezoid Person( + amplitude=0.5, + rising=7*3600, + width=1*3600, + falling=7*3600, + period=17*3600, + offset=0.3, + startTime=7*3600) + annotation (Placement(transformation(extent={{-94,-8},{-80,6}}))); + Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( + transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ + {-86,16},{-118,48}}))); + Modelica.Blocks.Interfaces.RealOutput PPool + "Output eletric energy needed for pool operation" annotation (Placement( + transformation(extent={{98,-62},{124,-36}}),iconTransformation(extent={{98,-62}, + {124,-36}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature + prescribedTemperature + annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); + Modelica.Blocks.Interfaces.RealOutput TPool "Value of Real output" + annotation (Placement(transformation(extent={{98,8},{118,28}}))); + Modelica.Blocks.Interfaces.RealOutput QPool + "Heat flow rate to maintain the pool at the set temperature" annotation ( + Placement(transformation(extent={{98,-20},{122,4}}), iconTransformation( + extent={{98,-20},{122,4}}))); +equation + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52},{40, + 52},{40,18.39},{31.02,18.39}}, color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-13.86,39.11},{-12, + 39.11},{-12,62},{-69.2,62}}, color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-26.78,39.11}, + {-26.78,80},{-69.2,80}}, color={0,0,127})); + connect(Opening.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, + -39},{-50,-39},{-50,-20.46},{-40.04,-20.46}}, color={0,0,127})); + connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.3,-1}, + {-48,-1},{-48,-8.25},{-39.7,-8.25}}, color={0,0,127})); + connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-39.36,21.72},{ + -39.36,22},{-66,22},{-66,32},{-102,32}}, color={0,0,127})); + connect(indoorSwimming.PPool, PPool) annotation (Line(points={{32.72,-27.12},{ + 32.72,-26},{96,-26},{96,-49},{111,-49}}, color={0,0,127})); + connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( + points={{32.72,-33.04},{32.72,-82},{112,-82}}, color={0,0,127})); + connect(prescribedTemperature.T, T_Air.y) + annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); + connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) + annotation (Line(points={{-4,80},{21.16,80},{21.16,39.48}}, color={191,0,0})); + connect(indoorSwimming.TPool, TPool) annotation (Line(points={{32.72,6.92},{ + 92,6.92},{92,18},{108,18}}, color={0,0,127})); + connect(MFlowFreshWater, MFlowFreshWater) + annotation (Line(points={{112,-82},{112,-82}}, color={0,0,127})); + connect(indoorSwimming.QPool, QPool) annotation (Line(points={{32.72,-1.22},{32.72, + 0},{92,0},{92,-8},{110,-8}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); +end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo new file mode 100644 index 0000000000..35eb309f6c --- /dev/null +++ b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo @@ -0,0 +1,118 @@ +within AixLib.Fluid.Pool.Examples; +model IndoorSwimmingPoolExternalHeatingSystem + extends Modelica.Icons.Example; + Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater + "Flow rate of added fresh water to the pool and water treatment system" + annotation (Placement(transformation(extent={{100,-112},{128,-84}}), + iconTransformation(extent={{100,-112},{128,-84}}))); + .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= + AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool( + use_idealHeater=false), redeclare package WaterMedium = WaterMedium) + annotation (Placement(transformation(extent={{-60,-36},{8,38}}))); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) + annotation (Placement(transformation(extent={{102,80},{86,96}}))); + Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) + annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); + Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) + annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); + Modelica.Blocks.Sources.Pulse Opening( + amplitude=1, + width=(13/15)*100, + period=(24 - 7)*3600, + offset=0, + startTime=3600*7) + annotation (Placement(transformation(extent={{-98,-38},{-84,-24}}))); + Modelica.Blocks.Sources.Trapezoid Person( + amplitude=0.5, + rising=7*3600, + width=1*3600, + falling=7*3600, + period=17*3600, + offset=0.3, + startTime=7*3600) + annotation (Placement(transformation(extent={{-98,-8},{-84,6}}))); + Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( + transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ + {-86,16},{-118,48}}))); + Modelica.Blocks.Interfaces.RealOutput PPool + "Output eletric energy needed for pool operation" annotation (Placement( + transformation(extent={{100,-90},{126,-64}}), + iconTransformation(extent={{100,-90}, + {126,-64}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature + prescribedTemperature + annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); + Modelica.Blocks.Interfaces.RealOutput TPool "Value of Real output" + annotation (Placement(transformation(extent={{100,62},{120,82}}))); + Controls.Continuous.LimPID PI( + k=1000, + yMax=10000000, + yMin=0, + controllerType=Modelica.Blocks.Types.SimpleController.PI, + Ti=1) annotation(Placement(transformation(extent={{-8,-8}, + {8,8}}, + rotation=180, + origin={76,6}))); + Modelica.Blocks.Sources.RealExpression SetTemperature(y=273.15 + 28) + annotation (Placement(transformation(extent={{116,10},{98,26}}))); + Modelica.Blocks.Interfaces.RealOutput y1 + "Connector of actuator output signal" + annotation (Placement(transformation(extent={{108,-30},{128,-10}}))); + MixingVolumes.MixingVolume vol( + redeclare package Medium = AixLib.Media.Water, + m_flow_nominal=indoorSwimming.m_flow_nominal, + V=2, + nPorts=2) annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + rotation=90, + origin={32,-14}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow + annotation (Placement(transformation(extent={{62,-50},{42,-30}}))); +equation + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{85.2,88},{18, + 88},{18,18.39},{9.02,18.39}}, color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-35.86,39.11},{ + -34,39.11},{-34,50},{-64,50},{-64,62},{-69.2,62}}, + color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-48.78,39.11}, + {-48.78,80},{-69.2,80}}, color={0,0,127})); + connect(Opening.y, indoorSwimming.openingHours) annotation (Line(points={{-83.3, + -31},{-70,-31},{-70,-20.46},{-62.04,-20.46}}, color={0,0,127})); + connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-83.3,-1}, + {-70,-1},{-70,-8.25},{-61.7,-8.25}}, color={0,0,127})); + connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-61.36,21.72}, + {-61.36,20},{-80,20},{-80,32},{-102,32}},color={0,0,127})); + connect(indoorSwimming.PPool, PPool) annotation (Line(points={{10.72,-27.12}, + {10.72,-26},{18,-26},{18,-77},{113,-77}}, color={0,0,127})); + connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( + points={{10.72,-33.04},{10.72,-98},{114,-98}}, color={0,0,127})); + connect(prescribedTemperature.T, T_Air.y) + annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); + connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) + annotation (Line(points={{-4,80},{2,80},{2,46},{-0.84,46},{-0.84,39.48}}, + color={191,0,0})); + connect(indoorSwimming.TPool, TPool) annotation (Line(points={{10.72,6.92},{ + 32,6.92},{32,72},{110,72}}, color={0,0,127})); + connect(MFlowFreshWater, MFlowFreshWater) + annotation (Line(points={{114,-98},{114,-98}}, color={0,0,127})); + connect(PI.u_s, SetTemperature.y) annotation (Line(points={{85.6,6},{92,6},{ + 92,18},{97.1,18}}, color={0,0,127})); + connect(indoorSwimming.TPool, PI.u_m) annotation (Line(points={{10.72,6.92},{ + 40,6.92},{40,52},{76,52},{76,15.6}}, color={0,0,127})); + connect(PI.y, y1) annotation (Line(points={{67.2,6},{62,6},{62,-20},{118,-20}}, + color={0,0,127})); + connect(vol.ports[1], indoorSwimming.toPool) annotation (Line(points={{22,-15}, + {22,-10.1},{8,-10.1}}, color={0,127,255})); + connect(vol.ports[2], indoorSwimming.fromPool) annotation (Line(points={{22, + -13},{22,-18.98},{8,-18.98}}, color={0,127,255})); + connect(prescribedHeatFlow.port, vol.heatPort) + annotation (Line(points={{42,-40},{32,-40},{32,-24}}, color={191,0,0})); + connect(PI.y, prescribedHeatFlow.Q_flow) annotation (Line(points={{67.2,6},{ + 54,6},{54,-34},{84,-34},{84,-40},{62,-40}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); +end IndoorSwimmingPoolExternalHeatingSystem; diff --git a/AixLib/Fluid/Pool/Examples/package.mo b/AixLib/Fluid/Pool/Examples/package.mo new file mode 100644 index 0000000000..ab95b937e8 --- /dev/null +++ b/AixLib/Fluid/Pool/Examples/package.mo @@ -0,0 +1,9 @@ +within AixLib.Fluid.Pool; +package Examples + extends Modelica.Icons.ExamplesPackage; + + + + + +end Examples; diff --git a/AixLib/Fluid/Pool/Examples/package.order b/AixLib/Fluid/Pool/Examples/package.order new file mode 100644 index 0000000000..1736d4cc6d --- /dev/null +++ b/AixLib/Fluid/Pool/Examples/package.order @@ -0,0 +1,2 @@ +IndoorSwimmingPool +IndoorSwimmingPoolExternalHeatingSystem diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo new file mode 100644 index 0000000000..71c8aca2a7 --- /dev/null +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -0,0 +1,546 @@ +within AixLib.Fluid.Pool; +model IndoorSwimmingPool + parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord poolParam + "Choose setup for this pool" annotation (choicesAllMatching=true); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + // Water transfer coefficients according to VDI 2089 Blatt 1 + parameter Real beta_nonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); + parameter Real beta_cover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" + annotation (Dialog(group="Water transfer coefficients")); + parameter Real beta_wavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" + annotation (Dialog(group="Water transfer coefficients")); + + // Parameter and variables for evaporation + constant Modelica.Units.SI.SpecificHeatCapacity R_D=461.52 + "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) + final parameter Modelica.Units.SI.SpecificEnergy h_vapor= + AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.TPool) + "Latent heat of evaporating water"; + Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) + "mass flow rate between pool water and air due to evaporation"; + Modelica.Units.SI.Pressure psat_TPool= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + poolWater.T) "Saturation pressure at pool temperature"; + Modelica.Units.SI.Pressure psat_T_Air= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + TAir) "Saturation pressure at air temperature"; + Real phi "Relative humidity"; + + // Pump + parameter Modelica.Units.SI.Pressure pumpHead=170000 + "Expected average flow resistance of water cycle"; + + // Pool circulation flow rate + final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= + poolParam.V_flow_nominal*rhoWater_default + "Nominal circulation mass flow rate to the pool"; + final parameter Modelica.Units.SI.MassFlowRate m_flow_partial= + poolParam.V_flow_partial*rhoWater_default + "Partial circulation mass flow rate to pool during non operating hours"; + Modelica.Units.SI.MassFlowRate m_flow_toPool(start=0.0) + "Actual circulation mass flow rate to the pool"; + + // Fresh water and water recycling + final parameter Modelica.Units.SI.Efficiency eps=if poolParam.use_HRS then + poolParam.efficiencyHRS else 0; + Modelica.Units.SI.MassFlowRate m_flow_freshWater(start=0.0) + "Mass flow of fresh water supplied to pool circulation system"; + + // Convection and Radiation at pool water surface + parameter Modelica.Units.SI.CoefficientOfHeatTransfer alpha_Air=3.5 + "Coefficient of heat transfer between the water surface and the room air"; + // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area + parameter Real epsilon = 0.9*0.95 + "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; + + AixLib.Fluid.MixingVolumes.MixingVolume Storage( + redeclare package Medium = WaterMedium, + T_start=poolParam.TPool, + m_flow_nominal=m_flow_nominal, + V=poolParam.VStorage, + nPorts=4) annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); + + AixLib.Fluid.Sources.Boundary_pT Sinc( + redeclare package Medium = WaterMedium, nPorts=1) + annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); + AixLib.Fluid.MixingVolumes.MixingVolume poolWater( + redeclare package Medium = WaterMedium, + T_start=poolParam.TPool, + m_flow_nominal=m_flow_nominal, + V=poolParam.VPool, + nPorts=3) + annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); + + Modelica.Blocks.Sources.RealExpression PoolWater(y=m_flow_toPool) + annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); + Modelica.Blocks.Interfaces.RealOutput QPool if poolParam.use_idealHeater + "Heat flow rate to maintain the pool at the set temperature" annotation ( + Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( + extent={{98,-16},{118,4}}))); + + AixLib.Fluid.Movers.BaseClasses.IdealSource Evaporation( + redeclare package Medium = WaterMedium, + m_flow_small=0.00001, + control_m_flow=true) annotation (Placement(transformation( + extent={{6,-6},{-6,6}}, + rotation=0, + origin={-30,26}))); + Modelica.Blocks.Sources.RealExpression m_Eavporation(y=m_flow_evap) + annotation (Placement(transformation(extent={{9,-9},{-9,9}}, + rotation=180, + origin={-81,41}))); + AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( + redeclare package Medium1 = WaterMedium, + redeclare package Medium2 = WaterMedium, + m1_flow_nominal=poolParam.m_flow_out*1.5, + m2_flow_nominal=poolParam.m_flow_out, + dp1_nominal(displayUnit="bar") = 100000, + dp2_nominal(displayUnit="bar") = 100000, + eps=eps) + annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=90, + origin={-33,-73}))); + Modelica.Blocks.Interfaces.RealInput openingHours + "Input profile for opening hours" + annotation (Placement(transformation(extent={{-118,-70},{-94,-46}}), + iconTransformation(extent={{-118,-70},{-94,-46}}))); + Modelica.Blocks.Interfaces.RealInput persons "Input profile for persons" + annotation (Placement(transformation(extent={{-118,-38},{-92,-12}}), + iconTransformation(extent={{-118,-38},{-92,-12}}))); + + Modelica.Blocks.Interfaces.RealInput TAir( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of the surrounding room air" annotation ( + Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}),iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}))); + Modelica.Blocks.Interfaces.RealInput X_w "Absolute humidty of the room Air" annotation (Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}), iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}))); + + AixLib.ThermalZones.ReducedOrder.Multizone.BaseClasses.AbsToRelHum absToRelHum + "Calculation of the relative humidity of the room air " annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=-90, + origin={-59,77}))); + + Modelica.Blocks.Sources.RealExpression FreshWater(y=m_flow_freshWater) annotation (Placement(transformation(extent={{-62,-78}, + {-48,-62}}))); + + AixLib.Fluid.Sources.Boundary_pT SincEvaporation( + redeclare package Medium = WaterMedium, nPorts=1) annotation (Placement(transformation(extent={{6,-6},{ + -6,6}}, + rotation=180, + origin={-64,26}))); + + Modelica.Fluid.Interfaces.FluidPort_b fromPool(redeclare package Medium = + WaterMedium) if not poolParam.use_idealHeater + "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-64},{110,-44}}), + iconTransformation(extent={{90,-64},{110,-44}}))); + + Modelica.Fluid.Interfaces.FluidPort_a toPool(redeclare package Medium = + WaterMedium) if not poolParam.use_idealHeater + "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-40},{110,-20}}), + iconTransformation(extent={{90,-40},{110,-20}}))); + + .AixLib.Fluid.Pool.BaseClasses.waveMachine waveMachine( + h_wave=poolParam.heightWave, + w_wave=poolParam.widthWave, + wavePool_startTime=poolParam.timeWavePool_start, + wavePool_period=poolParam.wavePool_period, + wavePool_width=poolParam.wavePool_width) if poolParam.use_wavePool + annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPoolSurface + "Air Temperature in Zone" annotation (Placement(transformation(extent={{56,86}, + {80,110}}), + iconTransformation(extent={{64,94},{84,114}}))); + + AixLib.Utilities.Interfaces.RadPort radPoolSurface + "Mean Radiation Temperature of surrounding walls" annotation (Placement( + transformation( + extent={{-8,-9},{8,9}}, + rotation=-90, + origin={39,100}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=-90, + origin={30,100}))); + + Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( + final Gr=epsilon*poolParam.APool) + "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( + extent={{-7,-7},{7,7}}, + rotation=90, + origin={39,73}))); + + Modelica.Thermal.HeatTransfer.Components.Convection convWaterSurface + "Convection at the watersurface" annotation (Placement(transformation( + extent={{-7,7},{7,-7}}, + rotation=90, + origin={67,75}))); + + Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=alpha_Air*poolParam.APool) + "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, + {82,84}}))); + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, + {12,68}}))); + + Modelica.Blocks.Math.Gain hEvapLatentHeatGain(final k=h_vapor) + "Calculation of heat flow rate due to evaporation" annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-44,52}))); + + Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater + "Flow rate of added fresh water to the pool and water treatment system" annotation (Placement(transformation(extent={{98,-102}, + {118,-82}}), + iconTransformation(extent={{98,-102},{118,-82}}))); + + AixLib.Fluid.Pool.BaseClasses.HeatTransferConduction heatTransferConduction( + AInnerPoolWall=poolParam.AInnerPoolWall, + APoolWallWithEarthContact=poolParam.APoolWallWithEarthContact, + APoolFloorWithEarthContact=poolParam.APoolFloorWithEarthContact, + AInnerPoolFloor=poolParam.AInnerPoolFloor, + hConWaterHorizontal=poolParam.hConWaterHorizontal, + hConWaterVertical=poolParam.hConWaterVertical, + PoolWall=poolParam.PoolWallParam) + "Model to depict the heat flow rate through the pool walls to the bordering room/soil" + annotation (Placement(transformation(extent={{64,32},{80,48}}))); + + Modelica.Blocks.Math.Gain minus1Gain(final k=-1) annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-20,60}))); + + Modelica.Blocks.Interfaces.RealOutput QEvap(final quantity="HeatFlowRate", + final unit="W") + "Heat needed to compensate losses" annotation (Placement(transformation(extent={{-92,46}, + {-122,76}}), + iconTransformation(extent={{-94,46},{-114,66}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of Soil" annotation (Placement( + transformation( + extent={{-13,-13},{13,13}}, + rotation=180, + origin={105,49}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=180, + origin={103,47}))); + + Modelica.Blocks.Interfaces.RealOutput PPool( + final quantity="Power", + final unit="W") + "Output eletric energy needed for pool operation" annotation (Placement(transformation(extent={{98,-86}, + {118,-66}}), + iconTransformation(extent={{98,-86},{118,-66}}))); + + Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavePool then 2 else 1) + "Add electric power of pump and the optional wave pool" + annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); + Sources.MassFlowSource_T boundary( + redeclare package Medium = WaterMedium, + use_m_flow_in=true, + T=283.15, + nPorts=1) + annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); + Modelica.Blocks.Sources.RealExpression ReadPoolTemp(y=poolWater.T) + annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=180, + origin={72,16}))); + Modelica.Blocks.Interfaces.RealOutput TPool "Value of Real output" + annotation (Placement(transformation(extent={{98,6},{118,26}}), + iconTransformation(extent={{98,6},{118,26}}))); + + final parameter Modelica.Units.SI.Density rhoWater_default= + WaterMedium.density_pTX( + p=WaterMedium.p_default, + T=273.15 + 30, + X=WaterMedium.X_default) "Default medium density"; + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater + if poolParam.use_idealHeater + annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); + Controls.Continuous.LimPID PI( + k=poolParam.k_idealHeater, + yMax=poolParam.QMax_idealHeater, + yMin=poolParam.QMin_idealHeater, + controllerType=Modelica.Blocks.Types.SimpleController.PI, + Ti=poolParam.Ti_idealHeater) if poolParam.use_idealHeater annotation(Placement(transformation(extent={{-4,-4}, + {4,4}}, + rotation=180, + origin={66,-16}))); + Modelica.Blocks.Sources.RealExpression SetTemperature(y=poolParam.TPool) + if poolParam.use_idealHeater + annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); + Controls.Continuous.LimPID PI1( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.1, + Ti=5, + yMax=m_flow_nominal/0.9, + yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); + Movers.FlowControlled_m_flow CirculationPump( + redeclare package Medium = WaterMedium, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + T_start=poolParam.TPool, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + redeclare Movers.Data.Generic per, + inputType=AixLib.Fluid.Types.InputType.Continuous, + addPowerToMedium=false, + nominalValuesDefineDefaultPressureCurve=true, + dp_nominal=pumpHead, + m_flow_start=m_flow_nominal) + annotation (Placement(transformation(extent={{-8,-8},{8,8}}, + rotation=0, + origin={0,-68}))); + Sensors.MassFlowRate senMasFlo(redeclare package Medium = + WaterMedium, allowFlowReversal=false) + annotation (Placement(transformation(extent={{-6,-6},{6,6}}, + rotation=0, + origin={22,-68}))); + FixedResistances.PressureDrop res( + redeclare package Medium = WaterMedium, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + show_T=false, + from_dp=false, + dp_nominal=pumpHead - poolParam.dpHeatExchangerPool, + homotopyInitialization=true, + linearized=false, + deltaM=0.3) + annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); + +equation + // Fresh water and water recycling + if poolParam.use_waterRecycling then + m_flow_freshWater=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); + else + m_flow_freshWater=poolParam.m_flow_out + m_flow_evap; + end if; + + // Pool circulation flow rate + if poolParam.use_partialLoad then + if openingHours > 0 then + m_flow_toPool = m_flow_nominal; + else + m_flow_toPool = m_flow_partial; + end if; + else + m_flow_toPool = m_flow_nominal; + end if; + + // Evaporation according to VDI 2089 sheet 1, formula (1) + phi=absToRelHum.relHum; + if psat_TPool-phi*psat_T_Air<0 then + m_flow_evap=0.0; + else + if openingHours > 0 then + if persons > 0 then + m_flow_evap =persons*(poolParam.beta_inUse/(R_D*0.5*(poolWater.T + + TAir))*(psat_TPool - phi*psat_T_Air)*poolParam.APool); + else + m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_T_Air)*poolParam.APool; + end if; + else + if poolParam.use_poolCover then + m_flow_evap = beta_cover /(R_D*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_T_Air)*poolParam.APool; + else + m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_T_Air)*poolParam.APool; + end if; + end if; + end if; + + if poolParam.use_idealHeater then + connect(res.port_b, poolWater.ports[1]) annotation (Line(points={{44,-68}, + {54,-68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, + color={0,127,255})); + else + connect(poolWater.ports[1], toPool) annotation (Line( + points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + connect(fromPool, res.port_b) annotation (Line( + points={{100,-54},{78,-54},{78,-68},{44,-68}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + end if; + + connect(poolWater.ports[3], Evaporation.port_a) annotation (Line(points={{2.66667, + -10},{2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); + + connect(Storage.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, + -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); + connect(Storage.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, + -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); + connect(Storage.ports[4], CirculationPump.port_a) annotation (Line(points={{-26.5, + -56},{-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); + connect(Storage.ports[1], poolWater.ports[2]) annotation (Line(points={{-29.5, + -56},{-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127, + 255})); + + connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, + {-62,88},{-67,88},{-67,103}},color={0,0,127})); + connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, + {-56,88},{-29,88},{-29,103}}, color={0,0,127})); + connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, + {-30,-88},{22,-88}}, color={0,127,255})); + connect(Evaporation.port_b, SincEvaporation.ports[1]) + annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); + connect(m_Eavporation.y, Evaporation.m_flow_in) annotation (Line(points={{-71.1, + 41},{-26.4,41},{-26.4,30.8}}, color={0,0,127})); + connect(radWaterSurface.port_b, radPoolSurface) annotation (Line(points={{39,80}, + {39,100}}, color={191,0,0})); + connect(convWaterSurface.fluid, convPoolSurface) annotation (Line(points={{67,82}, + {68,82},{68,98}}, color={191,0,0})); + connect(convWaterSurface.solid, poolWater.heatPort) annotation (Line(points={{67,68}, + {66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); + connect(radWaterSurface.port_a, poolWater.heatPort) annotation (Line(points={{39,66}, + {38,66},{38,0},{14,0}}, color={191,0,0})); + connect(preHeatFlowEvapLoss.port, poolWater.heatPort) annotation (Line(points={{12,60}, + {26,60},{26,0},{14,0}}, color={191,0,0})); + connect(m_Eavporation.y, hEvapLatentHeatGain.u) annotation (Line(points={{-71.1, + 41},{-58,41},{-58,52},{-48.8,52}}, + color={0,0,127})); + connect(heatTransferConduction.heatport_a, poolWater.heatPort) annotation ( + Line(points={{63.76,39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); + connect(hEvapLatentHeatGain.y, minus1Gain.u) annotation (Line(points={{-39.6, + 52},{-34,52},{-34,60},{-24.8,60}}, color={0,0,127})); + connect(hEvapLatentHeatGain.y, QEvap) annotation (Line(points={{-39.6,52},{-34, + 52},{-34,61},{-107,61}}, color={0,0,127})); + connect(heatTransferConduction.TSoil, TSoil) annotation (Line(points={{80.48,42.88}, + {82,42.88},{82,49},{105,49}}, color={0,0,127})); + connect(convPoolSurface, convPoolSurface) annotation (Line(points={{68,98},{68, + 98}}, color={191,0,0})); + connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, + {74,75}}, color={0,0,127})); + connect(minus1Gain.y, preHeatFlowEvapLoss.Q_flow) annotation (Line(points={{-15.6, + 60},{-4,60}}, color={0,0,127})); + + connect(boundary.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, + {-40,-78},{-36,-78}}, color={0,127, + 255})); + connect(waveMachine.open, openingHours) annotation (Line(points={{-93.28,-87}, + {-98,-87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, + color={0,0,127})); + connect(ReadPoolTemp.y, TPool) + annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); + + connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, + {54,-12},{48,-12}}, color={0,0,127})); + connect(idealHeater.port, poolWater.heatPort) annotation (Line(points={{32,-12}, + {24,-12},{24,0},{14,0}}, color={191,0,0})); + connect(SetTemperature.y, PI.u_s) + annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); + connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, + -16}}, color={0,0,127})); + connect(boundary.m_flow_in, FreshWater.y) annotation (Line(points={{-53.2,-83.2}, + {-60,-83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); + connect(FreshWater.y, MFlowFreshWater) annotation (Line(points={{-47.3,-70},{-42, + -70},{-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, + color={0,0,127})); + connect(Evaporation.port_b, Evaporation.port_a) annotation (Line( + points={{-36,26},{-30,26},{-24,26}}, + color={0,127,255}, + smooth=Smooth.Bezier)); + connect(CirculationPump.port_b, senMasFlo.port_a) + annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); + connect(senMasFlo.port_b, res.port_a) + annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); + connect(PI1.y, CirculationPump.m_flow_in) + annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); + connect(PI1.u_s, PoolWater.y) + annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); + connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, + {13,-58},{13,-55}}, color={0,0,127})); + + connect(elPower.u[1], CirculationPump.P) annotation (Line(points={{72,-76},{62, + -76},{62,-60.8},{8.8,-60.8}}, color={0,0,127})); + connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); + connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, + -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, + color={0,0,127})); + + connect(PI.u_m, ReadPoolTemp.y) annotation (Line(points={{66,-11.2},{66,4},{92, + 4},{92,16},{83,16}}, color={0,0,127})); + annotation (Line( + points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), + Line(points={{18.4,-40}, + {18,-40},{18,-44},{-100,-44}}, color={0,127,255}), + Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-50,82}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-60,80})), + Icon(coordinateSystem(preserveAspectRatio=false), + graphics={ + Rectangle( + extent={{98,98},{-98,-98}}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Bitmap(extent={{-94,-150},{96,58}}, fileName="modelica://AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg")}), + Diagram(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-100,2},{100,100}}, + lineColor={0,128,255}, + fillColor={170,213,255}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,12},{-6,0}}, + textColor={85,85,255}, + textStyle={TextStyle.Bold}, + horizontalAlignment=TextAlignment.Left, + textString="Heat and mass exchange +at pool surface or pool walls +"), Rectangle( + extent={{-66,-98},{100,-2}}, + lineColor={0,0,127}, + fillColor={155,195,232}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Rectangle( + extent={{-100,-98},{-68,-2}}, + lineColor={95,95,95}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,-6},{-72,-14}}, + textColor={95,95,95}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Pool +operation"), + Text( + extent={{-64,-2},{-22,-24}}, + textColor={0,0,127}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Water treatment +circuit +")})); +end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pool/package.mo b/AixLib/Fluid/Pool/package.mo new file mode 100644 index 0000000000..d75918bf6d --- /dev/null +++ b/AixLib/Fluid/Pool/package.mo @@ -0,0 +1,7 @@ +within AixLib.Fluid; +package Pool + + + + +end Pool; diff --git a/AixLib/Fluid/Pool/package.order b/AixLib/Fluid/Pool/package.order new file mode 100644 index 0000000000..fe272da0eb --- /dev/null +++ b/AixLib/Fluid/Pool/package.order @@ -0,0 +1,3 @@ +IndoorSwimmingPool +BaseClasses +Examples From bb391446f9cba547554125c77d7ae0dc0b2ba194 Mon Sep 17 00:00:00 2001 From: Larissa Date: Wed, 30 Nov 2022 17:59:43 +0100 Subject: [PATCH 05/34] Changed variable naming acording to conventions for AixLib and and added documentation #1407 --- .../Pools/IndoorSwimmingPoolBaseRecord.mo | 46 ++++++++------- .../DataBase/Pools/IndoorSwimmingPoolDummy.mo | 30 +++++----- .../ChildrensPool.mo | 39 +++++++------ .../TypesOfIndoorSwimmingPools/SportPool.mo | 42 +++++++------- .../BaseClasses/HeatTransferConduction.mo | 33 +++++------ AixLib/Fluid/Pool/BaseClasses/waveMachine.mo | 31 ++++++---- AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 56 +++++++++---------- 7 files changed, 149 insertions(+), 128 deletions(-) diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo index 552f40a177..eac32532fa 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo @@ -2,14 +2,14 @@ within AixLib.DataBase.Pools; record IndoorSwimmingPoolBaseRecord extends Modelica.Icons.Record; - parameter Modelica.Units.SI.Temperature T_pool + parameter Modelica.Units.SI.Temperature TPool "Set water temperature of swimming pool"; - parameter Modelica.Units.SI.Volume V_pool "Volume of pool water"; - parameter Modelica.Units.SI.Area A_pool(min=0) + parameter Modelica.Units.SI.Volume VPool "Volume of pool water"; + parameter Modelica.Units.SI.Area APool(min=0) "Area of water surface of swimming pool"; - parameter Modelica.Units.SI.Length d_pool(min=0) + parameter Modelica.Units.SI.Length depthPool(min=0) "Average depth of swimming pool"; - parameter Modelica.Units.SI.Volume V_storage + parameter Modelica.Units.SI.Volume VStorage "Usable Volume of water storage, DIN 19643-1"; // parameter for pool water circulation @@ -18,12 +18,16 @@ record IndoorSwimmingPoolBaseRecord parameter Modelica.Units.SI.VolumeFlowRate V_flow_partial(min=0) "In the case of partial load: circulation volume flow rate during non-opening hours, DIN 19643-1"; parameter Boolean use_partialLoad=false "Partial load operation implemented for non opening hours?"; - parameter Boolean use_idealHeater=true "Include an ideal heat exchanger into the circulation system"; - parameter Modelica.Units.SI.PressureDifference dpHeatExchangerPool + parameter Modelica.Units.SI.PressureDifference dpHeaExcPool "Pressure drop of heat exchanger, should be zero for an indeal heated pool"; + parameter Boolean use_idealHeater=true "Include an ideal heat exchanger into the circulation system"; + parameter Real KHeat "Gain of controller for ideal heater"; + parameter Modelica.Units.SI.Time THeat "Time constant of Integrator block for ideal heater"; + parameter Real QMaxHeat "Upper limit of output for ideal heater"; + parameter Real QMinHeat "Lower limit of output for ideal heater"; // parameter for evaporation - parameter Real beta_inUse(unit="m/s") "Water transfer coefficient during opening hours if pool is used, VDI 2089"; + parameter Real betaInUse(unit="m/s") "Water transfer coefficient during opening hours if pool is used, VDI 2089"; parameter Boolean use_poolCover=false "Pool covered during non opening hours"; // parameter for fresh water @@ -32,26 +36,26 @@ record IndoorSwimmingPoolBaseRecord parameter Modelica.Units.SI.MassFlowRate m_flow_out(min=0.0001) "Waterexchange due to people in the pool, DIN 19643-1"; parameter Boolean use_HRS=false "Is a heat recovery system physically integrated?"; - parameter Modelica.Units.SI.Efficiency efficiencyHRS + parameter Modelica.Units.SI.Efficiency etaHRS "Effieciency of heat recovery system"; // Wave mode parameter Boolean use_wavePool=false "Is there a wave machine installed?"; - parameter Modelica.Units.SI.Length h_wave "Height of generatedwave"; - parameter Modelica.Units.SI.Length w_wave - "Width of generated wave/ width of wave machine outlet"; - parameter Modelica.Units.SI.Time wavePool_startTime + parameter Modelica.Units.SI.Length heightWave "Height of generated wave"; + parameter Modelica.Units.SI.Length widthWave + "Width of generated wave/ width of wave machineoutlet"; + parameter Modelica.Units.SI.Time timeWavePul_start "Start time of first wave cycle"; - parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; - parameter Real wavePool_width "Length of wave generation within cycling period"; + parameter Modelica.Units.SI.Time periodeWavePul "Time of cycling period"; + parameter Real widthWavePul "Fraction of time of wave generation within cycling period"; // Pool Walls - parameter Modelica.Units.SI.Area AInnerPoolWall; - parameter Modelica.Units.SI.Area APoolWallWithEarthContact; - parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; - parameter Modelica.Units.SI.Area AInnerPoolFloor; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; + parameter Modelica.Units.SI.Area AWalInt "Area of pool walls which is connected to inner rooms (inner pool walls)"; + parameter Modelica.Units.SI.Area AWalExt "Area of pool walls which is connected to the ground (pool wall with earth contact)"; + parameter Modelica.Units.SI.Area AFloInt "Area of pool floors which is connected to inner rooms (inner pool floor)"; + parameter Modelica.Units.SI.Area AFloExt "Area of pool floors which is connected to teh ground (pool floor with earth contact)"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; //replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam; replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam constrainedby AixLib.DataBase.Walls.WallBaseDataDefinition diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo index a78c913d59..a77c476fbd 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo @@ -2,29 +2,33 @@ within AixLib.DataBase.Pools; record IndoorSwimmingPoolDummy "This is a dummy record with non-physical parameter values." extends IndoorSwimmingPoolBaseRecord( - T_pool=Modelica.Constants.eps, - V_pool=Modelica.Constants.inf, - A_pool=Modelica.Constants.inf, - d_pool=Modelica.Constants.inf, - V_storage=Modelica.Constants.inf, + TPool=Modelica.Constants.eps, + VPool=Modelica.Constants.inf, + APool=Modelica.Constants.inf, + depthPool=Modelica.Constants.inf, + VStorage=Modelica.Constants.inf, V_flow_nominal=Modelica.Constants.inf, V_flow_partial=Modelica.Constants.inf, use_partialLoad=false, + dpHeaExcPool=Modelica.Constants.inf, use_idealHeater=true, - dpHeatExchangerPool=Modelica.Constants.inf, - beta_inUse=Modelica.Constants.inf, + KHeat=Modelica.Constants.inf, + THeat=Modelica.Constants.inf, + QMaxHeat=Modelica.Constants.inf, + QMinHeat=Modelica.Constants.inf, + betaInUse=Modelica.Constants.inf, use_poolCover=false, use_waterRecycling=false, x_recycling=Modelica.Constants.inf, m_flow_out=Modelica.Constants.inf, use_HRS=false, - efficiencyHRS=Modelica.Constants.eps, + etaHRS=Modelica.Constants.eps, use_wavePool=false, - h_wave=Modelica.Constants.inf, - w_wave=Modelica.Constants.inf, - wavePool_period=Modelica.Constants.eps, - wavePool_startTime=Modelica.Constants.eps, - wavePool_width=Modelica.Constants.eps, + heightWave=Modelica.Constants.inf, + widthWave=Modelica.Constants.inf, + periodeWavePul=Modelica.Constants.eps, + timeWavePul_start=Modelica.Constants.eps, + widthWavePul=Modelica.Constants.eps, AInnerPoolWall=Modelica.Constants.inf, APoolWallWithEarthContact=Modelica.Constants.inf, APoolFloorWithEarthContact=Modelica.Constants.inf, diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo index e1fd40eda7..eaa42316a8 100644 --- a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo @@ -1,34 +1,37 @@ within AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools; record ChildrensPool "Pool which is mainly used by children" - extends IndoorSwimmingPoolBaseRecord( - T_pool=303.15, - V_pool=126.8, - A_pool=125.0, - d_pool=0.9303008070432868, - V_storage=69.333925940005700, + TPool=303.15, + VPool=126.8, + APool=125.0, + depthPool=0.9303008070432868, + VStorage=69.333925940005700, V_flow_nominal=0.028045267489711933, V_flow_partial=0.0125, use_partialLoad=true, + dpHeaExcPool=0, use_idealHeater=true, - dpHeatExchangerPool=0, - beta_inUse=0.011111111111111112, + KHeat=1000, + THeat=1, + QMaxHeat=1000000, + QMinHeat=0, + betaInUse=0.011111111111111112, use_poolCover=false, use_waterRecycling=false, x_recycling=0.0, m_flow_out=0.055645372003397, use_HRS=true, - efficiencyHRS=0.8, + etaHRS=0.8, use_wavePool=false, - h_wave=0, - w_wave=0, - wavePool_period=1800, - wavePool_startTime=0, - wavePool_width=0, - AInnerPoolWall=0.001, - APoolWallWithEarthContact=156.5, - APoolFloorWithEarthContact=156.5, - AInnerPoolFloor=0.001, + heightWave=0, + widthWave=0, + periodeWavePul=1800, + timeWavePul_start=0, + widthWavePul=0, + AWalInt=0.001, + AWalExt=156.5, + AFloInt=0.001, + AFloExt=156.5, hConWaterHorizontal=50.0, hConWaterVertical=5200.0, PoolWallParam= diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo index fb05d4aedc..630bd09946 100644 --- a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo @@ -1,38 +1,40 @@ within AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools; record SportPool "Pool which is mainly used by sport swimmers" extends IndoorSwimmingPoolBaseRecord( - T_pool=301.15, - V_pool=942.956, - A_pool=416.5, - d_pool=2.2640000000000002, - V_storage=69.333925940005700, + TPool=301.15, + VPool=942.956, + APool=416.5, + depthPool=2.2640000000000002, + VStorage=69.333925940005700, V_flow_nominal=0.0856995884773662, V_flow_partial=0.023144444444444443, use_partialLoad=true, + dpHeaExcPool=0, use_idealHeater=true, - dpHeatExchangerPool=0, - beta_inUse=0.011111111111111112, + KHeat=1000, + THeat=1, + QMaxHeat=1000000, + QMinHeat=0, + betaInUse=0.011111111111111112, use_poolCover=false, use_waterRecycling=false, x_recycling=0.0, m_flow_out=0.170038866026520, use_HRS=true, - efficiencyHRS=0.8, + etaHRS=0.8, use_wavePool=false, - h_wave=0, - w_wave=0, - wavePool_period=1800, - wavePool_startTime=0, - wavePool_width=10/30*100, - AInnerPoolWall=21.658, - APoolWallWithEarthContact=143.32, - APoolFloorWithEarthContact=559.82, - AInnerPoolFloor=0.001, + heightWave=0, + widthWave=0, + periodeWavePul=1800, + timeWavePul_start=0, + widthWavePul=10/30*100, + AWalInt=21.658, + AWalExt=143.32, + AFloInt=0.001, + AFloExt=559.82, hConWaterHorizontal=50.0, hConWaterVertical=5200.0, - PoolWallParam= - AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteIsulationConstruction()); - + PoolWallParam=AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteIsulationConstruction()); annotation (Documentation(info="

The swimming pool "SportPool" describes a typical indoor swimming pool, which is mainly used for sport swimming.

")); diff --git a/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo b/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo index eb43f1a31f..f69d72906a 100644 --- a/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo +++ b/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo @@ -1,13 +1,14 @@ within AixLib.Fluid.Pool.BaseClasses; model HeatTransferConduction "Heat transfer due to conduction through pool walls" - parameter Modelica.Units.SI.Area AInnerPoolWall; - parameter Modelica.Units.SI.Area APoolWallWithEarthContact; - parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; - parameter Modelica.Units.SI.Area AInnerPoolFloor; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; + parameter Modelica.Units.SI.Area AWalInt "Area of pool walls which is connected to inner rooms (inner pool walls)"; + parameter Modelica.Units.SI.Area AWalExt "Area of pool walls which is connected to the ground (pool wall with earth contact)"; + parameter Modelica.Units.SI.Area AFloInt "Area of pool floors which is connected to inner rooms (inner pool floor)"; + parameter Modelica.Units.SI.Area AFloExt "Area of pool floors which is connected to teh ground (pool floor with earth contact)"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter "Generate Heat Flow for earth contact" annotation (Placement(transformation( @@ -26,13 +27,13 @@ model HeatTransferConduction AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer InnerPoolFloor( - A=AInnerPoolFloor, - wallRec=PoolWall, + A=AFloInt, + wallRec=PoolWall, T_start=fill((0), (PoolWall.n))) annotation (Placement(transformation(extent={{-10,-34},{18,-10}}))); AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( hCon_const=hConWaterHorizontal, - A=AInnerPoolFloor, + A=AFloInt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( @@ -41,7 +42,7 @@ model HeatTransferConduction rotation=180))); AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( hCon_const=hConWaterVertical, - A=APoolWallWithEarthContact, + A=AWalExt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( origin={-54,40}, @@ -49,13 +50,13 @@ model HeatTransferConduction rotation=180))); AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer PoolWallWithEarthContact( - A=APoolWallWithEarthContact, + A=AWalExt, wallRec=PoolWall, T_start=fill((0), (PoolWall.n))) annotation (Placement(transformation(extent={{-6,26},{22,54}}))); AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( hCon_const=hConWaterHorizontal, - A=APoolFloorWithEarthContact, + A=AFloExt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( origin={-52,-60}, @@ -63,7 +64,7 @@ model HeatTransferConduction rotation=180))); AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer PoolFloorWithEarthContact( - A=APoolFloorWithEarthContact, + A=AFloExt, wallRec=PoolWall, T_start=fill((0), (PoolWall.n))) annotation (Placement(transformation(extent={{-10,-72},{14,-50}}))); @@ -75,7 +76,7 @@ model HeatTransferConduction origin={44,12}))); AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer InnerPoolWall( - A=AInnerPoolWall, + A=AWalInt, wallRec=PoolWall, T_start=fill((0), (PoolWall.n))) annotation (Placement(transformation(extent={{-6,64},{22,92}}))); @@ -84,7 +85,7 @@ model HeatTransferConduction annotation (Placement(transformation(extent={{96,2},{76,22}}))); AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( hCon_const=hConWaterVertical, - A=AInnerPoolWall, + A=AWalInt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( origin={-54,78}, @@ -153,6 +154,6 @@ equation Diagram( coordinateSystem(preserveAspectRatio=false)), Documentation(info=" -

This model is a base model to calculate the heat transfer through pool walls. The pool walls are sorted by: vertical walls with earth contact, pool floor with earth contact and the sum of walls and pool floor without earth contact.

+

This model is a base model to calculate the heat transfer through pool walls. The pool walls are divided in: vertical walls without earth contact, vertical walls with earth contact, pool floor without earth contact, pool floor with earth contact.

")); end HeatTransferConduction; diff --git a/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo b/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo index a453c2442f..26fc8426c0 100644 --- a/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo +++ b/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo @@ -1,13 +1,20 @@ within AixLib.Fluid.Pool.BaseClasses; model waveMachine "Calculate energy demands of a wave machine" - parameter Modelica.Units.SI.Length h_wave "Height of generated wave"; - parameter Modelica.Units.SI.Length w_wave - "Width of wave machine outlet/of generated wave"; - parameter Modelica.Units.SI.Time wavePool_startTime + + + + parameter Modelica.Units.SI.Length heightWave "Height of generated wave"; + parameter Modelica.Units.SI.Length widthWave + "Width of generated wave/ width of wave machineoutlet"; + parameter Modelica.Units.SI.Time timeWavePul_start "Start time of first wave cycle"; - parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; - parameter Real wavePool_width "Length of wave generation within cycling period"; + parameter Modelica.Units.SI.Time periodeWavePul "Time of cycling period"; + parameter Real widthWavePul "Fraction of time of wave generation within cycling period"; + + + + Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) "If input = 1, then true, else no waves generated" @@ -19,7 +26,7 @@ model waveMachine "Calculate energy demands of a wave machine" extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) "Estimate consumed power per width to generate wave of a certain heigth; " annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); - Modelica.Blocks.Sources.RealExpression get_h_wave(y=h_wave) + Modelica.Blocks.Sources.RealExpression get_heightWave(y=heightWave) "Get height of generated wave" annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" @@ -27,7 +34,7 @@ model waveMachine "Calculate energy demands of a wave machine" Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") "Power consumption of wave machine" annotation (Placement(transformation(extent={{96,-10},{116,10}}))); - Modelica.Blocks.Math.Gain multiply(k=w_wave) "Multply by width of wave" + Modelica.Blocks.Math.Gain multiply(k=widthWave) "Multply by width of wave" annotation (Placement(transformation(extent={{0,52},{16,68}}))); Modelica.Blocks.Sources.Constant zero(k=0) "no output if wave machine is off" @@ -37,12 +44,12 @@ model waveMachine "Calculate energy demands of a wave machine" Modelica.Blocks.Logical.And and1 annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( - width=wavePool_width, - period=wavePool_period, - startTime=wavePool_startTime) + width=widthWavePul, + period=periodeWavePul, + startTime=timeWavePul_start) annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); equation - connect(get_h_wave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, + connect(get_heightWave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, 60}}, color={0,0,127})); connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, color={0,0,127})); diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo index 71c8aca2a7..6af559ba66 100644 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -6,14 +6,14 @@ model IndoorSwimmingPool replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); // Water transfer coefficients according to VDI 2089 Blatt 1 - parameter Real beta_nonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); - parameter Real beta_cover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" - annotation (Dialog(group="Water transfer coefficients")); - parameter Real beta_wavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" - annotation (Dialog(group="Water transfer coefficients")); + parameter Real betaNonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); + parameter Real betaCover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" + annotation (Dialog(group="Water transfer coefficients")); + parameter Real betaWavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" + annotation (Dialog(group="Water transfer coefficients")); // Parameter and variables for evaporation - constant Modelica.Units.SI.SpecificHeatCapacity R_D=461.52 + constant Modelica.Units.SI.SpecificHeatCapacity RD=461.52 "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) final parameter Modelica.Units.SI.SpecificEnergy h_vapor= AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.TPool) @@ -23,7 +23,7 @@ model IndoorSwimmingPool Modelica.Units.SI.Pressure psat_TPool= Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( poolWater.T) "Saturation pressure at pool temperature"; - Modelica.Units.SI.Pressure psat_T_Air= + Modelica.Units.SI.Pressure psat_TAir= Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( TAir) "Saturation pressure at air temperature"; Real phi "Relative humidity"; @@ -43,16 +43,16 @@ model IndoorSwimmingPool "Actual circulation mass flow rate to the pool"; // Fresh water and water recycling - final parameter Modelica.Units.SI.Efficiency eps=if poolParam.use_HRS then - poolParam.efficiencyHRS else 0; + final parameter Modelica.Units.SI.Efficiency eta=if poolParam.use_HRS then + poolParam.etaHRS else 0; Modelica.Units.SI.MassFlowRate m_flow_freshWater(start=0.0) "Mass flow of fresh water supplied to pool circulation system"; // Convection and Radiation at pool water surface - parameter Modelica.Units.SI.CoefficientOfHeatTransfer alpha_Air=3.5 + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConvAir=3.5 "Coefficient of heat transfer between the water surface and the room air"; // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area - parameter Real epsilon = 0.9*0.95 + parameter Real eps = 0.9*0.95 "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; AixLib.Fluid.MixingVolumes.MixingVolume Storage( @@ -181,7 +181,7 @@ model IndoorSwimmingPool origin={30,100}))); Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( - final Gr=epsilon*poolParam.APool) + final Gr=eps*poolParam.APool) "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( extent={{-7,-7},{7,7}}, rotation=90, @@ -193,7 +193,7 @@ model IndoorSwimmingPool rotation=90, origin={67,75}))); - Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=alpha_Air*poolParam.APool) + Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=hConvAir*poolParam.APool) "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, {82,84}}))); @@ -213,10 +213,10 @@ model IndoorSwimmingPool iconTransformation(extent={{98,-102},{118,-82}}))); AixLib.Fluid.Pool.BaseClasses.HeatTransferConduction heatTransferConduction( - AInnerPoolWall=poolParam.AInnerPoolWall, - APoolWallWithEarthContact=poolParam.APoolWallWithEarthContact, - APoolFloorWithEarthContact=poolParam.APoolFloorWithEarthContact, - AInnerPoolFloor=poolParam.AInnerPoolFloor, + AWalInt=poolParam.AWalInt, + AWalExt=poolParam.AWalExt, + AFloInt=poolParam.AFloInt, + AFloExt=poolParam.AFloExt, hConWaterHorizontal=poolParam.hConWaterHorizontal, hConWaterVertical=poolParam.hConWaterVertical, PoolWall=poolParam.PoolWallParam) @@ -282,11 +282,11 @@ model IndoorSwimmingPool if poolParam.use_idealHeater annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); Controls.Continuous.LimPID PI( - k=poolParam.k_idealHeater, - yMax=poolParam.QMax_idealHeater, - yMin=poolParam.QMin_idealHeater, + k=poolParam.KHeat, + yMax=poolParam.QMaxHeat, + yMin=poolParam.QMinHeat, controllerType=Modelica.Blocks.Types.SimpleController.PI, - Ti=poolParam.Ti_idealHeater) if poolParam.use_idealHeater annotation(Placement(transformation(extent={{-4,-4}, + Ti=poolParam.THeat) if poolParam.use_idealHeater annotation(Placement(transformation(extent={{-4,-4}, {4,4}}, rotation=180, origin={66,-16}))); @@ -325,7 +325,7 @@ model IndoorSwimmingPool m_flow_nominal=m_flow_nominal, show_T=false, from_dp=false, - dp_nominal=pumpHead - poolParam.dpHeatExchangerPool, + dp_nominal=pumpHead - poolParam.dpHeaExcPool, homotopyInitialization=true, linearized=false, deltaM=0.3) @@ -352,21 +352,21 @@ equation // Evaporation according to VDI 2089 sheet 1, formula (1) phi=absToRelHum.relHum; - if psat_TPool-phi*psat_T_Air<0 then + if psat_TPool-phi*psat_TAir<0 then m_flow_evap=0.0; else if openingHours > 0 then if persons > 0 then - m_flow_evap =persons*(poolParam.beta_inUse/(R_D*0.5*(poolWater.T + - TAir))*(psat_TPool - phi*psat_T_Air)*poolParam.APool); + m_flow_evap =persons*(poolParam.betaInUse/(RD*0.5*(poolWater.T + + TAir))*(psat_TPool - phi*psat_TAir)*poolParam.APool); else - m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_T_Air)*poolParam.APool; + m_flow_evap = betaNonUse /(RD*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_TAir)*poolParam.APool; end if; else if poolParam.use_poolCover then - m_flow_evap = beta_cover /(R_D*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_T_Air)*poolParam.APool; + m_flow_evap = betaCover /(RD*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_TAir)*poolParam.APool; else - m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_T_Air)*poolParam.APool; + m_flow_evap = betaNonUse /(RD*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_TAir)*poolParam.APool; end if; end if; end if; From edb4fbad61b2ecdbc16ab63e03064d2baf67fd12 Mon Sep 17 00:00:00 2001 From: Larissa Date: Wed, 30 Nov 2022 18:29:35 +0100 Subject: [PATCH 06/34] Fix errors in parameterization and add documentation for pool model. #1407 --- AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 41 +++++++++++++++--- .../Fluid/Pools/PoolAndWaterCuircut.png | Bin 0 -> 294662 bytes 2 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 AixLib/Resources/Images/Fluid/Pools/PoolAndWaterCuircut.png diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo index 6af559ba66..2f35d3605c 100644 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -158,11 +158,11 @@ model IndoorSwimmingPool iconTransformation(extent={{90,-40},{110,-20}}))); .AixLib.Fluid.Pool.BaseClasses.waveMachine waveMachine( - h_wave=poolParam.heightWave, - w_wave=poolParam.widthWave, - wavePool_startTime=poolParam.timeWavePool_start, - wavePool_period=poolParam.wavePool_period, - wavePool_width=poolParam.wavePool_width) if poolParam.use_wavePool + heightWave=poolParam.heightWave, + widthWave=poolParam.widthWave, + timeWavePul_start=poolParam.timeWavePul_start, + periodeWavePul=poolParam.periodeWavePul, + widthWavePul=poolParam.widthWavePul) if poolParam.use_wavePool annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPoolSurface @@ -542,5 +542,34 @@ operation"), textStyle={TextStyle.Bold}, textString="Water treatment circuit -")})); +")}), +Documentation(info=" +

Overview

+

Model for indoor swimming pools to calculate energy and water demands. Optional use of a wave machine, pool cover, partial load for the circulation pump and heat recovery from wastewater or recycling. In addition, an ideal heater can be used to heat the pool.

+



+ +

Important parameters and Inputs

+
    +
  • All pool specific parameters are collected in one AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord record.
  • +
  • openingHours: Input profile for the opening hours to consider a pool cover or a reduced circulation flow during non-operating hours. Also, during non-opening hours pool occupancy is set to 0.
  • +
  • persons: Input profile for occupancy of the pool to consider occupancy level for evaportaion.
  • +
+ +

Assumptions

+
    +
  • Evaporation is determined according to VDI 2089.
  • +
  • Filter and disinfection units are not explicitly modeled and have to be considered within the pump delivery head (pumpHead). According to Saunus 1.7 bar is a good estimation for swimming pools in sport oriented swimming facilities.
  • +
  • The type of the filter should be taken into account within the determination of the volume flow and storage capacities. DIN 19643 provides standards for the volume flow and storage capacities, taking into account the pool size and type as well as the filter type.
  • +
  • There are no water losses or heat gains due to people entering or leaving the swimming pool.
  • +
+ +

References +

For automatic generation of a swimming pool within a thermal zone and multizone model as well as for datasets, see https://github.com/RWTH-EBC/TEASER +

References for implemented constants (use also for parametrization): +

    +
  • German Association of Engineers: Guideline VDI 2089-1, January 2010: Building Services in swimming baths - Indoor Pools
  • +
  • German Institute for Standardization DIN 19643-1, November 2012: Treatment of water of swimming pools and baths - Part 1 General Requirements
  • +
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • +
+")); end IndoorSwimmingPool; diff --git a/AixLib/Resources/Images/Fluid/Pools/PoolAndWaterCuircut.png b/AixLib/Resources/Images/Fluid/Pools/PoolAndWaterCuircut.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7225670a73c1cc466d035f0d30e7fe3d4e2f65 GIT binary patch literal 294662 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
~X%m`gChabr5yEIk2?3*-Vj& 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 z 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 Date: Wed, 30 Nov 2022 17:30:37 +0000 Subject: [PATCH 07/34] CI message from ebc-aixlib-bot. Push new files with corrected html Syntax . --- AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 92 +++++++++++++++++++------ 1 file changed, 70 insertions(+), 22 deletions(-) diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo index 2f35d3605c..27142203fc 100644 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -543,33 +543,81 @@ operation"), textString="Water treatment circuit ")}), -Documentation(info=" -

Overview

-

Model for indoor swimming pools to calculate energy and water demands. Optional use of a wave machine, pool cover, partial load for the circulation pump and heat recovery from wastewater or recycling. In addition, an ideal heater can be used to heat the pool.

-



- -

Important parameters and Inputs

+Documentation(info="

+ Overview +

+

+ Model for indoor swimming pools to calculate energy and water + demands. Optional use of a wave machine, pool cover, partial load for + the circulation pump and heat recovery from wastewater or recycling. + In addition, an ideal heater can be used to heat the pool. +

+

+
+
+ \"1\" +

+

+ Important parameters and + Inputs +

    -
  • All pool specific parameters are collected in one AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord record.
  • -
  • openingHours: Input profile for the opening hours to consider a pool cover or a reduced circulation flow during non-operating hours. Also, during non-opening hours pool occupancy is set to 0.
  • -
  • persons: Input profile for occupancy of the pool to consider occupancy level for evaportaion.
  • +
  • All pool specific parameters are collected in one AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord + record. +
  • +
  • openingHours: Input profile for the opening hours to consider a + pool cover or a reduced circulation flow during non-operating hours. + Also, during non-opening hours pool occupancy is set to 0. +
  • +
  • persons: Input profile for occupancy of the pool to consider + occupancy level for evaportaion. +
- -

Assumptions

+

+ Assumptions +

    -
  • Evaporation is determined according to VDI 2089.
  • -
  • Filter and disinfection units are not explicitly modeled and have to be considered within the pump delivery head (pumpHead). According to Saunus 1.7 bar is a good estimation for swimming pools in sport oriented swimming facilities.
  • -
  • The type of the filter should be taken into account within the determination of the volume flow and storage capacities. DIN 19643 provides standards for the volume flow and storage capacities, taking into account the pool size and type as well as the filter type.
  • -
  • There are no water losses or heat gains due to people entering or leaving the swimming pool.
  • +
  • Evaporation is determined according to VDI 2089. +
  • +
  • Filter and disinfection units are not explicitly modeled and have + to be considered within the pump delivery head (pumpHead). According + to Saunus 1.7 bar is a good estimation for swimming pools in sport + oriented swimming facilities. +
  • +
  • The type of the filter should be taken into account within the + determination of the volume flow and storage capacities. DIN 19643 + provides standards for the volume flow and storage capacities, taking + into account the pool size and type as well as the filter type. +
  • +
  • There are no water losses or heat gains due to people entering or + leaving the swimming pool. +
- -

References -

For automatic generation of a swimming pool within a thermal zone and multizone model as well as for datasets, see https://github.com/RWTH-EBC/TEASER -

References for implemented constants (use also for parametrization): +

+ References +

+

+ For automatic generation of a swimming pool within a thermal zone and + multizone model as well as for datasets, see + https://github.com/RWTH-EBC/TEASER +

+

+ References for implemented constants (use also for parametrization): +

    -
  • German Association of Engineers: Guideline VDI 2089-1, January 2010: Building Services in swimming baths - Indoor Pools
  • -
  • German Institute for Standardization DIN 19643-1, November 2012: Treatment of water of swimming pools and baths - Part 1 General Requirements
  • -
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • +
  • German Association of Engineers: Guideline VDI 2089-1, January + 2010: Building Services in swimming baths - Indoor Pools +
  • +
  • German Institute for Standardization DIN 19643-1, November 2012: + Treatment of water of swimming pools and baths - Part 1 General + Requirements +
  • +
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - + Betrieb +
")); end IndoorSwimmingPool; From a38d338a8f9a5c8765284f4980dcf763692b2a92 Mon Sep 17 00:00:00 2001 From: Larissa Date: Thu, 1 Dec 2022 19:03:05 +0100 Subject: [PATCH 08/34] changes in graphical view for example #1407 --- ...IndoorSwimmingPoolExternalHeatingSystem.mo | 58 ++++++++++--------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo index 35eb309f6c..5878ccbbe7 100644 --- a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo +++ b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo @@ -3,8 +3,8 @@ model IndoorSwimmingPoolExternalHeatingSystem extends Modelica.Icons.Example; Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater "Flow rate of added fresh water to the pool and water treatment system" - annotation (Placement(transformation(extent={{100,-112},{128,-84}}), - iconTransformation(extent={{100,-112},{128,-84}}))); + annotation (Placement(transformation(extent={{98,-100},{126,-72}}), + iconTransformation(extent={{98,-100},{126,-72}}))); .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool( use_idealHeater=false), redeclare package WaterMedium = WaterMedium) @@ -13,7 +13,7 @@ model IndoorSwimmingPoolExternalHeatingSystem replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) - annotation (Placement(transformation(extent={{102,80},{86,96}}))); + annotation (Placement(transformation(extent={{74,80},{58,96}}))); Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) @@ -24,7 +24,7 @@ model IndoorSwimmingPoolExternalHeatingSystem period=(24 - 7)*3600, offset=0, startTime=3600*7) - annotation (Placement(transformation(extent={{-98,-38},{-84,-24}}))); + annotation (Placement(transformation(extent={{-94,-44},{-80,-30}}))); Modelica.Blocks.Sources.Trapezoid Person( amplitude=0.5, rising=7*3600, @@ -33,20 +33,20 @@ model IndoorSwimmingPoolExternalHeatingSystem period=17*3600, offset=0.3, startTime=7*3600) - annotation (Placement(transformation(extent={{-98,-8},{-84,6}}))); + annotation (Placement(transformation(extent={{-94,-8},{-80,6}}))); Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ {-86,16},{-118,48}}))); Modelica.Blocks.Interfaces.RealOutput PPool "Output eletric energy needed for pool operation" annotation (Placement( - transformation(extent={{100,-90},{126,-64}}), - iconTransformation(extent={{100,-90}, - {126,-64}}))); + transformation(extent={{98,-78},{124,-52}}),iconTransformation(extent={{98,-78}, + {124,-52}}))); Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature prescribedTemperature annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); Modelica.Blocks.Interfaces.RealOutput TPool "Value of Real output" - annotation (Placement(transformation(extent={{100,62},{120,82}}))); + annotation (Placement(transformation(extent={{98,58},{122,82}}), + iconTransformation(extent={{98,58},{122,82}}))); Controls.Continuous.LimPID PI( k=1000, yMax=10000000, @@ -55,12 +55,13 @@ model IndoorSwimmingPoolExternalHeatingSystem Ti=1) annotation(Placement(transformation(extent={{-8,-8}, {8,8}}, rotation=180, - origin={76,6}))); + origin={62,6}))); Modelica.Blocks.Sources.RealExpression SetTemperature(y=273.15 + 28) - annotation (Placement(transformation(extent={{116,10},{98,26}}))); + annotation (Placement(transformation(extent={{98,20},{80,36}}))); Modelica.Blocks.Interfaces.RealOutput y1 "Connector of actuator output signal" - annotation (Placement(transformation(extent={{108,-30},{128,-10}}))); + annotation (Placement(transformation(extent={{98,-32},{122,-8}}), + iconTransformation(extent={{98,-32},{122,-8}}))); MixingVolumes.MixingVolume vol( redeclare package Medium = AixLib.Media.Water, m_flow_nominal=indoorSwimming.m_flow_nominal, @@ -72,37 +73,36 @@ model IndoorSwimmingPoolExternalHeatingSystem Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow annotation (Placement(transformation(extent={{62,-50},{42,-30}}))); equation - connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{85.2,88},{18, + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{57.2,88},{18, 88},{18,18.39},{9.02,18.39}}, color={0,0,127})); connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-35.86,39.11},{ -34,39.11},{-34,50},{-64,50},{-64,62},{-69.2,62}}, color={0,0,127})); connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-48.78,39.11}, {-48.78,80},{-69.2,80}}, color={0,0,127})); - connect(Opening.y, indoorSwimming.openingHours) annotation (Line(points={{-83.3, - -31},{-70,-31},{-70,-20.46},{-62.04,-20.46}}, color={0,0,127})); - connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-83.3,-1}, + connect(Opening.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, + -37},{-70,-37},{-70,-20.46},{-62.04,-20.46}}, color={0,0,127})); + connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.3,-1}, {-70,-1},{-70,-8.25},{-61.7,-8.25}}, color={0,0,127})); connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-61.36,21.72}, {-61.36,20},{-80,20},{-80,32},{-102,32}},color={0,0,127})); connect(indoorSwimming.PPool, PPool) annotation (Line(points={{10.72,-27.12}, - {10.72,-26},{18,-26},{18,-77},{113,-77}}, color={0,0,127})); + {10.72,-26},{18,-26},{18,-65},{111,-65}}, color={0,0,127})); connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( - points={{10.72,-33.04},{10.72,-98},{114,-98}}, color={0,0,127})); + points={{10.72,-33.04},{10.72,-86},{112,-86}}, color={0,0,127})); connect(prescribedTemperature.T, T_Air.y) annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) - annotation (Line(points={{-4,80},{2,80},{2,46},{-0.84,46},{-0.84,39.48}}, - color={191,0,0})); + annotation (Line(points={{-4,80},{-0.84,80},{-0.84,39.48}}, color={191,0,0})); connect(indoorSwimming.TPool, TPool) annotation (Line(points={{10.72,6.92},{ - 32,6.92},{32,72},{110,72}}, color={0,0,127})); + 32,6.92},{32,70},{110,70}}, color={0,0,127})); connect(MFlowFreshWater, MFlowFreshWater) - annotation (Line(points={{114,-98},{114,-98}}, color={0,0,127})); - connect(PI.u_s, SetTemperature.y) annotation (Line(points={{85.6,6},{92,6},{ - 92,18},{97.1,18}}, color={0,0,127})); + annotation (Line(points={{112,-86},{112,-86}}, color={0,0,127})); + connect(PI.u_s, SetTemperature.y) annotation (Line(points={{71.6,6},{76,6},{ + 76,28},{79.1,28}}, color={0,0,127})); connect(indoorSwimming.TPool, PI.u_m) annotation (Line(points={{10.72,6.92},{ - 40,6.92},{40,52},{76,52},{76,15.6}}, color={0,0,127})); - connect(PI.y, y1) annotation (Line(points={{67.2,6},{62,6},{62,-20},{118,-20}}, + 32,6.92},{32,20},{62,20},{62,15.6}}, color={0,0,127})); + connect(PI.y, y1) annotation (Line(points={{53.2,6},{48,6},{48,-20},{110,-20}}, color={0,0,127})); connect(vol.ports[1], indoorSwimming.toPool) annotation (Line(points={{22,-15}, {22,-10.1},{8,-10.1}}, color={0,127,255})); @@ -110,8 +110,10 @@ equation -13},{22,-18.98},{8,-18.98}}, color={0,127,255})); connect(prescribedHeatFlow.port, vol.heatPort) annotation (Line(points={{42,-40},{32,-40},{32,-24}}, color={191,0,0})); - connect(PI.y, prescribedHeatFlow.Q_flow) annotation (Line(points={{67.2,6},{ - 54,6},{54,-34},{84,-34},{84,-40},{62,-40}}, color={0,0,127})); + connect(PI.y, prescribedHeatFlow.Q_flow) annotation (Line(points={{53.2,6},{ + 48,6},{48,-20},{78,-20},{78,-40},{62,-40}}, color={0,0,127})); + connect(TPool, TPool) + annotation (Line(points={{110,70},{110,70}}, color={0,0,127})); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false)), experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); From 8bd22778827e616ee7223c3da2d9cd712903a491 Mon Sep 17 00:00:00 2001 From: Larissa Date: Fri, 2 Dec 2022 08:45:32 +0100 Subject: [PATCH 09/34] Delete old models of swimming pool --- AixLib/.copiedFiles.txt | 2503 ---------------------- AixLib/Fluid/Pools/BaseClasses.mo | 255 --- AixLib/Fluid/Pools/Example.mo | 88 - AixLib/Fluid/Pools/IndoorSwimmingPool.mo | 545 ----- AixLib/Fluid/Pools/package.order | 3 - 5 files changed, 3394 deletions(-) delete mode 100644 AixLib/.copiedFiles.txt delete mode 100644 AixLib/Fluid/Pools/BaseClasses.mo delete mode 100644 AixLib/Fluid/Pools/Example.mo delete mode 100644 AixLib/Fluid/Pools/IndoorSwimmingPool.mo delete mode 100644 AixLib/Fluid/Pools/package.order diff --git a/AixLib/.copiedFiles.txt b/AixLib/.copiedFiles.txt deleted file mode 100644 index 8f67174064..0000000000 --- a/AixLib/.copiedFiles.txt +++ /dev/null @@ -1,2503 +0,0 @@ -# Do not edit this file unless you know what you are doing. -# This file is used by the IBPSA merge script and generated by BuildingsPy. -AixLib/Airflow/Multizone/BaseClasses/Door.mo -AixLib/Airflow/Multizone/BaseClasses/DoorDiscretized.mo -AixLib/Airflow/Multizone/BaseClasses/ErrorControl.mo -AixLib/Airflow/Multizone/BaseClasses/Examples/Interpolate.mo -AixLib/Airflow/Multizone/BaseClasses/Examples/PowerLaw.mo -AixLib/Airflow/Multizone/BaseClasses/Examples/PowerLawFixedM.mo -AixLib/Airflow/Multizone/BaseClasses/Examples/WindPressureLowRise.mo -AixLib/Airflow/Multizone/BaseClasses/Examples/WindPressureProfile.mo -AixLib/Airflow/Multizone/BaseClasses/Examples/package.mo -AixLib/Airflow/Multizone/BaseClasses/Examples/package.order -AixLib/Airflow/Multizone/BaseClasses/PartialOneWayFlowElement.mo -AixLib/Airflow/Multizone/BaseClasses/PowerLawResistanceParameters.mo -AixLib/Airflow/Multizone/BaseClasses/TwoWayFlowElement.mo -AixLib/Airflow/Multizone/BaseClasses/TwoWayFlowElementBuoyancy.mo -AixLib/Airflow/Multizone/BaseClasses/ZonalFlow.mo -AixLib/Airflow/Multizone/BaseClasses/interpolate.mo -AixLib/Airflow/Multizone/BaseClasses/package.mo -AixLib/Airflow/Multizone/BaseClasses/package.order -AixLib/Airflow/Multizone/BaseClasses/powerLaw.mo -AixLib/Airflow/Multizone/BaseClasses/powerLawFixedM.mo -AixLib/Airflow/Multizone/BaseClasses/windPressureLowRise.mo -AixLib/Airflow/Multizone/BaseClasses/windPressureProfile.mo -AixLib/Airflow/Multizone/Coefficient_V_flow.mo -AixLib/Airflow/Multizone/Coefficient_m_flow.mo -AixLib/Airflow/Multizone/DoorDiscretizedOpen.mo -AixLib/Airflow/Multizone/DoorDiscretizedOperable.mo -AixLib/Airflow/Multizone/DoorOpen.mo -AixLib/Airflow/Multizone/DoorOperable.mo -AixLib/Airflow/Multizone/EffectiveAirLeakageArea.mo -AixLib/Airflow/Multizone/Examples/CO2TransportStep.mo -AixLib/Airflow/Multizone/Examples/ChimneyShaftNoVolume.mo -AixLib/Airflow/Multizone/Examples/ChimneyShaftWithVolume.mo -AixLib/Airflow/Multizone/Examples/ClosedDoors.mo -AixLib/Airflow/Multizone/Examples/NaturalVentilation.mo -AixLib/Airflow/Multizone/Examples/OneEffectiveAirLeakageArea.mo -AixLib/Airflow/Multizone/Examples/OneOpenDoor.mo -AixLib/Airflow/Multizone/Examples/OneRoom.mo -AixLib/Airflow/Multizone/Examples/Orifice.mo -AixLib/Airflow/Multizone/Examples/PowerLaw.mo -AixLib/Airflow/Multizone/Examples/PressurizationData.mo -AixLib/Airflow/Multizone/Examples/ReverseBuoyancy.mo -AixLib/Airflow/Multizone/Examples/ReverseBuoyancy3Zones.mo -AixLib/Airflow/Multizone/Examples/TrickleVent.mo -AixLib/Airflow/Multizone/Examples/ZonalFlow.mo -AixLib/Airflow/Multizone/Examples/package.mo -AixLib/Airflow/Multizone/Examples/package.order -AixLib/Airflow/Multizone/MediumColumn.mo -AixLib/Airflow/Multizone/MediumColumnDynamic.mo -AixLib/Airflow/Multizone/Orifice.mo -AixLib/Airflow/Multizone/Point_m_flow.mo -AixLib/Airflow/Multizone/Points_m_flow.mo -AixLib/Airflow/Multizone/Table_V_flow.mo -AixLib/Airflow/Multizone/Table_m_flow.mo -AixLib/Airflow/Multizone/Types/densitySelection.mo -AixLib/Airflow/Multizone/Types/package.mo -AixLib/Airflow/Multizone/Types/package.order -AixLib/Airflow/Multizone/UsersGuide.mo -AixLib/Airflow/Multizone/Validation/DoorOpenClosed.mo -AixLib/Airflow/Multizone/Validation/OneWayFlow.mo -AixLib/Airflow/Multizone/Validation/OpenDoorBuoyancyDynamic.mo -AixLib/Airflow/Multizone/Validation/OpenDoorBuoyancyPressureDynamic.mo -AixLib/Airflow/Multizone/Validation/OpenDoorPressure.mo -AixLib/Airflow/Multizone/Validation/OpenDoorTemperature.mo -AixLib/Airflow/Multizone/Validation/ThreeRoomsContam.mo -AixLib/Airflow/Multizone/Validation/ThreeRoomsContamDiscretizedDoor.mo -AixLib/Airflow/Multizone/Validation/package.mo -AixLib/Airflow/Multizone/Validation/package.order -AixLib/Airflow/Multizone/ZonalFlow_ACS.mo -AixLib/Airflow/Multizone/ZonalFlow_m_flow.mo -AixLib/Airflow/Multizone/package.mo -AixLib/Airflow/Multizone/package.order -AixLib/Airflow/package.mo -AixLib/Airflow/package.order -AixLib/BoundaryConditions/SkyTemperature/BlackBody.mo -AixLib/BoundaryConditions/SkyTemperature/Examples/BlackBody.mo -AixLib/BoundaryConditions/SkyTemperature/Examples/package.mo -AixLib/BoundaryConditions/SkyTemperature/Examples/package.order -AixLib/BoundaryConditions/SkyTemperature/package.mo -AixLib/BoundaryConditions/SkyTemperature/package.order -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/AltitudeAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Declination.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/AltitudeAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/Declination.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/IncidenceAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/SolarAzimuth.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/SolarHourAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/WallSolarAzimuth.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/ZenithAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/package.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/Examples/package.order -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/IncidenceAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/SolarAzimuth.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/SolarHourAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/WallSolarAzimuth.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/ZenithAngle.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/package.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/package.order -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/solarAzimuthNoEvent.mo -AixLib/BoundaryConditions/SolarGeometry/BaseClasses/solarAzimuthWithEvent.mo -AixLib/BoundaryConditions/SolarGeometry/Examples/IncidenceAngle.mo -AixLib/BoundaryConditions/SolarGeometry/Examples/ZenithAngle.mo -AixLib/BoundaryConditions/SolarGeometry/Examples/package.mo -AixLib/BoundaryConditions/SolarGeometry/Examples/package.order -AixLib/BoundaryConditions/SolarGeometry/IncidenceAngle.mo -AixLib/BoundaryConditions/SolarGeometry/ZenithAngle.mo -AixLib/BoundaryConditions/SolarGeometry/package.mo -AixLib/BoundaryConditions/SolarGeometry/package.order -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/BrighteningCoefficient.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/DiffuseIsotropic.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/DiffusePerez.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/DirectTiltedSurface.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/BrighteningCoefficient.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/DiffuseIsotropic.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/RelativeAirMass.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/SkyBrightness.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/SkyClearness.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/package.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/package.order -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/PartialSolarIrradiation.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/RelativeAirMass.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/SkyBrightness.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/SkyClearness.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/package.mo -AixLib/BoundaryConditions/SolarIrradiation/BaseClasses/package.order -AixLib/BoundaryConditions/SolarIrradiation/DiffuseIsotropic.mo -AixLib/BoundaryConditions/SolarIrradiation/DiffusePerez.mo -AixLib/BoundaryConditions/SolarIrradiation/DirectTiltedSurface.mo -AixLib/BoundaryConditions/SolarIrradiation/Examples/DiffuseIsotropic.mo -AixLib/BoundaryConditions/SolarIrradiation/Examples/DiffusePerez.mo -AixLib/BoundaryConditions/SolarIrradiation/Examples/DirectTiltedSurface.mo -AixLib/BoundaryConditions/SolarIrradiation/Examples/package.mo -AixLib/BoundaryConditions/SolarIrradiation/Examples/package.order -AixLib/BoundaryConditions/SolarIrradiation/package.mo -AixLib/BoundaryConditions/SolarIrradiation/package.order -AixLib/BoundaryConditions/Types.mo -AixLib/BoundaryConditions/UsersGuide.mo -AixLib/BoundaryConditions/Validation/BESTEST/WD100.mo -AixLib/BoundaryConditions/Validation/BESTEST/WD200.mo -AixLib/BoundaryConditions/Validation/BESTEST/WD300.mo -AixLib/BoundaryConditions/Validation/BESTEST/WD400.mo -AixLib/BoundaryConditions/Validation/BESTEST/WD500.mo -AixLib/BoundaryConditions/Validation/BESTEST/WD600.mo -AixLib/BoundaryConditions/Validation/BESTEST/package.mo -AixLib/BoundaryConditions/Validation/BESTEST/package.order -AixLib/BoundaryConditions/Validation/IsotropicAndPerezDiffuseRadiation.mo -AixLib/BoundaryConditions/Validation/UsersGuide.mo -AixLib/BoundaryConditions/Validation/package.mo -AixLib/BoundaryConditions/Validation/package.order -AixLib/BoundaryConditions/WeatherData/BaseClasses/CheckBlackBodySkyTemperature.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/CheckDewPointTemperature.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/CheckDryBulbTemperature.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/CheckPressure.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/ConvertTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/EquationOfTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/CheckBlackBodySkyTemperature.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/CheckPressure.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/CheckTemperature.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/ConvertTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/ConvertTimeNegativeStart.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/ConvertTimePositiveStart.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/EquationOfTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/GetAbsolutePath.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/GetAltitudeTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/GetHeaderElement.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/GetTimeSpanTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/GetTimeSpanTMY3LongHeader.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/GetTimeSpanTMY3_NonzeroStart.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/LimitMin.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/LocalCivilTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/SolarTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/package.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/Examples/package.order -AixLib/BoundaryConditions/WeatherData/BaseClasses/LimiterCeilingHeight.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/LimiterHorizontalInfraredIrradiation.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/LimiterOpaqueSkyCover.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/LimiterRelativeHumidity.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/LimiterTotalSkyCover.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/LimiterWindDirection.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/LimiterWindSpeed.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/LocalCivilTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/PartialLimiter.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/PartialLimiterMin.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/SolarTime.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/SourceSelector.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/SourceSelectorRadiation.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getAbsolutePath.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getAltitudeLocationTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getHeaderElementTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getLastHeaderElementTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getLatitudeTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getLongitudeTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getTimeSpanTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/getTimeZoneTMY3.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/package.mo -AixLib/BoundaryConditions/WeatherData/BaseClasses/package.order -AixLib/BoundaryConditions/WeatherData/Bus.mo -AixLib/BoundaryConditions/WeatherData/Examples/ReaderTMY3.mo -AixLib/BoundaryConditions/WeatherData/Examples/package.mo -AixLib/BoundaryConditions/WeatherData/Examples/package.order -AixLib/BoundaryConditions/WeatherData/ReaderTMY3.mo -AixLib/BoundaryConditions/WeatherData/Validation/DecemberToJanuary.mo -AixLib/BoundaryConditions/WeatherData/Validation/OverAYear_usingOneYearData.mo -AixLib/BoundaryConditions/WeatherData/Validation/ReaderTMY3HDirNor.mo -AixLib/BoundaryConditions/WeatherData/Validation/ThreeYears_usingTwoYearData.mo -AixLib/BoundaryConditions/WeatherData/Validation/ThreeYears_usingTwoYearDataNegativeStart.mo -AixLib/BoundaryConditions/WeatherData/Validation/ThreeYears_usingTwoYearDataPositiveStart.mo -AixLib/BoundaryConditions/WeatherData/Validation/package.mo -AixLib/BoundaryConditions/WeatherData/Validation/package.order -AixLib/BoundaryConditions/WeatherData/package.mo -AixLib/BoundaryConditions/WeatherData/package.order -AixLib/BoundaryConditions/package.mo -AixLib/BoundaryConditions/package.order -AixLib/Controls/Continuous/Examples/LimPID.mo -AixLib/Controls/Continuous/Examples/LimPIDWithReset.mo -AixLib/Controls/Continuous/Examples/NumberOfRequests.mo -AixLib/Controls/Continuous/Examples/OffTimer.mo -AixLib/Controls/Continuous/Examples/SignalRanker.mo -AixLib/Controls/Continuous/Examples/package.mo -AixLib/Controls/Continuous/Examples/package.order -AixLib/Controls/Continuous/LimPID.mo -AixLib/Controls/Continuous/NumberOfRequests.mo -AixLib/Controls/Continuous/OffTimer.mo -AixLib/Controls/Continuous/SignalRanker.mo -AixLib/Controls/Continuous/Validation/LimPIDReset.mo -AixLib/Controls/Continuous/Validation/OffTimerNonZeroStart.mo -AixLib/Controls/Continuous/Validation/package.mo -AixLib/Controls/Continuous/Validation/package.order -AixLib/Controls/Continuous/package.mo -AixLib/Controls/Continuous/package.order -AixLib/Controls/Discrete/BooleanDelay.mo -AixLib/Controls/Discrete/Examples/BooleanDelay.mo -AixLib/Controls/Discrete/Examples/package.mo -AixLib/Controls/Discrete/Examples/package.order -AixLib/Controls/Discrete/package.mo -AixLib/Controls/Discrete/package.order -AixLib/Controls/SetPoints/Examples/OccupancySchedule.mo -AixLib/Controls/SetPoints/Examples/SupplyReturnTemperatureReset.mo -AixLib/Controls/SetPoints/Examples/Table.mo -AixLib/Controls/SetPoints/Examples/package.mo -AixLib/Controls/SetPoints/Examples/package.order -AixLib/Controls/SetPoints/OccupancySchedule.mo -AixLib/Controls/SetPoints/SupplyReturnTemperatureReset.mo -AixLib/Controls/SetPoints/Table.mo -AixLib/Controls/SetPoints/Validation/OccupancyScheduleNegativeStartTime.mo -AixLib/Controls/SetPoints/Validation/OccupancySchedulePositiveStartTime.mo -AixLib/Controls/SetPoints/Validation/package.mo -AixLib/Controls/SetPoints/Validation/package.order -AixLib/Controls/SetPoints/package.mo -AixLib/Controls/SetPoints/package.order -AixLib/Controls/package.mo -AixLib/Controls/package.order -AixLib/Fluid/Actuators/BaseClasses/ActuatorSignal.mo -AixLib/Fluid/Actuators/BaseClasses/Examples/EqualPercentageDerivativeCheck.mo -AixLib/Fluid/Actuators/BaseClasses/Examples/package.mo -AixLib/Fluid/Actuators/BaseClasses/Examples/package.order -AixLib/Fluid/Actuators/BaseClasses/PartialDamperExponential.mo -AixLib/Fluid/Actuators/BaseClasses/PartialThreeWayValve.mo -AixLib/Fluid/Actuators/BaseClasses/PartialTwoWayValve.mo -AixLib/Fluid/Actuators/BaseClasses/PartialTwoWayValveKv.mo -AixLib/Fluid/Actuators/BaseClasses/ValveParameters.mo -AixLib/Fluid/Actuators/BaseClasses/der_equalPercentage.mo -AixLib/Fluid/Actuators/BaseClasses/equalPercentage.mo -AixLib/Fluid/Actuators/BaseClasses/exponentialDamper.mo -AixLib/Fluid/Actuators/BaseClasses/package.mo -AixLib/Fluid/Actuators/BaseClasses/package.order -AixLib/Fluid/Actuators/Dampers/Examples/Damper.mo -AixLib/Fluid/Actuators/Dampers/Examples/MixingBox.mo -AixLib/Fluid/Actuators/Dampers/Examples/VAVBoxExponential.mo -AixLib/Fluid/Actuators/Dampers/Examples/package.mo -AixLib/Fluid/Actuators/Dampers/Examples/package.order -AixLib/Fluid/Actuators/Dampers/Exponential.mo -AixLib/Fluid/Actuators/Dampers/MixingBox.mo -AixLib/Fluid/Actuators/Dampers/PressureIndependent.mo -AixLib/Fluid/Actuators/Dampers/Validation/PressureIndependent.mo -AixLib/Fluid/Actuators/Dampers/Validation/package.mo -AixLib/Fluid/Actuators/Dampers/Validation/package.order -AixLib/Fluid/Actuators/Dampers/package.mo -AixLib/Fluid/Actuators/Dampers/package.order -AixLib/Fluid/Actuators/Motors/Examples/IdealMotor.mo -AixLib/Fluid/Actuators/Motors/Examples/package.mo -AixLib/Fluid/Actuators/Motors/Examples/package.order -AixLib/Fluid/Actuators/Motors/IdealMotor.mo -AixLib/Fluid/Actuators/Motors/package.mo -AixLib/Fluid/Actuators/Motors/package.order -AixLib/Fluid/Actuators/Valves/Data/Generic.mo -AixLib/Fluid/Actuators/Valves/Data/Linear.mo -AixLib/Fluid/Actuators/Valves/Data/package.mo -AixLib/Fluid/Actuators/Valves/Data/package.order -AixLib/Fluid/Actuators/Valves/Examples/ThreeWayValves.mo -AixLib/Fluid/Actuators/Valves/Examples/TwoWayValvePressureIndependent.mo -AixLib/Fluid/Actuators/Valves/Examples/TwoWayValveTable.mo -AixLib/Fluid/Actuators/Valves/Examples/TwoWayValves.mo -AixLib/Fluid/Actuators/Valves/Examples/TwoWayValvesMotor.mo -AixLib/Fluid/Actuators/Valves/Examples/TwoWayValvesTable.mo -AixLib/Fluid/Actuators/Valves/Examples/package.mo -AixLib/Fluid/Actuators/Valves/Examples/package.order -AixLib/Fluid/Actuators/Valves/ThreeWayEqualPercentageLinear.mo -AixLib/Fluid/Actuators/Valves/ThreeWayLinear.mo -AixLib/Fluid/Actuators/Valves/ThreeWayTable.mo -AixLib/Fluid/Actuators/Valves/TwoWayButterfly.mo -AixLib/Fluid/Actuators/Valves/TwoWayEqualPercentage.mo -AixLib/Fluid/Actuators/Valves/TwoWayLinear.mo -AixLib/Fluid/Actuators/Valves/TwoWayPolynomial.mo -AixLib/Fluid/Actuators/Valves/TwoWayPressureIndependent.mo -AixLib/Fluid/Actuators/Valves/TwoWayQuickOpening.mo -AixLib/Fluid/Actuators/Valves/TwoWayTable.mo -AixLib/Fluid/Actuators/Valves/Validation/ThreeWayValveParameterization.mo -AixLib/Fluid/Actuators/Valves/Validation/TwoWayValveParameterization.mo -AixLib/Fluid/Actuators/Valves/Validation/package.mo -AixLib/Fluid/Actuators/Valves/Validation/package.order -AixLib/Fluid/Actuators/Valves/package.mo -AixLib/Fluid/Actuators/Valves/package.order -AixLib/Fluid/Actuators/package.mo -AixLib/Fluid/Actuators/package.order -AixLib/Fluid/BaseClasses/ActuatorFilter.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_dp_DerivativeCheck.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_dp_DerivativeCheck2.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_m_flow_DerivativeCheck.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_m_flow_DerivativeCheck2.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/InverseFlowFunctions.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/InvertingBasicFlowFunction_dp.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/InvertingBasicFlowFunction_m_flow.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/package.mo -AixLib/Fluid/BaseClasses/FlowModels/Validation/package.order -AixLib/Fluid/BaseClasses/FlowModels/basicFlowFunction_dp.mo -AixLib/Fluid/BaseClasses/FlowModels/basicFlowFunction_dp_der.mo -AixLib/Fluid/BaseClasses/FlowModels/basicFlowFunction_dp_der2.mo -AixLib/Fluid/BaseClasses/FlowModels/basicFlowFunction_m_flow.mo -AixLib/Fluid/BaseClasses/FlowModels/basicFlowFunction_m_flow_der.mo -AixLib/Fluid/BaseClasses/FlowModels/basicFlowFunction_m_flow_der2.mo -AixLib/Fluid/BaseClasses/FlowModels/package.mo -AixLib/Fluid/BaseClasses/FlowModels/package.order -AixLib/Fluid/BaseClasses/IndexMassFraction.mo -AixLib/Fluid/BaseClasses/MassFlowRateMultiplier.mo -AixLib/Fluid/BaseClasses/PartialResistance.mo -AixLib/Fluid/BaseClasses/PartialThreeWayResistance.mo -AixLib/Fluid/BaseClasses/Validation/ActuatorFilter.mo -AixLib/Fluid/BaseClasses/Validation/MassFlowRateMultiplier.mo -AixLib/Fluid/BaseClasses/Validation/package.mo -AixLib/Fluid/BaseClasses/Validation/package.order -AixLib/Fluid/BaseClasses/package.mo -AixLib/Fluid/BaseClasses/package.order -AixLib/Fluid/Chillers/BaseClasses/Carnot.mo -AixLib/Fluid/Chillers/BaseClasses/PartialCarnot_T.mo -AixLib/Fluid/Chillers/BaseClasses/PartialCarnot_y.mo -AixLib/Fluid/Chillers/BaseClasses/package.mo -AixLib/Fluid/Chillers/BaseClasses/package.order -AixLib/Fluid/Chillers/Carnot_TEva.mo -AixLib/Fluid/Chillers/Carnot_y.mo -AixLib/Fluid/Chillers/Examples/Carnot_TEva.mo -AixLib/Fluid/Chillers/Examples/Carnot_y.mo -AixLib/Fluid/Chillers/Examples/package.mo -AixLib/Fluid/Chillers/Examples/package.order -AixLib/Fluid/Chillers/Validation/CarnotVerifyCOP.mo -AixLib/Fluid/Chillers/Validation/CarnotVerifyEtaCarnot.mo -AixLib/Fluid/Chillers/Validation/Carnot_TEva_2ndLaw.mo -AixLib/Fluid/Chillers/Validation/Carnot_TEva_HighTemperature.mo -AixLib/Fluid/Chillers/Validation/Carnot_TEva_LimitedCapacity.mo -AixLib/Fluid/Chillers/Validation/Carnot_TEva_etaPL.mo -AixLib/Fluid/Chillers/Validation/Carnot_TEva_reverseFlow.mo -AixLib/Fluid/Chillers/Validation/Carnot_y_etaPL.mo -AixLib/Fluid/Chillers/Validation/package.mo -AixLib/Fluid/Chillers/Validation/package.order -AixLib/Fluid/Chillers/package.mo -AixLib/Fluid/Chillers/package.order -AixLib/Fluid/Delays/DelayFirstOrder.mo -AixLib/Fluid/Delays/Examples/Delay.mo -AixLib/Fluid/Delays/Examples/package.mo -AixLib/Fluid/Delays/Examples/package.order -AixLib/Fluid/Delays/package.mo -AixLib/Fluid/Delays/package.order -AixLib/Fluid/Examples/FlowSystem/Basic.mo -AixLib/Fluid/Examples/FlowSystem/Simplified1.mo -AixLib/Fluid/Examples/FlowSystem/Simplified2.mo -AixLib/Fluid/Examples/FlowSystem/Simplified3.mo -AixLib/Fluid/Examples/FlowSystem/Simplified4.mo -AixLib/Fluid/Examples/FlowSystem/Simplified5.mo -AixLib/Fluid/Examples/FlowSystem/Simplified6.mo -AixLib/Fluid/Examples/FlowSystem/package.mo -AixLib/Fluid/Examples/FlowSystem/package.order -AixLib/Fluid/Examples/Performance/BaseClasses/Example1.mo -AixLib/Fluid/Examples/Performance/BaseClasses/package.mo -AixLib/Fluid/Examples/Performance/BaseClasses/package.order -AixLib/Fluid/Examples/Performance/Example1v1.mo -AixLib/Fluid/Examples/Performance/Example1v2.mo -AixLib/Fluid/Examples/Performance/Example2.mo -AixLib/Fluid/Examples/Performance/Example3.mo -AixLib/Fluid/Examples/Performance/Example4.mo -AixLib/Fluid/Examples/Performance/Example5.mo -AixLib/Fluid/Examples/Performance/Example6.mo -AixLib/Fluid/Examples/Performance/Example7.mo -AixLib/Fluid/Examples/Performance/Example8.mo -AixLib/Fluid/Examples/Performance/PressureDrop/ParallelDp.mo -AixLib/Fluid/Examples/Performance/PressureDrop/ParallelDpOptimised.mo -AixLib/Fluid/Examples/Performance/PressureDrop/ParallelFlow.mo -AixLib/Fluid/Examples/Performance/PressureDrop/ParallelFlowOptimised.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesDp.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesDpOptimised.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesFlow.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesFlowOptimised.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesParallelDp.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesParallelDpOptimised.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesParallelFlow.mo -AixLib/Fluid/Examples/Performance/PressureDrop/SeriesParallelFlowOptimised.mo -AixLib/Fluid/Examples/Performance/PressureDrop/package.mo -AixLib/Fluid/Examples/Performance/PressureDrop/package.order -AixLib/Fluid/Examples/Performance/package.mo -AixLib/Fluid/Examples/Performance/package.order -AixLib/Fluid/Examples/ResistanceVolumeFlowReversal.mo -AixLib/Fluid/Examples/SimpleHouse.mo -AixLib/Fluid/Examples/package.mo -AixLib/Fluid/Examples/package.order -AixLib/Fluid/FMI/Adaptors/Examples/ThermalZoneHVACNoExhaust.mo -AixLib/Fluid/FMI/Adaptors/Examples/ThermalZoneHVACWithExhaust.mo -AixLib/Fluid/FMI/Adaptors/Examples/package.mo -AixLib/Fluid/FMI/Adaptors/Examples/package.order -AixLib/Fluid/FMI/Adaptors/HVAC.mo -AixLib/Fluid/FMI/Adaptors/Inlet.mo -AixLib/Fluid/FMI/Adaptors/Outlet.mo -AixLib/Fluid/FMI/Adaptors/ThermalZone.mo -AixLib/Fluid/FMI/Adaptors/package.mo -AixLib/Fluid/FMI/Adaptors/package.order -AixLib/Fluid/FMI/BaseClasses/X_w_toX.mo -AixLib/Fluid/FMI/BaseClasses/hOut_toT.mo -AixLib/Fluid/FMI/BaseClasses/package.mo -AixLib/Fluid/FMI/BaseClasses/package.order -AixLib/Fluid/FMI/Conversion/AirToOutlet.mo -AixLib/Fluid/FMI/Conversion/InletToAir.mo -AixLib/Fluid/FMI/Conversion/Validation/AirToOutlet.mo -AixLib/Fluid/FMI/Conversion/Validation/AirToOutletFlowReversal.mo -AixLib/Fluid/FMI/Conversion/Validation/InletToAirDryAir.mo -AixLib/Fluid/FMI/Conversion/Validation/InletToAirDryAirCO2.mo -AixLib/Fluid/FMI/Conversion/Validation/InletToAirMoistAir.mo -AixLib/Fluid/FMI/Conversion/Validation/InletToAirMoistAirCO2.mo -AixLib/Fluid/FMI/Conversion/Validation/package.mo -AixLib/Fluid/FMI/Conversion/Validation/package.order -AixLib/Fluid/FMI/Conversion/package.mo -AixLib/Fluid/FMI/Conversion/package.order -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/Fan.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/FlowSplitter_u.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/HVACZone.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/HVACZones.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/HeaterCooler_u.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/Heater_T.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/Humidifier_u.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/IdealSource_m_flow.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/MixingVolume.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/PressureDrop.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/ResistanceVolume.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/ThermalZone.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/ThermalZones.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/TwoPortPassThrough.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/package.mo -AixLib/Fluid/FMI/ExportContainers/Examples/FMUs/package.order -AixLib/Fluid/FMI/ExportContainers/Examples/package.mo -AixLib/Fluid/FMI/ExportContainers/Examples/package.order -AixLib/Fluid/FMI/ExportContainers/HVACZone.mo -AixLib/Fluid/FMI/ExportContainers/HVACZones.mo -AixLib/Fluid/FMI/ExportContainers/PartialTwoPort.mo -AixLib/Fluid/FMI/ExportContainers/ReplaceableTwoPort.mo -AixLib/Fluid/FMI/ExportContainers/ThermalZone.mo -AixLib/Fluid/FMI/ExportContainers/ThermalZones.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneAir1.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneAir2.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneAir3.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneSimpleAir1.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneSimpleAir2.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneSimpleAir3.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneAir1.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneAir2.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneAir3.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneSimpleAir1.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneSimpleAir2.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneSimpleAir3.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/package.mo -AixLib/Fluid/FMI/ExportContainers/Validation/FMUs/package.order -AixLib/Fluid/FMI/ExportContainers/Validation/package.mo -AixLib/Fluid/FMI/ExportContainers/Validation/package.order -AixLib/Fluid/FMI/ExportContainers/package.mo -AixLib/Fluid/FMI/ExportContainers/package.order -AixLib/Fluid/FMI/FlowSplitter_u.mo -AixLib/Fluid/FMI/Interfaces/FluidProperties.mo -AixLib/Fluid/FMI/Interfaces/Inlet.mo -AixLib/Fluid/FMI/Interfaces/MassFractionConnector.mo -AixLib/Fluid/FMI/Interfaces/Outlet.mo -AixLib/Fluid/FMI/Interfaces/PressureInput.mo -AixLib/Fluid/FMI/Interfaces/PressureOutput.mo -AixLib/Fluid/FMI/Interfaces/package.mo -AixLib/Fluid/FMI/Interfaces/package.order -AixLib/Fluid/FMI/Sink_T.mo -AixLib/Fluid/FMI/Source_T.mo -AixLib/Fluid/FMI/UsersGuide.mo -AixLib/Fluid/FMI/Validation/FlowSplitter_u.mo -AixLib/Fluid/FMI/Validation/HeaterFan.mo -AixLib/Fluid/FMI/Validation/HeaterFanPressureDriven.mo -AixLib/Fluid/FMI/Validation/HeaterFan_noReverseFlow.mo -AixLib/Fluid/FMI/Validation/package.mo -AixLib/Fluid/FMI/Validation/package.order -AixLib/Fluid/FMI/package.mo -AixLib/Fluid/FMI/package.order -AixLib/Fluid/FixedResistances/BaseClasses/PlugFlow.mo -AixLib/Fluid/FixedResistances/BaseClasses/PlugFlowHeatLoss.mo -AixLib/Fluid/FixedResistances/BaseClasses/PlugFlowPipe.mo -AixLib/Fluid/FixedResistances/BaseClasses/PlugFlowTransportDelay.mo -AixLib/Fluid/FixedResistances/BaseClasses/package.mo -AixLib/Fluid/FixedResistances/BaseClasses/package.order -AixLib/Fluid/FixedResistances/CheckValve.mo -AixLib/Fluid/FixedResistances/Examples/CheckValve.mo -AixLib/Fluid/FixedResistances/Examples/FlowJunction.mo -AixLib/Fluid/FixedResistances/Examples/HydraulicDiameter.mo -AixLib/Fluid/FixedResistances/Examples/PlugFlowPipe.mo -AixLib/Fluid/FixedResistances/Examples/PlugFlowPipeDiscretized.mo -AixLib/Fluid/FixedResistances/Examples/PressureDrop.mo -AixLib/Fluid/FixedResistances/Examples/package.mo -AixLib/Fluid/FixedResistances/Examples/package.order -AixLib/Fluid/FixedResistances/HydraulicDiameter.mo -AixLib/Fluid/FixedResistances/Junction.mo -AixLib/Fluid/FixedResistances/LosslessPipe.mo -AixLib/Fluid/FixedResistances/PlugFlowPipe.mo -AixLib/Fluid/FixedResistances/PlugFlowPipeDiscretized.mo -AixLib/Fluid/FixedResistances/PressureDrop.mo -AixLib/Fluid/FixedResistances/Validation/FlowJunctionSteadyState.mo -AixLib/Fluid/FixedResistances/Validation/FlowJunctionSteadyStateNoPressureDrop.mo -AixLib/Fluid/FixedResistances/Validation/LosslessPipe.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/BaseClasses/PipeDataBaseDefinition.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/BaseClasses/PipeDataULg.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/BaseClasses/package.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/BaseClasses/package.order -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataAIT151218.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataULg150801.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataULg151202.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataULg151204_1.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataULg151204_2.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataULg151204_4.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataULg160104_2.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/PipeDataULg160118_1.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/TestData.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/package.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/package.order -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/FlowReversal.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/MSLAIT.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/MSLAIT2Nodes.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/PlugFlowAIT.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/PlugFlowULg.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/TransportWaterAir.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/package.mo -AixLib/Fluid/FixedResistances/Validation/PlugFlowPipes/package.order -AixLib/Fluid/FixedResistances/Validation/PressureDropsExplicit.mo -AixLib/Fluid/FixedResistances/Validation/PressureDropsExplicitLinearized.mo -AixLib/Fluid/FixedResistances/Validation/PressureDropsParallel.mo -AixLib/Fluid/FixedResistances/Validation/PressureDropsSeries.mo -AixLib/Fluid/FixedResistances/Validation/package.mo -AixLib/Fluid/FixedResistances/Validation/package.order -AixLib/Fluid/FixedResistances/package.mo -AixLib/Fluid/FixedResistances/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalHEXOneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalHEXTwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalResistancesOneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalResistancesTwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/ConvectionResistanceCircularPipe.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesOneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesOneUTubeNegative.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesTwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesTwoUTubeNegative.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/MultipoleThermalResistances_OneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/MultipoleThermalResistances_TwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/convectionResistanceCircularPipe.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/internalResistancesOneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/internalResistancesTwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/multipoleFluidTemperature.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/multipoleFmk.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/multipoleThermalResistances.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/partialInternalResistances.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/InternalHEXOneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/InternalHEXTwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/InternalResistancesOneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/InternalResistancesTwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/PartialBorehole.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/PartialInternalHEX.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/PartialInternalResistances.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BaseClasses/PartialBorehole.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BaseClasses/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BaseClasses/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BoreholeDynamics.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BoreholeOneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BoreholeTwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/OneUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/TwoUTube.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Cylindrical.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/GroundTemperatureResponse.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/AggregationCellTimes.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/AggregationWeightingFactors.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/CountAggregationCells.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/ShiftAggregationCells.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/TemperatureResponseMatrix.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/TemporalSuperposition.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/aggregationCellTimes.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/aggregationWeightingFactors.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/countAggregationCells.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/shiftAggregationCells.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/temperatureResponseMatrix.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/temporalSuperposition.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/CylindricalHeatSource.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/CylindricalHeatSource_Integrand.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource_Erfint.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource_Integrand.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource_Integrand_Length.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/GFunction_100boreholes.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/GFunction_1borehole_5meters.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/GFunction_SmallScaleValidation.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/InfiniteLineSource.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/ShaGFunction.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/TimeGeometric.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/cylindricalHeatSource.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/cylindricalHeatSource_Integrand.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/finiteLineSource.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/finiteLineSource_Erfint.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/finiteLineSource_Integrand.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/gFunction.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/infiniteLineSource.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/shaGFunction.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/timeGeometric.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Analytic_20Years.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/BaseClasses/SmallScale_Borefield.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/BaseClasses/SmallScale_Configuration.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/BaseClasses/SmallScale_Filling.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/BaseClasses/SmallScale_Soil.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/BaseClasses/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/BaseClasses/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Cylindrical.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/FiniteDifference_1Week.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Measured_SmallScale.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/package.order -AixLib/Fluid/Geothermal/Borefields/BaseClasses/PartialBorefield.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/package.mo -AixLib/Fluid/Geothermal/Borefields/BaseClasses/package.order -AixLib/Fluid/Geothermal/Borefields/Data/Borefield/Example.mo -AixLib/Fluid/Geothermal/Borefields/Data/Borefield/Template.mo -AixLib/Fluid/Geothermal/Borefields/Data/Borefield/package.mo -AixLib/Fluid/Geothermal/Borefields/Data/Borefield/package.order -AixLib/Fluid/Geothermal/Borefields/Data/Configuration/Example.mo -AixLib/Fluid/Geothermal/Borefields/Data/Configuration/Template.mo -AixLib/Fluid/Geothermal/Borefields/Data/Configuration/package.mo -AixLib/Fluid/Geothermal/Borefields/Data/Configuration/package.order -AixLib/Fluid/Geothermal/Borefields/Data/Filling/Bentonite.mo -AixLib/Fluid/Geothermal/Borefields/Data/Filling/Template.mo -AixLib/Fluid/Geothermal/Borefields/Data/Filling/package.mo -AixLib/Fluid/Geothermal/Borefields/Data/Filling/package.order -AixLib/Fluid/Geothermal/Borefields/Data/Soil/SandStone.mo -AixLib/Fluid/Geothermal/Borefields/Data/Soil/Template.mo -AixLib/Fluid/Geothermal/Borefields/Data/Soil/package.mo -AixLib/Fluid/Geothermal/Borefields/Data/Soil/package.order -AixLib/Fluid/Geothermal/Borefields/Data/package.mo -AixLib/Fluid/Geothermal/Borefields/Data/package.order -AixLib/Fluid/Geothermal/Borefields/Examples/Borefields.mo -AixLib/Fluid/Geothermal/Borefields/Examples/RectangularBorefield.mo -AixLib/Fluid/Geothermal/Borefields/Examples/package.mo -AixLib/Fluid/Geothermal/Borefields/Examples/package.order -AixLib/Fluid/Geothermal/Borefields/OneUTube.mo -AixLib/Fluid/Geothermal/Borefields/TwoUTubes.mo -AixLib/Fluid/Geothermal/Borefields/Types.mo -AixLib/Fluid/Geothermal/Borefields/UsersGuide.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/ConstantHeatInjection_100Boreholes_Borefield.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/ConstantHeatInjection_100Boreholes_Configuration.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/ConstantHeatInjection_100Boreholes_Filling.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/ConstantHeatInjection_100Boreholes_Soil.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/SandBox_Borefield.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/SandBox_Configuration.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/SandBox_Filling.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/SandBox_Soil.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/package.mo -AixLib/Fluid/Geothermal/Borefields/Validation/BaseClasses/package.order -AixLib/Fluid/Geothermal/Borefields/Validation/ConstantHeatInjection_100Boreholes.mo -AixLib/Fluid/Geothermal/Borefields/Validation/Sandbox.mo -AixLib/Fluid/Geothermal/Borefields/Validation/package.mo -AixLib/Fluid/Geothermal/Borefields/Validation/package.order -AixLib/Fluid/Geothermal/Borefields/package.mo -AixLib/Fluid/Geothermal/Borefields/package.order -AixLib/Fluid/Geothermal/package.mo -AixLib/Fluid/Geothermal/package.order -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Convector.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/DerivativesCubicSpline.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/Convector.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/DerivateCubicSpline.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/ModificationFactor.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/package.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/package.order -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/ModificationFactor.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/package.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/BaseClasses/package.order -AixLib/Fluid/HeatExchangers/ActiveBeams/Cooling.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/CoolingAndHeating.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/BaseClasses/AirFlow.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/BaseClasses/TemperatureDifference.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/BaseClasses/WaterFlow.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/BaseClasses/package.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/BaseClasses/package.order -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/Generic.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/Trox.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/package.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Data/package.order -AixLib/Fluid/HeatExchangers/ActiveBeams/Examples/CoolingAndHeating.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Examples/CoolingOnly.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Examples/HeatingOnly.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Examples/package.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Examples/package.order -AixLib/Fluid/HeatExchangers/ActiveBeams/UsersGuide.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Validation/NumberOfBeams.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Validation/NumberOfBeamsDynamics.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Validation/package.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/Validation/package.order -AixLib/Fluid/HeatExchangers/ActiveBeams/package.mo -AixLib/Fluid/HeatExchangers/ActiveBeams/package.order -AixLib/Fluid/HeatExchangers/BaseClasses/Examples/HACoilInside.mo -AixLib/Fluid/HeatExchangers/BaseClasses/Examples/HADryCoil.mo -AixLib/Fluid/HeatExchangers/BaseClasses/Examples/HANaturalCylinder.mo -AixLib/Fluid/HeatExchangers/BaseClasses/Examples/package.mo -AixLib/Fluid/HeatExchangers/BaseClasses/Examples/package.order -AixLib/Fluid/HeatExchangers/BaseClasses/HACoilInside.mo -AixLib/Fluid/HeatExchangers/BaseClasses/HADryCoil.mo -AixLib/Fluid/HeatExchangers/BaseClasses/HANaturalCylinder.mo -AixLib/Fluid/HeatExchangers/BaseClasses/PartialEffectiveness.mo -AixLib/Fluid/HeatExchangers/BaseClasses/PartialEffectivenessNTU.mo -AixLib/Fluid/HeatExchangers/BaseClasses/PartialPrescribedOutlet.mo -AixLib/Fluid/HeatExchangers/BaseClasses/WetCoilDryRegime.mo -AixLib/Fluid/HeatExchangers/BaseClasses/WetCoilDryWetRegime.mo -AixLib/Fluid/HeatExchangers/BaseClasses/WetCoilUARated.mo -AixLib/Fluid/HeatExchangers/BaseClasses/WetCoilWetRegime.mo -AixLib/Fluid/HeatExchangers/BaseClasses/determineWaterIndex.mo -AixLib/Fluid/HeatExchangers/BaseClasses/dynamicViscosityWater.mo -AixLib/Fluid/HeatExchangers/BaseClasses/epsilon_C.mo -AixLib/Fluid/HeatExchangers/BaseClasses/epsilon_ntuZ.mo -AixLib/Fluid/HeatExchangers/BaseClasses/isobaricExpansionCoefficientWater.mo -AixLib/Fluid/HeatExchangers/BaseClasses/lmtd.mo -AixLib/Fluid/HeatExchangers/BaseClasses/ntu_epsilonZ.mo -AixLib/Fluid/HeatExchangers/BaseClasses/package.mo -AixLib/Fluid/HeatExchangers/BaseClasses/package.order -AixLib/Fluid/HeatExchangers/BaseClasses/prandtlNumberWater.mo -AixLib/Fluid/HeatExchangers/ConstantEffectiveness.mo -AixLib/Fluid/HeatExchangers/DryCoilEffectivenessNTU.mo -AixLib/Fluid/HeatExchangers/EvaporatorCondenser.mo -AixLib/Fluid/HeatExchangers/Examples/AirHeater_T.mo -AixLib/Fluid/HeatExchangers/Examples/AirHeater_u.mo -AixLib/Fluid/HeatExchangers/Examples/BaseClasses/EffectivenessNTUMassFlow.mo -AixLib/Fluid/HeatExchangers/Examples/BaseClasses/Heater.mo -AixLib/Fluid/HeatExchangers/Examples/BaseClasses/package.mo -AixLib/Fluid/HeatExchangers/Examples/BaseClasses/package.order -AixLib/Fluid/HeatExchangers/Examples/DryCoilEffectivenessNTUMassFlow.mo -AixLib/Fluid/HeatExchangers/Examples/DryCoilEffectivenessNTUPControl.mo -AixLib/Fluid/HeatExchangers/Examples/WaterCooler_T.mo -AixLib/Fluid/HeatExchangers/Examples/WaterHeater_T.mo -AixLib/Fluid/HeatExchangers/Examples/WaterHeater_u.mo -AixLib/Fluid/HeatExchangers/Examples/WetCoilEffectivenessNTUMassFlow.mo -AixLib/Fluid/HeatExchangers/Examples/package.mo -AixLib/Fluid/HeatExchangers/Examples/package.order -AixLib/Fluid/HeatExchangers/HeaterCooler_u.mo -AixLib/Fluid/HeatExchangers/Heater_T.mo -AixLib/Fluid/HeatExchangers/PrescribedOutlet.mo -AixLib/Fluid/HeatExchangers/Radiators/Examples/RadiatorEN442_2.mo -AixLib/Fluid/HeatExchangers/Radiators/Examples/package.mo -AixLib/Fluid/HeatExchangers/Radiators/Examples/package.order -AixLib/Fluid/HeatExchangers/Radiators/RadiatorEN442_2.mo -AixLib/Fluid/HeatExchangers/Radiators/package.mo -AixLib/Fluid/HeatExchangers/Radiators/package.order -AixLib/Fluid/HeatExchangers/SensibleCooler_T.mo -AixLib/Fluid/HeatExchangers/Validation/ConstantEffectiveness.mo -AixLib/Fluid/HeatExchangers/Validation/DryCoilEffectivenessNTU.mo -AixLib/Fluid/HeatExchangers/Validation/EvaporatorCondenser.mo -AixLib/Fluid/HeatExchangers/Validation/HeaterCooler_u.mo -AixLib/Fluid/HeatExchangers/Validation/PrescribedOutlet.mo -AixLib/Fluid/HeatExchangers/Validation/PrescribedOutlet_dynamic.mo -AixLib/Fluid/HeatExchangers/Validation/WetCoilEffectivenessNTU.mo -AixLib/Fluid/HeatExchangers/Validation/package.mo -AixLib/Fluid/HeatExchangers/Validation/package.order -AixLib/Fluid/HeatExchangers/WetCoilEffectivenessNTU.mo -AixLib/Fluid/HeatExchangers/package.mo -AixLib/Fluid/HeatExchangers/package.order -AixLib/Fluid/HeatPumps/BaseClasses/PartialWaterToWater.mo -AixLib/Fluid/HeatPumps/BaseClasses/package.mo -AixLib/Fluid/HeatPumps/BaseClasses/package.order -AixLib/Fluid/HeatPumps/Calibration/BaseClasses/PartialWaterToWater.mo -AixLib/Fluid/HeatPumps/Calibration/BaseClasses/package.mo -AixLib/Fluid/HeatPumps/Calibration/BaseClasses/package.order -AixLib/Fluid/HeatPumps/Calibration/ScrollWaterToWater.mo -AixLib/Fluid/HeatPumps/Calibration/package.mo -AixLib/Fluid/HeatPumps/Calibration/package.order -AixLib/Fluid/HeatPumps/Carnot_TCon.mo -AixLib/Fluid/HeatPumps/Carnot_y.mo -AixLib/Fluid/HeatPumps/Compressors/BaseClasses/PartialCompressor.mo -AixLib/Fluid/HeatPumps/Compressors/BaseClasses/TemperatureProtection.mo -AixLib/Fluid/HeatPumps/Compressors/BaseClasses/Validation/TemperatureProtection.mo -AixLib/Fluid/HeatPumps/Compressors/BaseClasses/Validation/package.mo -AixLib/Fluid/HeatPumps/Compressors/BaseClasses/Validation/package.order -AixLib/Fluid/HeatPumps/Compressors/BaseClasses/package.mo -AixLib/Fluid/HeatPumps/Compressors/BaseClasses/package.order -AixLib/Fluid/HeatPumps/Compressors/ReciprocatingCompressor.mo -AixLib/Fluid/HeatPumps/Compressors/ScrollCompressor.mo -AixLib/Fluid/HeatPumps/Compressors/Validation/ReciprocatingCompressor.mo -AixLib/Fluid/HeatPumps/Compressors/Validation/ReciprocatingCompressor_ZeroInput.mo -AixLib/Fluid/HeatPumps/Compressors/Validation/ScrollCompressor.mo -AixLib/Fluid/HeatPumps/Compressors/Validation/ScrollCompressor_ZeroInput.mo -AixLib/Fluid/HeatPumps/Compressors/Validation/package.mo -AixLib/Fluid/HeatPumps/Compressors/Validation/package.order -AixLib/Fluid/HeatPumps/Compressors/package.mo -AixLib/Fluid/HeatPumps/Compressors/package.order -AixLib/Fluid/HeatPumps/Data/BaseClasses/HeatPumps.mo -AixLib/Fluid/HeatPumps/Data/BaseClasses/package.mo -AixLib/Fluid/HeatPumps/Data/BaseClasses/package.order -AixLib/Fluid/HeatPumps/Data/ReciprocatingWaterToWater/Generic.mo -AixLib/Fluid/HeatPumps/Data/ReciprocatingWaterToWater/package.mo -AixLib/Fluid/HeatPumps/Data/ReciprocatingWaterToWater/package.order -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Generic.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW122_38kW_4_29COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW180_52kW_4_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW210_70kW_4_40COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW240_93kW_4_40COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW360_105kW_4_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW420_140kW_4_40COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW036_12kW_4_90COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW060_21kW_4_60COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW120_42kW_4_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW170_48kW_4_30COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW340_98kW_4_40COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA036_13kW_4_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA048_16kW_4_60COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA060_19kW_4_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA072_24kW_4_30COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA120_37kW_4_40COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA150_49kW_4_70COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA180_63kW_4_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA240_79kW_4_40COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA300_93kW_4_60COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA360_116kW_4_60COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA420_137kW_4_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW060_21kW_4_30COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW120_40kW_3_90COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW240_76kW_4_10COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Viessmann_BW301A21_28kW_5_94COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Viessmann_BW301A29_37kW_6_0COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Viessmann_BW301A45_58kW_5_50COP_R410A.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/package.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/package.order -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/package.mo -AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/package.order -AixLib/Fluid/HeatPumps/Data/package.mo -AixLib/Fluid/HeatPumps/Data/package.order -AixLib/Fluid/HeatPumps/Examples/Carnot_TCon.mo -AixLib/Fluid/HeatPumps/Examples/Carnot_y.mo -AixLib/Fluid/HeatPumps/Examples/ScrollWaterToWater_OneRoomRadiator.mo -AixLib/Fluid/HeatPumps/Examples/package.mo -AixLib/Fluid/HeatPumps/Examples/package.order -AixLib/Fluid/HeatPumps/ReciprocatingWaterToWater.mo -AixLib/Fluid/HeatPumps/ScrollWaterToWater.mo -AixLib/Fluid/HeatPumps/Validation/Carnot_TCon_LimitedCapacity.mo -AixLib/Fluid/HeatPumps/Validation/Carnot_TCon_LowTemperature.mo -AixLib/Fluid/HeatPumps/Validation/Carnot_TCon_etaPL.mo -AixLib/Fluid/HeatPumps/Validation/Carnot_TCon_reverseFlow.mo -AixLib/Fluid/HeatPumps/Validation/Carnot_y_etaCar.mo -AixLib/Fluid/HeatPumps/Validation/Carnot_y_etaPL.mo -AixLib/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_Dynamic.mo -AixLib/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_ScalingFactor.mo -AixLib/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_Static.mo -AixLib/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_VariableSpeed.mo -AixLib/Fluid/HeatPumps/Validation/ScrollWaterToWater_Dynamic.mo -AixLib/Fluid/HeatPumps/Validation/ScrollWaterToWater_ScalingFactor.mo -AixLib/Fluid/HeatPumps/Validation/ScrollWaterToWater_Static.mo -AixLib/Fluid/HeatPumps/Validation/ScrollWaterToWater_TemperatureProtection.mo -AixLib/Fluid/HeatPumps/Validation/ScrollWaterToWater_VariableSpeed.mo -AixLib/Fluid/HeatPumps/Validation/package.mo -AixLib/Fluid/HeatPumps/Validation/package.order -AixLib/Fluid/HeatPumps/package.mo -AixLib/Fluid/HeatPumps/package.order -AixLib/Fluid/Humidifiers/Examples/Humidifier_u.mo -AixLib/Fluid/Humidifiers/Examples/package.mo -AixLib/Fluid/Humidifiers/Examples/package.order -AixLib/Fluid/Humidifiers/Humidifier_u.mo -AixLib/Fluid/Humidifiers/SprayAirWasher_X.mo -AixLib/Fluid/Humidifiers/SteamHumidifier_X.mo -AixLib/Fluid/Humidifiers/Validation/SprayAirWasher_X.mo -AixLib/Fluid/Humidifiers/Validation/SprayAirWasher_X_dynamic.mo -AixLib/Fluid/Humidifiers/Validation/SteamHumidifier_X.mo -AixLib/Fluid/Humidifiers/Validation/SteamHumidifier_X_dynamic.mo -AixLib/Fluid/Humidifiers/Validation/package.mo -AixLib/Fluid/Humidifiers/Validation/package.order -AixLib/Fluid/Humidifiers/package.mo -AixLib/Fluid/Humidifiers/package.order -AixLib/Fluid/Interfaces/ConservationEquation.mo -AixLib/Fluid/Interfaces/EightPort.mo -AixLib/Fluid/Interfaces/EightPortFlowResistanceParameters.mo -AixLib/Fluid/Interfaces/EightPortHeatMassExchanger.mo -AixLib/Fluid/Interfaces/Examples/BaseClasses/PrescribedOutletState.mo -AixLib/Fluid/Interfaces/Examples/BaseClasses/package.mo -AixLib/Fluid/Interfaces/Examples/BaseClasses/package.order -AixLib/Fluid/Interfaces/Examples/ConservationEquation.mo -AixLib/Fluid/Interfaces/Examples/EightPortHeatMassExchanger.mo -AixLib/Fluid/Interfaces/Examples/FourPortHeatMassExchanger.mo -AixLib/Fluid/Interfaces/Examples/HeaterCooler_u.mo -AixLib/Fluid/Interfaces/Examples/Humidifier_u.mo -AixLib/Fluid/Interfaces/Examples/PrescribedOutlet.mo -AixLib/Fluid/Interfaces/Examples/PrescribedOutlet_TSetOnly.mo -AixLib/Fluid/Interfaces/Examples/PrescribedOutlet_Water.mo -AixLib/Fluid/Interfaces/Examples/PrescribedOutlet_X_wSetOnly.mo -AixLib/Fluid/Interfaces/Examples/ReverseFlowHumidifier.mo -AixLib/Fluid/Interfaces/Examples/ReverseFlowMassExchanger.mo -AixLib/Fluid/Interfaces/Examples/StaticTwoPortConservationEquation.mo -AixLib/Fluid/Interfaces/Examples/package.mo -AixLib/Fluid/Interfaces/Examples/package.order -AixLib/Fluid/Interfaces/FourPortFlowResistanceParameters.mo -AixLib/Fluid/Interfaces/FourPortHeatMassExchanger.mo -AixLib/Fluid/Interfaces/LumpedVolumeDeclarations.mo -AixLib/Fluid/Interfaces/PartialEightPortInterface.mo -AixLib/Fluid/Interfaces/PartialFourPort.mo -AixLib/Fluid/Interfaces/PartialFourPortInterface.mo -AixLib/Fluid/Interfaces/PartialFourPortParallel.mo -AixLib/Fluid/Interfaces/PartialTwoPort.mo -AixLib/Fluid/Interfaces/PartialTwoPortInterface.mo -AixLib/Fluid/Interfaces/PartialTwoPortTransport.mo -AixLib/Fluid/Interfaces/PartialTwoPortVector.mo -AixLib/Fluid/Interfaces/PrescribedOutlet.mo -AixLib/Fluid/Interfaces/StaticFourPortHeatMassExchanger.mo -AixLib/Fluid/Interfaces/StaticTwoPortConservationEquation.mo -AixLib/Fluid/Interfaces/StaticTwoPortHeatMassExchanger.mo -AixLib/Fluid/Interfaces/TwoPortFlowResistanceParameters.mo -AixLib/Fluid/Interfaces/TwoPortHeatMassExchanger.mo -AixLib/Fluid/Interfaces/package.mo -AixLib/Fluid/Interfaces/package.order -AixLib/Fluid/MassExchangers/ConstantEffectiveness.mo -AixLib/Fluid/MassExchangers/Examples/ConstantEffectiveness.mo -AixLib/Fluid/MassExchangers/Examples/package.mo -AixLib/Fluid/MassExchangers/Examples/package.order -AixLib/Fluid/MassExchangers/Validation/ConstantEffectivenessZeroFlow.mo -AixLib/Fluid/MassExchangers/Validation/ConstantEffectivenessZeroFlowBothStreams.mo -AixLib/Fluid/MassExchangers/Validation/package.mo -AixLib/Fluid/MassExchangers/Validation/package.order -AixLib/Fluid/MassExchangers/package.mo -AixLib/Fluid/MassExchangers/package.order -AixLib/Fluid/MixingVolumes/BaseClasses/MixingVolumeHeatMoisturePort.mo -AixLib/Fluid/MixingVolumes/BaseClasses/MixingVolumeHeatPort.mo -AixLib/Fluid/MixingVolumes/BaseClasses/PartialMixingVolume.mo -AixLib/Fluid/MixingVolumes/BaseClasses/Validation/MixingVolumeHeatMoisturePort.mo -AixLib/Fluid/MixingVolumes/BaseClasses/Validation/MixingVolumeHeatPortAir.mo -AixLib/Fluid/MixingVolumes/BaseClasses/Validation/MixingVolumeHeatPortWater.mo -AixLib/Fluid/MixingVolumes/BaseClasses/Validation/package.mo -AixLib/Fluid/MixingVolumes/BaseClasses/Validation/package.order -AixLib/Fluid/MixingVolumes/BaseClasses/package.mo -AixLib/Fluid/MixingVolumes/BaseClasses/package.order -AixLib/Fluid/MixingVolumes/Examples/MixingVolumeHeatConduction.mo -AixLib/Fluid/MixingVolumes/Examples/MixingVolumeMoistAir.mo -AixLib/Fluid/MixingVolumes/Examples/MixingVolumePrescribedHeatFlowRate.mo -AixLib/Fluid/MixingVolumes/Examples/package.mo -AixLib/Fluid/MixingVolumes/Examples/package.order -AixLib/Fluid/MixingVolumes/MixingVolume.mo -AixLib/Fluid/MixingVolumes/MixingVolumeMoistAir.mo -AixLib/Fluid/MixingVolumes/Validation/BaseClasses/MixingVolumeReverseFlow.mo -AixLib/Fluid/MixingVolumes/Validation/BaseClasses/MoistureMixingConservation.mo -AixLib/Fluid/MixingVolumes/Validation/BaseClasses/TraceSubstanceConservation.mo -AixLib/Fluid/MixingVolumes/Validation/BaseClasses/package.mo -AixLib/Fluid/MixingVolumes/Validation/BaseClasses/package.order -AixLib/Fluid/MixingVolumes/Validation/CoupledVolumesAir.mo -AixLib/Fluid/MixingVolumes/Validation/CoupledVolumesGlycol47.mo -AixLib/Fluid/MixingVolumes/Validation/CoupledVolumesSpecializedAirPerfectGas.mo -AixLib/Fluid/MixingVolumes/Validation/CoupledVolumesSpecializedWaterConstantProperties_pT.mo -AixLib/Fluid/MixingVolumes/Validation/CoupledVolumesSpecializedWaterTemperatureDependentDensity.mo -AixLib/Fluid/MixingVolumes/Validation/CoupledVolumesWater.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolume.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeAdiabaticCooling.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeHeatReverseFlow.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeHeatReverseFlowPrescribedHeatFlowRate.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeInitialization.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeMFactor.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeMassFlow.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeMoistureReverseFlow.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeMoistureReverseFlowPrescribedHeatFlowRate.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeSteadyStateMass.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeTraceSubstance.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeTraceSubstanceReverseFlow.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeTraceSubstanceReverseFlowPrescribedHeatFlowRate.mo -AixLib/Fluid/MixingVolumes/Validation/MixingVolumeZeroFlow.mo -AixLib/Fluid/MixingVolumes/Validation/MoistureMixingConservationDynamicBalance.mo -AixLib/Fluid/MixingVolumes/Validation/MoistureMixingConservationSteadyState.mo -AixLib/Fluid/MixingVolumes/Validation/TraceSubstanceConservationDynamicBalance.mo -AixLib/Fluid/MixingVolumes/Validation/TraceSubstanceConservationSteadyState.mo -AixLib/Fluid/MixingVolumes/Validation/package.mo -AixLib/Fluid/MixingVolumes/Validation/package.order -AixLib/Fluid/MixingVolumes/package.mo -AixLib/Fluid/MixingVolumes/package.order -AixLib/Fluid/Movers/BaseClasses/Characteristics/efficiency.mo -AixLib/Fluid/Movers/BaseClasses/Characteristics/efficiencyParameters.mo -AixLib/Fluid/Movers/BaseClasses/Characteristics/flowParameters.mo -AixLib/Fluid/Movers/BaseClasses/Characteristics/flowParametersInternal.mo -AixLib/Fluid/Movers/BaseClasses/Characteristics/package.mo -AixLib/Fluid/Movers/BaseClasses/Characteristics/package.order -AixLib/Fluid/Movers/BaseClasses/Characteristics/power.mo -AixLib/Fluid/Movers/BaseClasses/Characteristics/powerParameters.mo -AixLib/Fluid/Movers/BaseClasses/Characteristics/pressure.mo -AixLib/Fluid/Movers/BaseClasses/FlowMachineInterface.mo -AixLib/Fluid/Movers/BaseClasses/IdealSource.mo -AixLib/Fluid/Movers/BaseClasses/PartialFlowMachine.mo -AixLib/Fluid/Movers/BaseClasses/PowerInterface.mo -AixLib/Fluid/Movers/BaseClasses/Types.mo -AixLib/Fluid/Movers/BaseClasses/Validation/FlowMachineInterface.mo -AixLib/Fluid/Movers/BaseClasses/Validation/PowerInterface.mo -AixLib/Fluid/Movers/BaseClasses/Validation/package.mo -AixLib/Fluid/Movers/BaseClasses/Validation/package.order -AixLib/Fluid/Movers/BaseClasses/package.mo -AixLib/Fluid/Movers/BaseClasses/package.order -AixLib/Fluid/Movers/Data/Generic.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/CronolineIL80slash220dash4slash4.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos25slash1to4.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos25slash1to6.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos25slash1to8.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos30slash1to4.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos30slash1to8.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos32slash1to12.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos40slash1to12.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos40slash1to8.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos50slash1to12.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/Stratos80slash1to12.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/TopS25slash10.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/TopS30slash10.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/TopS30slash5.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/TopS40slash10.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/TopS40slash7.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/VeroLine50slash150dash4slash2.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/VeroLine80slash115dash2comma2slash2.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/package.mo -AixLib/Fluid/Movers/Data/Pumps/Wilo/package.order -AixLib/Fluid/Movers/Data/Pumps/package.mo -AixLib/Fluid/Movers/Data/Pumps/package.order -AixLib/Fluid/Movers/Data/package.mo -AixLib/Fluid/Movers/Data/package.order -AixLib/Fluid/Movers/Examples/ClosedLoop_y.mo -AixLib/Fluid/Movers/Examples/MoverContinuous.mo -AixLib/Fluid/Movers/Examples/MoverParameter.mo -AixLib/Fluid/Movers/Examples/MoverStages.mo -AixLib/Fluid/Movers/Examples/PumpsParallel.mo -AixLib/Fluid/Movers/Examples/PumpsSeries.mo -AixLib/Fluid/Movers/Examples/SpeedControlled_y_pumpCurves.mo -AixLib/Fluid/Movers/Examples/package.mo -AixLib/Fluid/Movers/Examples/package.order -AixLib/Fluid/Movers/FlowControlled_dp.mo -AixLib/Fluid/Movers/FlowControlled_m_flow.mo -AixLib/Fluid/Movers/SpeedControlled_Nrpm.mo -AixLib/Fluid/Movers/SpeedControlled_y.mo -AixLib/Fluid/Movers/UsersGuide.mo -AixLib/Fluid/Movers/Validation/BaseClasses/ControlledFlowMachine.mo -AixLib/Fluid/Movers/Validation/BaseClasses/FlowMachine_ZeroFlow.mo -AixLib/Fluid/Movers/Validation/BaseClasses/package.mo -AixLib/Fluid/Movers/Validation/BaseClasses/package.order -AixLib/Fluid/Movers/Validation/ControlledFlowMachine.mo -AixLib/Fluid/Movers/Validation/ControlledFlowMachineDynamic.mo -AixLib/Fluid/Movers/Validation/FlowControlled_dp.mo -AixLib/Fluid/Movers/Validation/FlowControlled_dpSystem.mo -AixLib/Fluid/Movers/Validation/FlowControlled_m_flow.mo -AixLib/Fluid/Movers/Validation/PowerExact.mo -AixLib/Fluid/Movers/Validation/PowerSimplified.mo -AixLib/Fluid/Movers/Validation/PumpCurveConstruction.mo -AixLib/Fluid/Movers/Validation/PumpCurveDerivatives.mo -AixLib/Fluid/Movers/Validation/Pump_Nrpm_stratos.mo -AixLib/Fluid/Movers/Validation/Pump_stratos.mo -AixLib/Fluid/Movers/Validation/SpeedControlled_Nrpm.mo -AixLib/Fluid/Movers/Validation/SpeedControlled_y.mo -AixLib/Fluid/Movers/Validation/SpeedControlled_y_linear.mo -AixLib/Fluid/Movers/Validation/package.mo -AixLib/Fluid/Movers/Validation/package.order -AixLib/Fluid/Movers/package.mo -AixLib/Fluid/Movers/package.order -AixLib/Fluid/Sensors/BaseClasses/PartialAbsoluteSensor.mo -AixLib/Fluid/Sensors/BaseClasses/PartialDynamicFlowSensor.mo -AixLib/Fluid/Sensors/BaseClasses/PartialFlowSensor.mo -AixLib/Fluid/Sensors/BaseClasses/package.mo -AixLib/Fluid/Sensors/BaseClasses/package.order -AixLib/Fluid/Sensors/Conversions/Examples/To_VolumeFraction.mo -AixLib/Fluid/Sensors/Conversions/Examples/package.mo -AixLib/Fluid/Sensors/Conversions/Examples/package.order -AixLib/Fluid/Sensors/Conversions/To_VolumeFraction.mo -AixLib/Fluid/Sensors/Conversions/package.mo -AixLib/Fluid/Sensors/Conversions/package.order -AixLib/Fluid/Sensors/Density.mo -AixLib/Fluid/Sensors/DensityTwoPort.mo -AixLib/Fluid/Sensors/EnthalpyFlowRate.mo -AixLib/Fluid/Sensors/EntropyFlowRate.mo -AixLib/Fluid/Sensors/Examples/Density.mo -AixLib/Fluid/Sensors/Examples/EnthalpyFlowRate.mo -AixLib/Fluid/Sensors/Examples/EntropyFlowRate.mo -AixLib/Fluid/Sensors/Examples/MassFraction.mo -AixLib/Fluid/Sensors/Examples/MoistAirEnthalpyFlowRate.mo -AixLib/Fluid/Sensors/Examples/PPM.mo -AixLib/Fluid/Sensors/Examples/Pressure.mo -AixLib/Fluid/Sensors/Examples/RelativeHumidity.mo -AixLib/Fluid/Sensors/Examples/SpecificEnthalpy.mo -AixLib/Fluid/Sensors/Examples/SpecificEntropy.mo -AixLib/Fluid/Sensors/Examples/TemperatureDryBulb.mo -AixLib/Fluid/Sensors/Examples/TemperatureWetBulb.mo -AixLib/Fluid/Sensors/Examples/TraceSubstances.mo -AixLib/Fluid/Sensors/Examples/Velocity.mo -AixLib/Fluid/Sensors/Examples/VolumeFlowRate.mo -AixLib/Fluid/Sensors/Examples/package.mo -AixLib/Fluid/Sensors/Examples/package.order -AixLib/Fluid/Sensors/LatentEnthalpyFlowRate.mo -AixLib/Fluid/Sensors/MassFlowRate.mo -AixLib/Fluid/Sensors/MassFraction.mo -AixLib/Fluid/Sensors/MassFractionTwoPort.mo -AixLib/Fluid/Sensors/PPM.mo -AixLib/Fluid/Sensors/PPMTwoPort.mo -AixLib/Fluid/Sensors/Pressure.mo -AixLib/Fluid/Sensors/RelativeHumidity.mo -AixLib/Fluid/Sensors/RelativeHumidityTwoPort.mo -AixLib/Fluid/Sensors/RelativePressure.mo -AixLib/Fluid/Sensors/RelativeTemperature.mo -AixLib/Fluid/Sensors/SensibleEnthalpyFlowRate.mo -AixLib/Fluid/Sensors/SpecificEnthalpy.mo -AixLib/Fluid/Sensors/SpecificEnthalpyTwoPort.mo -AixLib/Fluid/Sensors/SpecificEntropy.mo -AixLib/Fluid/Sensors/SpecificEntropyTwoPort.mo -AixLib/Fluid/Sensors/Temperature.mo -AixLib/Fluid/Sensors/TemperatureTwoPort.mo -AixLib/Fluid/Sensors/TemperatureWetBulbTwoPort.mo -AixLib/Fluid/Sensors/TraceSubstances.mo -AixLib/Fluid/Sensors/TraceSubstancesTwoPort.mo -AixLib/Fluid/Sensors/UsersGuide.mo -AixLib/Fluid/Sensors/Velocity.mo -AixLib/Fluid/Sensors/VolumeFlowRate.mo -AixLib/Fluid/Sensors/package.mo -AixLib/Fluid/Sensors/package.order -AixLib/Fluid/Sources/BaseClasses/Outside.mo -AixLib/Fluid/Sources/BaseClasses/PartialPropertySource.mo -AixLib/Fluid/Sources/BaseClasses/PartialSource.mo -AixLib/Fluid/Sources/BaseClasses/PartialSource_Xi_C.mo -AixLib/Fluid/Sources/BaseClasses/package.mo -AixLib/Fluid/Sources/BaseClasses/package.order -AixLib/Fluid/Sources/Boundary_pT.mo -AixLib/Fluid/Sources/Boundary_ph.mo -AixLib/Fluid/Sources/Examples/MassFlowSource_WeatherData.mo -AixLib/Fluid/Sources/Examples/Outside.mo -AixLib/Fluid/Sources/Examples/Outside_CpData.mo -AixLib/Fluid/Sources/Examples/Outside_CpData_Angles.mo -AixLib/Fluid/Sources/Examples/Outside_CpData_Specification.mo -AixLib/Fluid/Sources/Examples/Outside_CpLowRise.mo -AixLib/Fluid/Sources/Examples/PropertySource_T.mo -AixLib/Fluid/Sources/Examples/PropertySource_h.mo -AixLib/Fluid/Sources/Examples/TraceSubstancesFlowSource.mo -AixLib/Fluid/Sources/Examples/package.mo -AixLib/Fluid/Sources/Examples/package.order -AixLib/Fluid/Sources/MassFlowSource_T.mo -AixLib/Fluid/Sources/MassFlowSource_WeatherData.mo -AixLib/Fluid/Sources/MassFlowSource_h.mo -AixLib/Fluid/Sources/Outside.mo -AixLib/Fluid/Sources/Outside_CpData.mo -AixLib/Fluid/Sources/Outside_CpLowRise.mo -AixLib/Fluid/Sources/PropertySource_T.mo -AixLib/Fluid/Sources/PropertySource_h.mo -AixLib/Fluid/Sources/TraceSubstancesFlowSource.mo -AixLib/Fluid/Sources/Validation/BaseClasses/BoundarySystem.mo -AixLib/Fluid/Sources/Validation/BaseClasses/BoundarySystemWithX_in.mo -AixLib/Fluid/Sources/Validation/BaseClasses/BoundarySystemWithXi_in.mo -AixLib/Fluid/Sources/Validation/BaseClasses/package.mo -AixLib/Fluid/Sources/Validation/BaseClasses/package.order -AixLib/Fluid/Sources/Validation/Boundary.mo -AixLib/Fluid/Sources/Validation/BoundaryWithX_in.mo -AixLib/Fluid/Sources/Validation/BoundaryWithXi_in.mo -AixLib/Fluid/Sources/Validation/Outside_CpData_Directions.mo -AixLib/Fluid/Sources/Validation/package.mo -AixLib/Fluid/Sources/Validation/package.order -AixLib/Fluid/Sources/package.mo -AixLib/Fluid/Sources/package.order -AixLib/Fluid/Storage/BaseClasses/Buoyancy.mo -AixLib/Fluid/Storage/BaseClasses/Examples/IndirectTankHeatExchanger.mo -AixLib/Fluid/Storage/BaseClasses/Examples/package.mo -AixLib/Fluid/Storage/BaseClasses/Examples/package.order -AixLib/Fluid/Storage/BaseClasses/IndirectTankHeatExchanger.mo -AixLib/Fluid/Storage/BaseClasses/PartialStratified.mo -AixLib/Fluid/Storage/BaseClasses/ThirdOrderStratifier.mo -AixLib/Fluid/Storage/BaseClasses/package.mo -AixLib/Fluid/Storage/BaseClasses/package.order -AixLib/Fluid/Storage/Examples/ExpansionVessel.mo -AixLib/Fluid/Storage/Examples/Stratified.mo -AixLib/Fluid/Storage/Examples/StratifiedEnhancedInternalHex.mo -AixLib/Fluid/Storage/Examples/StratifiedUnloadAtMinimumTemperature.mo -AixLib/Fluid/Storage/Examples/package.mo -AixLib/Fluid/Storage/Examples/package.order -AixLib/Fluid/Storage/ExpansionVessel.mo -AixLib/Fluid/Storage/Stratified.mo -AixLib/Fluid/Storage/StratifiedEnhanced.mo -AixLib/Fluid/Storage/StratifiedEnhancedInternalHex.mo -AixLib/Fluid/Storage/UsersGuide.mo -AixLib/Fluid/Storage/Validation/HeatExchangerDynamics.mo -AixLib/Fluid/Storage/Validation/HeatExchangerLocation.mo -AixLib/Fluid/Storage/Validation/StratifiedLoadingUnloading.mo -AixLib/Fluid/Storage/Validation/StratifiedNonUniformInitial.mo -AixLib/Fluid/Storage/Validation/package.mo -AixLib/Fluid/Storage/Validation/package.order -AixLib/Fluid/Storage/package.mo -AixLib/Fluid/Storage/package.order -AixLib/Fluid/Types.mo -AixLib/Fluid/package.order -AixLib/Media/Air.mo -AixLib/Media/Antifreeze/BaseClasses/PropertyCoefficients.mo -AixLib/Media/Antifreeze/BaseClasses/package.mo -AixLib/Media/Antifreeze/BaseClasses/package.order -AixLib/Media/Antifreeze/EthyleneGlycolWater.mo -AixLib/Media/Antifreeze/PropyleneGlycolWater.mo -AixLib/Media/Antifreeze/Validation/BaseClasses/EthyleneGlycolWater.mo -AixLib/Media/Antifreeze/Validation/BaseClasses/FluidProperties.mo -AixLib/Media/Antifreeze/Validation/BaseClasses/PropyleneGlycolWater.mo -AixLib/Media/Antifreeze/Validation/BaseClasses/package.mo -AixLib/Media/Antifreeze/Validation/BaseClasses/package.order -AixLib/Media/Antifreeze/Validation/EthyleneGlycolWater.mo -AixLib/Media/Antifreeze/Validation/PropyleneGlycolWater.mo -AixLib/Media/Antifreeze/Validation/package.mo -AixLib/Media/Antifreeze/Validation/package.order -AixLib/Media/Antifreeze/package.mo -AixLib/Media/Antifreeze/package.order -AixLib/Media/Examples/AirDerivativeCheck.mo -AixLib/Media/Examples/AirProperties.mo -AixLib/Media/Examples/AirTemperatureEnthalpyInversion.mo -AixLib/Media/Examples/BaseClasses/FluidProperties.mo -AixLib/Media/Examples/BaseClasses/PartialProperties.mo -AixLib/Media/Examples/BaseClasses/TestTemperatureEnthalpyInversion.mo -AixLib/Media/Examples/BaseClasses/package.mo -AixLib/Media/Examples/BaseClasses/package.order -AixLib/Media/Examples/PropyleneGlycolWaterDerivativeCheck.mo -AixLib/Media/Examples/PropyleneGlycolWaterProperties.mo -AixLib/Media/Examples/PropyleneGlycolWaterTemperatureEnthalpyInversion.mo -AixLib/Media/Examples/SteamDerivativeCheck.mo -AixLib/Media/Examples/SteamProperties.mo -AixLib/Media/Examples/SteamSaturationConsistencyCheck.mo -AixLib/Media/Examples/SteamTemperatureEnthalpyInversion.mo -AixLib/Media/Examples/WaterDerivativeCheck.mo -AixLib/Media/Examples/WaterProperties.mo -AixLib/Media/Examples/WaterTemperatureEnthalpyInversion.mo -AixLib/Media/Examples/package.mo -AixLib/Media/Examples/package.order -AixLib/Media/Refrigerants/R410A/dPressureVap_dSpecificVolume_Tv.mo -AixLib/Media/Refrigerants/R410A/dPressureVap_dTemperature_Tv.mo -AixLib/Media/Refrigerants/R410A/dSpecificVolumeVap_pT.mo -AixLib/Media/Refrigerants/R410A/enthalpySatLiq_T.mo -AixLib/Media/Refrigerants/R410A/enthalpySatVap_T.mo -AixLib/Media/Refrigerants/R410A/isentropicExponentVap_Tv.mo -AixLib/Media/Refrigerants/R410A/package.mo -AixLib/Media/Refrigerants/R410A/package.order -AixLib/Media/Refrigerants/R410A/pressureSatVap_T.mo -AixLib/Media/Refrigerants/R410A/pressureVap_Tv.mo -AixLib/Media/Refrigerants/R410A/specificIsobaricHeatCapacityVap_Tv.mo -AixLib/Media/Refrigerants/R410A/specificIsochoricHeatCapacityVap_Tv.mo -AixLib/Media/Refrigerants/R410A/specificVolumeVap_pT.mo -AixLib/Media/Refrigerants/Validation/R410A_dSpecificVolumeVap_pT.mo -AixLib/Media/Refrigerants/Validation/package.mo -AixLib/Media/Refrigerants/Validation/package.order -AixLib/Media/Refrigerants/package.mo -AixLib/Media/Refrigerants/package.order -AixLib/Media/Specialized/Air/Examples/PerfectGasDerivativeCheck.mo -AixLib/Media/Specialized/Air/Examples/PerfectGasTemperatureEnthalpyInversion.mo -AixLib/Media/Specialized/Air/Examples/package.mo -AixLib/Media/Specialized/Air/Examples/package.order -AixLib/Media/Specialized/Air/PerfectGas.mo -AixLib/Media/Specialized/Air/package.mo -AixLib/Media/Specialized/Air/package.order -AixLib/Media/Specialized/Water/ConstantProperties_pT/package.mo -AixLib/Media/Specialized/Water/ConstantProperties_pT/package.order -AixLib/Media/Specialized/Water/Examples/TemperatureDependentDensityDerivativeCheck.mo -AixLib/Media/Specialized/Water/Examples/TemperatureDependentDensityProperties.mo -AixLib/Media/Specialized/Water/Examples/TemperatureDependentDensityTemperatureEnthalpyInversion.mo -AixLib/Media/Specialized/Water/Examples/WaterProperties_pT.mo -AixLib/Media/Specialized/Water/Examples/package.mo -AixLib/Media/Specialized/Water/Examples/package.order -AixLib/Media/Specialized/Water/TemperatureDependentDensity.mo -AixLib/Media/Specialized/Water/package.mo -AixLib/Media/Specialized/Water/package.order -AixLib/Media/Specialized/package.mo -AixLib/Media/Specialized/package.order -AixLib/Media/Steam.mo -AixLib/Media/Water.mo -AixLib/Media/package.mo -AixLib/Media/package.order -AixLib/Resources/C-Sources/cryptographicsHash.c -AixLib/Resources/C-Sources/cryptographicsHash.h -AixLib/Resources/C-Sources/fileWriterFree.c -AixLib/Resources/C-Sources/fileWriterInit.c -AixLib/Resources/C-Sources/fileWriterStructure.c -AixLib/Resources/C-Sources/fileWriterStructure.h -AixLib/Resources/C-Sources/getTimeSpan.c -AixLib/Resources/C-Sources/getTimeSpan.h -AixLib/Resources/C-Sources/jsonWriterFree.c -AixLib/Resources/C-Sources/jsonWriterFree.h -AixLib/Resources/C-Sources/jsonWriterInit.c -AixLib/Resources/C-Sources/jsonWriterInit.h -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/421810.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/421810.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/700260.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/700260.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/722190.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/722190.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/855740.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/855740.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/README.md -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD100.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD100.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD200.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD200.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD300.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD300.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD400.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD400.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD500.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD500.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD600.epw -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WD600.mos -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WeatherDriversResultsSubmittal1.json -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WeatherDriversResultsSubmittal2.json -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WeatherDriversTestSpec_1.pdf -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/WeatherDriversTestSpec_2.pdf -AixLib/Resources/Data/BoundaryConditions/Validation/BESTEST/generateResults.py -AixLib/Resources/Data/BoundaryConditions/WeatherData/BaseClasses/Examples/weatherWithLongHeader.mos -AixLib/Resources/Data/BoundaryConditions/WeatherData/Validation/DecemberToJanuary.mos -AixLib/Resources/Data/BoundaryConditions/WeatherData/Validation/TwoYears_DataOnceAMonth_TMY3.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataAIT151218.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataULg150801.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataULg151202.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataULg151204_1.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataULg151204_2.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataULg151204_4.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataULg160104_2.mos -AixLib/Resources/Data/Fluid/FixedResistances/Validation/PlugFlowPipes/PipeDataULg160118_1.mos -AixLib/Resources/Data/Fluid/Geothermal/Borefields/HeatTransfer/Validation/Analytic_20Years.txt -AixLib/Resources/Data/Fluid/Geothermal/Borefields/HeatTransfer/Validation/Beier_Smith_Spitler_2011_SandBox.txt -AixLib/Resources/Data/Fluid/Geothermal/Borefields/HeatTransfer/Validation/Cimmino_Bernier_2015_SmallScale.txt -AixLib/Resources/Data/Utilities/IO/Files/Examples/CSVReader/Data.txt -AixLib/Resources/Documentation/userGuide/source/_static/lbl-logo.png -AixLib/Resources/Images/Airflow/Multizone/BaseClasses/windPressureLowRise.odp -AixLib/Resources/Images/Airflow/Multizone/BaseClasses/windPressureLowRise.png -AixLib/Resources/Images/Airflow/Multizone/Examples/3roomValidation.png -AixLib/Resources/Images/Airflow/Multizone/Wetter-airflow-2006.pdf -AixLib/Resources/Images/BoundaryConditions/SkyTemperature/BaseClasses/Cloud.jpg -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/BaseClasses/AltitudeAngle.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/BaseClasses/Declination.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/BaseClasses/IncidenceAngle.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/BaseClasses/SolarAzimuth.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/BaseClasses/SolarHourAngle.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/BaseClasses/WallSolarAzimuth.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/BaseClasses/ZenithAngle.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/IncidenceAngle.png -AixLib/Resources/Images/BoundaryConditions/SolarGeometry/ZenithAngle.png -AixLib/Resources/Images/BoundaryConditions/WeatherData/BaseClasses/relativeHumidity.png -AixLib/Resources/Images/BoundaryConditions/WeatherData/RadiationTimeShift.png -AixLib/Resources/Images/BoundaryConditions/ear_ray.odp -AixLib/Resources/Images/BoundaryConditions/ear_ray.png -AixLib/Resources/Images/BoundaryConditions/zen_pla.odp -AixLib/Resources/Images/BoundaryConditions/zen_pla.png -AixLib/Resources/Images/BoundaryConditions/zen_sun.odp -AixLib/Resources/Images/BoundaryConditions/zen_sun.png -AixLib/Resources/Images/Controls/Continuous/Examples/NumberOfRequests.png -AixLib/Resources/Images/Controls/Continuous/Examples/OffTimer1.png -AixLib/Resources/Images/Controls/Continuous/Examples/OffTimer2.png -AixLib/Resources/Images/Controls/Continuous/Examples/SignalRankerU.png -AixLib/Resources/Images/Controls/Continuous/Examples/SignalRankerY.png -AixLib/Resources/Images/Controls/SetPoints/Examples/OccupancySchedule.png -AixLib/Resources/Images/Controls/SetPoints/Examples/SupplyReturnTemperatureReset.png -AixLib/Resources/Images/Controls/SetPoints/Table.png -AixLib/Resources/Images/Fluid/Actuators/Valves/Examples/TwoWayButterfly.png -AixLib/Resources/Images/Fluid/Actuators/Valves/Examples/TwoWayValveTable_kv.png -AixLib/Resources/Images/Fluid/Actuators/threeWayValvePressureDropSeries.png -AixLib/Resources/Images/Fluid/Actuators/valvePressureDropSeries.png -AixLib/Resources/Images/Fluid/Actuators/valveResponse.png -AixLib/Resources/Images/Fluid/Actuators/valveSchematic.png -AixLib/Resources/Images/Fluid/FMI/ExportContainers/Validation/RoomConvectiveHVACConvective.pdf -AixLib/Resources/Images/Fluid/FMI/ExportContainers/Validation/RoomConvectiveHVACConvective.png -AixLib/Resources/Images/Fluid/FMI/ExportContainers/Validation/RoomConvectiveHVACConvective.svg -AixLib/Resources/Images/Fluid/FMI/FMI_icon.png -AixLib/Resources/Images/Fluid/FMI/UsersGuide/2015-WetterFuchsNouidui.pdf -AixLib/Resources/Images/Fluid/FMI/modelica_icon.png -AixLib/Resources/Images/Fluid/FixedResistances/Junction.png -AixLib/Resources/Images/Fluid/FixedResistances/Junction.svg -AixLib/Resources/Images/Fluid/FixedResistances/PressureDrop.png -AixLib/Resources/Images/Fluid/FixedResistances/Validation/PlugFlowPipes/AITTestBench.png -AixLib/Resources/Images/Fluid/FixedResistances/Validation/PlugFlowPipes/ULgTestBench.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/BorefieldGeometry_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/BorefieldGeometry_01.tex -AixLib/Resources/Images/Fluid/Geothermal/Borefields/BoreholeResistances_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/BoreholeResistances_01.tex -AixLib/Resources/Images/Fluid/Geothermal/Borefields/CylindricalHeatSource_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/CylindricalHeatSource_02.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/ErrorFunctionIntegral_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/FiniteLineSource_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/FiniteLineSource_02.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/GFunction_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/InfiniteLineSource_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/InfiniteLineSource_02.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_01.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_01.tex -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_02.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_03.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_04.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_05.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_06.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_07.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_08.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_09.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_10.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_11.png -AixLib/Resources/Images/Fluid/Geothermal/Borefields/LoadAggregation_12.png -AixLib/Resources/Images/Fluid/HeatExchangers/ActiveBeams/schematicAB.png -AixLib/Resources/Images/Fluid/HeatExchangers/ActiveBeams/schematicAB.svg -AixLib/Resources/Images/Fluid/HeatPumps/WaterToWater_Cycle.png -AixLib/Resources/Images/Fluid/Movers/Data/stratoscurve.png -AixLib/Resources/Images/Fluid/Movers/Examples/PumpValidationHead.png -AixLib/Resources/Images/Fluid/Movers/Examples/PumpValidationPower.png -AixLib/Resources/Images/Fluid/Movers/UsersGuide/2013-IBPSA-Wetter.pdf -AixLib/Resources/Images/Fluid/Movers/UsersGuide/fanSpeedFiltered.png -AixLib/Resources/Images/Fluid/Movers/UsersGuide/pumpCurve.png -AixLib/Resources/Images/Fluid/Movers/Validation/PowerExact.png -AixLib/Resources/Images/Fluid/Movers/Validation/PowerExact.svg -AixLib/Resources/Images/Fluid/Movers/Validation/PowerSimplified.png -AixLib/Resources/Images/Fluid/Movers/Validation/PowerSimplified.svg -AixLib/Resources/Images/Fluid/Sensors/onePortHex.png -AixLib/Resources/Images/Fluid/Sensors/onePortHex.tiff -AixLib/Resources/Images/Fluid/Sensors/twoPortHex.png -AixLib/Resources/Images/Fluid/Sensors/twoPortHex.tiff -AixLib/Resources/Images/Fluid/Sensors/warningIcon.png -AixLib/Resources/Images/Fluid/Sensors/warningIcon.svg -AixLib/Resources/Images/Fluid/Sources/Outside_CpData.png -AixLib/Resources/Images/Fluid/Sources/Outside_CpData.svg -AixLib/Resources/Images/Fluid/Storage/Stratified.pdf -AixLib/Resources/Images/Fluid/Storage/Stratified.png -AixLib/Resources/Images/Fluid/Storage/Stratified.svg -AixLib/Resources/Images/Fluid/Storage/StratifiedHex.pdf -AixLib/Resources/Images/Fluid/Storage/StratifiedHex.png -AixLib/Resources/Images/Fluid/Storage/StratifiedHex.svg -AixLib/Resources/Images/IBPSA-logo-text.png -AixLib/Resources/Images/IBPSA-logo.png -AixLib/Resources/Images/Media/Antifreeze/EthyleneGlycol.py -AixLib/Resources/Images/Media/Antifreeze/EthyleneGlycolWaterError10degC.png -AixLib/Resources/Images/Media/Antifreeze/EthyleneGlycolWaterError20degC.png -AixLib/Resources/Images/Media/Antifreeze/EthyleneGlycolWaterProperties.png -AixLib/Resources/Images/Media/Antifreeze/PropyleneGlycolWaterError10degC.pdf -AixLib/Resources/Images/Media/Antifreeze/PropyleneGlycolWaterError10degC.png -AixLib/Resources/Images/Media/Antifreeze/PropyleneGlycolWaterError20degC.pdf -AixLib/Resources/Images/Media/Antifreeze/PropyleneGlycolWaterError20degC.png -AixLib/Resources/Images/Media/Antifreeze/PropyleneGlycolWaterProperties.pdf -AixLib/Resources/Images/Media/Antifreeze/PropyleneGlycolWaterProperties.png -AixLib/Resources/Images/Media/Antifreeze/propyleneGlycol.py -AixLib/Resources/Images/Media/Water/plotCp.pdf -AixLib/Resources/Images/Media/Water/plotCp.png -AixLib/Resources/Images/Media/Water/plotCp.py -AixLib/Resources/Images/Media/Water/plotDensity.py -AixLib/Resources/Images/Media/Water/plotLambda.pdf -AixLib/Resources/Images/Media/Water/plotLambda.png -AixLib/Resources/Images/Media/Water/plotLambda.py -AixLib/Resources/Images/Media/Water/plotRho.pdf -AixLib/Resources/Images/Media/Water/plotRho.png -AixLib/Resources/Images/Media/Water/plotkinVis.pdf -AixLib/Resources/Images/Media/Water/plotkinVis.png -AixLib/Resources/Images/Media/Water/plotkinVis.py -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/BaseClasses/ExtMassVarRC/ExtMassVarRC.png -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/BaseClasses/ExtMassVarRC/ExtMassVarRC.svg -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/BaseClasses/IntMassVarRC/IntMassVarRC.png -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/BaseClasses/IntMassVarRC/IntMassVarRC.svg -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/FourElements.png -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/FourElements.svg -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/OneElement.png -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/OneElement.svg -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/ThreeElements.png -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/ThreeElements.svg -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/TwoElements.png -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/TwoElements.svg -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/UsersGuide/BauSIM2014_208-2_p1192.pdf -AixLib/Resources/Images/ThermalZones/ReducedOrder/RC/UsersGuide/p2241.pdf -AixLib/Resources/Images/Utilities/Math/Functions/Examples/cubicHermite.png -AixLib/Resources/Images/Utilities/Math/Functions/SmoothExponentialXPower.png -AixLib/Resources/Images/Utilities/Math/int.pdf -AixLib/Resources/Images/Utilities/Math/int.png -AixLib/Resources/ReferenceResults/Dymola/AixLib_Airflow_Multizone_BaseClasses_Examples_Interpolate.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Airflow_Multizone_BaseClasses_Examples_WindPressureProfile.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Airflow_Multizone_Examples_PowerLaw.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Airflow_Multizone_Examples_PressurizationData.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Airflow_Multizone_Examples_TrickleVent.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Airflow_Multizone_Validation_OneWayFlow.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_BoundaryConditions_WeatherData_BaseClasses_Examples_GetAltitudeTMY3.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_BaseClasses_Validation_ActuatorFilter.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_FixedResistances_Examples_PlugFlowPipeDiscretized.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_HeatExchangers_Examples_WetCoilEffectivenessNTUMassFlow.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_HeatExchangers_Validation_WetCoilEffectivenessNTU.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Sources_Examples_Outside_CpData.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Sources_Examples_Outside_CpData_Angles.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Sources_Examples_Outside_CpData_Specification.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Sources_Validation_Outside_CpData_Directions.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Media_Examples_SteamDerivativeCheck.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Media_Examples_SteamProperties.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Media_Examples_SteamSaturationConsistencyCheck.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Media_Examples_SteamTemperatureEnthalpyInversion.txt -AixLib/Resources/ReferenceResults/Dymola/AixLib_Utilities_Math_Examples_Polynomial.txt -AixLib/Resources/Scripts/Conversion/ConvertIBPSA_from_3.0_to_4.0.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/BaseClasses/Examples/Interpolate.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/BaseClasses/Examples/PowerLaw.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/BaseClasses/Examples/PowerLawFixedM.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/BaseClasses/Examples/WindPressureLowRise.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/BaseClasses/Examples/WindPressureProfile.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/CO2TransportStep.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/ChimneyShaftNoVolume.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/ChimneyShaftWithVolume.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/ClosedDoors.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/NaturalVentilation.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/OneEffectiveAirLeakageArea.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/OneOpenDoor.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/OneRoom.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/Orifice.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/PowerLaw.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/PressurizationData.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/ReverseBuoyancy.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/ReverseBuoyancy3Zones.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/TrickleVent.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Examples/ZonalFlow.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/DoorOpenClosed.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/OneWayFlow.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/OpenDoorBuoyancyDynamic.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/OpenDoorBuoyancyPressureDynamic.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/OpenDoorPressure.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/OpenDoorTemperature.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/ThreeRoomsContam.mos -AixLib/Resources/Scripts/Dymola/Airflow/Multizone/Validation/ThreeRoomsContamDiscretizedDoor.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SkyTemperature/Examples/BlackBody.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/BaseClasses/Examples/AltitudeAngle.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/BaseClasses/Examples/Declination.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/BaseClasses/Examples/IncidenceAngle.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/BaseClasses/Examples/SolarAzimuth.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/BaseClasses/Examples/SolarHourAngle.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/BaseClasses/Examples/WallSolarAzimuth.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/BaseClasses/Examples/ZenithAngle.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/Examples/IncidenceAngle.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarGeometry/Examples/ZenithAngle.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/BrighteningCoefficient.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/DiffuseIsotropic.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/RelativeAirMass.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/SkyBrightness.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/BaseClasses/Examples/SkyClearness.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/Examples/DiffuseIsotropic.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/Examples/DiffusePerez.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/SolarIrradiation/Examples/DirectTiltedSurface.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/Validation/BESTEST/WD100.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/Validation/BESTEST/WD200.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/Validation/BESTEST/WD300.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/Validation/BESTEST/WD400.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/Validation/BESTEST/WD500.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/Validation/BESTEST/WD600.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/CheckBlackBodySkyTemperature.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/CheckPressure.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/CheckTemperature.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/ConvertTime.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/ConvertTimeNegativeStart.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/ConvertTimePositiveStart.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/EquationOfTime.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/GetAbsolutePath.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/GetAltitudeTMY3.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/GetHeaderElement.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/GetTimeSpanTMY3.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/GetTimeSpanTMY3LongHeader.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/GetTimeSpanTMY3_NonzeroStart.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/LimitMin.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/LocalCivilTime.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/BaseClasses/Examples/SolarTime.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/Examples/ReaderTMY3.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/Validation/DecemberToJanuary.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/Validation/OverAYear_usingOneYearData.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/Validation/ReaderTMY3HDirNor.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/Validation/ThreeYears_usingTwoYearData.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/Validation/ThreeYears_usingTwoYearDataNegativeStart.mos -AixLib/Resources/Scripts/Dymola/BoundaryConditions/WeatherData/Validation/ThreeYears_usingTwoYearDataPositiveStart.mos -AixLib/Resources/Scripts/Dymola/Controls/Continuous/Examples/LimPID.mos -AixLib/Resources/Scripts/Dymola/Controls/Continuous/Examples/LimPIDWithReset.mos -AixLib/Resources/Scripts/Dymola/Controls/Continuous/Examples/NumberOfRequests.mos -AixLib/Resources/Scripts/Dymola/Controls/Continuous/Examples/OffTimer.mos -AixLib/Resources/Scripts/Dymola/Controls/Continuous/Examples/SignalRanker.mos -AixLib/Resources/Scripts/Dymola/Controls/Continuous/Validation/LimPIDReset.mos -AixLib/Resources/Scripts/Dymola/Controls/Continuous/Validation/OffTimerNonZeroStart.mos -AixLib/Resources/Scripts/Dymola/Controls/Discrete/Examples/BooleanDelay.mos -AixLib/Resources/Scripts/Dymola/Controls/SetPoints/Examples/OccupancySchedule.mos -AixLib/Resources/Scripts/Dymola/Controls/SetPoints/Examples/SupplyReturnTemperatureReset.mos -AixLib/Resources/Scripts/Dymola/Controls/SetPoints/Examples/Table.mos -AixLib/Resources/Scripts/Dymola/Controls/SetPoints/Validation/OccupancyScheduleNegativeStartTime.mos -AixLib/Resources/Scripts/Dymola/Controls/SetPoints/Validation/OccupancySchedulePositiveStartTime.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/BaseClasses/Examples/EqualPercentageDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Dampers/Examples/Damper.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Dampers/Examples/MixingBox.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Dampers/Examples/VAVBoxExponential.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Dampers/Validation/PressureIndependent.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Motors/Examples/IdealMotor.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Examples/ThreeWayValves.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Examples/TwoWayValvePressureIndependent.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Examples/TwoWayValveTable.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Examples/TwoWayValves.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Examples/TwoWayValvesMotor.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Examples/TwoWayValvesTable.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Validation/ThreeWayValveParameterization.mos -AixLib/Resources/Scripts/Dymola/Fluid/Actuators/Valves/Validation/TwoWayValveParameterization.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_dp_DerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_dp_DerivativeCheck2.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_m_flow_DerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/FlowModels/Validation/BasicFlowFunction_m_flow_DerivativeCheck2.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/FlowModels/Validation/InverseFlowFunctions.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/FlowModels/Validation/InvertingBasicFlowFunction_dp.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/FlowModels/Validation/InvertingBasicFlowFunction_m_flow.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/Validation/ActuatorFilter.mos -AixLib/Resources/Scripts/Dymola/Fluid/BaseClasses/Validation/MassFlowRateMultiplier.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Examples/Carnot_TEva.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Examples/Carnot_y.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/CarnotVerifyCOP.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/CarnotVerifyEtaCarnot.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/Carnot_TEva_2ndLaw.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/Carnot_TEva_HighTemperature.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/Carnot_TEva_LimitedCapacity.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/Carnot_TEva_etaPL.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/Carnot_TEva_reverseFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/Chillers/Validation/Carnot_y_etaPL.mos -AixLib/Resources/Scripts/Dymola/Fluid/Delays/Examples/Delay.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/FlowSystem/Basic.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/FlowSystem/Simplified1.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/FlowSystem/Simplified2.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/FlowSystem/Simplified3.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/FlowSystem/Simplified4.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/FlowSystem/Simplified5.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/FlowSystem/Simplified6.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example1v1.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example1v2.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example2.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example3.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example4.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example5.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example6.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example7.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/Example8.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/ParallelDp.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/ParallelDpOptimised.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/ParallelFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/ParallelFlowOptimised.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesDp.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesDpOptimised.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesFlowOptimised.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesParallelDp.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesParallelDpOptimised.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesParallelFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/Performance/PressureDrop/SeriesParallelFlowOptimised.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/ResistanceVolumeFlowReversal.mos -AixLib/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Adaptors/Examples/ThermalZoneHVACNoExhaust.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Adaptors/Examples/ThermalZoneHVACWithExhaust.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Conversion/Validation/AirToOutlet.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Conversion/Validation/AirToOutletFlowReversal.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Conversion/Validation/InletToAirDryAir.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Conversion/Validation/InletToAirDryAirCO2.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Conversion/Validation/InletToAirMoistAir.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Conversion/Validation/InletToAirMoistAirCO2.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/Fan.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/FlowSplitter_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/HVACZone.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/HVACZones.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/HeaterCooler_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/Heater_T.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/Humidifier_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/IdealSource_m_flow.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/MixingVolume.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/PressureDrop.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/ResistanceVolume.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/ThermalZone.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/ThermalZones.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Examples/FMUs/TwoPortPassThrough.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneAir1.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneAir2.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneAir3.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneSimpleAir1.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneSimpleAir2.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/HVACThermalZoneSimpleAir3.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneAir1.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneAir2.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneAir3.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneSimpleAir1.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneSimpleAir2.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/ExportContainers/Validation/FMUs/ThermalZoneSimpleAir3.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Validation/FlowSplitter_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Validation/HeaterFan.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Validation/HeaterFanPressureDriven.mos -AixLib/Resources/Scripts/Dymola/Fluid/FMI/Validation/HeaterFan_noReverseFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Examples/CheckValve.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Examples/FlowJunction.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Examples/HydraulicDiameter.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Examples/PlugFlowPipe.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Examples/PlugFlowPipeDiscretized.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Examples/PressureDrop.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/FlowJunctionSteadyState.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/FlowJunctionSteadyStateNoPressureDrop.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/LosslessPipe.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PlugFlowPipes/Data/TestData.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PlugFlowPipes/FlowReversal.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PlugFlowPipes/MSLAIT.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PlugFlowPipes/MSLAIT2Nodes.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PlugFlowPipes/PlugFlowAIT.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PlugFlowPipes/PlugFlowULg.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PlugFlowPipes/TransportWaterAir.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PressureDropsExplicit.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PressureDropsExplicitLinearized.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PressureDropsParallel.mos -AixLib/Resources/Scripts/Dymola/Fluid/FixedResistances/Validation/PressureDropsSeries.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalHEXOneUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalHEXTwoUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalResistancesOneUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Examples/InternalResistancesTwoUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/ConvectionResistanceCircularPipe.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesOneUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesOneUTubeNegative.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesTwoUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/InternalResistancesTwoUTubeNegative.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/MultipoleThermalResistances_OneUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/BaseClasses/Functions/Validation/MultipoleThermalResistances_TwoUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BoreholeDynamics.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BoreholeOneUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/Boreholes/Examples/BoreholeTwoUTube.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/AggregationCellTimes.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/AggregationWeightingFactors.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/CountAggregationCells.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/ShiftAggregationCells.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/TemperatureResponseMatrix.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/LoadAggregation/Validation/TemporalSuperposition.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/CylindricalHeatSource.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/CylindricalHeatSource_Integrand.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource_Erfint.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource_Integrand.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/FiniteLineSource_Integrand_Length.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/GFunction_100boreholes.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/GFunction_1borehole_5meters.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/GFunction_SmallScaleValidation.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/InfiniteLineSource.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/ShaGFunction.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/ThermalResponseFactors/Validation/TimeGeometric.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Analytic_20Years.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Cylindrical.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/FiniteDifference_1Week.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Measured_SmallScale.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/Examples/Borefields.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/Examples/RectangularBorefield.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/Validation/ConstantHeatInjection_100Boreholes.mos -AixLib/Resources/Scripts/Dymola/Fluid/Geothermal/Borefields/Validation/Sandbox.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/Convector.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/DerivateCubicSpline.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/BaseClasses/Examples/ModificationFactor.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/Examples/CoolingAndHeating.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/Examples/CoolingOnly.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/Examples/HeatingOnly.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/Validation/NumberOfBeams.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/ActiveBeams/Validation/NumberOfBeamsDynamics.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/BaseClasses/Examples/HACoilInside.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/BaseClasses/Examples/HADryCoil.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/BaseClasses/Examples/HANaturalCylinder.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/AirHeater_T.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/AirHeater_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/DryCoilEffectivenessNTUMassFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/DryCoilEffectivenessNTUPControl.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/WaterCooler_T.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/WaterHeater_T.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/WaterHeater_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Examples/WetCoilEffectivenessNTUMassFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Radiators/Examples/RadiatorEN442_2.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Validation/ConstantEffectiveness.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Validation/DryCoilEffectivenessNTU.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Validation/EvaporatorCondenser.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Validation/HeaterCooler_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Validation/PrescribedOutlet.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Validation/PrescribedOutlet_dynamic.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatExchangers/Validation/WetCoilEffectivenessNTU.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Calibration/ScrollWaterToWater.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Compressors/BaseClasses/Validation/TemperatureProtection.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Compressors/Validation/ReciprocatingCompressor.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Compressors/Validation/ReciprocatingCompressor_ZeroInput.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Compressors/Validation/ScrollCompressor.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Compressors/Validation/ScrollCompressor_ZeroInput.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Examples/Carnot_TCon.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Examples/Carnot_y.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Examples/ScrollWaterToWater_OneRoomRadiator.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/Carnot_TCon_LimitedCapacity.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/Carnot_TCon_LowTemperature.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/Carnot_TCon_etaPL.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/Carnot_TCon_reverseFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/Carnot_y_etaCar.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/Carnot_y_etaPL.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_Dynamic.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_ScalingFactor.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_Static.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ReciprocatingWaterToWater_VariableSpeed.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ScrollWaterToWater_Dynamic.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ScrollWaterToWater_ScalingFactor.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ScrollWaterToWater_Static.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ScrollWaterToWater_TemperatureProtection.mos -AixLib/Resources/Scripts/Dymola/Fluid/HeatPumps/Validation/ScrollWaterToWater_VariableSpeed.mos -AixLib/Resources/Scripts/Dymola/Fluid/Humidifiers/Examples/Humidifier_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/Humidifiers/Validation/SprayAirWasher_X.mos -AixLib/Resources/Scripts/Dymola/Fluid/Humidifiers/Validation/SprayAirWasher_X_dynamic.mos -AixLib/Resources/Scripts/Dymola/Fluid/Humidifiers/Validation/SteamHumidifier_X.mos -AixLib/Resources/Scripts/Dymola/Fluid/Humidifiers/Validation/SteamHumidifier_X_dynamic.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/ConservationEquation.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/EightPortHeatMassExchanger.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/FourPortHeatMassExchanger.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/HeaterCooler_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/Humidifier_u.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/PrescribedOutlet.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/PrescribedOutlet_TSetOnly.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/PrescribedOutlet_Water.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/PrescribedOutlet_X_wSetOnly.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/ReverseFlowHumidifier.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/ReverseFlowMassExchanger.mos -AixLib/Resources/Scripts/Dymola/Fluid/Interfaces/Examples/StaticTwoPortConservationEquation.mos -AixLib/Resources/Scripts/Dymola/Fluid/MassExchangers/Examples/ConstantEffectiveness.mos -AixLib/Resources/Scripts/Dymola/Fluid/MassExchangers/Validation/ConstantEffectivenessZeroFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/MassExchangers/Validation/ConstantEffectivenessZeroFlowBothStreams.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/BaseClasses/Validation/MixingVolumeHeatMoisturePort.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/BaseClasses/Validation/MixingVolumeHeatPortAir.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/BaseClasses/Validation/MixingVolumeHeatPortWater.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Examples/MixingVolumeHeatConduction.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Examples/MixingVolumeMoistAir.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Examples/MixingVolumePrescribedHeatFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/CoupledVolumesAir.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/CoupledVolumesGlycol47.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/CoupledVolumesSpecializedAirPerfectGas.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/CoupledVolumesSpecializedWaterConstantProperties_pT.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/CoupledVolumesSpecializedWaterTemperatureDependentDensity.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/CoupledVolumesWater.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolume.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeAdiabaticCooling.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeHeatReverseFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeHeatReverseFlowPrescribedHeatFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeInitialization.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeMFactor.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeMassFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeMoistureReverseFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeMoistureReverseFlowPrescribedHeatFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeSteadyStateMass.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeTraceSubstance.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeTraceSubstanceReverseFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeTraceSubstanceReverseFlowPrescribedHeatFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MixingVolumeZeroFlow.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MoistureMixingConservationDynamicBalance.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/MoistureMixingConservationSteadyState.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/TraceSubstanceConservationDynamicBalance.mos -AixLib/Resources/Scripts/Dymola/Fluid/MixingVolumes/Validation/TraceSubstanceConservationSteadyState.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/BaseClasses/Validation/FlowMachineInterface.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/BaseClasses/Validation/PowerInterface.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Examples/ClosedLoop_y.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Examples/MoverContinuous.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Examples/MoverParameter.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Examples/MoverStages.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Examples/PumpsParallel.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Examples/PumpsSeries.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Examples/SpeedControlled_y_pumpCurves.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/ControlledFlowMachine.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/ControlledFlowMachineDynamic.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/FlowControlled_dp.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/FlowControlled_dpSystem.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/FlowControlled_m_flow.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/PowerExact.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/PowerSimplified.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/PumpCurveConstruction.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/PumpCurveDerivatives.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/Pump_Nrpm_stratos.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/Pump_stratos.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/SpeedControlled_Nrpm.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/SpeedControlled_y.mos -AixLib/Resources/Scripts/Dymola/Fluid/Movers/Validation/SpeedControlled_y_linear.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Conversions/Examples/To_VolumeFraction.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/Density.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/EnthalpyFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/EntropyFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/MassFraction.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/MoistAirEnthalpyFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/PPM.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/Pressure.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/RelativeHumidity.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/SpecificEnthalpy.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/SpecificEntropy.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/TemperatureDryBulb.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/TemperatureWetBulb.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/TraceSubstances.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/Velocity.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sensors/Examples/VolumeFlowRate.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/MassFlowSource_WeatherData.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/Outside.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/Outside_CpData.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/Outside_CpData_Angles.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/Outside_CpData_Specification.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/Outside_CpLowRise.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/PropertySource_T.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/PropertySource_h.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Examples/TraceSubstancesFlowSource.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Validation/Boundary.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Validation/BoundaryWithX_in.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Validation/BoundaryWithXi_in.mos -AixLib/Resources/Scripts/Dymola/Fluid/Sources/Validation/Outside_CpData_Directions.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/BaseClasses/Examples/IndirectTankHeatExchanger.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Examples/ExpansionVessel.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Examples/Stratified.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Examples/StratifiedEnhancedInternalHex.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Examples/StratifiedUnloadAtMinimumTemperature.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Validation/HeatExchangerDynamics.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Validation/HeatExchangerLocation.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Validation/StratifiedLoadingUnloading.mos -AixLib/Resources/Scripts/Dymola/Fluid/Storage/Validation/StratifiedNonUniformInitial.mos -AixLib/Resources/Scripts/Dymola/Media/Antifreeze/Validation/EthyleneGlycolWater.mos -AixLib/Resources/Scripts/Dymola/Media/Antifreeze/Validation/PropyleneGlycolWater.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/AirDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/AirProperties.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/AirTemperatureEnthalpyInversion.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/PropyleneGlycolWaterDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/PropyleneGlycolWaterProperties.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/PropyleneGlycolWaterTemperatureEnthalpyInversion.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/SteamDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/SteamProperties.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/SteamSaturationConsistencyCheck.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/SteamTemperatureEnthalpyInversion.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/WaterDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/WaterProperties.mos -AixLib/Resources/Scripts/Dymola/Media/Examples/WaterTemperatureEnthalpyInversion.mos -AixLib/Resources/Scripts/Dymola/Media/Refrigerants/Validation/R410A_dSpecificVolumeVap_pT.mos -AixLib/Resources/Scripts/Dymola/Media/Specialized/Air/Examples/PerfectGasDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Media/Specialized/Air/Examples/PerfectGasTemperatureEnthalpyInversion.mos -AixLib/Resources/Scripts/Dymola/Media/Specialized/Water/Examples/TemperatureDependentDensityDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Media/Specialized/Water/Examples/TemperatureDependentDensityProperties.mos -AixLib/Resources/Scripts/Dymola/Media/Specialized/Water/Examples/TemperatureDependentDensityTemperatureEnthalpyInversion.mos -AixLib/Resources/Scripts/Dymola/Media/Specialized/Water/Examples/WaterProperties_pT.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Examples/SimpleRoomFourElements.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Examples/SimpleRoomFourElementsTraceSubstance.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Examples/SimpleRoomOneElement.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Examples/SimpleRoomThreeElements.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Examples/SimpleRoomTwoElements.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/RoomSteadyState.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/RoomWithLatentGain.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/RoomWithoutLatentGain.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase1.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase10.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase11.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase12.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase2.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase3.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase4.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase5.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase6.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase7.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase8.mos -AixLib/Resources/Scripts/Dymola/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase9.mos -AixLib/Resources/Scripts/Dymola/Utilities/Cryptographics/Validation/SHA1.mos -AixLib/Resources/Scripts/Dymola/Utilities/Diagnostics/Validation/CheckEquality.mos -AixLib/Resources/Scripts/Dymola/Utilities/IO/Files/Examples/CSVReader.mos -AixLib/Resources/Scripts/Dymola/Utilities/IO/Files/Examples/CSVWriter.mos -AixLib/Resources/Scripts/Dymola/Utilities/IO/Files/Examples/JSONWriter.mos -AixLib/Resources/Scripts/Dymola/Utilities/IO/SignalExchange/Examples/FirstOrder.mos -AixLib/Resources/Scripts/Dymola/Utilities/IO/SignalExchange/Examples/WeatherStation.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/Average.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/BesselJ0.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/BesselJ1.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/BesselY0.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/BesselY1.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/Bicubic.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/Binomial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/Biquadratic.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/BooleanReplicator.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/ExponentialIntegralE1.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/Factorial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/FallingFactorial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/IntegerReplicator.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/IntegratorWithReset.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/InverseXRegularized.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/Polynomial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/PowerLinearized.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/QuadraticLinear.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/RegNonZeroPower.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/SmoothBlocks.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/SmoothExponential.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/SmoothHeaviside.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/SmoothLimit.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/SmoothMin.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/Splice.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Examples/VectorFunctions.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/BesselJ0.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/BesselJ1.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/BesselY0.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/BesselY1.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/Binomial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/CubicHermite.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/ExponentialIntegralE1.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/Factorial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/FallingFactorial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/InverseXDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/InverseXDerivative_2_Check.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/InverseXRegularized.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/IsMonotonic.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/Polynomial.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/PowerLinearized.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/QuinticHermite.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/RegNonZeroPower.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/RegNonZeroPowerDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/RegNonZeroPowerDerivative_2_Check.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/RegStep.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/SmoothExponentialDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/SmoothHeavisideDerivatives.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/SpliceFunction.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/SpliceFunctionDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Utilities/Math/Functions/Examples/TrapezoidalIntegration.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/Density_pTX.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/DewPointTemperature.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/HumidityRatioPressure.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/MassFraction_pTphi.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/Phi_pTX.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/SaturationPressure.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/SaturationPressureLiquid.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/SublimationPressureIce.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/TWetBul_TDryBulPhi.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/TWetBul_TDryBulXi.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Examples/TotalAirDryAir.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/BaseClasses/Examples/DewPointTemperatureDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/BaseClasses/Examples/DewPointTemperatureDerivativeCheck_amb.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/BaseClasses/Examples/InverseDewPointTemperatureDerivativeCheck_amb.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/BaseClasses/Examples/SaturationPressureDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/BaseClasses/Examples/WaterVaporPressureDerivativeCheck.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/Examples/Density_pTX.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/Examples/SaturationPressure.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/Examples/X_pSatpphi.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/Examples/pW_TDewPoi.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/Examples/pW_TDewPoi_comparison.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/Examples/pW_X.mos -AixLib/Resources/Scripts/Dymola/Utilities/Psychrometrics/Functions/Examples/phi_pTX.mos -AixLib/Resources/Scripts/Dymola/Utilities/Time/Examples/CalendarTime.mos -AixLib/Resources/Scripts/Dymola/Utilities/Time/Examples/ModelTime.mos -AixLib/Resources/Scripts/Dymola/Utilities/Time/Validation/CalendarTimeMonths.mos -AixLib/Resources/Scripts/Dymola/Utilities/Time/Validation/CalendarTimeMonthsMinus.mos -AixLib/Resources/Scripts/Dymola/Utilities/Time/Validation/CalendarTimeMonthsPlus.mos -AixLib/Resources/Scripts/JModelica/buildingspy_to_csv.py -AixLib/Resources/Scripts/travis/dymola/dymola -AixLib/Resources/Scripts/travis/omc/omc -AixLib/Resources/bin/ConvertWeatherData.jar -AixLib/Resources/src/convertEPW/Makefile -AixLib/Resources/src/convertEPW/doc/ConvertWeatherData.html -AixLib/Resources/src/convertEPW/doc/allclasses-index.html -AixLib/Resources/src/convertEPW/doc/allclasses.html -AixLib/Resources/src/convertEPW/doc/allpackages-index.html -AixLib/Resources/src/convertEPW/doc/constant-values.html -AixLib/Resources/src/convertEPW/doc/deprecated-list.html -AixLib/Resources/src/convertEPW/doc/element-list -AixLib/Resources/src/convertEPW/doc/help-doc.html -AixLib/Resources/src/convertEPW/doc/index-all.html -AixLib/Resources/src/convertEPW/doc/index.html -AixLib/Resources/src/convertEPW/doc/jquery/external/jquery/jquery.js -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-bg_glass_65_dadada_1x400.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-bg_glass_75_dadada_1x400.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-bg_glass_95_fef1ec_1x400.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-icons_222222_256x240.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-icons_2e83ff_256x240.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-icons_454545_256x240.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-icons_888888_256x240.png -AixLib/Resources/src/convertEPW/doc/jquery/images/ui-icons_cd0a0a_256x240.png -AixLib/Resources/src/convertEPW/doc/jquery/jquery-3.3.1.js -AixLib/Resources/src/convertEPW/doc/jquery/jquery-3.5.1.js -AixLib/Resources/src/convertEPW/doc/jquery/jquery-migrate-3.0.1.js -AixLib/Resources/src/convertEPW/doc/jquery/jquery-ui.css -AixLib/Resources/src/convertEPW/doc/jquery/jquery-ui.js -AixLib/Resources/src/convertEPW/doc/jquery/jquery-ui.min.css -AixLib/Resources/src/convertEPW/doc/jquery/jquery-ui.min.js -AixLib/Resources/src/convertEPW/doc/jquery/jquery-ui.structure.css -AixLib/Resources/src/convertEPW/doc/jquery/jquery-ui.structure.min.css -AixLib/Resources/src/convertEPW/doc/jquery/jszip-utils/dist/jszip-utils-ie.js -AixLib/Resources/src/convertEPW/doc/jquery/jszip-utils/dist/jszip-utils-ie.min.js -AixLib/Resources/src/convertEPW/doc/jquery/jszip-utils/dist/jszip-utils.js -AixLib/Resources/src/convertEPW/doc/jquery/jszip-utils/dist/jszip-utils.min.js -AixLib/Resources/src/convertEPW/doc/jquery/jszip/dist/jszip.js -AixLib/Resources/src/convertEPW/doc/jquery/jszip/dist/jszip.min.js -AixLib/Resources/src/convertEPW/doc/member-search-index.js -AixLib/Resources/src/convertEPW/doc/member-search-index.zip -AixLib/Resources/src/convertEPW/doc/overview-tree.html -AixLib/Resources/src/convertEPW/doc/package-search-index.js -AixLib/Resources/src/convertEPW/doc/package-search-index.zip -AixLib/Resources/src/convertEPW/doc/package-summary.html -AixLib/Resources/src/convertEPW/doc/package-tree.html -AixLib/Resources/src/convertEPW/doc/resources/glass.png -AixLib/Resources/src/convertEPW/doc/resources/inherit.gif -AixLib/Resources/src/convertEPW/doc/resources/x.png -AixLib/Resources/src/convertEPW/doc/script.js -AixLib/Resources/src/convertEPW/doc/search.js -AixLib/Resources/src/convertEPW/doc/stylesheet.css -AixLib/Resources/src/convertEPW/doc/type-search-index.js -AixLib/Resources/src/convertEPW/doc/type-search-index.zip -AixLib/Resources/src/convertEPW/src/ConvertWeatherData.java -AixLib/Resources/src/convertEPW/src/Makefile -AixLib/Resources/src/convertEPW/src/Manifest.txt -AixLib/Resources/src/fluid/heatpumps/calibration/Examples/SomeManufacturer_ABC060_70kW_4_0COP_R410A.mo -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap-theme.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap-theme.css.map -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap-theme.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap-theme.min.css.map -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap.css.map -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/css/bootstrap.min.css.map -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.eot -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.svg -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.ttf -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff2 -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/js/bootstrap.js -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/js/bootstrap.min.js -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootstrap-3.4.1/js/npm.js -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/cerulean/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/cosmo/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/cyborg/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/darkly/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/flatly/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.eot -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.svg -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.ttf -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.woff -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.woff2 -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/journal/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/lumen/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/paper/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/readable/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/sandstone/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/simplex/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/slate/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/spacelab/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/superhero/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/united/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/bootswatch-3.4.1/yeti/bootstrap.min.css -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/jquery-3.5.1.js -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/js/jquery-1.12.4.min.js -AixLib/Resources/src/fluid/heatpumps/calibration/doc/build/html/_static/underscore-1.13.1.js -AixLib/Resources/src/fluid/heatpumps/calibration/doc/requirements.txt -AixLib/Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw -AixLib/Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.mos -AixLib/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw -AixLib/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos -AixLib/Resources/www/navigation.png -AixLib/ThermalZones/ReducedOrder/EquivalentAirTemperature/BaseClasses/PartialVDI6007.mo -AixLib/ThermalZones/ReducedOrder/EquivalentAirTemperature/BaseClasses/package.mo -AixLib/ThermalZones/ReducedOrder/EquivalentAirTemperature/BaseClasses/package.order -AixLib/ThermalZones/ReducedOrder/EquivalentAirTemperature/VDI6007.mo -AixLib/ThermalZones/ReducedOrder/EquivalentAirTemperature/VDI6007WithWindow.mo -AixLib/ThermalZones/ReducedOrder/EquivalentAirTemperature/package.mo -AixLib/ThermalZones/ReducedOrder/EquivalentAirTemperature/package.order -AixLib/ThermalZones/ReducedOrder/Examples/SimpleRoomFourElements.mo -AixLib/ThermalZones/ReducedOrder/Examples/SimpleRoomFourElementsTraceSubstance.mo -AixLib/ThermalZones/ReducedOrder/Examples/SimpleRoomOneElement.mo -AixLib/ThermalZones/ReducedOrder/Examples/SimpleRoomThreeElements.mo -AixLib/ThermalZones/ReducedOrder/Examples/SimpleRoomTwoElements.mo -AixLib/ThermalZones/ReducedOrder/Examples/package.mo -AixLib/ThermalZones/ReducedOrder/Examples/package.order -AixLib/ThermalZones/ReducedOrder/RC/BaseClasses/ExteriorWall.mo -AixLib/ThermalZones/ReducedOrder/RC/BaseClasses/InteriorWall.mo -AixLib/ThermalZones/ReducedOrder/RC/BaseClasses/ThermSplitter.mo -AixLib/ThermalZones/ReducedOrder/RC/BaseClasses/package.mo -AixLib/ThermalZones/ReducedOrder/RC/BaseClasses/package.order -AixLib/ThermalZones/ReducedOrder/RC/BaseClasses/splitFacVal.mo -AixLib/ThermalZones/ReducedOrder/RC/FourElements.mo -AixLib/ThermalZones/ReducedOrder/RC/OneElement.mo -AixLib/ThermalZones/ReducedOrder/RC/ThreeElements.mo -AixLib/ThermalZones/ReducedOrder/RC/TwoElements.mo -AixLib/ThermalZones/ReducedOrder/RC/package.mo -AixLib/ThermalZones/ReducedOrder/RC/package.order -AixLib/ThermalZones/ReducedOrder/SolarGain/BaseClasses/PartialCorrectionG.mo -AixLib/ThermalZones/ReducedOrder/SolarGain/BaseClasses/package.mo -AixLib/ThermalZones/ReducedOrder/SolarGain/BaseClasses/package.order -AixLib/ThermalZones/ReducedOrder/SolarGain/CorrectionGDoublePane.mo -AixLib/ThermalZones/ReducedOrder/SolarGain/package.mo -AixLib/ThermalZones/ReducedOrder/SolarGain/package.order -AixLib/ThermalZones/ReducedOrder/Validation/RoomSteadyState.mo -AixLib/ThermalZones/ReducedOrder/Validation/RoomWithLatentGain.mo -AixLib/ThermalZones/ReducedOrder/Validation/RoomWithoutLatentGain.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/BaseClasses/VerifyDifferenceThreePeriods.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/BaseClasses/package.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/BaseClasses/package.order -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase1.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase10.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase11.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase12.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase2.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase3.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase4.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase5.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase6.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase7.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase8.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/TestCase9.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/package.mo -AixLib/ThermalZones/ReducedOrder/Validation/VDI6007/package.order -AixLib/ThermalZones/ReducedOrder/Validation/package.mo -AixLib/ThermalZones/ReducedOrder/Validation/package.order -AixLib/ThermalZones/ReducedOrder/package.mo -AixLib/ThermalZones/ReducedOrder/package.order -AixLib/ThermalZones/package.mo -AixLib/ThermalZones/package.order -AixLib/Types/Azimuth/package.mo -AixLib/Types/Azimuth/package.order -AixLib/Types/Tilt/package.mo -AixLib/Types/Tilt/package.order -AixLib/Types/package.mo -AixLib/Types/package.order -AixLib/Utilities/Cryptographics/Validation/SHA1.mo -AixLib/Utilities/Cryptographics/Validation/package.mo -AixLib/Utilities/Cryptographics/Validation/package.order -AixLib/Utilities/Cryptographics/package.mo -AixLib/Utilities/Cryptographics/package.order -AixLib/Utilities/Cryptographics/sha.mo -AixLib/Utilities/Diagnostics/AssertEquality.mo -AixLib/Utilities/Diagnostics/AssertInequality.mo -AixLib/Utilities/Diagnostics/BaseClasses/PartialInputCheck.mo -AixLib/Utilities/Diagnostics/BaseClasses/package.mo -AixLib/Utilities/Diagnostics/BaseClasses/package.order -AixLib/Utilities/Diagnostics/CheckEquality.mo -AixLib/Utilities/Diagnostics/Validation/CheckEquality.mo -AixLib/Utilities/Diagnostics/Validation/package.mo -AixLib/Utilities/Diagnostics/Validation/package.order -AixLib/Utilities/Diagnostics/package.mo -AixLib/Utilities/Diagnostics/package.order -AixLib/Utilities/IO/Files/BaseClasses/FileWriter.mo -AixLib/Utilities/IO/Files/BaseClasses/FileWriterObject.mo -AixLib/Utilities/IO/Files/BaseClasses/JSONWriterObject.mo -AixLib/Utilities/IO/Files/BaseClasses/OutputTime.mo -AixLib/Utilities/IO/Files/BaseClasses/cacheVals.mo -AixLib/Utilities/IO/Files/BaseClasses/package.mo -AixLib/Utilities/IO/Files/BaseClasses/package.order -AixLib/Utilities/IO/Files/BaseClasses/writeJSON.mo -AixLib/Utilities/IO/Files/CSVWriter.mo -AixLib/Utilities/IO/Files/CombiTimeTableWriter.mo -AixLib/Utilities/IO/Files/Examples/BaseClasses/PartialCSV.mo -AixLib/Utilities/IO/Files/Examples/BaseClasses/package.mo -AixLib/Utilities/IO/Files/Examples/BaseClasses/package.order -AixLib/Utilities/IO/Files/Examples/CSVReader.mo -AixLib/Utilities/IO/Files/Examples/CSVWriter.mo -AixLib/Utilities/IO/Files/Examples/JSONWriter.mo -AixLib/Utilities/IO/Files/Examples/package.mo -AixLib/Utilities/IO/Files/Examples/package.order -AixLib/Utilities/IO/Files/JSONWriter.mo -AixLib/Utilities/IO/Files/package.mo -AixLib/Utilities/IO/Files/package.order -AixLib/Utilities/IO/SignalExchange/Examples/BaseClasses/ExportedModel.mo -AixLib/Utilities/IO/SignalExchange/Examples/BaseClasses/OriginalModel.mo -AixLib/Utilities/IO/SignalExchange/Examples/BaseClasses/package.mo -AixLib/Utilities/IO/SignalExchange/Examples/BaseClasses/package.order -AixLib/Utilities/IO/SignalExchange/Examples/FirstOrder.mo -AixLib/Utilities/IO/SignalExchange/Examples/WeatherStation.mo -AixLib/Utilities/IO/SignalExchange/Examples/package.mo -AixLib/Utilities/IO/SignalExchange/Examples/package.order -AixLib/Utilities/IO/SignalExchange/Overwrite.mo -AixLib/Utilities/IO/SignalExchange/Read.mo -AixLib/Utilities/IO/SignalExchange/SignalTypes/SignalsForKPIs.mo -AixLib/Utilities/IO/SignalExchange/SignalTypes/package.mo -AixLib/Utilities/IO/SignalExchange/SignalTypes/package.order -AixLib/Utilities/IO/SignalExchange/WeatherStation.mo -AixLib/Utilities/IO/SignalExchange/package.mo -AixLib/Utilities/IO/SignalExchange/package.order -AixLib/Utilities/IO/package.mo -AixLib/Utilities/IO/package.order -AixLib/Utilities/Math/Average.mo -AixLib/Utilities/Math/BesselJ0.mo -AixLib/Utilities/Math/BesselJ1.mo -AixLib/Utilities/Math/BesselY0.mo -AixLib/Utilities/Math/BesselY1.mo -AixLib/Utilities/Math/Bicubic.mo -AixLib/Utilities/Math/Binomial.mo -AixLib/Utilities/Math/Biquadratic.mo -AixLib/Utilities/Math/BooleanReplicator.mo -AixLib/Utilities/Math/Examples/Average.mo -AixLib/Utilities/Math/Examples/BesselJ0.mo -AixLib/Utilities/Math/Examples/BesselJ1.mo -AixLib/Utilities/Math/Examples/BesselY0.mo -AixLib/Utilities/Math/Examples/BesselY1.mo -AixLib/Utilities/Math/Examples/Bicubic.mo -AixLib/Utilities/Math/Examples/Binomial.mo -AixLib/Utilities/Math/Examples/Biquadratic.mo -AixLib/Utilities/Math/Examples/BooleanReplicator.mo -AixLib/Utilities/Math/Examples/ExponentialIntegralE1.mo -AixLib/Utilities/Math/Examples/Factorial.mo -AixLib/Utilities/Math/Examples/FallingFactorial.mo -AixLib/Utilities/Math/Examples/IntegerReplicator.mo -AixLib/Utilities/Math/Examples/IntegratorWithReset.mo -AixLib/Utilities/Math/Examples/InverseXRegularized.mo -AixLib/Utilities/Math/Examples/Polynomial.mo -AixLib/Utilities/Math/Examples/PowerLinearized.mo -AixLib/Utilities/Math/Examples/QuadraticLinear.mo -AixLib/Utilities/Math/Examples/RegNonZeroPower.mo -AixLib/Utilities/Math/Examples/SmoothBlocks.mo -AixLib/Utilities/Math/Examples/SmoothExponential.mo -AixLib/Utilities/Math/Examples/SmoothHeaviside.mo -AixLib/Utilities/Math/Examples/SmoothLimit.mo -AixLib/Utilities/Math/Examples/SmoothMin.mo -AixLib/Utilities/Math/Examples/Splice.mo -AixLib/Utilities/Math/Examples/VectorFunctions.mo -AixLib/Utilities/Math/Examples/package.mo -AixLib/Utilities/Math/Examples/package.order -AixLib/Utilities/Math/ExponentialIntegralE1.mo -AixLib/Utilities/Math/Factorial.mo -AixLib/Utilities/Math/FallingFactorial.mo -AixLib/Utilities/Math/Functions/BaseClasses/der_2_regNonZeroPower.mo -AixLib/Utilities/Math/Functions/BaseClasses/der_2_smoothTransition.mo -AixLib/Utilities/Math/Functions/BaseClasses/der_inverseXRegularized.mo -AixLib/Utilities/Math/Functions/BaseClasses/der_regNonZeroPower.mo -AixLib/Utilities/Math/Functions/BaseClasses/der_smoothTransition.mo -AixLib/Utilities/Math/Functions/BaseClasses/der_spliceFunction.mo -AixLib/Utilities/Math/Functions/BaseClasses/package.mo -AixLib/Utilities/Math/Functions/BaseClasses/package.order -AixLib/Utilities/Math/Functions/BaseClasses/smoothTransition.mo -AixLib/Utilities/Math/Functions/Examples/BesselJ0.mo -AixLib/Utilities/Math/Functions/Examples/BesselJ1.mo -AixLib/Utilities/Math/Functions/Examples/BesselY0.mo -AixLib/Utilities/Math/Functions/Examples/BesselY1.mo -AixLib/Utilities/Math/Functions/Examples/Binomial.mo -AixLib/Utilities/Math/Functions/Examples/CubicHermite.mo -AixLib/Utilities/Math/Functions/Examples/ExponentialIntegralE1.mo -AixLib/Utilities/Math/Functions/Examples/Factorial.mo -AixLib/Utilities/Math/Functions/Examples/FallingFactorial.mo -AixLib/Utilities/Math/Functions/Examples/InverseXDerivativeCheck.mo -AixLib/Utilities/Math/Functions/Examples/InverseXDerivative_2_Check.mo -AixLib/Utilities/Math/Functions/Examples/InverseXRegularized.mo -AixLib/Utilities/Math/Functions/Examples/IsMonotonic.mo -AixLib/Utilities/Math/Functions/Examples/Polynomial.mo -AixLib/Utilities/Math/Functions/Examples/PowerLinearized.mo -AixLib/Utilities/Math/Functions/Examples/QuinticHermite.mo -AixLib/Utilities/Math/Functions/Examples/RegNonZeroPower.mo -AixLib/Utilities/Math/Functions/Examples/RegNonZeroPowerDerivativeCheck.mo -AixLib/Utilities/Math/Functions/Examples/RegNonZeroPowerDerivative_2_Check.mo -AixLib/Utilities/Math/Functions/Examples/RegStep.mo -AixLib/Utilities/Math/Functions/Examples/SmoothExponentialDerivativeCheck.mo -AixLib/Utilities/Math/Functions/Examples/SmoothHeavisideDerivatives.mo -AixLib/Utilities/Math/Functions/Examples/SpliceFunction.mo -AixLib/Utilities/Math/Functions/Examples/SpliceFunctionDerivativeCheck.mo -AixLib/Utilities/Math/Functions/Examples/TrapezoidalIntegration.mo -AixLib/Utilities/Math/Functions/Examples/package.mo -AixLib/Utilities/Math/Functions/Examples/package.order -AixLib/Utilities/Math/Functions/average.mo -AixLib/Utilities/Math/Functions/besselJ0.mo -AixLib/Utilities/Math/Functions/besselJ1.mo -AixLib/Utilities/Math/Functions/besselY0.mo -AixLib/Utilities/Math/Functions/besselY1.mo -AixLib/Utilities/Math/Functions/bicubic.mo -AixLib/Utilities/Math/Functions/binomial.mo -AixLib/Utilities/Math/Functions/biquadratic.mo -AixLib/Utilities/Math/Functions/booleanReplicator.mo -AixLib/Utilities/Math/Functions/cubicHermiteLinearExtrapolation.mo -AixLib/Utilities/Math/Functions/exponentialIntegralE1.mo -AixLib/Utilities/Math/Functions/factorial.mo -AixLib/Utilities/Math/Functions/fallingFactorial.mo -AixLib/Utilities/Math/Functions/integerReplicator.mo -AixLib/Utilities/Math/Functions/inverseXRegularized.mo -AixLib/Utilities/Math/Functions/isMonotonic.mo -AixLib/Utilities/Math/Functions/package.mo -AixLib/Utilities/Math/Functions/package.order -AixLib/Utilities/Math/Functions/polynomial.mo -AixLib/Utilities/Math/Functions/powerLinearized.mo -AixLib/Utilities/Math/Functions/quadraticLinear.mo -AixLib/Utilities/Math/Functions/quinticHermite.mo -AixLib/Utilities/Math/Functions/regNonZeroPower.mo -AixLib/Utilities/Math/Functions/regStep.mo -AixLib/Utilities/Math/Functions/smoothExponential.mo -AixLib/Utilities/Math/Functions/smoothHeaviside.mo -AixLib/Utilities/Math/Functions/smoothLimit.mo -AixLib/Utilities/Math/Functions/smoothMax.mo -AixLib/Utilities/Math/Functions/smoothMin.mo -AixLib/Utilities/Math/Functions/spliceFunction.mo -AixLib/Utilities/Math/Functions/splineDerivatives.mo -AixLib/Utilities/Math/Functions/trapezoidalIntegration.mo -AixLib/Utilities/Math/IntegerReplicator.mo -AixLib/Utilities/Math/IntegratorWithReset.mo -AixLib/Utilities/Math/InverseXRegularized.mo -AixLib/Utilities/Math/Max.mo -AixLib/Utilities/Math/Min.mo -AixLib/Utilities/Math/Polynomial.mo -AixLib/Utilities/Math/PowerLinearized.mo -AixLib/Utilities/Math/QuadraticLinear.mo -AixLib/Utilities/Math/RegNonZeroPower.mo -AixLib/Utilities/Math/SmoothExponential.mo -AixLib/Utilities/Math/SmoothHeaviside.mo -AixLib/Utilities/Math/SmoothLimit.mo -AixLib/Utilities/Math/SmoothMax.mo -AixLib/Utilities/Math/SmoothMin.mo -AixLib/Utilities/Math/Splice.mo -AixLib/Utilities/Math/TrapezoidalIntegration.mo -AixLib/Utilities/Math/package.mo -AixLib/Utilities/Math/package.order -AixLib/Utilities/Psychrometrics/BaseClasses/HumidityRatioVaporPressure.mo -AixLib/Utilities/Psychrometrics/BaseClasses/package.mo -AixLib/Utilities/Psychrometrics/BaseClasses/package.order -AixLib/Utilities/Psychrometrics/Constants.mo -AixLib/Utilities/Psychrometrics/Density_pTX.mo -AixLib/Utilities/Psychrometrics/Examples/Density_pTX.mo -AixLib/Utilities/Psychrometrics/Examples/DewPointTemperature.mo -AixLib/Utilities/Psychrometrics/Examples/HumidityRatioPressure.mo -AixLib/Utilities/Psychrometrics/Examples/MassFraction_pTphi.mo -AixLib/Utilities/Psychrometrics/Examples/Phi_pTX.mo -AixLib/Utilities/Psychrometrics/Examples/SaturationPressure.mo -AixLib/Utilities/Psychrometrics/Examples/SaturationPressureLiquid.mo -AixLib/Utilities/Psychrometrics/Examples/SublimationPressureIce.mo -AixLib/Utilities/Psychrometrics/Examples/TWetBul_TDryBulPhi.mo -AixLib/Utilities/Psychrometrics/Examples/TWetBul_TDryBulXi.mo -AixLib/Utilities/Psychrometrics/Examples/TotalAirDryAir.mo -AixLib/Utilities/Psychrometrics/Examples/package.mo -AixLib/Utilities/Psychrometrics/Examples/package.order -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/Examples/DewPointTemperatureDerivativeCheck.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/Examples/DewPointTemperatureDerivativeCheck_amb.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/Examples/InverseDewPointTemperatureDerivativeCheck_amb.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/Examples/SaturationPressureDerivativeCheck.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/Examples/WaterVaporPressureDerivativeCheck.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/Examples/package.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/Examples/package.order -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/der_TDewPoi_pW_amb.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/der_pW_TDewPoi.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/der_pW_TDewPoi_amb.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/der_pW_X.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/der_saturationPressureLiquid.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/der_sublimationPressureIce.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/package.mo -AixLib/Utilities/Psychrometrics/Functions/BaseClasses/package.order -AixLib/Utilities/Psychrometrics/Functions/Examples/Density_pTX.mo -AixLib/Utilities/Psychrometrics/Functions/Examples/SaturationPressure.mo -AixLib/Utilities/Psychrometrics/Functions/Examples/X_pSatpphi.mo -AixLib/Utilities/Psychrometrics/Functions/Examples/pW_TDewPoi.mo -AixLib/Utilities/Psychrometrics/Functions/Examples/pW_TDewPoi_comparison.mo -AixLib/Utilities/Psychrometrics/Functions/Examples/pW_X.mo -AixLib/Utilities/Psychrometrics/Functions/Examples/package.mo -AixLib/Utilities/Psychrometrics/Functions/Examples/package.order -AixLib/Utilities/Psychrometrics/Functions/Examples/phi_pTX.mo -AixLib/Utilities/Psychrometrics/Functions/TDewPoi_pW.mo -AixLib/Utilities/Psychrometrics/Functions/TDewPoi_pW_amb.mo -AixLib/Utilities/Psychrometrics/Functions/X_pSatpphi.mo -AixLib/Utilities/Psychrometrics/Functions/X_pTphi.mo -AixLib/Utilities/Psychrometrics/Functions/X_pW.mo -AixLib/Utilities/Psychrometrics/Functions/density_pTX.mo -AixLib/Utilities/Psychrometrics/Functions/pW_TDewPoi.mo -AixLib/Utilities/Psychrometrics/Functions/pW_TDewPoi_amb.mo -AixLib/Utilities/Psychrometrics/Functions/pW_X.mo -AixLib/Utilities/Psychrometrics/Functions/package.mo -AixLib/Utilities/Psychrometrics/Functions/package.order -AixLib/Utilities/Psychrometrics/Functions/phi_pTX.mo -AixLib/Utilities/Psychrometrics/Functions/saturationPressure.mo -AixLib/Utilities/Psychrometrics/Functions/saturationPressureLiquid.mo -AixLib/Utilities/Psychrometrics/Functions/sublimationPressureIce.mo -AixLib/Utilities/Psychrometrics/Phi_pTX.mo -AixLib/Utilities/Psychrometrics/SaturationPressure.mo -AixLib/Utilities/Psychrometrics/SaturationPressureLiquid.mo -AixLib/Utilities/Psychrometrics/SublimationPressureIce.mo -AixLib/Utilities/Psychrometrics/TDewPoi_pW.mo -AixLib/Utilities/Psychrometrics/TWetBul_TDryBulPhi.mo -AixLib/Utilities/Psychrometrics/TWetBul_TDryBulXi.mo -AixLib/Utilities/Psychrometrics/ToDryAir.mo -AixLib/Utilities/Psychrometrics/ToTotalAir.mo -AixLib/Utilities/Psychrometrics/X_pTphi.mo -AixLib/Utilities/Psychrometrics/X_pW.mo -AixLib/Utilities/Psychrometrics/hSat_pTSat.mo -AixLib/Utilities/Psychrometrics/pW_TDewPoi.mo -AixLib/Utilities/Psychrometrics/pW_X.mo -AixLib/Utilities/Psychrometrics/package.mo -AixLib/Utilities/Psychrometrics/package.order -AixLib/Utilities/Time/CalendarTime.mo -AixLib/Utilities/Time/Examples/CalendarTime.mo -AixLib/Utilities/Time/Examples/ModelTime.mo -AixLib/Utilities/Time/Examples/package.mo -AixLib/Utilities/Time/Examples/package.order -AixLib/Utilities/Time/ModelTime.mo -AixLib/Utilities/Time/Types/ZeroTime.mo -AixLib/Utilities/Time/Types/package.mo -AixLib/Utilities/Time/Types/package.order -AixLib/Utilities/Time/Validation/CalendarTimeMonths.mo -AixLib/Utilities/Time/Validation/CalendarTimeMonthsMinus.mo -AixLib/Utilities/Time/Validation/CalendarTimeMonthsPlus.mo -AixLib/Utilities/Time/Validation/package.mo -AixLib/Utilities/Time/Validation/package.order -AixLib/Utilities/Time/package.mo -AixLib/Utilities/Time/package.order -AixLib/Utilities/package.mo -AixLib/Utilities/package.order -AixLib/package.order diff --git a/AixLib/Fluid/Pools/BaseClasses.mo b/AixLib/Fluid/Pools/BaseClasses.mo deleted file mode 100644 index ad2d09fcad..0000000000 --- a/AixLib/Fluid/Pools/BaseClasses.mo +++ /dev/null @@ -1,255 +0,0 @@ -within AixLib.Fluid.Pools; -package BaseClasses - extends Modelica.Icons.BasesPackage; - - model HeatTransferConduction - "Heat transfer due to conduction through pool walls" - parameter Modelica.Units.SI.Area AInnerPoolWall; - parameter Modelica.Units.SI.Area APoolWallWithEarthContact; - parameter Modelica.Units.SI.Area APoolFloorWithEarthContact; - parameter Modelica.Units.SI.Area AInnerPoolFloor; - - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical; - - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter - "Generate Heat Flow for earth contact" annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=180, - origin={74,-28}))); - - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport_a - "Inlet for heattransfer" annotation (Placement(transformation(extent={{-116, - -14},{-90,12}}), - iconTransformation(extent={{-116,-14},{-90,12}}))); - - Modelica.Blocks.Interfaces.RealInput TSoil "Temperature of Soil" annotation (Placement(transformation(extent={{130,-48}, - {90,-8}}), - iconTransformation(extent={{126,16},{86,56}}))); - - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - InnerPoolFloor( - A=AInnerPoolFloor, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-10,-34},{18,-10}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( - hCon_const=hConWaterHorizontal, - A=AInnerPoolFloor, - calcMethod=3, - surfaceOrientation=1) - annotation (Placement(transformation( - origin={-48,-22}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( - hCon_const=hConWaterVertical, - A=APoolWallWithEarthContact, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-54,40}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - PoolWallWithEarthContact( - A=APoolWallWithEarthContact, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-6,26},{22,54}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( - hCon_const=hConWaterHorizontal, - A=APoolFloorWithEarthContact, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-52,-60}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - PoolFloorWithEarthContact( - A=APoolFloorWithEarthContact, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-10,-72},{14,-50}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow - prescribedHeatFlow1 "Generate Heat Flow for earth contact" - annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=180, - origin={44,12}))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - InnerPoolWall( - A=AInnerPoolWall, - wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-6,64},{22,92}}))); - Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) - "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" - annotation (Placement(transformation(extent={{96,2},{76,22}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( - hCon_const=hConWaterVertical, - A=AInnerPoolWall, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-54,78}, - extent={{-10,-10},{10,10}}, - rotation=180))); - replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall - annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); - equation - connect(HeatFlowOuter.T, TSoil) - annotation (Line(points={{81.2,-28},{110,-28}}, color={0,0,127})); - connect(heatport_a, heatport_a) - annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) - annotation (Line(points={{-38,-22},{-10,-22}}, color={191,0,0})); - connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( - Line(points={{14,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); - connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) - annotation (Line(points={{-10,-61},{-10,-60},{-42,-60}}, color={191,0,0})); - connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{22,78},{30,78},{30,12},{38,12}}, color={191,0,0})); - connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( - points={{-64,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( - points={{-58,-22},{-72,-22},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( - points={{-62,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) - annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); - connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( - points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); - connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{18,-22},{30,-22},{30,12},{38,12}}, color={191,0,0})); - connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) - annotation (Line(points={{-44,40},{-6,40}}, color={191,0,0})); - connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( - Line(points={{-6,78},{-44,78}}, color={191,0,0})); - connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( - points={{-64,78},{-72,78},{-72,-1},{-103,-1}},color={191,0,0})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-80,58},{28,-26}}, - lineColor={28,108,200}, - fillColor={28,108,200}, - fillPattern=FillPattern.Solid), - Rectangle( - extent={{28,68},{48,-46}}, - lineColor={135,135,135}, - fillColor={175,175,175}, - fillPattern=FillPattern.Forward), - Rectangle( - extent={{-86,-26},{30,-46}}, - lineColor={135,135,135}, - fillColor={175,175,175}, - fillPattern=FillPattern.Forward), - Polygon( - points={{-16,-10},{-4,6},{58,-52},{46,-62},{-16,-10}}, - lineColor={238,46,47}, - fillColor={238,46,47}, - fillPattern=FillPattern.Solid), - Polygon( - points={{32,-68},{36,-66},{62,-38},{76,-78},{32,-68}}, - lineColor={238,46,47}, - fillColor={238,46,47}, - fillPattern=FillPattern.Solid), - Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0})}), - Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -

This model is a base model to calculate the heat transfer through pool walls. The pool walls are sorted by: vertical walls with earth contact, pool floor with earth contact and the sum of walls and pool floor without earth contact.

-")); - end HeatTransferConduction; - - model waveMachine "Calculate energy demands of a wave machine" - - parameter Modelica.Units.SI.Length h_wave "Height of generated wave"; - parameter Modelica.Units.SI.Length w_wave - "Width of wave machine outlet/of generated wave"; - parameter Modelica.Units.SI.Time wavePool_startTime - "Start time of first wave cycle"; - parameter Modelica.Units.SI.Time wavePool_period "Time of cycling period"; - parameter Real wavePool_width "Length of wave generation within cycling period"; - - Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) - "If input = 1, then true, else no waves generated" - annotation (Placement(transformation(extent={{-58,-8},{-42,8}}))); - Modelica.Blocks.Tables.CombiTable1Dv tablePWave( - y(unit="W/m"), - tableOnFile=false, - table=[0,0; 0.7,3500; 0.9,6000; 1.3,12000], - extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) - "Estimate consumed power per width to generate wave of a certain heigth; " - annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); - Modelica.Blocks.Sources.RealExpression get_h_wave(y=h_wave) - "Get height of generated wave" - annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); - Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" - annotation (Placement(transformation(extent={{-136,-20},{-96,20}}))); - Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") - "Power consumption of wave machine" - annotation (Placement(transformation(extent={{96,-10},{116,10}}))); - Modelica.Blocks.Math.Gain multiply(k=w_wave) "Multply by width of wave" - annotation (Placement(transformation(extent={{0,52},{16,68}}))); - Modelica.Blocks.Sources.Constant zero(k=0) - "no output if wave machine is off" - annotation (Placement(transformation(extent={{-14,-78},{0,-64}}))); - Modelica.Blocks.Logical.Switch switchWaveMachine - annotation (Placement(transformation(extent={{60,-10},{80,10}}))); - Modelica.Blocks.Logical.And and1 - annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); - Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( - width=wavePool_width, - period=wavePool_period, - startTime=wavePool_startTime) - annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); - equation - connect(get_h_wave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, - 60}}, color={0,0,127})); - connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, - color={0,0,127})); - connect(open, useWavePool.u) - annotation (Line(points={{-116,0},{-59.6,0}}, color={0,0,127})); - connect(switchWaveMachine.y, PWaveMachine) annotation (Line(points={{81,0},{ - 106,0}}, color={0,0,127})); - connect(multiply.y, switchWaveMachine.u1) - annotation (Line(points={{16.8,60},{42,60},{42,8},{58,8}}, - color={0,0,127})); - connect(zero.y, switchWaveMachine.u3) annotation (Line(points={{0.7,-71},{52,-71}, - {52,-8},{58,-8}}, color={0,0,127})); - connect(PWaveMachine, PWaveMachine) annotation (Line( - points={{106,0},{101,0},{101,0},{106,0}}, - color={0,0,127}, - smooth=Smooth.Bezier)); - connect(useWavePool.y, and1.u1) - annotation (Line(points={{-41.2,0},{-10,0}}, color={255,0,255})); - connect(and1.y, switchWaveMachine.u2) - annotation (Line(points={{13,0},{58,0}}, color={255,0,255})); - connect(wavePoolCycle.y, and1.u2) annotation (Line(points={{-39,-40},{-24,-40}, - {-24,-8},{-10,-8}}, color={255,0,255})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}), - Line( - points={{-98,0},{-52,62},{-2,-24},{50,60},{100,-2}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1), - Line( - points={{-98,-18},{-52,44},{-2,-42},{50,42},{98,-20}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1), - Line( - points={{-98,-36},{-52,26},{-2,-60},{50,24},{96,-36}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1)}), Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -

Model to calculate the energy demand of a wavemachine. Based on values of:

-
    -
  • German Association for the Recreational and Medicinal Bath Industry (Deutsche Gesellschaft für das Badewesen DGfdB), April 2015 : Richtlinien für den Bäderbau
  • -
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • -
-")); - end waveMachine; -end BaseClasses; diff --git a/AixLib/Fluid/Pools/Example.mo b/AixLib/Fluid/Pools/Example.mo deleted file mode 100644 index c02b775c4a..0000000000 --- a/AixLib/Fluid/Pools/Example.mo +++ /dev/null @@ -1,88 +0,0 @@ -within AixLib.Fluid.Pools; -package Example - extends Modelica.Icons.ExamplesPackage; - - model IndoorSwimmingPool - extends Modelica.Icons.Example; - Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater - "Flow rate of added fresh water to the pool and water treatment system" - annotation (Placement(transformation(extent={{98,-96},{126,-68}}), - iconTransformation(extent={{98,-96},{126,-68}}))); - .AixLib.Fluid.Pools.IndoorSwimmingPool indoorSwimming(poolParam= - AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool(), - redeclare package WaterMedium = WaterMedium) - annotation (Placement(transformation(extent={{-38,-36},{30,38}}))); - - replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); - - Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) - annotation (Placement(transformation(extent={{96,44},{80,60}}))); - Modelica.Blocks.Sources.RealExpression X_W(y=14.3) - annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); - Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) - annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); - Modelica.Blocks.Sources.Pulse pulse( - amplitude=1, - width=13/15, - period=(24 - 7)*3600, - offset=0, - startTime=3600*7) - annotation (Placement(transformation(extent={{-94,-50},{-80,-36}}))); - Modelica.Blocks.Sources.Trapezoid Person( - amplitude=0.5, - rising=7*3600, - width=1*3600, - falling=7*3600, - period=17*3600, - offset=0.3, - startTime=7*3600) - annotation (Placement(transformation(extent={{-96,-16},{-80,0}}))); - Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( - transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ - {-86,16},{-118,48}}))); - Modelica.Blocks.Interfaces.RealOutput PPool - "Output eletric energy needed for pool operation" annotation (Placement( - transformation(extent={{98,-62},{124,-36}}),iconTransformation(extent={{98,-62}, - {124,-36}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature - prescribedTemperature - annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); - Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" - annotation (Placement(transformation(extent={{98,8},{118,28}}))); - Modelica.Blocks.Interfaces.RealOutput QPool - "Heat flow rate to maintain the pool at the set temperature" annotation ( - Placement(transformation(extent={{98,-20},{122,4}}), iconTransformation( - extent={{98,-20},{122,4}}))); - equation - connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52},{ - 40,52},{40,18.39},{31.02,18.39}}, - color={0,0,127})); - connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-13.86,39.11},{-12, - 39.11},{-12,62},{-69.2,62}}, color={0,0,127})); - connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-26.78,39.11}, - {-26.78,80},{-69.2,80}}, color={0,0,127})); - connect(pulse.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, - -43},{-50,-43},{-50,-20.46},{-40.04,-20.46}}, color={0,0,127})); - connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.2,-8}, - {-48,-8},{-48,-8.25},{-39.7,-8.25}}, color={0,0,127})); - connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-39.36,21.72},{ - -39.36,22},{-66,22},{-66,32},{-102,32}}, color={0,0,127})); - connect(indoorSwimming.PPool, PPool) annotation (Line(points={{32.72,-27.12}, - {32.72,-26},{96,-26},{96,-49},{111,-49}}, color={0,0,127})); - connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( - points={{32.72,-33.04},{32.72,-82},{112,-82}}, color={0,0,127})); - connect(prescribedTemperature.T, T_Air.y) - annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); - connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) - annotation (Line(points={{-4,80},{21.16,80},{21.16,39.48}}, color={191,0,0})); - connect(indoorSwimming.T_Pool, T_Pool) annotation (Line(points={{32.72,6.92}, - {92,6.92},{92,18},{108,18}}, color={0,0,127})); - connect(MFlowFreshWater, MFlowFreshWater) - annotation (Line(points={{112,-82},{112,-82}}, color={0,0,127})); - connect(indoorSwimming.QPool, QPool) annotation (Line(points={{32.72,-1.22}, - {32.72,0},{92,0},{92,-8},{110,-8}}, color={0,0,127})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=1080000, __Dymola_Algorithm="Dassl")); - end IndoorSwimmingPool; -end Example; diff --git a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo deleted file mode 100644 index f17823024e..0000000000 --- a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo +++ /dev/null @@ -1,545 +0,0 @@ -within AixLib.Fluid.Pools; -model IndoorSwimmingPool - parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord poolParam - "Choose setup for this pool" annotation (choicesAllMatching=true); - - replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); - - // Water transfer coefficients according to VDI 2089 Blatt 1 - parameter Real beta_nonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); - parameter Real beta_cover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" - annotation (Dialog(group="Water transfer coefficients")); - parameter Real beta_wavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" - annotation (Dialog(group="Water transfer coefficients")); - - // Parameter and variables for evaporation - constant Modelica.Units.SI.SpecificHeatCapacity R_D=461.52 - "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) - final parameter Modelica.Units.SI.SpecificEnergy h_vapor= - AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.T_pool) - "Latent heat of evaporating water"; - Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) - "mass flow rate between pool water and air due to evaporation"; - Modelica.Units.SI.Pressure psat_T_pool= - Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( - poolWater.T) "Saturation pressure at pool temperature"; - Modelica.Units.SI.Pressure psat_T_Air= - Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( - TAir) "Saturation pressure at air temperature"; - Real phi "Relative humidity"; - - // Pump - parameter Modelica.Units.SI.Pressure pumpHead=170000 - "Expected average flow resistance of water cycle"; - - // Pool circulation flow rate - final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= - poolParam.V_flow_nominal*rhoWater_default - "Nominal circulation mass flow rate to the pool"; - final parameter Modelica.Units.SI.MassFlowRate m_flow_partial= - poolParam.V_flow_partial*rhoWater_default - "Partial circulation mass flow rate to pool during non operating hours"; - Modelica.Units.SI.MassFlowRate m_flow_toPool(start=0.0) - "Actual circulation mass flow rate to the pool"; - - // Fresh water and water recycling - final parameter Modelica.Units.SI.Efficiency eps=if poolParam.use_HRS then - poolParam.efficiencyHRS else 0; - Modelica.Units.SI.MassFlowRate m_flow_freshWater(start=0.0) - "Mass flow of fresh water supplied to pool circulation system"; - - // Convection and Radiation at pool water surface - parameter Modelica.Units.SI.CoefficientOfHeatTransfer alpha_Air=3.5 - "Coefficient of heat transfer between the water surface and the room air"; - // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area - parameter Real epsilon = 0.9*0.95 - "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; - - AixLib.Fluid.MixingVolumes.MixingVolume Storage( - redeclare package Medium = WaterMedium, - T_start=poolParam.T_pool, - m_flow_nominal=m_flow_nominal, - V=poolParam.V_storage, - nPorts=4) annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); - - AixLib.Fluid.Sources.Boundary_pT Sinc( - redeclare package Medium = WaterMedium, nPorts=1) - annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); - AixLib.Fluid.MixingVolumes.MixingVolume poolWater( - redeclare package Medium = WaterMedium, - T_start=poolParam.T_pool, - m_flow_nominal=m_flow_nominal, - V=poolParam.V_pool, - nPorts=3) - annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); - - Modelica.Blocks.Sources.RealExpression PoolWater(y=m_flow_toPool) - annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); - Modelica.Blocks.Interfaces.RealOutput QPool if poolParam.use_idealHeater - "Heat flow rate to maintain the pool at the set temperature" annotation ( - Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( - extent={{98,-16},{118,4}}))); - - AixLib.Fluid.Movers.BaseClasses.IdealSource Evaporation( - redeclare package Medium = WaterMedium, - m_flow_small=0.00001, - control_m_flow=true) annotation (Placement(transformation( - extent={{6,-6},{-6,6}}, - rotation=0, - origin={-30,26}))); - Modelica.Blocks.Sources.RealExpression m_Eavporation(y=m_flow_evap) - annotation (Placement(transformation(extent={{9,-9},{-9,9}}, - rotation=180, - origin={-81,41}))); - AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( - redeclare package Medium1 = WaterMedium, - redeclare package Medium2 = WaterMedium, - m1_flow_nominal=poolParam.m_flow_out*1.5, - m2_flow_nominal=poolParam.m_flow_out, - dp1_nominal(displayUnit="bar") = 100000, - dp2_nominal(displayUnit="bar") = 100000, - eps=eps) - annotation (Placement(transformation( - extent={{-5,-5},{5,5}}, - rotation=90, - origin={-33,-73}))); - Modelica.Blocks.Interfaces.RealInput openingHours - "Input profile for opening hours" - annotation (Placement(transformation(extent={{-118,-70},{-94,-46}}), - iconTransformation(extent={{-118,-70},{-94,-46}}))); - Modelica.Blocks.Interfaces.RealInput persons "Input profile for persons" - annotation (Placement(transformation(extent={{-118,-38},{-92,-12}}), - iconTransformation(extent={{-118,-38},{-92,-12}}))); - - Modelica.Blocks.Interfaces.RealInput TAir( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") "Temperature of the surrounding room air" annotation ( - Placement(transformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-67,103}),iconTransformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-67,103}))); - Modelica.Blocks.Interfaces.RealInput X_w "Absolute humidty of the room Air" annotation (Placement(transformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-29,103}), iconTransformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-29,103}))); - - AixLib.ThermalZones.ReducedOrder.Multizone.BaseClasses.AbsToRelHum absToRelHum - "Calculation of the relative humidity of the room air " annotation (Placement(transformation( - extent={{-5,-5},{5,5}}, - rotation=-90, - origin={-59,77}))); - - Modelica.Blocks.Sources.RealExpression FreshWater(y=m_flow_freshWater) annotation (Placement(transformation(extent={{-62,-78}, - {-48,-62}}))); - - AixLib.Fluid.Sources.Boundary_pT SincEvaporation( - redeclare package Medium = WaterMedium, nPorts=1) annotation (Placement(transformation(extent={{6,-6},{ - -6,6}}, - rotation=180, - origin={-64,26}))); - - Modelica.Fluid.Interfaces.FluidPort_b fromPool(redeclare package Medium = - WaterMedium) if poolParam.use_idealHeater == false - "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" - annotation (Placement(transformation(extent={{90,-64},{110,-44}}), - iconTransformation(extent={{90,-64},{110,-44}}))); - - Modelica.Fluid.Interfaces.FluidPort_a toPool(redeclare package Medium = - WaterMedium) if poolParam.use_idealHeater == false - "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" - annotation (Placement(transformation(extent={{90,-40},{110,-20}}), - iconTransformation(extent={{90,-40},{110,-20}}))); - - .AixLib.Fluid.Pools.BaseClasses.waveMachine waveMachine( - h_wave=poolParam.h_wave, - w_wave=poolParam.w_wave, - wavePool_startTime=poolParam.wavePool_startTime, - wavePool_period=poolParam.wavePool_period, - wavePool_width=poolParam.wavePool_width) if poolParam.use_wavePool - annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); - - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPoolSurface - "Air Temperature in Zone" annotation (Placement(transformation(extent={{56,86}, - {80,110}}), - iconTransformation(extent={{64,94},{84,114}}))); - - AixLib.Utilities.Interfaces.RadPort radPoolSurface - "Mean Radiation Temperature of surrounding walls" annotation (Placement( - transformation( - extent={{-8,-9},{8,9}}, - rotation=-90, - origin={39,100}), iconTransformation( - extent={{-11,-11},{11,11}}, - rotation=-90, - origin={30,100}))); - - Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( - final Gr=epsilon*poolParam.A_pool) - "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( - extent={{-7,-7},{7,7}}, - rotation=90, - origin={39,73}))); - - Modelica.Thermal.HeatTransfer.Components.Convection convWaterSurface - "Convection at the watersurface" annotation (Placement(transformation( - extent={{-7,7},{7,-7}}, - rotation=90, - origin={67,75}))); - - Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=alpha_Air*poolParam.A_pool) - "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, - {82,84}}))); - - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, - {12,68}}))); - - Modelica.Blocks.Math.Gain hEvapLatentHeatGain(final k=h_vapor) - "Calculation of heat flow rate due to evaporation" annotation (Placement( - transformation( - extent={{-4,-4},{4,4}}, - rotation=0, - origin={-44,52}))); - - Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater - "Flow rate of added fresh water to the pool and water treatment system" annotation (Placement(transformation(extent={{98,-102}, - {118,-82}}), - iconTransformation(extent={{98,-102},{118,-82}}))); - - AixLib.Fluid.Pools.BaseClasses.HeatTransferConduction heatTransferConduction( - AInnerPoolWall=poolParam.AInnerPoolWall, - APoolWallWithEarthContact=poolParam.APoolWallWithEarthContact, - APoolFloorWithEarthContact=poolParam.APoolFloorWithEarthContact, - AInnerPoolFloor=poolParam.AInnerPoolFloor, - hConWaterHorizontal=poolParam.hConWaterHorizontal, - hConWaterVertical=poolParam.hConWaterVertical, - PoolWall=poolParam.PoolWallParam) - "Model to depict the heat flow rate through the pool walls to the bordering room/soil" - annotation (Placement(transformation(extent={{64,32},{80,48}}))); - - Modelica.Blocks.Math.Gain minus1Gain(final k=-1) annotation (Placement( - transformation( - extent={{-4,-4},{4,4}}, - rotation=0, - origin={-20,60}))); - - Modelica.Blocks.Interfaces.RealOutput QEvap(final quantity="HeatFlowRate", - final unit="W") - "Heat needed to compensate losses" annotation (Placement(transformation(extent={{-92,46}, - {-122,76}}), - iconTransformation(extent={{-94,46},{-114,66}}))); - - Modelica.Blocks.Interfaces.RealInput TSoil( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") "Temperature of Soil" annotation (Placement( - transformation( - extent={{-13,-13},{13,13}}, - rotation=180, - origin={105,49}), iconTransformation( - extent={{-11,-11},{11,11}}, - rotation=180, - origin={103,47}))); - - Modelica.Blocks.Interfaces.RealOutput PPool( - final quantity="Power", - final unit="W") - "Output eletric energy needed for pool operation" annotation (Placement(transformation(extent={{98,-86}, - {118,-66}}), - iconTransformation(extent={{98,-86},{118,-66}}))); - - Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavePool then 2 else 1) - "Add electric power of pump and the optional wave pool" - annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); - Sources.MassFlowSource_T boundary( - redeclare package Medium = WaterMedium, - use_m_flow_in=true, - T=283.15, - nPorts=1) - annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); - Modelica.Blocks.Sources.RealExpression ReadPoolTemp(y=poolWater.T) - annotation (Placement(transformation( - extent={{10,-10},{-10,10}}, - rotation=180, - origin={72,16}))); - Modelica.Blocks.Interfaces.RealOutput T_Pool "Value of Real output" - annotation (Placement(transformation(extent={{98,6},{118,26}}), - iconTransformation(extent={{98,6},{118,26}}))); - - final parameter Modelica.Units.SI.Density rhoWater_default= - WaterMedium.density_pTX( - p=WaterMedium.p_default, - T=273.15 + 30, - X=WaterMedium.X_default) "Default medium density"; - - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater - annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); - Controls.Continuous.LimPID PI( - k=1000, - yMax=100000000, - yMin=0, - controllerType=Modelica.Blocks.Types.SimpleController.PI, - Ti=5, - Td=0.1) annotation(Placement(transformation(extent={{-4,-4}, - {4,4}}, - rotation=180, - origin={66,-16}))); - Modelica.Blocks.Sources.RealExpression SetTemperature(y=poolParam.T_pool) - if poolParam.use_idealHeater - annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); - Controls.Continuous.LimPID PI1( - controllerType=Modelica.Blocks.Types.SimpleController.PI, - k=0.1, - Ti=5, - yMax=m_flow_nominal/0.9, - yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); - Movers.FlowControlled_m_flow CirculationPump( - redeclare package Medium = WaterMedium, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - T_start=poolParam.T_pool, - allowFlowReversal=false, - m_flow_nominal=m_flow_nominal, - redeclare Movers.Data.Generic per, - inputType=AixLib.Fluid.Types.InputType.Continuous, - addPowerToMedium=false, - nominalValuesDefineDefaultPressureCurve=true, - dp_nominal=pumpHead, - m_flow_start=m_flow_nominal) - annotation (Placement(transformation(extent={{-8,-8},{8,8}}, - rotation=0, - origin={0,-68}))); - Sensors.MassFlowRate senMasFlo(redeclare package Medium = - WaterMedium, allowFlowReversal=false) - annotation (Placement(transformation(extent={{-6,-6},{6,6}}, - rotation=0, - origin={22,-68}))); - FixedResistances.PressureDrop res( - redeclare package Medium = WaterMedium, - allowFlowReversal=false, - m_flow_nominal=m_flow_nominal, - show_T=false, - from_dp=false, - dp_nominal=pumpHead - poolParam.dpHeatExchangerPool, - homotopyInitialization=true, - linearized=false, - deltaM=0.3) - annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); -equation - // Fresh water and water recycling - if poolParam.use_waterRecycling then - m_flow_freshWater=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); - else - m_flow_freshWater=poolParam.m_flow_out + m_flow_evap; - end if; - - // Pool circulation flow rate - if poolParam.use_partialLoad then - if openingHours > 0 then - m_flow_toPool = m_flow_nominal; - else - m_flow_toPool = m_flow_partial; - end if; - else - m_flow_toPool = m_flow_nominal; - end if; - - // Evaporation according to VDI 2089 sheet 1, formula (1) - phi=absToRelHum.relHum; - if psat_T_pool-phi*psat_T_Air<0 then - m_flow_evap=0.0; - else - if openingHours > 0 then - if persons > 0 then - m_flow_evap =persons*(poolParam.beta_inUse/(R_D*0.5*(poolWater.T + - TAir))*(psat_T_pool - phi*psat_T_Air)*poolParam.A_pool); - else - m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; - end if; - else - if poolParam.use_poolCover then - m_flow_evap = beta_cover /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; - else - m_flow_evap = beta_nonUse /(R_D*0.5*(poolWater.T + TAir))*(psat_T_pool-phi*psat_T_Air)*poolParam.A_pool; - end if; - end if; - end if; - - if poolParam.use_idealHeater then - connect(res.port_b, poolWater.ports[1]) annotation (Line(points={{44,-68}, - {54,-68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, - color={0,127,255})); - else - connect(poolWater.ports[1], toPool) annotation (Line( - points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, - color={0,127,255}, - pattern=LinePattern.Dash)); - connect(fromPool, res.port_b) annotation (Line( - points={{100,-54},{78,-54},{78,-68},{44,-68}}, - color={0,127,255}, - pattern=LinePattern.Dash)); - end if; - - connect(poolWater.ports[3], Evaporation.port_a) annotation (Line(points={{2.66667, - -10},{2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); - - connect(Storage.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, - -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); - connect(Storage.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, - -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); - connect(Storage.ports[4], CirculationPump.port_a) annotation (Line(points={{-26.5, - -56},{-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); - connect(Storage.ports[1], poolWater.ports[2]) annotation (Line(points={{-29.5, - -56},{-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127, - 255})); - - connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, - {-62,88},{-67,88},{-67,103}},color={0,0,127})); - connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, - {-56,88},{-29,88},{-29,103}}, color={0,0,127})); - connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, - {-30,-88},{22,-88}}, color={0,127,255})); - connect(Evaporation.port_b, SincEvaporation.ports[1]) - annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); - connect(m_Eavporation.y, Evaporation.m_flow_in) annotation (Line(points={{-71.1, - 41},{-26.4,41},{-26.4,30.8}}, color={0,0,127})); - connect(radWaterSurface.port_b, radPoolSurface) annotation (Line(points={{39,80}, - {39,100}}, color={191,0,0})); - connect(convWaterSurface.fluid, convPoolSurface) annotation (Line(points={{67,82}, - {68,82},{68,98}}, color={191,0,0})); - connect(convWaterSurface.solid, poolWater.heatPort) annotation (Line(points={{67,68}, - {66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); - connect(radWaterSurface.port_a, poolWater.heatPort) annotation (Line(points={{39,66}, - {38,66},{38,0},{14,0}}, color={191,0,0})); - connect(preHeatFlowEvapLoss.port, poolWater.heatPort) annotation (Line(points={{12,60}, - {26,60},{26,0},{14,0}}, color={191,0,0})); - connect(m_Eavporation.y, hEvapLatentHeatGain.u) annotation (Line(points={{-71.1, - 41},{-58,41},{-58,52},{-48.8,52}}, - color={0,0,127})); - connect(heatTransferConduction.heatport_a, poolWater.heatPort) annotation ( - Line(points={{63.76,39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); - connect(hEvapLatentHeatGain.y, minus1Gain.u) annotation (Line(points={{-39.6, - 52},{-34,52},{-34,60},{-24.8,60}}, color={0,0,127})); - connect(hEvapLatentHeatGain.y, QEvap) annotation (Line(points={{-39.6,52},{-34, - 52},{-34,61},{-107,61}}, color={0,0,127})); - connect(heatTransferConduction.TSoil, TSoil) annotation (Line(points={{80.48,42.88}, - {82,42.88},{82,49},{105,49}}, color={0,0,127})); - connect(convPoolSurface, convPoolSurface) annotation (Line(points={{68,98},{68, - 98}}, color={191,0,0})); - connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, - {74,75}}, color={0,0,127})); - connect(minus1Gain.y, preHeatFlowEvapLoss.Q_flow) annotation (Line(points={{-15.6, - 60},{-4,60}}, color={0,0,127})); - - connect(boundary.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, - {-40,-78},{-36,-78}}, color={0,127, - 255})); - connect(waveMachine.open, openingHours) annotation (Line(points={{-93.28,-87}, - {-98,-87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, - color={0,0,127})); - connect(ReadPoolTemp.y, T_Pool) - annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); - - connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, - {54,-12},{48,-12}}, color={0,0,127})); - connect(idealHeater.port, poolWater.heatPort) annotation (Line(points={{32,-12}, - {24,-12},{24,0},{14,0}}, color={191,0,0})); - connect(SetTemperature.y, PI.u_s) - annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); - connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, - -16}}, color={0,0,127})); - connect(boundary.m_flow_in, FreshWater.y) annotation (Line(points={{-53.2,-83.2}, - {-60,-83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); - connect(FreshWater.y, MFlowFreshWater) annotation (Line(points={{-47.3,-70},{-42, - -70},{-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, - color={0,0,127})); - connect(Evaporation.port_b, Evaporation.port_a) annotation (Line( - points={{-36,26},{-30,26},{-24,26}}, - color={0,127,255}, - smooth=Smooth.Bezier)); - connect(CirculationPump.port_b, senMasFlo.port_a) - annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); - connect(senMasFlo.port_b, res.port_a) - annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); - connect(PI1.y, CirculationPump.m_flow_in) - annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); - connect(PI1.u_s, PoolWater.y) - annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); - connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, - {13,-58},{13,-55}}, color={0,0,127})); - - connect(elPower.u[1], CirculationPump.P) annotation (Line(points={{72,-76},{62, - -76},{62,-60.8},{8.8,-60.8}}, color={0,0,127})); - connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); - connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, - -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, - color={0,0,127})); - - connect(PI.u_m, ReadPoolTemp.y) annotation (Line(points={{66,-11.2},{66,4},{92, - 4},{92,16},{83,16}}, color={0,0,127})); - annotation (Line( - points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), - Line(points={{18.4,-40}, - {18,-40},{18,-44},{-100,-44}}, color={0,127,255}), - Placement(transformation( - extent={{-20,-20},{20,20}}, - rotation=-90, - origin={-50,82}), iconTransformation( - extent={{-20,-20},{20,20}}, - rotation=-90, - origin={-60,80})), - Icon(coordinateSystem(preserveAspectRatio=false), - graphics={ - Rectangle( - extent={{98,98},{-98,-98}}, - fillColor={215,215,215}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Bitmap(extent={{-94,-150},{96,58}}, fileName="modelica://AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg")}), - Diagram(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-100,2},{100,100}}, - lineColor={0,128,255}, - fillColor={170,213,255}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Text( - extent={{-98,12},{-6,0}}, - textColor={85,85,255}, - textStyle={TextStyle.Bold}, - horizontalAlignment=TextAlignment.Left, - textString="Heat and mass exchange -at pool surface or pool walls -"), Rectangle( - extent={{-66,-98},{100,-2}}, - lineColor={0,0,127}, - fillColor={155,195,232}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Rectangle( - extent={{-100,-98},{-68,-2}}, - lineColor={95,95,95}, - fillColor={215,215,215}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Text( - extent={{-98,-6},{-72,-14}}, - textColor={95,95,95}, - horizontalAlignment=TextAlignment.Left, - textStyle={TextStyle.Bold}, - textString="Pool -operation"), - Text( - extent={{-64,-2},{-22,-24}}, - textColor={0,0,127}, - horizontalAlignment=TextAlignment.Left, - textStyle={TextStyle.Bold}, - textString="Water treatment -circuit -")})); -end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pools/package.order b/AixLib/Fluid/Pools/package.order deleted file mode 100644 index 29476d67bf..0000000000 --- a/AixLib/Fluid/Pools/package.order +++ /dev/null @@ -1,3 +0,0 @@ -IndoorSwimmingPool -BaseClasses -Example From b0faaf8b6fd839e031939d533f39064d4e54851e Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 6 Dec 2022 15:16:44 +0100 Subject: [PATCH 10/34] Changed variable names, added units etc. #1407 --- .../Fluid/Pool/Examples/IndoorSwimmingPool.mo | 72 ++-- ...IndoorSwimmingPoolExternalHeatingSystem.mo | 89 ++--- AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 322 +++++++++--------- 3 files changed, 222 insertions(+), 261 deletions(-) diff --git a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo index 02a68f59c1..2f66d01a54 100644 --- a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo @@ -1,31 +1,27 @@ within AixLib.Fluid.Pool.Examples; model IndoorSwimmingPool extends Modelica.Icons.Example; - Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater - "Flow rate of added fresh water to the pool and water treatment system" - annotation (Placement(transformation(extent={{98,-96},{126,-68}}), - iconTransformation(extent={{98,-96},{126,-68}}))); .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool(), redeclare package WaterMedium = WaterMedium) - annotation (Placement(transformation(extent={{-38,-36},{30,38}}))); + annotation (Placement(transformation(extent={{-20,-40},{30,16}}))); replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) annotation (Placement(transformation(extent={{96,44},{80,60}}))); Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) - annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); + annotation (Placement(transformation(extent={{-84,32},{-68,48}}))); Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) - annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); - Modelica.Blocks.Sources.Pulse Opening( + annotation (Placement(transformation(extent={{-84,56},{-68,72}}))); + Modelica.Blocks.Sources.Pulse timeOpe( amplitude=1, width=(13/15)*100, period=(24 - 7)*3600, offset=0, startTime=3600*7) - annotation (Placement(transformation(extent={{-94,-46},{-80,-32}}))); - Modelica.Blocks.Sources.Trapezoid Person( + annotation (Placement(transformation(extent={{-88,-48},{-74,-34}}))); + Modelica.Blocks.Sources.Trapezoid uRelPer( amplitude=0.5, rising=7*3600, width=1*3600, @@ -33,50 +29,28 @@ model IndoorSwimmingPool period=17*3600, offset=0.3, startTime=7*3600) - annotation (Placement(transformation(extent={{-94,-8},{-80,6}}))); - Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( - transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ - {-86,16},{-118,48}}))); - Modelica.Blocks.Interfaces.RealOutput PPool - "Output eletric energy needed for pool operation" annotation (Placement( - transformation(extent={{98,-62},{124,-36}}),iconTransformation(extent={{98,-62}, - {124,-36}}))); + annotation (Placement(transformation(extent={{-86,-6},{-72,8}}))); Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature prescribedTemperature annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); - Modelica.Blocks.Interfaces.RealOutput TPool "Value of Real output" - annotation (Placement(transformation(extent={{98,8},{118,28}}))); - Modelica.Blocks.Interfaces.RealOutput QPool - "Heat flow rate to maintain the pool at the set temperature" annotation ( - Placement(transformation(extent={{98,-20},{122,4}}), iconTransformation( - extent={{98,-20},{122,4}}))); equation - connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52},{40, - 52},{40,18.39},{31.02,18.39}}, color={0,0,127})); - connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-13.86,39.11},{-12, - 39.11},{-12,62},{-69.2,62}}, color={0,0,127})); - connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-26.78,39.11}, - {-26.78,80},{-69.2,80}}, color={0,0,127})); - connect(Opening.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, - -39},{-50,-39},{-50,-20.46},{-40.04,-20.46}}, color={0,0,127})); - connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.3,-1}, - {-48,-1},{-48,-8.25},{-39.7,-8.25}}, color={0,0,127})); - connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-39.36,21.72},{ - -39.36,22},{-66,22},{-66,32},{-102,32}}, color={0,0,127})); - connect(indoorSwimming.PPool, PPool) annotation (Line(points={{32.72,-27.12},{ - 32.72,-26},{96,-26},{96,-49},{111,-49}}, color={0,0,127})); - connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( - points={{32.72,-33.04},{32.72,-82},{112,-82}}, color={0,0,127})); + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52},{38, + 52},{38,1.16},{30.75,1.16}}, color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-2.25,16.84},{ + -2.25,24},{-62,24},{-62,40},{-67.2,40}}, + color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-11.75,16.84}, + {-10,16.84},{-10,64},{-67.2,64}}, + color={0,0,127})); + connect(timeOpe.y, indoorSwimming.timeOpe) annotation (Line(points={{-73.3, + -41},{-30,-41},{-30,-28.24},{-21.5,-28.24}}, color={0,0,127})); + connect(uRelPer.y, indoorSwimming.uRelPer) annotation (Line(points={{-71.3,1}, + {-30,1},{-30,-19.56},{-21.75,-19.56}}, color={0,0,127})); connect(prescribedTemperature.T, T_Air.y) - annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); - connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) - annotation (Line(points={{-4,80},{21.16,80},{21.16,39.48}}, color={191,0,0})); - connect(indoorSwimming.TPool, TPool) annotation (Line(points={{32.72,6.92},{ - 92,6.92},{92,18},{108,18}}, color={0,0,127})); - connect(MFlowFreshWater, MFlowFreshWater) - annotation (Line(points={{112,-82},{112,-82}}, color={0,0,127})); - connect(indoorSwimming.QPool, QPool) annotation (Line(points={{32.72,-1.22},{32.72, - 0},{92,0},{92,-8},{110,-8}}, color={0,0,127})); + annotation (Line(points={{-17.2,80},{-58,80},{-58,64},{-67.2,64}}, + color={0,0,127})); + connect(prescribedTemperature.port, indoorSwimming.convPool) annotation (Line( + points={{-4,80},{23.5,80},{23.5,17.12}}, color={191,0,0})); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false)), experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); diff --git a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo index 5878ccbbe7..c21e587145 100644 --- a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo +++ b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo @@ -1,21 +1,17 @@ within AixLib.Fluid.Pool.Examples; model IndoorSwimmingPoolExternalHeatingSystem extends Modelica.Icons.Example; - Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater - "Flow rate of added fresh water to the pool and water treatment system" - annotation (Placement(transformation(extent={{98,-100},{126,-72}}), - iconTransformation(extent={{98,-100},{126,-72}}))); .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool( use_idealHeater=false), redeclare package WaterMedium = WaterMedium) - annotation (Placement(transformation(extent={{-60,-36},{8,38}}))); + annotation (Placement(transformation(extent={{-32,-38},{16,28}}))); replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) annotation (Placement(transformation(extent={{74,80},{58,96}}))); Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) - annotation (Placement(transformation(extent={{-86,54},{-70,70}}))); + annotation (Placement(transformation(extent={{-88,48},{-72,64}}))); Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); Modelica.Blocks.Sources.Pulse Opening( @@ -34,19 +30,9 @@ model IndoorSwimmingPoolExternalHeatingSystem offset=0.3, startTime=7*3600) annotation (Placement(transformation(extent={{-94,-8},{-80,6}}))); - Modelica.Blocks.Interfaces.RealOutput QEvap annotation (Placement( - transformation(extent={{-86,16},{-118,48}}), iconTransformation(extent={ - {-86,16},{-118,48}}))); - Modelica.Blocks.Interfaces.RealOutput PPool - "Output eletric energy needed for pool operation" annotation (Placement( - transformation(extent={{98,-78},{124,-52}}),iconTransformation(extent={{98,-78}, - {124,-52}}))); Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature prescribedTemperature annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); - Modelica.Blocks.Interfaces.RealOutput TPool "Value of Real output" - annotation (Placement(transformation(extent={{98,58},{122,82}}), - iconTransformation(extent={{98,58},{122,82}}))); Controls.Continuous.LimPID PI( k=1000, yMax=10000000, @@ -55,13 +41,9 @@ model IndoorSwimmingPoolExternalHeatingSystem Ti=1) annotation(Placement(transformation(extent={{-8,-8}, {8,8}}, rotation=180, - origin={62,6}))); + origin={82,4}))); Modelica.Blocks.Sources.RealExpression SetTemperature(y=273.15 + 28) - annotation (Placement(transformation(extent={{98,20},{80,36}}))); - Modelica.Blocks.Interfaces.RealOutput y1 - "Connector of actuator output signal" - annotation (Placement(transformation(extent={{98,-32},{122,-8}}), - iconTransformation(extent={{98,-32},{122,-8}}))); + annotation (Placement(transformation(extent={{96,34},{78,50}}))); MixingVolumes.MixingVolume vol( redeclare package Medium = AixLib.Media.Water, m_flow_nominal=indoorSwimming.m_flow_nominal, @@ -69,51 +51,38 @@ model IndoorSwimmingPoolExternalHeatingSystem nPorts=2) annotation (Placement(transformation( extent={{-10,10},{10,-10}}, rotation=90, - origin={32,-14}))); + origin={44,-12}))); Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow annotation (Placement(transformation(extent={{62,-50},{42,-30}}))); equation - connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{57.2,88},{18, - 88},{18,18.39},{9.02,18.39}}, color={0,0,127})); - connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-35.86,39.11},{ - -34,39.11},{-34,50},{-64,50},{-64,62},{-69.2,62}}, + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{57.2,88},{36, + 88},{36,10.51},{16.72,10.51}}, color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-14.96,28.99},{ + -14.96,38},{-64,38},{-64,56},{-71.2,56}}, color={0,0,127})); - connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-48.78,39.11}, - {-48.78,80},{-69.2,80}}, color={0,0,127})); - connect(Opening.y, indoorSwimming.openingHours) annotation (Line(points={{-79.3, - -37},{-70,-37},{-70,-20.46},{-62.04,-20.46}}, color={0,0,127})); - connect(Person.y, indoorSwimming.persons) annotation (Line(points={{-79.3,-1}, - {-70,-1},{-70,-8.25},{-61.7,-8.25}}, color={0,0,127})); - connect(indoorSwimming.QEvap, QEvap) annotation (Line(points={{-61.36,21.72}, - {-61.36,20},{-80,20},{-80,32},{-102,32}},color={0,0,127})); - connect(indoorSwimming.PPool, PPool) annotation (Line(points={{10.72,-27.12}, - {10.72,-26},{18,-26},{18,-65},{111,-65}}, color={0,0,127})); - connect(indoorSwimming.MFlowFreshWater, MFlowFreshWater) annotation (Line( - points={{10.72,-33.04},{10.72,-86},{112,-86}}, color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-24.08,28.99}, + {-24.08,80},{-69.2,80}}, color={0,0,127})); + connect(Opening.y, indoorSwimming.timeOpe) annotation (Line(points={{-79.3, + -37},{-50,-37},{-50,-24.14},{-33.44,-24.14}}, color={0,0,127})); + connect(Person.y, indoorSwimming.uRelPer) annotation (Line(points={{-79.3,-1}, + {-50,-1},{-50,-13.91},{-33.68,-13.91}}, color={0,0,127})); connect(prescribedTemperature.T, T_Air.y) annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); - connect(prescribedTemperature.port, indoorSwimming.convPoolSurface) - annotation (Line(points={{-4,80},{-0.84,80},{-0.84,39.48}}, color={191,0,0})); - connect(indoorSwimming.TPool, TPool) annotation (Line(points={{10.72,6.92},{ - 32,6.92},{32,70},{110,70}}, color={0,0,127})); - connect(MFlowFreshWater, MFlowFreshWater) - annotation (Line(points={{112,-86},{112,-86}}, color={0,0,127})); - connect(PI.u_s, SetTemperature.y) annotation (Line(points={{71.6,6},{76,6},{ - 76,28},{79.1,28}}, color={0,0,127})); - connect(indoorSwimming.TPool, PI.u_m) annotation (Line(points={{10.72,6.92},{ - 32,6.92},{32,20},{62,20},{62,15.6}}, color={0,0,127})); - connect(PI.y, y1) annotation (Line(points={{53.2,6},{48,6},{48,-20},{110,-20}}, - color={0,0,127})); - connect(vol.ports[1], indoorSwimming.toPool) annotation (Line(points={{22,-15}, - {22,-10.1},{8,-10.1}}, color={0,127,255})); - connect(vol.ports[2], indoorSwimming.fromPool) annotation (Line(points={{22, - -13},{22,-18.98},{8,-18.98}}, color={0,127,255})); + connect(prescribedTemperature.port, indoorSwimming.convPool) annotation (Line( + points={{-4,80},{9.76,80},{9.76,29.32}}, color={191,0,0})); + connect(PI.u_s, SetTemperature.y) annotation (Line(points={{91.6,4},{98,4},{ + 98,30},{70,30},{70,42},{77.1,42}}, + color={0,0,127})); + connect(indoorSwimming.TPool, PI.u_m) annotation (Line(points={{17.92,0.28},{ + 62,0.28},{62,18},{82,18},{82,13.6}}, color={0,0,127})); + connect(vol.ports[1], indoorSwimming.port_a1) annotation (Line(points={{34, + -13},{16,-13},{16,-14.9}}, color={0,127,255})); + connect(vol.ports[2], indoorSwimming.port_b1) annotation (Line(points={{34, + -11},{20,-11},{20,-22.82},{16,-22.82}}, color={0,127,255})); connect(prescribedHeatFlow.port, vol.heatPort) - annotation (Line(points={{42,-40},{32,-40},{32,-24}}, color={191,0,0})); - connect(PI.y, prescribedHeatFlow.Q_flow) annotation (Line(points={{53.2,6},{ - 48,6},{48,-20},{78,-20},{78,-40},{62,-40}}, color={0,0,127})); - connect(TPool, TPool) - annotation (Line(points={{110,70},{110,70}}, color={0,0,127})); + annotation (Line(points={{42,-40},{42,-22},{44,-22}}, color={191,0,0})); + connect(PI.y, prescribedHeatFlow.Q_flow) annotation (Line(points={{73.2,4},{ + 66,4},{66,-20},{70,-20},{70,-40},{62,-40}}, color={0,0,127})); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false)), experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo index 27142203fc..89994a3bb4 100644 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -1,4 +1,4 @@ -within AixLib.Fluid.Pool; +within AixLib.Fluid.Pool; model IndoorSwimmingPool parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord poolParam "Choose setup for this pool" annotation (choicesAllMatching=true); @@ -21,8 +21,8 @@ model IndoorSwimmingPool Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) "mass flow rate between pool water and air due to evaporation"; Modelica.Units.SI.Pressure psat_TPool= - Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( - poolWater.T) "Saturation pressure at pool temperature"; + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + poolWat.T) "Saturation pressure at pool temperature"; Modelica.Units.SI.Pressure psat_TAir= Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( TAir) "Saturation pressure at air temperature"; @@ -45,7 +45,7 @@ model IndoorSwimmingPool // Fresh water and water recycling final parameter Modelica.Units.SI.Efficiency eta=if poolParam.use_HRS then poolParam.etaHRS else 0; - Modelica.Units.SI.MassFlowRate m_flow_freshWater(start=0.0) + Modelica.Units.SI.MassFlowRate m_flow_add(start=0.0) "Mass flow of fresh water supplied to pool circulation system"; // Convection and Radiation at pool water surface @@ -55,40 +55,39 @@ model IndoorSwimmingPool parameter Real eps = 0.9*0.95 "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; - AixLib.Fluid.MixingVolumes.MixingVolume Storage( + AixLib.Fluid.MixingVolumes.MixingVolume poolSto( redeclare package Medium = WaterMedium, T_start=poolParam.TPool, m_flow_nominal=m_flow_nominal, V=poolParam.VStorage, - nPorts=4) annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); + nPorts=4) "water storage for pool " + annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); AixLib.Fluid.Sources.Boundary_pT Sinc( redeclare package Medium = WaterMedium, nPorts=1) annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); - AixLib.Fluid.MixingVolumes.MixingVolume poolWater( + AixLib.Fluid.MixingVolumes.MixingVolume poolWat( redeclare package Medium = WaterMedium, T_start=poolParam.TPool, m_flow_nominal=m_flow_nominal, V=poolParam.VPool, - nPorts=3) + nPorts=3) "water volume of pool" annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); - Modelica.Blocks.Sources.RealExpression PoolWater(y=m_flow_toPool) + Modelica.Blocks.Sources.RealExpression getSetMasFlo(y=m_flow_toPool) + "set circulating mass flow of pool water" annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); - Modelica.Blocks.Interfaces.RealOutput QPool if poolParam.use_idealHeater - "Heat flow rate to maintain the pool at the set temperature" annotation ( - Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( - extent={{98,-16},{118,4}}))); - AixLib.Fluid.Movers.BaseClasses.IdealSource Evaporation( + AixLib.Fluid.Movers.BaseClasses.IdealSource setEva( redeclare package Medium = WaterMedium, m_flow_small=0.00001, control_m_flow=true) annotation (Placement(transformation( extent={{6,-6},{-6,6}}, rotation=0, origin={-30,26}))); - Modelica.Blocks.Sources.RealExpression m_Eavporation(y=m_flow_evap) - annotation (Placement(transformation(extent={{9,-9},{-9,9}}, + Modelica.Blocks.Sources.RealExpression getEva(y=m_flow_evap) annotation ( + Placement(transformation( + extent={{9,-9},{-9,9}}, rotation=180, origin={-81,41}))); AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( @@ -103,13 +102,14 @@ model IndoorSwimmingPool extent={{-5,-5},{5,5}}, rotation=90, origin={-33,-73}))); - Modelica.Blocks.Interfaces.RealInput openingHours - "Input profile for opening hours" - annotation (Placement(transformation(extent={{-118,-70},{-94,-46}}), + Modelica.Blocks.Interfaces.RealInput timeOpe + "Input profile for opening hours (0: closed, 1: open)" annotation ( + Placement(transformation(extent={{-118,-70},{-94,-46}}), iconTransformation(extent={{-118,-70},{-94,-46}}))); - Modelica.Blocks.Interfaces.RealInput persons "Input profile for persons" - annotation (Placement(transformation(extent={{-118,-38},{-92,-12}}), - iconTransformation(extent={{-118,-38},{-92,-12}}))); + Modelica.Blocks.Interfaces.RealInput uRelPer + "relative number of people related to max. value" annotation (Placement( + transformation(extent={{-120,-40},{-94,-14}}), iconTransformation( + extent={{-120,-40},{-94,-14}}))); Modelica.Blocks.Interfaces.RealInput TAir( final quantity="ThermodynamicTemperature", @@ -136,23 +136,24 @@ model IndoorSwimmingPool rotation=-90, origin={-59,77}))); - Modelica.Blocks.Sources.RealExpression FreshWater(y=m_flow_freshWater) annotation (Placement(transformation(extent={{-62,-78}, - {-48,-62}}))); + Modelica.Blocks.Sources.RealExpression getAddWat(y=m_flow_add) + "requried added fresh warter to the pool circulation" + annotation (Placement(transformation(extent={{-62,-78},{-48,-62}}))); - AixLib.Fluid.Sources.Boundary_pT SincEvaporation( - redeclare package Medium = WaterMedium, nPorts=1) annotation (Placement(transformation(extent={{6,-6},{ - -6,6}}, + AixLib.Fluid.Sources.Boundary_pT sincEva(redeclare package Medium = + WaterMedium, nPorts=1) annotation (Placement(transformation( + extent={{6,-6},{-6,6}}, rotation=180, origin={-64,26}))); - Modelica.Fluid.Interfaces.FluidPort_b fromPool(redeclare package Medium = - WaterMedium) if not poolParam.use_idealHeater + Modelica.Fluid.Interfaces.FluidPort_b port_b1(redeclare package Medium = + WaterMedium) if not poolParam.use_idealHeater "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" annotation (Placement(transformation(extent={{90,-64},{110,-44}}), iconTransformation(extent={{90,-64},{110,-44}}))); - Modelica.Fluid.Interfaces.FluidPort_a toPool(redeclare package Medium = - WaterMedium) if not poolParam.use_idealHeater + Modelica.Fluid.Interfaces.FluidPort_a port_a1(redeclare package Medium = + WaterMedium) if not poolParam.use_idealHeater "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" annotation (Placement(transformation(extent={{90,-40},{110,-20}}), iconTransformation(extent={{90,-40},{110,-20}}))); @@ -165,20 +166,19 @@ model IndoorSwimmingPool widthWavePul=poolParam.widthWavePul) if poolParam.use_wavePool annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPoolSurface - "Air Temperature in Zone" annotation (Placement(transformation(extent={{56,86}, - {80,110}}), - iconTransformation(extent={{64,94},{84,114}}))); - - AixLib.Utilities.Interfaces.RadPort radPoolSurface - "Mean Radiation Temperature of surrounding walls" annotation (Placement( - transformation( - extent={{-8,-9},{8,9}}, - rotation=-90, - origin={39,100}), iconTransformation( - extent={{-11,-11},{11,11}}, - rotation=-90, - origin={30,100}))); + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPool + "Air temperature in zone" annotation (Placement(transformation(extent={{56,86}, + {80,110}}), iconTransformation(extent={{64,94},{84,114}}))); + + AixLib.Utilities.Interfaces.RadPort radPool + "Mean Radiation Temperature of surrounding walls " annotation (Placement( + transformation( + extent={{-8,-9},{8,9}}, + rotation=-90, + origin={39,100}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=-90, + origin={30,100}))); Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( final Gr=eps*poolParam.APool) @@ -200,19 +200,21 @@ model IndoorSwimmingPool Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, {12,68}}))); - Modelica.Blocks.Math.Gain hEvapLatentHeatGain(final k=h_vapor) + Modelica.Blocks.Math.Gain hEva(final k=h_vapor) "Calculation of heat flow rate due to evaporation" annotation (Placement( transformation( extent={{-4,-4},{4,4}}, rotation=0, origin={-44,52}))); - Modelica.Blocks.Interfaces.RealOutput MFlowFreshWater - "Flow rate of added fresh water to the pool and water treatment system" annotation (Placement(transformation(extent={{98,-102}, - {118,-82}}), + Modelica.Blocks.Interfaces.RealOutput m_flow_add_out( + final quantity="MassFlowRate", + final unit= "kg/s") + "Flow rate of added fresh water to the pool and water treatment system" + annotation (Placement(transformation(extent={{98,-102},{118,-82}}), iconTransformation(extent={{98,-102},{118,-82}}))); - AixLib.Fluid.Pool.BaseClasses.HeatTransferConduction heatTransferConduction( + AixLib.Fluid.Pool.BaseClasses.HeatTransferConduction heatTraCond( AWalInt=poolParam.AWalInt, AWalExt=poolParam.AWalExt, AFloInt=poolParam.AFloInt, @@ -223,17 +225,25 @@ model IndoorSwimmingPool "Model to depict the heat flow rate through the pool walls to the bordering room/soil" annotation (Placement(transformation(extent={{64,32},{80,48}}))); - Modelica.Blocks.Math.Gain minus1Gain(final k=-1) annotation (Placement( + Modelica.Blocks.Math.Gain minusGain(final k=-1) annotation (Placement( transformation( extent={{-4,-4},{4,4}}, rotation=0, origin={-20,60}))); - Modelica.Blocks.Interfaces.RealOutput QEvap(final quantity="HeatFlowRate", - final unit="W") - "Heat needed to compensate losses" annotation (Placement(transformation(extent={{-92,46}, - {-122,76}}), - iconTransformation(extent={{-94,46},{-114,66}}))); + Modelica.Blocks.Interfaces.RealOutput QEva( + final quantity="HeatFlowRate", + final unit="W") "Heat due to evaporation" annotation (Placement( + transformation(extent={{-92,46},{-122,76}}), iconTransformation(extent={ + {-94,46},{-114,66}}))); + + Modelica.Blocks.Interfaces.RealOutput QPool( + final quantity="HeatFlowRate", + final unit="W") + if poolParam.use_idealHeater + "Heat flow rate to maintain the pool at the set temperature" annotation ( + Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( + extent={{98,-16},{118,4}}))); Modelica.Blocks.Interfaces.RealInput TSoil( final quantity="ThermodynamicTemperature", @@ -254,29 +264,27 @@ model IndoorSwimmingPool {118,-66}}), iconTransformation(extent={{98,-86},{118,-66}}))); + Modelica.Blocks.Interfaces.RealOutput TPool( + final quantity="ThermodynamicTemperature", + final unit="K") + "current temperature of pool" + annotation (Placement(transformation(extent={{98,6},{118,26}}), + iconTransformation(extent={{98,6},{118,26}}))); + Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavePool then 2 else 1) "Add electric power of pump and the optional wave pool" annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); - Sources.MassFlowSource_T boundary( + Sources.MassFlowSource_T bou( redeclare package Medium = WaterMedium, use_m_flow_in=true, T=283.15, nPorts=1) annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); - Modelica.Blocks.Sources.RealExpression ReadPoolTemp(y=poolWater.T) - annotation (Placement(transformation( + Modelica.Blocks.Sources.RealExpression getMeaTPool(y=poolWat.T) annotation ( + Placement(transformation( extent={{10,-10},{-10,10}}, rotation=180, origin={72,16}))); - Modelica.Blocks.Interfaces.RealOutput TPool "Value of Real output" - annotation (Placement(transformation(extent={{98,6},{118,26}}), - iconTransformation(extent={{98,6},{118,26}}))); - - final parameter Modelica.Units.SI.Density rhoWater_default= - WaterMedium.density_pTX( - p=WaterMedium.p_default, - T=273.15 + 30, - X=WaterMedium.X_default) "Default medium density"; Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater if poolParam.use_idealHeater @@ -290,7 +298,7 @@ model IndoorSwimmingPool {4,4}}, rotation=180, origin={66,-16}))); - Modelica.Blocks.Sources.RealExpression SetTemperature(y=poolParam.TPool) + Modelica.Blocks.Sources.RealExpression getSetTPool(y=poolParam.TPool) if poolParam.use_idealHeater annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); Controls.Continuous.LimPID PI1( @@ -299,7 +307,7 @@ model IndoorSwimmingPool Ti=5, yMax=m_flow_nominal/0.9, yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); - Movers.FlowControlled_m_flow CirculationPump( + Movers.FlowControlled_m_flow cirPump( redeclare package Medium = WaterMedium, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, T_start=poolParam.TPool, @@ -311,7 +319,9 @@ model IndoorSwimmingPool nominalValuesDefineDefaultPressureCurve=true, dp_nominal=pumpHead, m_flow_start=m_flow_nominal) - annotation (Placement(transformation(extent={{-8,-8},{8,8}}, + "circulation pump for permanent pool circulation " annotation (Placement( + transformation( + extent={{-8,-8},{8,8}}, rotation=0, origin={0,-68}))); Sensors.MassFlowRate senMasFlo(redeclare package Medium = @@ -328,20 +338,30 @@ model IndoorSwimmingPool dp_nominal=pumpHead - poolParam.dpHeaExcPool, homotopyInitialization=true, linearized=false, - deltaM=0.3) + deltaM=0.3) "representative resistance for whole system " annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); + +protected + final parameter Modelica.Units.SI.Density rhoWater_default= + WaterMedium.density_pTX( + p=WaterMedium.p_default, + T=273.15 + 30, + X=WaterMedium.X_default) "Default medium density"; + + + equation // Fresh water and water recycling if poolParam.use_waterRecycling then - m_flow_freshWater=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); + m_flow_add=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); else - m_flow_freshWater=poolParam.m_flow_out + m_flow_evap; + m_flow_add=poolParam.m_flow_out + m_flow_evap; end if; // Pool circulation flow rate if poolParam.use_partialLoad then - if openingHours > 0 then + if timeOpe > 0 then m_flow_toPool = m_flow_nominal; else m_flow_toPool = m_flow_partial; @@ -355,49 +375,50 @@ equation if psat_TPool-phi*psat_TAir<0 then m_flow_evap=0.0; else - if openingHours > 0 then - if persons > 0 then - m_flow_evap =persons*(poolParam.betaInUse/(RD*0.5*(poolWater.T + - TAir))*(psat_TPool - phi*psat_TAir)*poolParam.APool); + if timeOpe > 0 then + if uRelPer > 0 then + m_flow_evap =uRelPer*(poolParam.betaInUse/(RD*0.5*(poolWat.T + TAir))*( + psat_TPool - phi*psat_TAir)*poolParam.APool); else - m_flow_evap = betaNonUse /(RD*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_TAir)*poolParam.APool; + m_flow_evap =betaNonUse/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* + psat_TAir)*poolParam.APool; end if; else if poolParam.use_poolCover then - m_flow_evap = betaCover /(RD*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_TAir)*poolParam.APool; + m_flow_evap =betaCover/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* + psat_TAir)*poolParam.APool; else - m_flow_evap = betaNonUse /(RD*0.5*(poolWater.T + TAir))*(psat_TPool-phi*psat_TAir)*poolParam.APool; + m_flow_evap =betaNonUse/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* + psat_TAir)*poolParam.APool; end if; end if; end if; if poolParam.use_idealHeater then - connect(res.port_b, poolWater.ports[1]) annotation (Line(points={{44,-68}, - {54,-68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, - color={0,127,255})); + connect(res.port_b, poolWat.ports[1]) annotation (Line(points={{44,-68},{54, + -68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, color={0,127,255})); else - connect(poolWater.ports[1], toPool) annotation (Line( - points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, - color={0,127,255}, - pattern=LinePattern.Dash)); - connect(fromPool, res.port_b) annotation (Line( - points={{100,-54},{78,-54},{78,-68},{44,-68}}, - color={0,127,255}, - pattern=LinePattern.Dash)); + connect(poolWat.ports[1], port_a1) annotation (Line( + points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + connect(port_b1, res.port_b) annotation (Line( + points={{100,-54},{78,-54},{78,-68},{44,-68}}, + color={0,127,255}, + pattern=LinePattern.Dash)); end if; - connect(poolWater.ports[3], Evaporation.port_a) annotation (Line(points={{2.66667, - -10},{2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); + connect(poolWat.ports[3], setEva.port_a) annotation (Line(points={{2.66667,-10}, + {2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); - connect(Storage.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, + connect(poolSto.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); - connect(Storage.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, + connect(poolSto.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); - connect(Storage.ports[4], CirculationPump.port_a) annotation (Line(points={{-26.5, - -56},{-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); - connect(Storage.ports[1], poolWater.ports[2]) annotation (Line(points={{-29.5, - -56},{-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127, - 255})); + connect(poolSto.ports[4], cirPump.port_a) annotation (Line(points={{-26.5,-56}, + {-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); + connect(poolSto.ports[1], poolWat.ports[2]) annotation (Line(points={{-29.5,-56}, + {-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127,255})); connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, {-62,88},{-67,88},{-67,103}},color={0,0,127})); @@ -405,83 +426,80 @@ equation {-56,88},{-29,88},{-29,103}}, color={0,0,127})); connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, {-30,-88},{22,-88}}, color={0,127,255})); - connect(Evaporation.port_b, SincEvaporation.ports[1]) + connect(setEva.port_b, sincEva.ports[1]) annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); - connect(m_Eavporation.y, Evaporation.m_flow_in) annotation (Line(points={{-71.1, - 41},{-26.4,41},{-26.4,30.8}}, color={0,0,127})); - connect(radWaterSurface.port_b, radPoolSurface) annotation (Line(points={{39,80}, - {39,100}}, color={191,0,0})); - connect(convWaterSurface.fluid, convPoolSurface) annotation (Line(points={{67,82}, - {68,82},{68,98}}, color={191,0,0})); - connect(convWaterSurface.solid, poolWater.heatPort) annotation (Line(points={{67,68}, - {66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); - connect(radWaterSurface.port_a, poolWater.heatPort) annotation (Line(points={{39,66}, - {38,66},{38,0},{14,0}}, color={191,0,0})); - connect(preHeatFlowEvapLoss.port, poolWater.heatPort) annotation (Line(points={{12,60}, - {26,60},{26,0},{14,0}}, color={191,0,0})); - connect(m_Eavporation.y, hEvapLatentHeatGain.u) annotation (Line(points={{-71.1, - 41},{-58,41},{-58,52},{-48.8,52}}, - color={0,0,127})); - connect(heatTransferConduction.heatport_a, poolWater.heatPort) annotation ( - Line(points={{63.76,39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); - connect(hEvapLatentHeatGain.y, minus1Gain.u) annotation (Line(points={{-39.6, - 52},{-34,52},{-34,60},{-24.8,60}}, color={0,0,127})); - connect(hEvapLatentHeatGain.y, QEvap) annotation (Line(points={{-39.6,52},{-34, - 52},{-34,61},{-107,61}}, color={0,0,127})); - connect(heatTransferConduction.TSoil, TSoil) annotation (Line(points={{80.48,42.88}, - {82,42.88},{82,49},{105,49}}, color={0,0,127})); - connect(convPoolSurface, convPoolSurface) annotation (Line(points={{68,98},{68, - 98}}, color={191,0,0})); + connect(getEva.y, setEva.m_flow_in) annotation (Line(points={{-71.1,41},{-26.4, + 41},{-26.4,30.8}}, color={0,0,127})); + connect(radWaterSurface.port_b, radPool) + annotation (Line(points={{39,80},{39,100}}, color={191,0,0})); + connect(convWaterSurface.fluid, convPool) + annotation (Line(points={{67,82},{68,82},{68,98}}, color={191,0,0})); + connect(convWaterSurface.solid, poolWat.heatPort) annotation (Line(points={{67, + 68},{66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); + connect(radWaterSurface.port_a, poolWat.heatPort) + annotation (Line(points={{39,66},{38,66},{38,0},{14,0}}, color={191,0,0})); + connect(preHeatFlowEvapLoss.port, poolWat.heatPort) + annotation (Line(points={{12,60},{26,60},{26,0},{14,0}}, color={191,0,0})); + connect(getEva.y, hEva.u) annotation (Line(points={{-71.1,41},{-58,41},{-58,52}, + {-48.8,52}}, color={0,0,127})); + connect(heatTraCond.heatport_a, poolWat.heatPort) annotation (Line(points={{63.76, + 39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); + connect(hEva.y, minusGain.u) annotation (Line(points={{-39.6,52},{-34,52},{-34, + 60},{-24.8,60}}, color={0,0,127})); + connect(hEva.y, QEva) annotation (Line(points={{-39.6,52},{-34,52},{-34,61},{-107, + 61}}, color={0,0,127})); + connect(heatTraCond.TSoil, TSoil) annotation (Line(points={{80.48,42.88},{82,42.88}, + {82,49},{105,49}}, color={0,0,127})); + connect(convPool, convPool) + annotation (Line(points={{68,98},{68,98}}, color={191,0,0})); connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, {74,75}}, color={0,0,127})); - connect(minus1Gain.y, preHeatFlowEvapLoss.Q_flow) annotation (Line(points={{-15.6, - 60},{-4,60}}, color={0,0,127})); - - connect(boundary.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, - {-40,-78},{-36,-78}}, color={0,127, - 255})); - connect(waveMachine.open, openingHours) annotation (Line(points={{-93.28,-87}, - {-98,-87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, - color={0,0,127})); - connect(ReadPoolTemp.y, TPool) + connect(minusGain.y, preHeatFlowEvapLoss.Q_flow) + annotation (Line(points={{-15.6,60},{-4,60}}, color={0,0,127})); + + connect(bou.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, + {-40,-78},{-36,-78}}, color={0,127,255})); + connect(waveMachine.open, timeOpe) annotation (Line(points={{-93.28,-87},{-98, + -87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, color={0,0,127})); + connect(getMeaTPool.y, TPool) annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, {54,-12},{48,-12}}, color={0,0,127})); - connect(idealHeater.port, poolWater.heatPort) annotation (Line(points={{32,-12}, + connect(idealHeater.port, poolWat.heatPort) annotation (Line(points={{32,-12}, {24,-12},{24,0},{14,0}}, color={191,0,0})); - connect(SetTemperature.y, PI.u_s) + connect(getSetTPool.y, PI.u_s) annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, -16}}, color={0,0,127})); - connect(boundary.m_flow_in, FreshWater.y) annotation (Line(points={{-53.2,-83.2}, - {-60,-83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); - connect(FreshWater.y, MFlowFreshWater) annotation (Line(points={{-47.3,-70},{-42, - -70},{-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, - color={0,0,127})); - connect(Evaporation.port_b, Evaporation.port_a) annotation (Line( + connect(bou.m_flow_in, getAddWat.y) annotation (Line(points={{-53.2,-83.2},{-60, + -83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); + connect(getAddWat.y, m_flow_add_out) annotation (Line(points={{-47.3,-70},{-42,-70}, + {-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, color={0,0, + 127})); + connect(setEva.port_b, setEva.port_a) annotation (Line( points={{-36,26},{-30,26},{-24,26}}, color={0,127,255}, smooth=Smooth.Bezier)); - connect(CirculationPump.port_b, senMasFlo.port_a) + connect(cirPump.port_b, senMasFlo.port_a) annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); connect(senMasFlo.port_b, res.port_a) annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); - connect(PI1.y, CirculationPump.m_flow_in) + connect(PI1.y, cirPump.m_flow_in) annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); - connect(PI1.u_s, PoolWater.y) + connect(PI1.u_s,getSetMasFlo. y) annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, {13,-58},{13,-55}}, color={0,0,127})); - connect(elPower.u[1], CirculationPump.P) annotation (Line(points={{72,-76},{62, - -76},{62,-60.8},{8.8,-60.8}}, color={0,0,127})); + connect(elPower.u[1], cirPump.P) annotation (Line(points={{72,-76},{62,-76},{62, + -60.8},{8.8,-60.8}}, color={0,0,127})); connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, color={0,0,127})); - connect(PI.u_m, ReadPoolTemp.y) annotation (Line(points={{66,-11.2},{66,4},{92, + connect(PI.u_m,getMeaTPool. y) annotation (Line(points={{66,-11.2},{66,4},{92, 4},{92,16},{83,16}}, color={0,0,127})); annotation (Line( points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), From 22b963049b273779a36d31a0b9da8b056b4506ec Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 3 Jan 2023 11:01:18 +0100 Subject: [PATCH 11/34] Add energy dynamics and initial temperatures for pool walls --- .../BaseClasses/HeatTransferConduction.mo | 55 +++++++++++-------- AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 8 ++- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo b/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo index f69d72906a..efac5362b4 100644 --- a/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo +++ b/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo @@ -2,6 +2,10 @@ within AixLib.Fluid.Pool.BaseClasses; model HeatTransferConduction "Heat transfer due to conduction through pool walls" + parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState + "Type of energy balance: dynamic (3 initialization options) or steady state" + annotation(Evaluate=true, Dialog(tab="Dynamics", group="Equations")); + parameter Modelica.Units.SI.Area AWalInt "Area of pool walls which is connected to inner rooms (inner pool walls)"; parameter Modelica.Units.SI.Area AWalExt "Area of pool walls which is connected to the ground (pool wall with earth contact)"; parameter Modelica.Units.SI.Area AFloInt "Area of pool floors which is connected to inner rooms (inner pool floor)"; @@ -9,6 +13,7 @@ model HeatTransferConduction parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; + parameter Modelica.Units.SI.Temperature TPool "Set temperature for pool"; Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter "Generate Heat Flow for earth contact" annotation (Placement(transformation( @@ -29,15 +34,16 @@ model HeatTransferConduction InnerPoolFloor( A=AFloInt, wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-10,-34},{18,-10}}))); + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,-32},{22,-8}}))); AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( hCon_const=hConWaterHorizontal, A=AFloInt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( - origin={-48,-22}, + origin={-50,-20}, extent={{-10,-10},{10,10}}, rotation=180))); AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( @@ -45,29 +51,31 @@ model HeatTransferConduction A=AWalExt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( - origin={-54,40}, + origin={-50,40}, extent={{-10,-10},{10,10}}, rotation=180))); AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer PoolWallWithEarthContact( A=AWalExt, wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-6,26},{22,54}}))); + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,28},{22,52}}))); AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( hCon_const=hConWaterHorizontal, A=AFloExt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( - origin={-52,-60}, + origin={-50,-60}, extent={{-10,-10},{10,10}}, rotation=180))); AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer PoolFloorWithEarthContact( A=AFloExt, wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-10,-72},{14,-50}}))); + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,-72},{22,-50}}))); Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow1 "Generate Heat Flow for earth contact" annotation (Placement(transformation( @@ -78,8 +86,9 @@ model HeatTransferConduction InnerPoolWall( A=AWalInt, wallRec=PoolWall, - T_start=fill((0), (PoolWall.n))) - annotation (Placement(transformation(extent={{-6,64},{22,92}}))); + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,68},{22,92}}))); Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" annotation (Placement(transformation(extent={{96,2},{76,22}}))); @@ -88,7 +97,7 @@ model HeatTransferConduction A=AWalInt, calcMethod=3, surfaceOrientation=1) annotation (Placement(transformation( - origin={-54,78}, + origin={-50,80}, extent={{-10,-10},{10,10}}, rotation=180))); replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall @@ -99,31 +108,31 @@ equation connect(heatport_a, heatport_a) annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) - annotation (Line(points={{-38,-22},{-10,-22}}, color={191,0,0})); + annotation (Line(points={{-40,-20},{-2,-20}}, color={191,0,0})); connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( - Line(points={{14,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); + Line(points={{22,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) - annotation (Line(points={{-10,-61},{-10,-60},{-42,-60}}, color={191,0,0})); + annotation (Line(points={{-2,-61},{-2,-60},{-40,-60}}, color={191,0,0})); connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{22,78},{30,78},{30,12},{38,12}}, color={191,0,0})); + points={{22,80},{30,80},{30,12},{38,12}}, color={191,0,0})); connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( - points={{-64,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); + points={{-60,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( - points={{-58,-22},{-72,-22},{-72,-1},{-103,-1}}, color={191,0,0})); + points={{-60,-20},{-72,-20},{-72,-1},{-103,-1}}, color={191,0,0})); connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( - points={{-62,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); + points={{-60,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{18,-22},{30,-22},{30,12},{38,12}}, color={191,0,0})); + points={{22,-20},{30,-20},{30,12},{38,12}}, color={191,0,0})); connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) - annotation (Line(points={{-44,40},{-6,40}}, color={191,0,0})); + annotation (Line(points={{-40,40},{-2,40}}, color={191,0,0})); connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( - Line(points={{-6,78},{-44,78}}, color={191,0,0})); + Line(points={{-2,80},{-40,80}}, color={191,0,0})); connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( - points={{-64,78},{-72,78},{-72,-1},{-103,-1}},color={191,0,0})); + points={{-60,80},{-72,80},{-72,-1},{-103,-1}},color={191,0,0})); annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ Rectangle( extent={{-80,58},{28,-26}}, diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo index 89994a3bb4..27e2fa3dc8 100644 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -5,6 +5,10 @@ model IndoorSwimmingPool replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState + "Type of energy balance: dynamic (3 initialization options) or steady state" + annotation(Evaluate=true, Dialog(tab="Dynamics", group="Equations")); + // Water transfer coefficients according to VDI 2089 Blatt 1 parameter Real betaNonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); parameter Real betaCover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" @@ -57,6 +61,7 @@ model IndoorSwimmingPool AixLib.Fluid.MixingVolumes.MixingVolume poolSto( redeclare package Medium = WaterMedium, + energyDynamics=energyDynamics, T_start=poolParam.TPool, m_flow_nominal=m_flow_nominal, V=poolParam.VStorage, @@ -68,6 +73,7 @@ model IndoorSwimmingPool annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); AixLib.Fluid.MixingVolumes.MixingVolume poolWat( redeclare package Medium = WaterMedium, + energyDynamics=energyDynamics, T_start=poolParam.TPool, m_flow_nominal=m_flow_nominal, V=poolParam.VPool, @@ -309,7 +315,7 @@ model IndoorSwimmingPool yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); Movers.FlowControlled_m_flow cirPump( redeclare package Medium = WaterMedium, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + energyDynamics=energyDynamics, T_start=poolParam.TPool, allowFlowReversal=false, m_flow_nominal=m_flow_nominal, From 737e926aebb929ed277f705cf3385ec85794d509 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 3 Jan 2023 11:05:43 +0100 Subject: [PATCH 12/34] correct errors in pool wall dum,my #1407 --- AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo index a77c476fbd..9a40f5c088 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo @@ -29,10 +29,10 @@ record IndoorSwimmingPoolDummy periodeWavePul=Modelica.Constants.eps, timeWavePul_start=Modelica.Constants.eps, widthWavePul=Modelica.Constants.eps, - AInnerPoolWall=Modelica.Constants.inf, - APoolWallWithEarthContact=Modelica.Constants.inf, - APoolFloorWithEarthContact=Modelica.Constants.inf, - AInnerPoolFloor=Modelica.Constants.inf, + AWalInt=Modelica.Constants.inf, + AWalExt=Modelica.Constants.inf, + AFloExt=Modelica.Constants.inf, + AFloInt=Modelica.Constants.inf, hConWaterHorizontal=Modelica.Constants.inf, hConWaterVertical=Modelica.Constants.inf, PoolWallParam=AixLib.DataBase.Pools.SwimmingPoolWalls.WallDummy()); From cfce70a0e191c2d97facfef03768c71594a34498 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 3 Jan 2023 11:06:07 +0100 Subject: [PATCH 13/34] change declaration of pool wall record #1407 --- AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo index eac32532fa..f9b9d195d3 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo @@ -57,9 +57,8 @@ record IndoorSwimmingPoolBaseRecord parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; //replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam; - replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition - PoolWallParam constrainedby AixLib.DataBase.Walls.WallBaseDataDefinition - annotation (choicesAllMatching=true, Placement(transformation(extent={{48,-98},{68,-78}}))); + parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam + annotation (choicesAllMatching=true); annotation (Documentation(info=" From 8a0d9f5313d5f213220ed3ad61950bffe00afac5 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 3 Jan 2023 11:34:11 +0100 Subject: [PATCH 14/34] add value for TPool in pool wall model #1407 --- AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 1 + 1 file changed, 1 insertion(+) diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo index 27e2fa3dc8..0e9a31159e 100644 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -227,6 +227,7 @@ model IndoorSwimmingPool AFloExt=poolParam.AFloExt, hConWaterHorizontal=poolParam.hConWaterHorizontal, hConWaterVertical=poolParam.hConWaterVertical, + TPool=poolParam.TPool, PoolWall=poolParam.PoolWallParam) "Model to depict the heat flow rate through the pool walls to the bordering room/soil" annotation (Placement(transformation(extent={{64,32},{80,48}}))); From 6fd193dfe82d1a86f3815dbe6908eb22c07343f2 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 3 Jan 2023 11:57:39 +0100 Subject: [PATCH 15/34] Add data for pool pump #1407 --- AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo index 0e9a31159e..16a1e3f5d9 100644 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo @@ -320,7 +320,23 @@ model IndoorSwimmingPool T_start=poolParam.TPool, allowFlowReversal=false, m_flow_nominal=m_flow_nominal, - redeclare Movers.Data.Generic per, + redeclare Movers.Data.Generic per( + pressure(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, dp={ + pumpHead/0.7,pumpHead,0}), + use_powerCharacteristic=false, + hydraulicEfficiency(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, + eta={0.7,0.8,0.7}), + motorEfficiency(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, + eta={0.9,0.9,0.9}), + power(V_flow={0,(m_flow_nominal/1000*0.2),(m_flow_nominal/1000*0.5), + m_flow_nominal/1000*0.7,m_flow_nominal/1000,m_flow_nominal/1000/0.7, + m_flow_nominal/1000/0.6,m_flow_nominal/1000/0.5,m_flow_nominal/1000 + /0.4}, P={(m_flow_nominal/0.4)/1000*pumpHead/0.7/0.9,( + m_flow_nominal/0.5)/1000*pumpHead/0.7/0.9,(m_flow_nominal/0.6)/1000 + *pumpHead/0.7/0.9,(m_flow_nominal/0.7)/1000*pumpHead/0.7/0.9, + m_flow_nominal/1000*pumpHead/0.8/0.9,(m_flow_nominal/1000*0.7)* + pumpHead/0.7/0.9,(m_flow_nominal/1000*0.5)*pumpHead/0.7/0.9,( + m_flow_nominal/1000*0.2)*pumpHead/0.7/0.9,0})), inputType=AixLib.Fluid.Types.InputType.Continuous, addPowerToMedium=false, nominalValuesDefineDefaultPressureCurve=true, From 0fa518a10e915fd295d95baee71d9e1d3bbd4a98 Mon Sep 17 00:00:00 2001 From: Larissa Date: Fri, 13 Jan 2023 14:59:51 +0100 Subject: [PATCH 16/34] fix typo in data record name #1407 --- ...tionConstruction.mo => ConcreteInsulationConstruction.mo} | 5 +++-- AixLib/DataBase/Pools/SwimmingPoolWalls/package.order | 2 +- .../Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo | 2 +- .../DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo | 3 ++- 4 files changed, 7 insertions(+), 5 deletions(-) rename AixLib/DataBase/Pools/SwimmingPoolWalls/{ConcreteIsulationConstruction.mo => ConcreteInsulationConstruction.mo} (82%) diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteIsulationConstruction.mo b/AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteInsulationConstruction.mo similarity index 82% rename from AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteIsulationConstruction.mo rename to AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteInsulationConstruction.mo index 34682e9abc..1ff635dbef 100644 --- a/AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteIsulationConstruction.mo +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/ConcreteInsulationConstruction.mo @@ -1,5 +1,6 @@ within AixLib.DataBase.Pools.SwimmingPoolWalls; -record ConcreteIsulationConstruction "Concrete pool construction with isolation" +record ConcreteInsulationConstruction + "Concrete pool construction with insulation" extends AixLib.DataBase.Walls.WallBaseDataDefinition( n(min=1) = 3 "Number of wall layers", d={0.05,0.2,0.1} "Thickness of wall layers", @@ -9,4 +10,4 @@ record ConcreteIsulationConstruction "Concrete pool construction with isolation" eps=0.9 "Emissivity of inner wall surface"); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false))); -end ConcreteIsulationConstruction; +end ConcreteInsulationConstruction; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order index c6511d0fb9..fcb783fc15 100644 --- a/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order @@ -1,3 +1,3 @@ WallDummy -ConcreteIsulationConstruction +ConcreteInsulationConstruction StainlessSteelConstruction diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo index eaa42316a8..b8d33746c7 100644 --- a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo @@ -35,7 +35,7 @@ record ChildrensPool "Pool which is mainly used by children" hConWaterHorizontal=50.0, hConWaterVertical=5200.0, PoolWallParam= - AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteIsulationConstruction()); + AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteInsulationConstruction()); annotation (Documentation(info="

The swimming pool "ChildrensPool" describes a typical indoor swimming pool, which is mainly used by children and to teach children swimming.

")); diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo index 630bd09946..11238528a9 100644 --- a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo @@ -34,7 +34,8 @@ record SportPool "Pool which is mainly used by sport swimmers" AFloExt=559.82, hConWaterHorizontal=50.0, hConWaterVertical=5200.0, - PoolWallParam=AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteIsulationConstruction()); + PoolWallParam= + AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteInsulationConstruction()); annotation (Documentation(info="

The swimming pool "SportPool" describes a typical indoor swimming pool, which is mainly used for sport swimming.

")); From f9410575eb2a2d2ff0978d37c281e31e5a64f0c7 Mon Sep 17 00:00:00 2001 From: "A. Kuempel" Date: Thu, 9 Mar 2023 11:07:06 +0100 Subject: [PATCH 17/34] Update package.mo --- AixLib/Fluid/Pool/Examples/package.mo | 5 ----- 1 file changed, 5 deletions(-) diff --git a/AixLib/Fluid/Pool/Examples/package.mo b/AixLib/Fluid/Pool/Examples/package.mo index ab95b937e8..f39716d3be 100644 --- a/AixLib/Fluid/Pool/Examples/package.mo +++ b/AixLib/Fluid/Pool/Examples/package.mo @@ -1,9 +1,4 @@ within AixLib.Fluid.Pool; package Examples extends Modelica.Icons.ExamplesPackage; - - - - - end Examples; From 1819e7592d38d6f6d4658b47ac3b9d0a6f34afc8 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 12:44:16 +0200 Subject: [PATCH 18/34] Delete data bases which are not needed for this issue #1407 --- .../DataBase/Pools/IndoorSwimmingPoolDummy.mo | 42 ------------------- .../Pools/SwimmingPoolWalls/WallDummy.mo | 12 ------ .../Pools/SwimmingPoolWalls/package.order | 1 - AixLib/DataBase/Pools/package.order | 1 - 4 files changed, 56 deletions(-) delete mode 100644 AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo delete mode 100644 AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo deleted file mode 100644 index 9a40f5c088..0000000000 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolDummy.mo +++ /dev/null @@ -1,42 +0,0 @@ -within AixLib.DataBase.Pools; -record IndoorSwimmingPoolDummy - "This is a dummy record with non-physical parameter values." - extends IndoorSwimmingPoolBaseRecord( - TPool=Modelica.Constants.eps, - VPool=Modelica.Constants.inf, - APool=Modelica.Constants.inf, - depthPool=Modelica.Constants.inf, - VStorage=Modelica.Constants.inf, - V_flow_nominal=Modelica.Constants.inf, - V_flow_partial=Modelica.Constants.inf, - use_partialLoad=false, - dpHeaExcPool=Modelica.Constants.inf, - use_idealHeater=true, - KHeat=Modelica.Constants.inf, - THeat=Modelica.Constants.inf, - QMaxHeat=Modelica.Constants.inf, - QMinHeat=Modelica.Constants.inf, - betaInUse=Modelica.Constants.inf, - use_poolCover=false, - use_waterRecycling=false, - x_recycling=Modelica.Constants.inf, - m_flow_out=Modelica.Constants.inf, - use_HRS=false, - etaHRS=Modelica.Constants.eps, - use_wavePool=false, - heightWave=Modelica.Constants.inf, - widthWave=Modelica.Constants.inf, - periodeWavePul=Modelica.Constants.eps, - timeWavePul_start=Modelica.Constants.eps, - widthWavePul=Modelica.Constants.eps, - AWalInt=Modelica.Constants.inf, - AWalExt=Modelica.Constants.inf, - AFloExt=Modelica.Constants.inf, - AFloInt=Modelica.Constants.inf, - hConWaterHorizontal=Modelica.Constants.inf, - hConWaterVertical=Modelica.Constants.inf, - PoolWallParam=AixLib.DataBase.Pools.SwimmingPoolWalls.WallDummy()); - annotation (Documentation(info=" -

This record is a place holder for zones without swimming pools to avoid error messages.

-")); -end IndoorSwimmingPoolDummy; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo b/AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo deleted file mode 100644 index b774b05586..0000000000 --- a/AixLib/DataBase/Pools/SwimmingPoolWalls/WallDummy.mo +++ /dev/null @@ -1,12 +0,0 @@ -within AixLib.DataBase.Pools.SwimmingPoolWalls; -record WallDummy - extends AixLib.DataBase.Walls.WallBaseDataDefinition( - n(min=1) = 1 "Number of wall layers", - d={1} "Thickness of wall layers", - rho={1} "Density of wall layers", - lambda={1} "Thermal conductivity of wall layers", - c={1} "Specific heat capacity of wall layers", - eps=1 "Emissivity of inner wall surface"); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false))); -end WallDummy; diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order index fcb783fc15..4e8ea0b5f3 100644 --- a/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/package.order @@ -1,3 +1,2 @@ -WallDummy ConcreteInsulationConstruction StainlessSteelConstruction diff --git a/AixLib/DataBase/Pools/package.order b/AixLib/DataBase/Pools/package.order index 159d4643c5..a89c64ac40 100644 --- a/AixLib/DataBase/Pools/package.order +++ b/AixLib/DataBase/Pools/package.order @@ -1,4 +1,3 @@ IndoorSwimmingPoolBaseRecord -IndoorSwimmingPoolDummy TypesOfIndoorSwimmingPools SwimmingPoolWalls From ed21aef7dd7784f6ff3b1490e64f9c6c08ddf728 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 12:44:46 +0200 Subject: [PATCH 19/34] Rename parameters to meet naming convention #1407 --- .../Pools/IndoorSwimmingPoolBaseRecord.mo | 34 +++++++++---------- .../ChildrensPool.mo | 34 +++++++++---------- .../TypesOfIndoorSwimmingPools/SportPool.mo | 34 +++++++++---------- 3 files changed, 51 insertions(+), 51 deletions(-) diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo index f9b9d195d3..97485f9948 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo @@ -7,32 +7,32 @@ record IndoorSwimmingPoolBaseRecord parameter Modelica.Units.SI.Volume VPool "Volume of pool water"; parameter Modelica.Units.SI.Area APool(min=0) "Area of water surface of swimming pool"; - parameter Modelica.Units.SI.Length depthPool(min=0) + parameter Modelica.Units.SI.Length depPool(min=0) "Average depth of swimming pool"; - parameter Modelica.Units.SI.Volume VStorage + parameter Modelica.Units.SI.Volume VSto "Usable Volume of water storage, DIN 19643-1"; // parameter for pool water circulation parameter Modelica.Units.SI.VolumeFlowRate V_flow_nominal(min=0.001) "Circulation volume flow rate"; - parameter Modelica.Units.SI.VolumeFlowRate V_flow_partial(min=0) + parameter Modelica.Units.SI.VolumeFlowRate V_flow_par(min=0) "In the case of partial load: circulation volume flow rate during non-opening hours, DIN 19643-1"; - parameter Boolean use_partialLoad=false "Partial load operation implemented for non opening hours?"; + parameter Boolean use_parLoa=false "Partial load operation implemented for non opening hours?"; parameter Modelica.Units.SI.PressureDifference dpHeaExcPool "Pressure drop of heat exchanger, should be zero for an indeal heated pool"; - parameter Boolean use_idealHeater=true "Include an ideal heat exchanger into the circulation system"; + parameter Boolean use_ideHeaExc=true "Include an ideal heat exchanger into the circulation system"; parameter Real KHeat "Gain of controller for ideal heater"; - parameter Modelica.Units.SI.Time THeat "Time constant of Integrator block for ideal heater"; + parameter Modelica.Units.SI.Time timeHea "Time constant of Integrator block for ideal heater"; parameter Real QMaxHeat "Upper limit of output for ideal heater"; parameter Real QMinHeat "Lower limit of output for ideal heater"; // parameter for evaporation parameter Real betaInUse(unit="m/s") "Water transfer coefficient during opening hours if pool is used, VDI 2089"; - parameter Boolean use_poolCover=false "Pool covered during non opening hours"; + parameter Boolean use_poolCov=false "Pool covered during non opening hours"; // parameter for fresh water - parameter Boolean use_waterRecycling= false "Recycled water used for refilling pool water?"; - parameter Real x_recycling(min=0) "Percentage of refilling water provided by recycled pool water, DIN 19643-1: <= 0,8"; + parameter Boolean use_watRec= false "Recycled water used for refilling pool water?"; + parameter Real x_rec(min=0) "Percentage of refilling water provided by recycled pool water, DIN 19643-1: <= 0,8"; parameter Modelica.Units.SI.MassFlowRate m_flow_out(min=0.0001) "Waterexchange due to people in the pool, DIN 19643-1"; parameter Boolean use_HRS=false "Is a heat recovery system physically integrated?"; @@ -40,22 +40,22 @@ record IndoorSwimmingPoolBaseRecord "Effieciency of heat recovery system"; // Wave mode - parameter Boolean use_wavePool=false "Is there a wave machine installed?"; - parameter Modelica.Units.SI.Length heightWave "Height of generated wave"; - parameter Modelica.Units.SI.Length widthWave + parameter Boolean use_wavPool=false "Is there a wave machine installed?"; + parameter Modelica.Units.SI.Length heiWav "Height of generated wave"; + parameter Modelica.Units.SI.Length widWav "Width of generated wave/ width of wave machineoutlet"; - parameter Modelica.Units.SI.Time timeWavePul_start + parameter Modelica.Units.SI.Time timeWavPul_start "Start time of first wave cycle"; - parameter Modelica.Units.SI.Time periodeWavePul "Time of cycling period"; - parameter Real widthWavePul "Fraction of time of wave generation within cycling period"; + parameter Modelica.Units.SI.Time perWavPul "Time of cycling period"; + parameter Real widWavPul "Fraction of time of wave generation within cycling period"; // Pool Walls parameter Modelica.Units.SI.Area AWalInt "Area of pool walls which is connected to inner rooms (inner pool walls)"; parameter Modelica.Units.SI.Area AWalExt "Area of pool walls which is connected to the ground (pool wall with earth contact)"; parameter Modelica.Units.SI.Area AFloInt "Area of pool floors which is connected to inner rooms (inner pool floor)"; parameter Modelica.Units.SI.Area AFloExt "Area of pool floors which is connected to teh ground (pool floor with earth contact)"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWatHor "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWatVer "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; //replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam; parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam annotation (choicesAllMatching=true); diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo index b8d33746c7..59262af745 100644 --- a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/ChildrensPool.mo @@ -4,36 +4,36 @@ record ChildrensPool "Pool which is mainly used by children" TPool=303.15, VPool=126.8, APool=125.0, - depthPool=0.9303008070432868, - VStorage=69.333925940005700, + depPool=0.9303008070432868, + VSto=69.333925940005700, V_flow_nominal=0.028045267489711933, - V_flow_partial=0.0125, - use_partialLoad=true, + V_flow_par=0.0125, + use_parLoa=true, dpHeaExcPool=0, - use_idealHeater=true, + use_ideHeaExc=true, KHeat=1000, - THeat=1, + timeHea=1, QMaxHeat=1000000, QMinHeat=0, betaInUse=0.011111111111111112, - use_poolCover=false, - use_waterRecycling=false, - x_recycling=0.0, + use_poolCov=false, + use_watRec=false, + x_rec=0.0, m_flow_out=0.055645372003397, use_HRS=true, etaHRS=0.8, - use_wavePool=false, - heightWave=0, - widthWave=0, - periodeWavePul=1800, - timeWavePul_start=0, - widthWavePul=0, + use_wavPool=false, + heiWav=0, + widWav=0, + perWavPul=1800, + timeWavPul_start=0, + widWavPul=0, AWalInt=0.001, AWalExt=156.5, AFloInt=0.001, AFloExt=156.5, - hConWaterHorizontal=50.0, - hConWaterVertical=5200.0, + hConWatHor=50.0, + hConWatVer=5200.0, PoolWallParam= AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteInsulationConstruction()); annotation (Documentation(info=" diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo index 11238528a9..cf2285ecc2 100644 --- a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo +++ b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/SportPool.mo @@ -4,36 +4,36 @@ record SportPool "Pool which is mainly used by sport swimmers" TPool=301.15, VPool=942.956, APool=416.5, - depthPool=2.2640000000000002, - VStorage=69.333925940005700, + depPool=2.2640000000000002, + VSto=69.333925940005700, V_flow_nominal=0.0856995884773662, - V_flow_partial=0.023144444444444443, - use_partialLoad=true, + V_flow_par=0.023144444444444443, + use_parLoa=true, dpHeaExcPool=0, - use_idealHeater=true, + use_ideHeaExc=true, KHeat=1000, - THeat=1, + timeHea=1, QMaxHeat=1000000, QMinHeat=0, betaInUse=0.011111111111111112, - use_poolCover=false, - use_waterRecycling=false, - x_recycling=0.0, + use_poolCov=false, + use_watRec=false, + x_rec=0.0, m_flow_out=0.170038866026520, use_HRS=true, etaHRS=0.8, - use_wavePool=false, - heightWave=0, - widthWave=0, - periodeWavePul=1800, - timeWavePul_start=0, - widthWavePul=10/30*100, + use_wavPool=false, + heiWav=0, + widWav=0, + perWavPul=1800, + timeWavPul_start=0, + widWavPul=10/30*100, AWalInt=21.658, AWalExt=143.32, AFloInt=0.001, AFloExt=559.82, - hConWaterHorizontal=50.0, - hConWaterVertical=5200.0, + hConWatHor=50.0, + hConWatVer=5200.0, PoolWallParam= AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteInsulationConstruction()); annotation (Documentation(info=" From 86c0516b6480682fe9fa4ab5ea7e6b6ccd539e85 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 12:46:40 +0200 Subject: [PATCH 20/34] Rename base data record and change strukture of package #1407 --- AixLib/DataBase/Pools/ChildrensPool.mo | 42 +++++++++++++++++++ ...> IndoorSwimmingPoolBaseDataDefinition.mo} | 4 +- AixLib/DataBase/Pools/SportPool.mo | 42 +++++++++++++++++++ .../TypesOfIndoorSwimmingPools/package.mo | 3 -- AixLib/DataBase/Pools/package.order | 5 ++- 5 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 AixLib/DataBase/Pools/ChildrensPool.mo rename AixLib/DataBase/Pools/{IndoorSwimmingPoolBaseRecord.mo => IndoorSwimmingPoolBaseDataDefinition.mo} (98%) create mode 100644 AixLib/DataBase/Pools/SportPool.mo delete mode 100644 AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo diff --git a/AixLib/DataBase/Pools/ChildrensPool.mo b/AixLib/DataBase/Pools/ChildrensPool.mo new file mode 100644 index 0000000000..ba2278d2cd --- /dev/null +++ b/AixLib/DataBase/Pools/ChildrensPool.mo @@ -0,0 +1,42 @@ +within AixLib.DataBase.Pools; +record ChildrensPool "Pool which is mainly used by children" + extends IndoorSwimmingPoolBaseDataDefinition( + TPool=303.15, + VPool=126.8, + APool=125.0, + depPool=0.9303008070432868, + VSto=69.333925940005700, + V_flow_nominal=0.028045267489711933, + V_flow_par=0.0125, + use_parLoa=true, + dpHeaExcPool=0, + use_ideHeaExc=true, + KHeat=1000, + timeHea=1, + QMaxHeat=1000000, + QMinHeat=0, + betaInUse=0.011111111111111112, + use_poolCov=false, + use_watRec=false, + x_rec=0.0, + m_flow_out=0.055645372003397, + use_HRS=true, + etaHRS=0.8, + use_wavPool=false, + heiWav=0, + widWav=0, + perWavPul=1800, + timeWavPul_start=0, + widWavPul=0, + AWalInt=0.001, + AWalExt=156.5, + AFloInt=0.001, + AFloExt=156.5, + hConWatHor=50.0, + hConWatVer=5200.0, + PoolWallParam= + AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteInsulationConstruction()); +annotation (Documentation(info=" +

The swimming pool "ChildrensPool" describes a typical indoor swimming pool, which is mainly used by children and to teach children swimming.

+")); +end ChildrensPool; diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo similarity index 98% rename from AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo rename to AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo index 97485f9948..9b059af8ec 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseRecord.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo @@ -1,5 +1,5 @@ within AixLib.DataBase.Pools; -record IndoorSwimmingPoolBaseRecord +record IndoorSwimmingPoolBaseDataDefinition extends Modelica.Icons.Record; parameter Modelica.Units.SI.Temperature TPool @@ -74,4 +74,4 @@ record IndoorSwimmingPoolBaseRecord
  • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
  • ")); -end IndoorSwimmingPoolBaseRecord; +end IndoorSwimmingPoolBaseDataDefinition; diff --git a/AixLib/DataBase/Pools/SportPool.mo b/AixLib/DataBase/Pools/SportPool.mo new file mode 100644 index 0000000000..3f6693aa9d --- /dev/null +++ b/AixLib/DataBase/Pools/SportPool.mo @@ -0,0 +1,42 @@ +within AixLib.DataBase.Pools; +record SportPool "Pool which is mainly used by sport swimmers" + extends IndoorSwimmingPoolBaseDataDefinition( + TPool=301.15, + VPool=942.956, + APool=416.5, + depPool=2.2640000000000002, + VSto=69.333925940005700, + V_flow_nominal=0.0856995884773662, + V_flow_par=0.023144444444444443, + use_parLoa=true, + dpHeaExcPool=0, + use_ideHeaExc=true, + KHeat=1000, + timeHea=1, + QMaxHeat=1000000, + QMinHeat=0, + betaInUse=0.011111111111111112, + use_poolCov=false, + use_watRec=false, + x_rec=0.0, + m_flow_out=0.170038866026520, + use_HRS=true, + etaHRS=0.8, + use_wavPool=false, + heiWav=0, + widWav=0, + perWavPul=1800, + timeWavPul_start=0, + widWavPul=10/30*100, + AWalInt=21.658, + AWalExt=143.32, + AFloInt=0.001, + AFloExt=559.82, + hConWatHor=50.0, + hConWatVer=5200.0, + PoolWallParam= + AixLib.DataBase.Pools.SwimmingPoolWalls.ConcreteInsulationConstruction()); + annotation (Documentation(info=" +

    The swimming pool "SportPool" describes a typical indoor swimming pool, which is mainly used for sport swimming.

    +")); +end SportPool; diff --git a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo b/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo deleted file mode 100644 index 5994359dda..0000000000 --- a/AixLib/DataBase/Pools/TypesOfIndoorSwimmingPools/package.mo +++ /dev/null @@ -1,3 +0,0 @@ -within AixLib.DataBase.Pools; -package TypesOfIndoorSwimmingPools -end TypesOfIndoorSwimmingPools; diff --git a/AixLib/DataBase/Pools/package.order b/AixLib/DataBase/Pools/package.order index a89c64ac40..627151f2b7 100644 --- a/AixLib/DataBase/Pools/package.order +++ b/AixLib/DataBase/Pools/package.order @@ -1,3 +1,4 @@ -IndoorSwimmingPoolBaseRecord -TypesOfIndoorSwimmingPools +IndoorSwimmingPoolBaseDataDefinition +SportPool +ChildrensPool SwimmingPoolWalls From 2b36582c5089226198b7d608c9298bd055b118f2 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 12:50:01 +0200 Subject: [PATCH 21/34] Rename package fluid.pool to fluid.pools (analog to movers, heatpumps, etc.) #1407 --- .../BaseClasses/HeatTransferConduction.mo | 168 +++++ AixLib/Fluid/Pools/BaseClasses/package.mo | 6 + AixLib/Fluid/Pools/BaseClasses/package.order | 2 + AixLib/Fluid/Pools/BaseClasses/waveMachine.mo | 93 +++ .../Pools/Examples/IndoorSwimmingPool.mo | 57 ++ ...IndoorSwimmingPoolExternalHeatingSystem.mo | 89 +++ AixLib/Fluid/Pools/Examples/package.mo | 4 + AixLib/Fluid/Pools/Examples/package.order | 2 + AixLib/Fluid/Pools/IndoorSwimmingPool.mo | 661 ++++++++++++++++++ AixLib/Fluid/Pools/package.mo | 7 + AixLib/Fluid/Pools/package.order | 3 + AixLib/Fluid/package.order | 2 +- 12 files changed, 1093 insertions(+), 1 deletion(-) create mode 100644 AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo create mode 100644 AixLib/Fluid/Pools/BaseClasses/package.mo create mode 100644 AixLib/Fluid/Pools/BaseClasses/package.order create mode 100644 AixLib/Fluid/Pools/BaseClasses/waveMachine.mo create mode 100644 AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo create mode 100644 AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo create mode 100644 AixLib/Fluid/Pools/Examples/package.mo create mode 100644 AixLib/Fluid/Pools/Examples/package.order create mode 100644 AixLib/Fluid/Pools/IndoorSwimmingPool.mo create mode 100644 AixLib/Fluid/Pools/package.mo create mode 100644 AixLib/Fluid/Pools/package.order diff --git a/AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo b/AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo new file mode 100644 index 0000000000..517910b396 --- /dev/null +++ b/AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo @@ -0,0 +1,168 @@ +within AixLib.Fluid.Pools.BaseClasses; +model HeatTransferConduction + "Heat transfer due to conduction through pool walls" + + parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState + "Type of energy balance: dynamic (3 initialization options) or steady state" + annotation(Evaluate=true, Dialog(tab="Dynamics", group="Equations")); + + parameter Modelica.Units.SI.Area AWalInt "Area of pool walls which is connected to inner rooms (inner pool walls)"; + parameter Modelica.Units.SI.Area AWalExt "Area of pool walls which is connected to the ground (pool wall with earth contact)"; + parameter Modelica.Units.SI.Area AFloInt "Area of pool floors which is connected to inner rooms (inner pool floor)"; + parameter Modelica.Units.SI.Area AFloExt "Area of pool floors which is connected to teh ground (pool floor with earth contact)"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; + + parameter Modelica.Units.SI.Temperature TPool "Set temperature for pool"; + + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter + "Generate Heat Flow for earth contact" annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={74,-28}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport_a + "Inlet for heattransfer" annotation (Placement(transformation(extent={{-116, + -14},{-90,12}}), + iconTransformation(extent={{-116,-14},{-90,12}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil "Temperature of Soil" annotation (Placement(transformation(extent={{130,-48}, + {90,-8}}), + iconTransformation(extent={{126,16},{86,56}}))); + + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolFloor( + A=AFloInt, + wallRec=PoolWall, + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,-32},{22,-8}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( + hCon_const=hConWaterHorizontal, + A=AFloInt, + calcMethod=3, + surfaceOrientation=1) + annotation (Placement(transformation( + origin={-50,-20}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( + hCon_const=hConWaterVertical, + A=AWalExt, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-50,40}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolWallWithEarthContact( + A=AWalExt, + wallRec=PoolWall, + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,28},{22,52}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( + hCon_const=hConWaterHorizontal, + A=AFloExt, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-50,-60}, + extent={{-10,-10},{10,10}}, + rotation=180))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + PoolFloorWithEarthContact( + A=AFloExt, + wallRec=PoolWall, + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,-72},{22,-50}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow + prescribedHeatFlow1 "Generate Heat Flow for earth contact" + annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=180, + origin={44,12}))); + AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer + InnerPoolWall( + A=AWalInt, + wallRec=PoolWall, + T_start=fill(TPool, PoolWall.n), + energyDynamics=energyDynamics) + annotation (Placement(transformation(extent={{-2,68},{22,92}}))); + Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) + "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" + annotation (Placement(transformation(extent={{96,2},{76,22}}))); + AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( + hCon_const=hConWaterVertical, + A=AWalInt, + calcMethod=3, + surfaceOrientation=1) annotation (Placement(transformation( + origin={-50,80}, + extent={{-10,-10},{10,10}}, + rotation=180))); + replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall + annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); +equation + connect(HeatFlowOuter.T, TSoil) + annotation (Line(points={{81.2,-28},{110,-28}}, color={0,0,127})); + connect(heatport_a, heatport_a) + annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) + annotation (Line(points={{-40,-20},{-2,-20}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( + Line(points={{22,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); + connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) + annotation (Line(points={{-2,-61},{-2,-60},{-40,-60}}, color={191,0,0})); + connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{22,80},{30,80},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( + points={{-60,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( + points={{-60,-20},{-72,-20},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( + points={{-60,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); + connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) + annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); + connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( + points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); + connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( + points={{22,-20},{30,-20},{30,12},{38,12}}, color={191,0,0})); + connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) + annotation (Line(points={{-40,40},{-2,40}}, color={191,0,0})); + connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( + Line(points={{-2,80},{-40,80}}, color={191,0,0})); + connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( + points={{-60,80},{-72,80},{-72,-1},{-103,-1}},color={191,0,0})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-80,58},{28,-26}}, + lineColor={28,108,200}, + fillColor={28,108,200}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{28,68},{48,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Rectangle( + extent={{-86,-26},{30,-46}}, + lineColor={135,135,135}, + fillColor={175,175,175}, + fillPattern=FillPattern.Forward), + Polygon( + points={{-16,-10},{-4,6},{58,-52},{46,-62},{-16,-10}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Polygon( + points={{32,-68},{36,-66},{62,-38},{76,-78},{32,-68}}, + lineColor={238,46,47}, + fillColor={238,46,47}, + fillPattern=FillPattern.Solid), + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0})}), + Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

    This model is a base model to calculate the heat transfer through pool walls. The pool walls are divided in: vertical walls without earth contact, vertical walls with earth contact, pool floor without earth contact, pool floor with earth contact.

    +")); +end HeatTransferConduction; diff --git a/AixLib/Fluid/Pools/BaseClasses/package.mo b/AixLib/Fluid/Pools/BaseClasses/package.mo new file mode 100644 index 0000000000..fb7f0d7029 --- /dev/null +++ b/AixLib/Fluid/Pools/BaseClasses/package.mo @@ -0,0 +1,6 @@ +within AixLib.Fluid.Pools; +package BaseClasses + extends Modelica.Icons.BasesPackage; + + +end BaseClasses; diff --git a/AixLib/Fluid/Pools/BaseClasses/package.order b/AixLib/Fluid/Pools/BaseClasses/package.order new file mode 100644 index 0000000000..c1967ace29 --- /dev/null +++ b/AixLib/Fluid/Pools/BaseClasses/package.order @@ -0,0 +1,2 @@ +HeatTransferConduction +waveMachine diff --git a/AixLib/Fluid/Pools/BaseClasses/waveMachine.mo b/AixLib/Fluid/Pools/BaseClasses/waveMachine.mo new file mode 100644 index 0000000000..e498df7091 --- /dev/null +++ b/AixLib/Fluid/Pools/BaseClasses/waveMachine.mo @@ -0,0 +1,93 @@ +within AixLib.Fluid.Pools.BaseClasses; +model waveMachine "Calculate energy demands of a wave machine" + + parameter Modelica.Units.SI.Length heightWave "Height of generated wave"; + parameter Modelica.Units.SI.Length widthWave + "Width of generated wave/ width of wave machineoutlet"; + parameter Modelica.Units.SI.Time timeWavePul_start + "Start time of first wave cycle"; + parameter Modelica.Units.SI.Time periodeWavePul "Time of cycling period"; + parameter Real widthWavePul "Fraction of time of wave generation within cycling period"; + + Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) + "If input = 1, then true, else no waves generated" + annotation (Placement(transformation(extent={{-58,-8},{-42,8}}))); + Modelica.Blocks.Tables.CombiTable1Dv tablePWave( + y(unit="W/m"), + tableOnFile=false, + table=[0,0; 0.7,3500; 0.9,6000; 1.3,12000], + extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) + "Estimate consumed power per width to generate wave of a certain heigth; " + annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); + Modelica.Blocks.Sources.RealExpression get_heightWave(y=heightWave) + "Get height of generated wave" + annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); + Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" + annotation (Placement(transformation(extent={{-136,-20},{-96,20}}))); + Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") + "Power consumption of wave machine" + annotation (Placement(transformation(extent={{96,-10},{116,10}}))); + Modelica.Blocks.Math.Gain multiply(k=widthWave) "Multply by width of wave" + annotation (Placement(transformation(extent={{0,52},{16,68}}))); + Modelica.Blocks.Sources.Constant zero(k=0) + "no output if wave machine is off" + annotation (Placement(transformation(extent={{-14,-78},{0,-64}}))); + Modelica.Blocks.Logical.Switch switchWaveMachine + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); + Modelica.Blocks.Logical.And and1 + annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); + Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( + width=widthWavePul, + period=periodeWavePul, + startTime=timeWavePul_start) + annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); +equation + connect(get_heightWave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, + 60}}, color={0,0,127})); + connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, + color={0,0,127})); + connect(open, useWavePool.u) + annotation (Line(points={{-116,0},{-59.6,0}}, color={0,0,127})); + connect(switchWaveMachine.y, PWaveMachine) annotation (Line(points={{81,0},{ + 106,0}}, color={0,0,127})); + connect(multiply.y, switchWaveMachine.u1) + annotation (Line(points={{16.8,60},{42,60},{42,8},{58,8}}, + color={0,0,127})); + connect(zero.y, switchWaveMachine.u3) annotation (Line(points={{0.7,-71},{52,-71}, + {52,-8},{58,-8}}, color={0,0,127})); + connect(PWaveMachine, PWaveMachine) annotation (Line( + points={{106,0},{101,0},{101,0},{106,0}}, + color={0,0,127}, + smooth=Smooth.Bezier)); + connect(useWavePool.y, and1.u1) + annotation (Line(points={{-41.2,0},{-10,0}}, color={255,0,255})); + connect(and1.y, switchWaveMachine.u2) + annotation (Line(points={{13,0},{58,0}}, color={255,0,255})); + connect(wavePoolCycle.y, and1.u2) annotation (Line(points={{-39,-40},{-24,-40}, + {-24,-8},{-10,-8}}, color={255,0,255})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}), + Line( + points={{-98,0},{-52,62},{-2,-24},{50,60},{100,-2}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-18},{-52,44},{-2,-42},{50,42},{98,-20}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1), + Line( + points={{-98,-36},{-52,26},{-2,-60},{50,24},{96,-36}}, + color={28,108,200}, + smooth=Smooth.Bezier, + thickness=1)}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

    Model to calculate the energy demand of a wavemachine. Based on values of:

    +
      +
    • German Association for the Recreational and Medicinal Bath Industry (Deutsche Gesellschaft für das Badewesen DGfdB), April 2015 : Richtlinien für den Bäderbau
    • +
    • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
    • +
    +")); +end waveMachine; diff --git a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo new file mode 100644 index 0000000000..8b196f8ed7 --- /dev/null +++ b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo @@ -0,0 +1,57 @@ +within AixLib.Fluid.Pools.Examples; +model IndoorSwimmingPool + extends Modelica.Icons.Example; + .AixLib.Fluid.Pools.IndoorSwimmingPool indoorSwimming(poolParam= + AixLib.DataBase.Pools.SportPool(), redeclare package WaterMedium = + WaterMedium) + annotation (Placement(transformation(extent={{-20,-40},{30,16}}))); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) + annotation (Placement(transformation(extent={{96,44},{80,60}}))); + Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) + annotation (Placement(transformation(extent={{-84,32},{-68,48}}))); + Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) + annotation (Placement(transformation(extent={{-84,56},{-68,72}}))); + Modelica.Blocks.Sources.Pulse timeOpe( + amplitude=1, + width=(13/15)*100, + period=(24 - 7)*3600, + offset=0, + startTime=3600*7) + annotation (Placement(transformation(extent={{-88,-48},{-74,-34}}))); + Modelica.Blocks.Sources.Trapezoid uRelPer( + amplitude=0.5, + rising=7*3600, + width=1*3600, + falling=7*3600, + period=17*3600, + offset=0.3, + startTime=7*3600) + annotation (Placement(transformation(extent={{-86,-6},{-72,8}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature + prescribedTemperature + annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); +equation + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52},{38, + 52},{38,1.16},{30.75,1.16}}, color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-2.25,16.84},{ + -2.25,24},{-62,24},{-62,40},{-67.2,40}}, + color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-11.75,16.84}, + {-10,16.84},{-10,64},{-67.2,64}}, + color={0,0,127})); + connect(timeOpe.y, indoorSwimming.timeOpe) annotation (Line(points={{-73.3, + -41},{-30,-41},{-30,-28.24},{-21.5,-28.24}}, color={0,0,127})); + connect(uRelPer.y, indoorSwimming.uRelPer) annotation (Line(points={{-71.3,1}, + {-30,1},{-30,-19.56},{-21.75,-19.56}}, color={0,0,127})); + connect(prescribedTemperature.T, T_Air.y) + annotation (Line(points={{-17.2,80},{-58,80},{-58,64},{-67.2,64}}, + color={0,0,127})); + connect(prescribedTemperature.port, indoorSwimming.convPool) annotation (Line( + points={{-4,80},{23.5,80},{23.5,17.12}}, color={191,0,0})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); +end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo new file mode 100644 index 0000000000..7cdb817784 --- /dev/null +++ b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo @@ -0,0 +1,89 @@ +within AixLib.Fluid.Pools.Examples; +model IndoorSwimmingPoolExternalHeatingSystem + extends Modelica.Icons.Example; + .AixLib.Fluid.Pools.IndoorSwimmingPool indoorSwimming(poolParam= + AixLib.DataBase.Pools.SportPool(use_idealHeater=false), redeclare + package WaterMedium = WaterMedium) + annotation (Placement(transformation(extent={{-32,-38},{16,28}}))); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) + annotation (Placement(transformation(extent={{74,80},{58,96}}))); + Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) + annotation (Placement(transformation(extent={{-88,48},{-72,64}}))); + Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) + annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); + Modelica.Blocks.Sources.Pulse Opening( + amplitude=1, + width=(13/15)*100, + period=(24 - 7)*3600, + offset=0, + startTime=3600*7) + annotation (Placement(transformation(extent={{-94,-44},{-80,-30}}))); + Modelica.Blocks.Sources.Trapezoid Person( + amplitude=0.5, + rising=7*3600, + width=1*3600, + falling=7*3600, + period=17*3600, + offset=0.3, + startTime=7*3600) + annotation (Placement(transformation(extent={{-94,-8},{-80,6}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature + prescribedTemperature + annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); + Controls.Continuous.LimPID PI( + k=1000, + yMax=10000000, + yMin=0, + controllerType=Modelica.Blocks.Types.SimpleController.PI, + Ti=1) annotation(Placement(transformation(extent={{-8,-8}, + {8,8}}, + rotation=180, + origin={82,4}))); + Modelica.Blocks.Sources.RealExpression SetTemperature(y=273.15 + 28) + annotation (Placement(transformation(extent={{96,34},{78,50}}))); + MixingVolumes.MixingVolume vol( + redeclare package Medium = AixLib.Media.Water, + m_flow_nominal=indoorSwimming.m_flow_nominal, + V=2, + nPorts=2) annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + rotation=90, + origin={44,-12}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow + annotation (Placement(transformation(extent={{62,-50},{42,-30}}))); +equation + connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{57.2,88},{36, + 88},{36,10.51},{16.72,10.51}}, color={0,0,127})); + connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-14.96,28.99},{ + -14.96,38},{-64,38},{-64,56},{-71.2,56}}, + color={0,0,127})); + connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-24.08,28.99}, + {-24.08,80},{-69.2,80}}, color={0,0,127})); + connect(Opening.y, indoorSwimming.timeOpe) annotation (Line(points={{-79.3, + -37},{-50,-37},{-50,-24.14},{-33.44,-24.14}}, color={0,0,127})); + connect(Person.y, indoorSwimming.uRelPer) annotation (Line(points={{-79.3,-1}, + {-50,-1},{-50,-13.91},{-33.68,-13.91}}, color={0,0,127})); + connect(prescribedTemperature.T, T_Air.y) + annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); + connect(prescribedTemperature.port, indoorSwimming.convPool) annotation (Line( + points={{-4,80},{9.76,80},{9.76,29.32}}, color={191,0,0})); + connect(PI.u_s, SetTemperature.y) annotation (Line(points={{91.6,4},{98,4},{ + 98,30},{70,30},{70,42},{77.1,42}}, + color={0,0,127})); + connect(indoorSwimming.TPool, PI.u_m) annotation (Line(points={{17.92,0.28},{ + 62,0.28},{62,18},{82,18},{82,13.6}}, color={0,0,127})); + connect(vol.ports[1], indoorSwimming.port_a1) annotation (Line(points={{34, + -13},{16,-13},{16,-14.9}}, color={0,127,255})); + connect(vol.ports[2], indoorSwimming.port_b1) annotation (Line(points={{34, + -11},{20,-11},{20,-22.82},{16,-22.82}}, color={0,127,255})); + connect(prescribedHeatFlow.port, vol.heatPort) + annotation (Line(points={{42,-40},{42,-22},{44,-22}}, color={191,0,0})); + connect(PI.y, prescribedHeatFlow.Q_flow) annotation (Line(points={{73.2,4},{ + 66,4},{66,-20},{70,-20},{70,-40},{62,-40}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); +end IndoorSwimmingPoolExternalHeatingSystem; diff --git a/AixLib/Fluid/Pools/Examples/package.mo b/AixLib/Fluid/Pools/Examples/package.mo new file mode 100644 index 0000000000..30e5b78435 --- /dev/null +++ b/AixLib/Fluid/Pools/Examples/package.mo @@ -0,0 +1,4 @@ +within AixLib.Fluid.Pools; +package Examples + extends Modelica.Icons.ExamplesPackage; +end Examples; diff --git a/AixLib/Fluid/Pools/Examples/package.order b/AixLib/Fluid/Pools/Examples/package.order new file mode 100644 index 0000000000..1736d4cc6d --- /dev/null +++ b/AixLib/Fluid/Pools/Examples/package.order @@ -0,0 +1,2 @@ +IndoorSwimmingPool +IndoorSwimmingPoolExternalHeatingSystem diff --git a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo new file mode 100644 index 0000000000..b6c9b87101 --- /dev/null +++ b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo @@ -0,0 +1,661 @@ +within AixLib.Fluid.Pools; +model IndoorSwimmingPool + parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseDataDefinition + poolParam "Choose setup for this pool" annotation (choicesAllMatching=true); + + replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); + + parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState + "Type of energy balance: dynamic (3 initialization options) or steady state" + annotation(Evaluate=true, Dialog(tab="Dynamics", group="Equations")); + + // Water transfer coefficients according to VDI 2089 Blatt 1 + parameter Real betaNonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); + parameter Real betaCover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" + annotation (Dialog(group="Water transfer coefficients")); + parameter Real betaWavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" + annotation (Dialog(group="Water transfer coefficients")); + + // Parameter and variables for evaporation + constant Modelica.Units.SI.SpecificHeatCapacity RD=461.52 + "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) + final parameter Modelica.Units.SI.SpecificEnergy h_vapor= + AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.TPool) + "Latent heat of evaporating water"; + Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) + "mass flow rate between pool water and air due to evaporation"; + Modelica.Units.SI.Pressure psat_TPool= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + poolWat.T) "Saturation pressure at pool temperature"; + Modelica.Units.SI.Pressure psat_TAir= + Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( + TAir) "Saturation pressure at air temperature"; + Real phi "Relative humidity"; + + // Pump + parameter Modelica.Units.SI.Pressure pumpHead=170000 + "Expected average flow resistance of water cycle"; + + // Pool circulation flow rate + final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= + poolParam.V_flow_nominal*rhoWater_default + "Nominal circulation mass flow rate to the pool"; + final parameter Modelica.Units.SI.MassFlowRate m_flow_partial= + poolParam.V_flow_par*rhoWater_default + "Partial circulation mass flow rate to pool during non operating hours"; + Modelica.Units.SI.MassFlowRate m_flow_toPool(start=0.0) + "Actual circulation mass flow rate to the pool"; + + // Fresh water and water recycling + final parameter Modelica.Units.SI.Efficiency eta=if poolParam.use_HRS then + poolParam.etaHRS else 0; + Modelica.Units.SI.MassFlowRate m_flow_add(start=0.0) + "Mass flow of fresh water supplied to pool circulation system"; + + // Convection and Radiation at pool water surface + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConvAir=3.5 + "Coefficient of heat transfer between the water surface and the room air"; + // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area + parameter Real eps = 0.9*0.95 + "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; + + AixLib.Fluid.MixingVolumes.MixingVolume poolSto( + redeclare package Medium = WaterMedium, + energyDynamics=energyDynamics, + T_start=poolParam.TPool, + m_flow_nominal=m_flow_nominal, + V=poolParam.VSto, + nPorts=4) "water storage for pool " + annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); + + AixLib.Fluid.Sources.Boundary_pT Sinc( + redeclare package Medium = WaterMedium, nPorts=1) + annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); + AixLib.Fluid.MixingVolumes.MixingVolume poolWat( + redeclare package Medium = WaterMedium, + energyDynamics=energyDynamics, + T_start=poolParam.TPool, + m_flow_nominal=m_flow_nominal, + V=poolParam.VPool, + nPorts=3) "water volume of pool" + annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); + + Modelica.Blocks.Sources.RealExpression getSetMasFlo(y=m_flow_toPool) + "set circulating mass flow of pool water" + annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); + + AixLib.Fluid.Movers.BaseClasses.IdealSource setEva( + redeclare package Medium = WaterMedium, + m_flow_small=0.00001, + control_m_flow=true) annotation (Placement(transformation( + extent={{6,-6},{-6,6}}, + rotation=0, + origin={-30,26}))); + Modelica.Blocks.Sources.RealExpression getEva(y=m_flow_evap) annotation ( + Placement(transformation( + extent={{9,-9},{-9,9}}, + rotation=180, + origin={-81,41}))); + AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( + redeclare package Medium1 = WaterMedium, + redeclare package Medium2 = WaterMedium, + m1_flow_nominal=poolParam.m_flow_out*1.5, + m2_flow_nominal=poolParam.m_flow_out, + dp1_nominal(displayUnit="bar") = 100000, + dp2_nominal(displayUnit="bar") = 100000, + eps=eps) + annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=90, + origin={-33,-73}))); + Modelica.Blocks.Interfaces.RealInput timeOpe + "Input profile for opening hours (0: closed, 1: open)" annotation ( + Placement(transformation(extent={{-118,-70},{-94,-46}}), + iconTransformation(extent={{-118,-70},{-94,-46}}))); + Modelica.Blocks.Interfaces.RealInput uRelPer + "relative number of people related to max. value" annotation (Placement( + transformation(extent={{-120,-40},{-94,-14}}), iconTransformation( + extent={{-120,-40},{-94,-14}}))); + + Modelica.Blocks.Interfaces.RealInput TAir( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of the surrounding room air" annotation ( + Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}),iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-67,103}))); + Modelica.Blocks.Interfaces.RealInput X_w "Absolute humidty of the room Air" annotation (Placement(transformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}), iconTransformation( + extent={{-15,-15},{15,15}}, + rotation=-90, + origin={-29,103}))); + + AixLib.ThermalZones.ReducedOrder.Multizone.BaseClasses.AbsToRelHum absToRelHum + "Calculation of the relative humidity of the room air " annotation (Placement(transformation( + extent={{-5,-5},{5,5}}, + rotation=-90, + origin={-59,77}))); + + Modelica.Blocks.Sources.RealExpression getAddWat(y=m_flow_add) + "requried added fresh warter to the pool circulation" + annotation (Placement(transformation(extent={{-62,-78},{-48,-62}}))); + + AixLib.Fluid.Sources.Boundary_pT sincEva(redeclare package Medium = + WaterMedium, nPorts=1) annotation (Placement(transformation( + extent={{6,-6},{-6,6}}, + rotation=180, + origin={-64,26}))); + + Modelica.Fluid.Interfaces.FluidPort_b port_b1(redeclare package Medium = + WaterMedium) if not poolParam.use_ideHeaExc + "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-64},{110,-44}}), + iconTransformation(extent={{90,-64},{110,-44}}))); + + Modelica.Fluid.Interfaces.FluidPort_a port_a1(redeclare package Medium = + WaterMedium) if not poolParam.use_ideHeaExc + "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" + annotation (Placement(transformation(extent={{90,-40},{110,-20}}), + iconTransformation(extent={{90,-40},{110,-20}}))); + + .AixLib.Fluid.Pools.BaseClasses.waveMachine waveMachine( + heightWave=poolParam.heiWav, + widthWave=poolParam.widWav, + timeWavePul_start=poolParam.timeWavPul_start, + periodeWavePul=poolParam.perWavPul, + widthWavePul=poolParam.widWavPul) if poolParam.use_wavPool + annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPool + "Air temperature in zone" annotation (Placement(transformation(extent={{56,86}, + {80,110}}), iconTransformation(extent={{64,94},{84,114}}))); + + AixLib.Utilities.Interfaces.RadPort radPool + "Mean Radiation Temperature of surrounding walls " annotation (Placement( + transformation( + extent={{-8,-9},{8,9}}, + rotation=-90, + origin={39,100}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=-90, + origin={30,100}))); + + Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( + final Gr=eps*poolParam.APool) + "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( + extent={{-7,-7},{7,7}}, + rotation=90, + origin={39,73}))); + + Modelica.Thermal.HeatTransfer.Components.Convection convWaterSurface + "Convection at the watersurface" annotation (Placement(transformation( + extent={{-7,7},{7,-7}}, + rotation=90, + origin={67,75}))); + + Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=hConvAir*poolParam.APool) + "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, + {82,84}}))); + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, + {12,68}}))); + + Modelica.Blocks.Math.Gain hEva(final k=h_vapor) + "Calculation of heat flow rate due to evaporation" annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-44,52}))); + + Modelica.Blocks.Interfaces.RealOutput m_flow_add_out( + final quantity="MassFlowRate", + final unit= "kg/s") + "Flow rate of added fresh water to the pool and water treatment system" + annotation (Placement(transformation(extent={{98,-102},{118,-82}}), + iconTransformation(extent={{98,-102},{118,-82}}))); + + AixLib.Fluid.Pools.BaseClasses.HeatTransferConduction heatTraCond( + AWalInt=poolParam.AWalInt, + AWalExt=poolParam.AWalExt, + AFloInt=poolParam.AFloInt, + AFloExt=poolParam.AFloExt, + hConWaterHorizontal=poolParam.hConWatHor, + hConWaterVertical=poolParam.hConWatVer, + TPool=poolParam.TPool, + PoolWall=poolParam.PoolWallParam) + "Model to depict the heat flow rate through the pool walls to the bordering room/soil" + annotation (Placement(transformation(extent={{64,32},{80,48}}))); + + Modelica.Blocks.Math.Gain minusGain(final k=-1) annotation (Placement( + transformation( + extent={{-4,-4},{4,4}}, + rotation=0, + origin={-20,60}))); + + Modelica.Blocks.Interfaces.RealOutput QEva( + final quantity="HeatFlowRate", + final unit="W") "Heat due to evaporation" annotation (Placement( + transformation(extent={{-92,46},{-122,76}}), iconTransformation(extent={ + {-94,46},{-114,66}}))); + + Modelica.Blocks.Interfaces.RealOutput QPool( + final quantity="HeatFlowRate", + final unit="W") + if poolParam.use_ideHeaExc + "Heat flow rate to maintain the pool at the set temperature" annotation ( + Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( + extent={{98,-16},{118,4}}))); + + Modelica.Blocks.Interfaces.RealInput TSoil( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Temperature of Soil" annotation (Placement( + transformation( + extent={{-13,-13},{13,13}}, + rotation=180, + origin={105,49}), iconTransformation( + extent={{-11,-11},{11,11}}, + rotation=180, + origin={103,47}))); + + Modelica.Blocks.Interfaces.RealOutput PPool( + final quantity="Power", + final unit="W") + "Output eletric energy needed for pool operation" annotation (Placement(transformation(extent={{98,-86}, + {118,-66}}), + iconTransformation(extent={{98,-86},{118,-66}}))); + + Modelica.Blocks.Interfaces.RealOutput TPool( + final quantity="ThermodynamicTemperature", + final unit="K") + "current temperature of pool" + annotation (Placement(transformation(extent={{98,6},{118,26}}), + iconTransformation(extent={{98,6},{118,26}}))); + + Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavPool then 2 else 1) + "Add electric power of pump and the optional wave pool" + annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); + Sources.MassFlowSource_T bou( + redeclare package Medium = WaterMedium, + use_m_flow_in=true, + T=283.15, + nPorts=1) + annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); + Modelica.Blocks.Sources.RealExpression getMeaTPool(y=poolWat.T) annotation ( + Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=180, + origin={72,16}))); + + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater + if poolParam.use_ideHeaExc + annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); + Controls.Continuous.LimPID PI( + k=poolParam.KHeat, + yMax=poolParam.QMaxHeat, + yMin=poolParam.QMinHeat, + controllerType=Modelica.Blocks.Types.SimpleController.PI, + Ti=poolParam.timeHea) if poolParam.use_ideHeaExc annotation(Placement(transformation(extent={{-4,-4}, + {4,4}}, + rotation=180, + origin={66,-16}))); + Modelica.Blocks.Sources.RealExpression getSetTPool(y=poolParam.TPool) + if poolParam.use_ideHeaExc + annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); + Controls.Continuous.LimPID PI1( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.1, + Ti=5, + yMax=m_flow_nominal/0.9, + yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); + Movers.FlowControlled_m_flow cirPump( + redeclare package Medium = WaterMedium, + energyDynamics=energyDynamics, + T_start=poolParam.TPool, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + redeclare Movers.Data.Generic per( + pressure(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, dp={ + pumpHead/0.7,pumpHead,0}), + use_powerCharacteristic=false, + hydraulicEfficiency(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, + eta={0.7,0.8,0.7}), + motorEfficiency(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, + eta={0.9,0.9,0.9}), + power(V_flow={0,(m_flow_nominal/1000*0.2),(m_flow_nominal/1000*0.5), + m_flow_nominal/1000*0.7,m_flow_nominal/1000,m_flow_nominal/1000/0.7, + m_flow_nominal/1000/0.6,m_flow_nominal/1000/0.5,m_flow_nominal/1000 + /0.4}, P={(m_flow_nominal/0.4)/1000*pumpHead/0.7/0.9,( + m_flow_nominal/0.5)/1000*pumpHead/0.7/0.9,(m_flow_nominal/0.6)/1000 + *pumpHead/0.7/0.9,(m_flow_nominal/0.7)/1000*pumpHead/0.7/0.9, + m_flow_nominal/1000*pumpHead/0.8/0.9,(m_flow_nominal/1000*0.7)* + pumpHead/0.7/0.9,(m_flow_nominal/1000*0.5)*pumpHead/0.7/0.9,( + m_flow_nominal/1000*0.2)*pumpHead/0.7/0.9,0})), + inputType=AixLib.Fluid.Types.InputType.Continuous, + addPowerToMedium=false, + nominalValuesDefineDefaultPressureCurve=true, + dp_nominal=pumpHead, + m_flow_start=m_flow_nominal) + "circulation pump for permanent pool circulation " annotation (Placement( + transformation( + extent={{-8,-8},{8,8}}, + rotation=0, + origin={0,-68}))); + Sensors.MassFlowRate senMasFlo(redeclare package Medium = + WaterMedium, allowFlowReversal=false) + annotation (Placement(transformation(extent={{-6,-6},{6,6}}, + rotation=0, + origin={22,-68}))); + FixedResistances.PressureDrop res( + redeclare package Medium = WaterMedium, + allowFlowReversal=false, + m_flow_nominal=m_flow_nominal, + show_T=false, + from_dp=false, + dp_nominal=pumpHead - poolParam.dpHeaExcPool, + homotopyInitialization=true, + linearized=false, + deltaM=0.3) "representative resistance for whole system " + annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); + +protected + final parameter Modelica.Units.SI.Density rhoWater_default= + WaterMedium.density_pTX( + p=WaterMedium.p_default, + T=273.15 + 30, + X=WaterMedium.X_default) "Default medium density"; + +equation + // Fresh water and water recycling + if poolParam.use_watRec then + m_flow_add=(1-poolParam.x_rec)*(poolParam.m_flow_out + m_flow_evap); + else + m_flow_add=poolParam.m_flow_out + m_flow_evap; + end if; + + // Pool circulation flow rate + if poolParam.use_parLoa then + if timeOpe > 0 then + m_flow_toPool = m_flow_nominal; + else + m_flow_toPool = m_flow_partial; + end if; + else + m_flow_toPool = m_flow_nominal; + end if; + + // Evaporation according to VDI 2089 sheet 1, formula (1) + phi=absToRelHum.relHum; + if psat_TPool-phi*psat_TAir<0 then + m_flow_evap=0.0; + else + if timeOpe > 0 then + if uRelPer > 0 then + m_flow_evap =uRelPer*(poolParam.betaInUse/(RD*0.5*(poolWat.T + TAir))*( + psat_TPool - phi*psat_TAir)*poolParam.APool); + else + m_flow_evap =betaNonUse/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* + psat_TAir)*poolParam.APool; + end if; + else + if poolParam.use_poolCov then + m_flow_evap =betaCover/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* + psat_TAir)*poolParam.APool; + else + m_flow_evap =betaNonUse/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* + psat_TAir)*poolParam.APool; + end if; + end if; + end if; + + if poolParam.use_ideHeaExc then + connect(res.port_b, poolWat.ports[1]) annotation (Line(points={{44,-68},{54, + -68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, color={0,127,255})); + else + connect(poolWat.ports[1], port_a1) annotation (Line( + points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + connect(port_b1, res.port_b) annotation (Line( + points={{100,-54},{78,-54},{78,-68},{44,-68}}, + color={0,127,255}, + pattern=LinePattern.Dash)); + end if; + + connect(poolWat.ports[3], setEva.port_a) annotation (Line(points={{2.66667,-10}, + {2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); + + connect(poolSto.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, + -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); + connect(poolSto.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, + -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); + connect(poolSto.ports[4], cirPump.port_a) annotation (Line(points={{-26.5,-56}, + {-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); + connect(poolSto.ports[1], poolWat.ports[2]) annotation (Line(points={{-29.5,-56}, + {-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127,255})); + + connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, + {-62,88},{-67,88},{-67,103}},color={0,0,127})); + connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, + {-56,88},{-29,88},{-29,103}}, color={0,0,127})); + connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, + {-30,-88},{22,-88}}, color={0,127,255})); + connect(setEva.port_b, sincEva.ports[1]) + annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); + connect(getEva.y, setEva.m_flow_in) annotation (Line(points={{-71.1,41},{-26.4, + 41},{-26.4,30.8}}, color={0,0,127})); + connect(radWaterSurface.port_b, radPool) + annotation (Line(points={{39,80},{39,100}}, color={191,0,0})); + connect(convWaterSurface.fluid, convPool) + annotation (Line(points={{67,82},{68,82},{68,98}}, color={191,0,0})); + connect(convWaterSurface.solid, poolWat.heatPort) annotation (Line(points={{67, + 68},{66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); + connect(radWaterSurface.port_a, poolWat.heatPort) + annotation (Line(points={{39,66},{38,66},{38,0},{14,0}}, color={191,0,0})); + connect(preHeatFlowEvapLoss.port, poolWat.heatPort) + annotation (Line(points={{12,60},{26,60},{26,0},{14,0}}, color={191,0,0})); + connect(getEva.y, hEva.u) annotation (Line(points={{-71.1,41},{-58,41},{-58,52}, + {-48.8,52}}, color={0,0,127})); + connect(heatTraCond.heatport_a, poolWat.heatPort) annotation (Line(points={{63.76, + 39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); + connect(hEva.y, minusGain.u) annotation (Line(points={{-39.6,52},{-34,52},{-34, + 60},{-24.8,60}}, color={0,0,127})); + connect(hEva.y, QEva) annotation (Line(points={{-39.6,52},{-34,52},{-34,61},{-107, + 61}}, color={0,0,127})); + connect(heatTraCond.TSoil, TSoil) annotation (Line(points={{80.48,42.88},{82,42.88}, + {82,49},{105,49}}, color={0,0,127})); + connect(convPool, convPool) + annotation (Line(points={{68,98},{68,98}}, color={191,0,0})); + connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, + {74,75}}, color={0,0,127})); + connect(minusGain.y, preHeatFlowEvapLoss.Q_flow) + annotation (Line(points={{-15.6,60},{-4,60}}, color={0,0,127})); + + connect(bou.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, + {-40,-78},{-36,-78}}, color={0,127,255})); + connect(waveMachine.open, timeOpe) annotation (Line(points={{-93.28,-87},{-98, + -87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, color={0,0,127})); + connect(getMeaTPool.y, TPool) + annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); + + connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, + {54,-12},{48,-12}}, color={0,0,127})); + connect(idealHeater.port, poolWat.heatPort) annotation (Line(points={{32,-12}, + {24,-12},{24,0},{14,0}}, color={191,0,0})); + connect(getSetTPool.y, PI.u_s) + annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); + connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, + -16}}, color={0,0,127})); + connect(bou.m_flow_in, getAddWat.y) annotation (Line(points={{-53.2,-83.2},{-60, + -83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); + connect(getAddWat.y, m_flow_add_out) annotation (Line(points={{-47.3,-70},{-42,-70}, + {-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, color={0,0, + 127})); + connect(setEva.port_b, setEva.port_a) annotation (Line( + points={{-36,26},{-30,26},{-24,26}}, + color={0,127,255}, + smooth=Smooth.Bezier)); + connect(cirPump.port_b, senMasFlo.port_a) + annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); + connect(senMasFlo.port_b, res.port_a) + annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); + connect(PI1.y, cirPump.m_flow_in) + annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); + connect(PI1.u_s,getSetMasFlo. y) + annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); + connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, + {13,-58},{13,-55}}, color={0,0,127})); + + connect(elPower.u[1], cirPump.P) annotation (Line(points={{72,-76},{62,-76},{62, + -60.8},{8.8,-60.8}}, color={0,0,127})); + connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); + connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, + -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, + color={0,0,127})); + + connect(PI.u_m,getMeaTPool. y) annotation (Line(points={{66,-11.2},{66,4},{92, + 4},{92,16},{83,16}}, color={0,0,127})); + annotation (Line( + points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), + Line(points={{18.4,-40}, + {18,-40},{18,-44},{-100,-44}}, color={0,127,255}), + Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-50,82}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=-90, + origin={-60,80})), + Icon(coordinateSystem(preserveAspectRatio=false), + graphics={ + Rectangle( + extent={{98,98},{-98,-98}}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Bitmap(extent={{-94,-150},{96,58}}, fileName="modelica://AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg")}), + Diagram(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-100,2},{100,100}}, + lineColor={0,128,255}, + fillColor={170,213,255}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,12},{-6,0}}, + textColor={85,85,255}, + textStyle={TextStyle.Bold}, + horizontalAlignment=TextAlignment.Left, + textString="Heat and mass exchange +at pool surface or pool walls +"), Rectangle( + extent={{-66,-98},{100,-2}}, + lineColor={0,0,127}, + fillColor={155,195,232}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Rectangle( + extent={{-100,-98},{-68,-2}}, + lineColor={95,95,95}, + fillColor={215,215,215}, + fillPattern=FillPattern.Solid, + lineThickness=0.5), + Text( + extent={{-98,-6},{-72,-14}}, + textColor={95,95,95}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Pool +operation"), + Text( + extent={{-64,-2},{-22,-24}}, + textColor={0,0,127}, + horizontalAlignment=TextAlignment.Left, + textStyle={TextStyle.Bold}, + textString="Water treatment +circuit +")}), +Documentation(info="

    + Overview +

    +

    + Model for indoor swimming pools to calculate energy and water + demands. Optional use of a wave machine, pool cover, partial load for + the circulation pump and heat recovery from wastewater or recycling. + In addition, an ideal heater can be used to heat the pool. +

    +

    +
    +
    + \"1\" +

    +

    + Important parameters and + Inputs +

    +
      +
    • All pool specific parameters are collected in one AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord + record. +
    • +
    • openingHours: Input profile for the opening hours to consider a + pool cover or a reduced circulation flow during non-operating hours. + Also, during non-opening hours pool occupancy is set to 0. +
    • +
    • persons: Input profile for occupancy of the pool to consider + occupancy level for evaportaion. +
    • +
    +

    + Assumptions +

    +
      +
    • Evaporation is determined according to VDI 2089. +
    • +
    • Filter and disinfection units are not explicitly modeled and have + to be considered within the pump delivery head (pumpHead). According + to Saunus 1.7 bar is a good estimation for swimming pools in sport + oriented swimming facilities. +
    • +
    • The type of the filter should be taken into account within the + determination of the volume flow and storage capacities. DIN 19643 + provides standards for the volume flow and storage capacities, taking + into account the pool size and type as well as the filter type. +
    • +
    • There are no water losses or heat gains due to people entering or + leaving the swimming pool. +
    • +
    +

    + References +

    +

    + For automatic generation of a swimming pool within a thermal zone and + multizone model as well as for datasets, see + https://github.com/RWTH-EBC/TEASER +

    +

    + References for implemented constants (use also for parametrization): +

    +
      +
    • German Association of Engineers: Guideline VDI 2089-1, January + 2010: Building Services in swimming baths - Indoor Pools +
    • +
    • German Institute for Standardization DIN 19643-1, November 2012: + Treatment of water of swimming pools and baths - Part 1 General + Requirements +
    • +
    • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - + Betrieb +
    • +
    +")); +end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pools/package.mo b/AixLib/Fluid/Pools/package.mo new file mode 100644 index 0000000000..e1e4d74320 --- /dev/null +++ b/AixLib/Fluid/Pools/package.mo @@ -0,0 +1,7 @@ +within AixLib.Fluid; +package Pools + + + + +end Pools; diff --git a/AixLib/Fluid/Pools/package.order b/AixLib/Fluid/Pools/package.order new file mode 100644 index 0000000000..fe272da0eb --- /dev/null +++ b/AixLib/Fluid/Pools/package.order @@ -0,0 +1,3 @@ +IndoorSwimmingPool +BaseClasses +Examples diff --git a/AixLib/Fluid/package.order b/AixLib/Fluid/package.order index f1b354885d..ba573e45c2 100644 --- a/AixLib/Fluid/package.order +++ b/AixLib/Fluid/package.order @@ -13,7 +13,7 @@ Humidifiers MassExchangers MixingVolumes Movers -Pool +Pools Sensors Solar Sources From cba8332eb04d51845351e5893764a33ee1d65410 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 12:56:13 +0200 Subject: [PATCH 22/34] Add descriptions for pool wall record #1407 --- AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo | 2 +- .../Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo | 1 + AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo index 9b059af8ec..ba64a292a9 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo @@ -58,7 +58,7 @@ record IndoorSwimmingPoolBaseDataDefinition parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWatVer "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; //replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam; parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWallParam - annotation (choicesAllMatching=true); + "Wall base data definition with all layers of pool walls" annotation (choicesAllMatching=true); annotation (Documentation(info=" diff --git a/AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo b/AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo index a2957d849c..0f6a93fff7 100644 --- a/AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo +++ b/AixLib/DataBase/Pools/SwimmingPoolWalls/StainlessSteelConstruction.mo @@ -1,5 +1,6 @@ within AixLib.DataBase.Pools.SwimmingPoolWalls; record StainlessSteelConstruction + "Stainless steel pool construction without insulation" extends AixLib.DataBase.Walls.WallBaseDataDefinition( n(min=1) = 1 "Number of wall layers", d={0.05} "Thickness of wall layers", diff --git a/AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo b/AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo index 517910b396..33e58e2927 100644 --- a/AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo +++ b/AixLib/Fluid/Pools/BaseClasses/HeatTransferConduction.mo @@ -101,6 +101,7 @@ model HeatTransferConduction extent={{-10,-10},{10,10}}, rotation=180))); replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall + "Wall type for pool walls, record contains all wall layers" annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); equation connect(HeatFlowOuter.T, TSoil) From 3064c96fbf9a6140b51b3e9d336988600b909ba4 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:01:33 +0200 Subject: [PATCH 23/34] fullfill naming convention #1407 --- AixLib/DataBase/Pools/ChildrensPool.mo | 8 ++++---- .../Pools/IndoorSwimmingPoolBaseDataDefinition.mo | 8 ++++---- AixLib/DataBase/Pools/SportPool.mo | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/AixLib/DataBase/Pools/ChildrensPool.mo b/AixLib/DataBase/Pools/ChildrensPool.mo index ba2278d2cd..e14a3acf60 100644 --- a/AixLib/DataBase/Pools/ChildrensPool.mo +++ b/AixLib/DataBase/Pools/ChildrensPool.mo @@ -4,7 +4,7 @@ record ChildrensPool "Pool which is mainly used by children" TPool=303.15, VPool=126.8, APool=125.0, - depPool=0.9303008070432868, + depthPool=0.9303008070432868, VSto=69.333925940005700, V_flow_nominal=0.028045267489711933, V_flow_par=0.0125, @@ -23,11 +23,11 @@ record ChildrensPool "Pool which is mainly used by children" use_HRS=true, etaHRS=0.8, use_wavPool=false, - heiWav=0, - widWav=0, + heightWav=0, + widthWav=0, perWavPul=1800, timeWavPul_start=0, - widWavPul=0, + widthWavPul=0, AWalInt=0.001, AWalExt=156.5, AFloInt=0.001, diff --git a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo index ba64a292a9..936d544185 100644 --- a/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo +++ b/AixLib/DataBase/Pools/IndoorSwimmingPoolBaseDataDefinition.mo @@ -7,7 +7,7 @@ record IndoorSwimmingPoolBaseDataDefinition parameter Modelica.Units.SI.Volume VPool "Volume of pool water"; parameter Modelica.Units.SI.Area APool(min=0) "Area of water surface of swimming pool"; - parameter Modelica.Units.SI.Length depPool(min=0) + parameter Modelica.Units.SI.Length depthPool(min=0) "Average depth of swimming pool"; parameter Modelica.Units.SI.Volume VSto "Usable Volume of water storage, DIN 19643-1"; @@ -41,13 +41,13 @@ record IndoorSwimmingPoolBaseDataDefinition // Wave mode parameter Boolean use_wavPool=false "Is there a wave machine installed?"; - parameter Modelica.Units.SI.Length heiWav "Height of generated wave"; - parameter Modelica.Units.SI.Length widWav + parameter Modelica.Units.SI.Length heightWav "Height of generated wave"; + parameter Modelica.Units.SI.Length widthWav "Width of generated wave/ width of wave machineoutlet"; parameter Modelica.Units.SI.Time timeWavPul_start "Start time of first wave cycle"; parameter Modelica.Units.SI.Time perWavPul "Time of cycling period"; - parameter Real widWavPul "Fraction of time of wave generation within cycling period"; + parameter Real widthWavPul "Fraction of time of wave generation within cycling period"; // Pool Walls parameter Modelica.Units.SI.Area AWalInt "Area of pool walls which is connected to inner rooms (inner pool walls)"; diff --git a/AixLib/DataBase/Pools/SportPool.mo b/AixLib/DataBase/Pools/SportPool.mo index 3f6693aa9d..7cfbb11ead 100644 --- a/AixLib/DataBase/Pools/SportPool.mo +++ b/AixLib/DataBase/Pools/SportPool.mo @@ -4,7 +4,7 @@ record SportPool "Pool which is mainly used by sport swimmers" TPool=301.15, VPool=942.956, APool=416.5, - depPool=2.2640000000000002, + depthPool=2.2640000000000002, VSto=69.333925940005700, V_flow_nominal=0.0856995884773662, V_flow_par=0.023144444444444443, @@ -23,11 +23,11 @@ record SportPool "Pool which is mainly used by sport swimmers" use_HRS=true, etaHRS=0.8, use_wavPool=false, - heiWav=0, - widWav=0, + heightWav=0, + widthWav=0, perWavPul=1800, timeWavPul_start=0, - widWavPul=10/30*100, + widthWavPul=10/30*100, AWalInt=21.658, AWalExt=143.32, AFloInt=0.001, From e2fd9a8b72ec1883d9c9d2ccbce7e643d34d184d Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:19:42 +0200 Subject: [PATCH 24/34] fixed warnings in example --- AixLib/Fluid/Pools/IndoorSwimmingPool.mo | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo index b6c9b87101..286f9c6105 100644 --- a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo @@ -9,17 +9,19 @@ model IndoorSwimmingPool "Type of energy balance: dynamic (3 initialization options) or steady state" annotation(Evaluate=true, Dialog(tab="Dynamics", group="Equations")); + parameter Modelica.Fluid.Types.Dynamics massDynamics=energyDynamics + "Type of energy balance: dynamic (3 initialization options) or steady state" + annotation(Evaluate=true, Dialog(tab="Advanced", group="Dynamics")); + // Water transfer coefficients according to VDI 2089 Blatt 1 parameter Real betaNonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); - parameter Real betaCover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" - annotation (Dialog(group="Water transfer coefficients")); - parameter Real betaWavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" - annotation (Dialog(group="Water transfer coefficients")); + parameter Real betaCover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours with pool cover" annotation (Dialog(group="Water transfer coefficients")); + parameter Real betaWavePool(unit="m/s")=50/3600 "Water transfer coefficient during wave pool operation" annotation (Dialog(group="Water transfer coefficients")); // Parameter and variables for evaporation - constant Modelica.Units.SI.SpecificHeatCapacity RD=461.52 + final constant Modelica.Units.SI.SpecificHeatCapacity RD=461.52 "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) - final parameter Modelica.Units.SI.SpecificEnergy h_vapor= + final parameter Modelica.Units.SI.SpecificEnergy hVap= AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.TPool) "Latent heat of evaporating water"; Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) @@ -34,7 +36,7 @@ model IndoorSwimmingPool // Pump parameter Modelica.Units.SI.Pressure pumpHead=170000 - "Expected average flow resistance of water cycle"; + "Expected average flow resistance of water cycle"; //Source: Saunus 2005 // Pool circulation flow rate final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= @@ -62,6 +64,7 @@ model IndoorSwimmingPool AixLib.Fluid.MixingVolumes.MixingVolume poolSto( redeclare package Medium = WaterMedium, energyDynamics=energyDynamics, + massDynamics=massDynamics, T_start=poolParam.TPool, m_flow_nominal=m_flow_nominal, V=poolParam.VSto, @@ -74,6 +77,7 @@ model IndoorSwimmingPool AixLib.Fluid.MixingVolumes.MixingVolume poolWat( redeclare package Medium = WaterMedium, energyDynamics=energyDynamics, + massDynamics=massDynamics, T_start=poolParam.TPool, m_flow_nominal=m_flow_nominal, V=poolParam.VPool, @@ -101,8 +105,8 @@ model IndoorSwimmingPool redeclare package Medium2 = WaterMedium, m1_flow_nominal=poolParam.m_flow_out*1.5, m2_flow_nominal=poolParam.m_flow_out, - dp1_nominal(displayUnit="bar") = 100000, - dp2_nominal(displayUnit="bar") = 100000, + dp1_nominal(displayUnit="bar") = 20000, + dp2_nominal(displayUnit="bar") = 20000, eps=eps) annotation (Placement(transformation( extent={{-5,-5},{5,5}}, @@ -206,7 +210,7 @@ model IndoorSwimmingPool Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, {12,68}}))); - Modelica.Blocks.Math.Gain hEva(final k=h_vapor) + Modelica.Blocks.Math.Gain hEva(final k=hVap) "Calculation of heat flow rate due to evaporation" annotation (Placement( transformation( extent={{-4,-4},{4,4}}, From cdce34834514963e21db2b8afb78de0d3723938c Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:20:04 +0200 Subject: [PATCH 25/34] fixed warning in example #1407 --- .../Examples/IndoorSwimmingPoolExternalHeatingSystem.mo | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo index 7cdb817784..9c7c09a7da 100644 --- a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo +++ b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo @@ -2,8 +2,8 @@ within AixLib.Fluid.Pools.Examples; model IndoorSwimmingPoolExternalHeatingSystem extends Modelica.Icons.Example; .AixLib.Fluid.Pools.IndoorSwimmingPool indoorSwimming(poolParam= - AixLib.DataBase.Pools.SportPool(use_idealHeater=false), redeclare - package WaterMedium = WaterMedium) + AixLib.DataBase.Pools.SportPool(use_ideHeaExc=false), redeclare package + WaterMedium = WaterMedium) annotation (Placement(transformation(extent={{-32,-38},{16,28}}))); replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); @@ -46,6 +46,8 @@ model IndoorSwimmingPoolExternalHeatingSystem annotation (Placement(transformation(extent={{96,34},{78,50}}))); MixingVolumes.MixingVolume vol( redeclare package Medium = AixLib.Media.Water, + energyDynamics=indoorSwimming.energyDynamics, + p_start=100000, m_flow_nominal=indoorSwimming.m_flow_nominal, V=2, nPorts=2) annotation (Placement(transformation( From 3037c1ff42f4b05a3e97373883a3351cf66c0e94 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:27:22 +0200 Subject: [PATCH 26/34] propagate temperature of fresh water and set hConvAir final #1407 --- AixLib/Fluid/Pools/IndoorSwimmingPool.mo | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo index 286f9c6105..a0d706dd7a 100644 --- a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo @@ -53,9 +53,11 @@ model IndoorSwimmingPool poolParam.etaHRS else 0; Modelica.Units.SI.MassFlowRate m_flow_add(start=0.0) "Mass flow of fresh water supplied to pool circulation system"; + parameter Modelica.Media.Interfaces.Types.Temperature TFreWater=283.15 + "Temperature of fresh water"; // Convection and Radiation at pool water surface - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConvAir=3.5 + final parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConvAir=3.5 "Coefficient of heat transfer between the water surface and the room air"; // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area parameter Real eps = 0.9*0.95 @@ -288,7 +290,7 @@ model IndoorSwimmingPool Sources.MassFlowSource_T bou( redeclare package Medium = WaterMedium, use_m_flow_in=true, - T=283.15, + T=TFreWater, nPorts=1) annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); Modelica.Blocks.Sources.RealExpression getMeaTPool(y=poolWat.T) annotation ( @@ -368,6 +370,7 @@ model IndoorSwimmingPool deltaM=0.3) "representative resistance for whole system " annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); + protected final parameter Modelica.Units.SI.Density rhoWater_default= WaterMedium.density_pTX( From 944652b75c80d3bd82adc0cdbd59dadf3b2b592b Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:40:52 +0200 Subject: [PATCH 27/34] Add short descriptions for examples #1407 --- AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo | 7 +++++-- .../Examples/IndoorSwimmingPoolExternalHeatingSystem.mo | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo index 8b196f8ed7..58ce25a5fc 100644 --- a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo @@ -1,5 +1,5 @@ within AixLib.Fluid.Pools.Examples; -model IndoorSwimmingPool +model IndoorSwimmingPool "Example of an indoor swimming pool" extends Modelica.Icons.Example; .AixLib.Fluid.Pools.IndoorSwimmingPool indoorSwimming(poolParam= AixLib.DataBase.Pools.SportPool(), redeclare package WaterMedium = @@ -53,5 +53,8 @@ equation points={{-4,80},{23.5,80},{23.5,17.12}}, color={191,0,0})); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); + experiment(StopTime=172800, __Dymola_Algorithm="Dassl"), + Documentation(info=" +

    Example model for an sport oriented indoor swimming pool with an integrated ideal heat exchanger.

    +")); end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo index 9c7c09a7da..67a4378119 100644 --- a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo +++ b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo @@ -87,5 +87,8 @@ equation 66,4},{66,-20},{70,-20},{70,-40},{62,-40}}, color={0,0,127})); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); + experiment(StopTime=172800, __Dymola_Algorithm="Dassl"), + Documentation(info=" +

    Example model for an sport oriented indoor swimming pool with an external heat source.

    +")); end IndoorSwimmingPoolExternalHeatingSystem; From b3385319bd035750a3cc6f51f3d5b5d2548a504f Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:44:34 +0200 Subject: [PATCH 28/34] Add simulate and plot scripts for both examples #1407 --- AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo | 5 ++++- .../IndoorSwimmingPoolExternalHeatingSystem.mo | 5 ++++- .../Fluid/Pools/Examples/IndoorSwimmingPool.mos | 12 ++++++++++++ .../IndoorSwimmingPoolExternalHeatingSystem.mos | 12 ++++++++++++ 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPool.mos create mode 100644 AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos diff --git a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo index 58ce25a5fc..1c69d03a0a 100644 --- a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPool.mo @@ -53,7 +53,10 @@ equation points={{-4,80},{23.5,80},{23.5,17.12}}, color={191,0,0})); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=172800, __Dymola_Algorithm="Dassl"), + experiment(Tolerance=1e-6,StopTime=604800,Interval=900), + __Dymola_Commands(file= + "modelica://AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPool.mos" + "Simulate and plot"), Documentation(info="

    Example model for an sport oriented indoor swimming pool with an integrated ideal heat exchanger.

    ")); diff --git a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo index 67a4378119..e3e18d8815 100644 --- a/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo +++ b/AixLib/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo @@ -87,7 +87,10 @@ equation 66,4},{66,-20},{70,-20},{70,-40},{62,-40}}, color={0,0,127})); annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=172800, __Dymola_Algorithm="Dassl"), + experiment(Tolerance=1e-6,StopTime=604800,Interval=900), + __Dymola_Commands(file= + "modelica://AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos" + "Simulate and plot"), Documentation(info="

    Example model for an sport oriented indoor swimming pool with an external heat source.

    ")); diff --git a/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPool.mos b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPool.mos new file mode 100644 index 0000000000..87b121615d --- /dev/null +++ b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPool.mos @@ -0,0 +1,12 @@ +simulateModel("AixLib.Fluid.Pools.Examples.IndoorSwimmingPool", tolerance=1e-6, stopTime=604800, numberOfIntervals=0, outputInterval=900, method="CVode", resultFile="IndoorSwimmingPool"); +createPlot(id = 1, + position = {55, 50, 697, 502}, + x = "time", + y = {"indoorSwimming.TPool","indoorSwimming.QPool","indoorSwimming.PPool","indoorSwimming.QEva"}, + autoscale = true, + autoerase = true, + autoreplot = true, + grid = true, + color = true, + leftTitleType = 1, + bottomTitleType = 1); diff --git a/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos new file mode 100644 index 0000000000..5147d81336 --- /dev/null +++ b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos @@ -0,0 +1,12 @@ +simulateModel("AixLib.Fluid.Pools.Examples.IndoorSwimmingPoolExternalHeatingSystem", tolerance=1e-6, stopTime=604800, numberOfIntervals=0, outputInterval=900, method="CVode", resultFile="IndoorSwimmingPool"); +createPlot(id = 1, + position = {55, 50, 697, 502}, + x = "time", + y = {"indoorSwimming.TPool","prescribedHeatFlow.Q_flow","indoorSwimming.PPool","indoorSwimming.QEva"}, + autoscale = true, + autoerase = true, + autoreplot = true, + grid = true, + color = true, + leftTitleType = 1, + bottomTitleType = 1); From 70f476c0231a21b48505d30fd2dca05308658a3a Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:48:07 +0200 Subject: [PATCH 29/34] lower case for components #1407 --- AixLib/Fluid/Pools/IndoorSwimmingPool.mo | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo index a0d706dd7a..a48c0a07e2 100644 --- a/AixLib/Fluid/Pools/IndoorSwimmingPool.mo +++ b/AixLib/Fluid/Pools/IndoorSwimmingPool.mo @@ -102,7 +102,7 @@ model IndoorSwimmingPool extent={{9,-9},{-9,9}}, rotation=180, origin={-81,41}))); - AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( + AixLib.Fluid.HeatExchangers.ConstantEffectiveness heatExchanger( redeclare package Medium1 = WaterMedium, redeclare package Medium2 = WaterMedium, m1_flow_nominal=poolParam.m_flow_out*1.5, @@ -438,9 +438,9 @@ equation connect(poolWat.ports[3], setEva.port_a) annotation (Line(points={{2.66667,-10}, {2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); - connect(poolSto.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, + connect(poolSto.ports[2],heatExchanger. port_b1) annotation (Line(points={{-28.5, -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); - connect(poolSto.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, + connect(poolSto.ports[3],heatExchanger. port_a2) annotation (Line(points={{-27.5, -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); connect(poolSto.ports[4], cirPump.port_a) annotation (Line(points={{-26.5,-56}, {-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); @@ -451,7 +451,7 @@ equation {-62,88},{-67,88},{-67,103}},color={0,0,127})); connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, {-56,88},{-29,88},{-29,103}}, color={0,0,127})); - connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, + connect(heatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, {-30,-88},{22,-88}}, color={0,127,255})); connect(setEva.port_b, sincEva.ports[1]) annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); @@ -484,7 +484,7 @@ equation connect(minusGain.y, preHeatFlowEvapLoss.Q_flow) annotation (Line(points={{-15.6,60},{-4,60}}, color={0,0,127})); - connect(bou.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, + connect(bou.ports[1],heatExchanger. port_a1) annotation (Line(points={{-40,-88}, {-40,-78},{-36,-78}}, color={0,127,255})); connect(waveMachine.open, timeOpe) annotation (Line(points={{-93.28,-87},{-98, -87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, color={0,0,127})); From 0ddc4562b1d2a5f341a39d84332fc0e0cab3180a Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 11 Apr 2023 13:50:35 +0200 Subject: [PATCH 30/34] add simulate and plot script for second example #1407 --- .../IndoorSwimmingPoolExternalHeatingSystem.mos | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos diff --git a/AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos new file mode 100644 index 0000000000..5147d81336 --- /dev/null +++ b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos @@ -0,0 +1,12 @@ +simulateModel("AixLib.Fluid.Pools.Examples.IndoorSwimmingPoolExternalHeatingSystem", tolerance=1e-6, stopTime=604800, numberOfIntervals=0, outputInterval=900, method="CVode", resultFile="IndoorSwimmingPool"); +createPlot(id = 1, + position = {55, 50, 697, 502}, + x = "time", + y = {"indoorSwimming.TPool","prescribedHeatFlow.Q_flow","indoorSwimming.PPool","indoorSwimming.QEva"}, + autoscale = true, + autoerase = true, + autoreplot = true, + grid = true, + color = true, + leftTitleType = 1, + bottomTitleType = 1); From e93de432e97034dcd7effd87d1913d431d1a5966 Mon Sep 17 00:00:00 2001 From: Larissa Date: Wed, 12 Apr 2023 07:56:17 +0200 Subject: [PATCH 31/34] Correct simulate and plot scripts #1407 --- .../IndoorSwimmingPoolExternalHeatingSystem.mos | 2 +- .../IndoorSwimmingPoolExternalHeatingSystem.mos | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos diff --git a/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos index 5147d81336..00a125c746 100644 --- a/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos +++ b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/Examples/IndoorSwimmingPoolExternalHeatingSystem.mos @@ -1,4 +1,4 @@ -simulateModel("AixLib.Fluid.Pools.Examples.IndoorSwimmingPoolExternalHeatingSystem", tolerance=1e-6, stopTime=604800, numberOfIntervals=0, outputInterval=900, method="CVode", resultFile="IndoorSwimmingPool"); +simulateModel("AixLib.Fluid.Pools.Examples.IndoorSwimmingPoolExternalHeatingSystem", tolerance=1e-6, stopTime=604800, numberOfIntervals=0, outputInterval=900, method="CVode", resultFile="IndoorSwimmingPoolExternalHeatingSystem"); createPlot(id = 1, position = {55, 50, 697, 502}, x = "time", diff --git a/AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos b/AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos deleted file mode 100644 index 5147d81336..0000000000 --- a/AixLib/Resources/Scripts/Dymola/Fluid/Pools/IndoorSwimmingPoolExternalHeatingSystem.mos +++ /dev/null @@ -1,12 +0,0 @@ -simulateModel("AixLib.Fluid.Pools.Examples.IndoorSwimmingPoolExternalHeatingSystem", tolerance=1e-6, stopTime=604800, numberOfIntervals=0, outputInterval=900, method="CVode", resultFile="IndoorSwimmingPool"); -createPlot(id = 1, - position = {55, 50, 697, 502}, - x = "time", - y = {"indoorSwimming.TPool","prescribedHeatFlow.Q_flow","indoorSwimming.PPool","indoorSwimming.QEva"}, - autoscale = true, - autoerase = true, - autoreplot = true, - grid = true, - color = true, - leftTitleType = 1, - bottomTitleType = 1); From c1d898ded0758528ccad4bd36f9eb8a5536f9b6c Mon Sep 17 00:00:00 2001 From: ebc-aixlib-bot Date: Wed, 12 Apr 2023 05:59:13 +0000 Subject: [PATCH 32/34] CI message from ebc-aixlib-bot. Automatic push of CI with new regression reference files.Please pull the new files before push again. Plottet Results https://ebc.pages.rwth-aachen.de/EBC_all/github_ci/AixLib/1407-add-swimming-pool-model/plots/ --- ...Fluid_Pools_Examples_IndoorSwimmingPool.txt | 18 ++++++++++++++++++ ...IndoorSwimmingPoolExternalHeatingSystem.txt | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPool.txt create mode 100644 AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPoolExternalHeatingSystem.txt diff --git a/AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPool.txt b/AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPool.txt new file mode 100644 index 0000000000..7444be15de --- /dev/null +++ b/AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPool.txt @@ -0,0 +1,18 @@ +last-generated=2023-04-12 +statistics-initialization= +{ + "nonlinear": "0, 16, 1", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": "13", + "nonlinear": "16, 0, 1", + "number of continuous time states": "4", + "numerical Jacobians": "0" +} +time=[0e+00, 6.048e+05] +indoorSwimming.TPool=[2.953302612304688e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011512097167969e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011502478027344e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011486926269531e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011479919433594e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011520202636719e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011501208496094e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02] +indoorSwimming.QPool=[5.81974560546875e+03, 3.672327734375e+04, 3.672327734375e+04, 3.672327734375e+04, 3.672327734375e+04, 6.51784578125e+04, 8.036227187500001e+04, 9.554609062500001e+04, 1.10729909375e+05, 1.1477186625e+05, 9.959969375000001e+04, 8.440429593750001e+04, 6.920889031250001e+04, 3.672473734375e+04, 3.672327734375e+04, 6.337085859375e+04, 7.8554674375e+04, 9.373849093750004e+04, 1.089223153125e+05, 1.158358125e+05, 1.0140866875e+05, 8.62132709375e+04, 7.10178665625e+04, 5.582246640625e+04, 3.672327734375e+04, 6.156326171875e+04, 7.674707656250001e+04, 9.19308953125e+04, 1.071147153125001e+05, 1.158358125e+05, 1.03217646875e+05, 8.80222459375e+04, 7.28268478125e+04, 5.76314434375e+04, 3.672327734375e+04, 5.975566484375e+04, 7.493948218750001e+04, 9.012329875e+04, 1.053071153125e+05, 1.158358125e+05, 1.050266265625e+05, 8.983122093750007e+04, 7.4635823125e+04, 5.944042140625e+04, 3.672327734375e+04, 5.794806796875e+04, 7.31318821875e+04, 8.831569875e+04, 1.0349951875e+05, 1.158358125e+05, 1.068356015625e+05, 9.1640198125e+04, 7.6444798125e+04, 6.124939640625e+04, 3.672327734375e+04, 5.614047109375e+04, 7.132428750000015e+04, 8.650809874999986e+04, 1.01691923125e+05, 1.158126034375e+05, 1.086445765625e+05, 9.344917875000001e+04, 7.825377312500001e+04, 6.305837140625e+04, 3.672327734375e+04, 5.117247421875e+04, 6.951669e+04, 8.47005046875e+04, 9.988432312500014e+04, 1.150681421874998e+05, 1.104535515625e+05, 9.525815375e+04, 8.0062748125e+04, 6.4867348125e+04, 3.672327734375e+04, 3.672327734375e+04, 6.770909218750001e+04, 8.289290656249999e+04, 9.8076723125e+04, 1.132605475e+05, 1.122625265625e+05, 9.706712874999986e+04, 8.187172312500015e+04, 6.66763253125e+04, 3.672327734375e+04, 3.672327734375e+04, 6.590149781250001e+04, 8.1085309375e+04, 9.6269128125e+04, 1.114529475e+05, 1.1406256875e+05, 9.887610374999999e+04, 8.368070406249999e+04, 6.84853003125e+04, 3.672400734375e+04, 3.672327734375e+04, 6.40938978125e+04, 7.9277714375e+04, 9.446153093750001e+04, 1.09645353125e+05, 1.158358125e+05] +indoorSwimming.PPool=[2.0239375e+04, 3.988600158691406e+02, 3.988599853515625e+02, 3.988599853515625e+02, 3.988599853515625e+02, 2.0239384375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 1.644363802490234e+03, 3.988599853515625e+02, 2.0239380859375e+04, 2.0239375e+04, 2.0239373515625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239380859375e+04, 2.023937609375e+04, 2.0239373046875e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239373046875e+04, 2.02393790625e+04, 2.023937375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239376953125e+04, 2.0239380625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239380078125e+04, 2.0239378203125e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 1.627127512207031e+04, 2.0239373203125e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 3.988599853515625e+02, 2.02393740625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599694824219e+02, 3.988599853515625e+02, 2.023938625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 1.021612034912109e+03, 3.988599853515625e+02, 2.02393815625e+04, 2.0239375e+04, 2.0239374140625e+04, 2.0239375e+04, 2.0239375e+04] +indoorSwimming.QEva=[5.1318876953125e+03, 2.1516798828125e+04, 2.1516798828125e+04, 2.1516798828125e+04, 2.1516798828125e+04, 4.916270703125e+04, 6.39115190625e+04, 7.866032968750002e+04, 9.340914687500001e+04, 9.732605687499999e+04, 8.258541875e+04, 6.78254715625e+04, 5.3065524375e+04, 2.1517617578125e+04, 2.1516798828125e+04, 4.74068953125e+04, 6.21557078125e+04, 7.690451718750004e+04, 9.165333437500001e+04, 9.8362515625e+04, 8.434255624999999e+04, 6.958260906250001e+04, 5.482266125e+04, 4.006271171875e+04, 2.1516798828125e+04, 4.56510859375e+04, 6.039989640625e+04, 7.514870468749999e+04, 8.989752187500006e+04, 9.8362515625e+04, 8.6099690625e+04, 7.13397465625e+04, 5.6579795625e+04, 4.181984828125e+04, 2.1516798828125e+04, 4.38952734375e+04, 5.864408671875e+04, 7.3392895e+04, 8.814170937500001e+04, 9.8362515625e+04, 8.78568234375e+04, 7.309688031250007e+04, 5.833693296875e+04, 4.357698578125e+04, 2.1516798828125e+04, 4.213946328125e+04, 5.688827421875e+04, 7.163708749999999e+04, 8.63859003125e+04, 9.8362515625e+04, 8.96139609375e+04, 7.485401375e+04, 6.009407046875e+04, 4.533412328125e+04, 2.1516798828125e+04, 4.038365234375e+04, 5.513246437500014e+04, 6.988127499999986e+04, 8.463009218750001e+04, 9.83432228125e+04, 9.13710984375e+04, 7.661115125e+04, 6.18512065625e+04, 4.709125828125e+04, 2.1516798828125e+04, 3.5556794140625e+04, 5.3376653125e+04, 6.812546249999999e+04, 8.287427968750014e+04, 9.762308906249986e+04, 9.312823593749999e+04, 7.836828875000001e+04, 6.36083415625e+04, 4.8848394375e+04, 2.1516798828125e+04, 2.1516798828125e+04, 5.162084171875e+04, 6.63696521875e+04, 8.111846718750001e+04, 9.5867284375e+04, 9.488537343750001e+04, 8.012542624999986e+04, 6.536547906250014e+04, 5.0605531875e+04, 2.1516798828125e+04, 2.1516798828125e+04, 4.986503203125e+04, 6.46138428125e+04, 7.936265468750001e+04, 9.411147125e+04, 9.663508437500001e+04, 8.188256375e+04, 6.71226165625e+04, 5.2362669375e+04, 2.1517208203125e+04, 2.1516798828125e+04, 4.810921953125e+04, 6.28580328125e+04, 7.760684218750001e+04, 9.2355659375e+04, 9.8362515625e+04] diff --git a/AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPoolExternalHeatingSystem.txt b/AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPoolExternalHeatingSystem.txt new file mode 100644 index 0000000000..a54081cdb3 --- /dev/null +++ b/AixLib/Resources/ReferenceResults/Dymola/AixLib_Fluid_Pools_Examples_IndoorSwimmingPoolExternalHeatingSystem.txt @@ -0,0 +1,18 @@ +last-generated=2023-04-12 +statistics-initialization= +{ + "nonlinear": "0, 17, 1", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": "13", + "nonlinear": "17, 0, 1", + "number of continuous time states": "4", + "numerical Jacobians": "0" +} +time=[0e+00, 6.048e+05] +indoorSwimming.TPool=[2.953302612304688e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011512097167969e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011502478027344e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011486926269531e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011479919433594e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011499938964844e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011520202636719e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011525268554688e+02, 3.011501208496094e+02, 3.011499938964844e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011474914550781e+02, 3.011499938964844e+02] +prescribedHeatFlow.Q_flow=[5.81974560546875e+03, 3.672327734375e+04, 3.672327734375e+04, 3.672327734375e+04, 3.672327734375e+04, 6.51784578125e+04, 8.036227187500001e+04, 9.554609062500001e+04, 1.10729909375e+05, 1.1477186625e+05, 9.959969375000001e+04, 8.440429593750001e+04, 6.920889031250001e+04, 3.672473734375e+04, 3.672327734375e+04, 6.337085859375e+04, 7.8554674375e+04, 9.373849093750004e+04, 1.089223153125e+05, 1.158358125e+05, 1.0140866875e+05, 8.62132709375e+04, 7.10178665625e+04, 5.582246640625e+04, 3.672327734375e+04, 6.156326171875e+04, 7.674707656250001e+04, 9.19308953125e+04, 1.071147153125001e+05, 1.158358125e+05, 1.03217646875e+05, 8.80222459375e+04, 7.28268478125e+04, 5.76314434375e+04, 3.672327734375e+04, 5.975566484375e+04, 7.493948218750001e+04, 9.012329375e+04, 1.053071465625e+05, 1.158358125e+05, 1.050266265625e+05, 8.983122093750007e+04, 7.4635823125e+04, 5.944042140625e+04, 3.672327734375e+04, 5.794806796875e+04, 7.31318821875e+04, 8.831569875e+04, 1.0349951875e+05, 1.158358125e+05, 1.068356015625e+05, 9.1640198125e+04, 7.6444798125e+04, 6.124939640625e+04, 3.672327734375e+04, 5.614047109375e+04, 7.132428750000015e+04, 8.650809874999986e+04, 1.01691923125e+05, 1.158126034375e+05, 1.086445765625e+05, 9.344917875000001e+04, 7.825377312500001e+04, 6.305837140625e+04, 3.672327734375e+04, 5.117247421875e+04, 6.951669e+04, 8.47005046875e+04, 9.988432312500014e+04, 1.150681421874998e+05, 1.104535515625e+05, 9.525815375e+04, 8.0062748125e+04, 6.4867348125e+04, 3.672327734375e+04, 3.672327734375e+04, 6.770909218750001e+04, 8.289290656249999e+04, 9.8076723125e+04, 1.132605475e+05, 1.122625265625e+05, 9.706712874999986e+04, 8.187172312500015e+04, 6.66763253125e+04, 3.672327734375e+04, 3.672327734375e+04, 6.590149781250001e+04, 8.1085309375e+04, 9.6269128125e+04, 1.114529475e+05, 1.1406256875e+05, 9.887610374999999e+04, 8.368070406249999e+04, 6.84853003125e+04, 3.672400734375e+04, 3.672327734375e+04, 6.40938978125e+04, 7.9277714375e+04, 9.446153093750001e+04, 1.09645353125e+05, 1.158358125e+05] +indoorSwimming.PPool=[2.0239375e+04, 3.988600158691406e+02, 3.988599853515625e+02, 3.988599853515625e+02, 3.988599853515625e+02, 2.0239384375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 1.644363802490234e+03, 3.988599853515625e+02, 2.0239380859375e+04, 2.0239375e+04, 2.0239373515625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239380859375e+04, 2.023937609375e+04, 2.0239373046875e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239373046875e+04, 2.02393790625e+04, 2.023937375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239376953125e+04, 2.0239380625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 2.0239380078125e+04, 2.0239378203125e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 1.627127512207031e+04, 2.0239373203125e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599853515625e+02, 3.988599853515625e+02, 2.02393740625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 3.988599694824219e+02, 3.988599853515625e+02, 2.023938625e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 2.0239375e+04, 1.021612034912109e+03, 3.988599853515625e+02, 2.02393815625e+04, 2.0239375e+04, 2.0239374140625e+04, 2.0239375e+04, 2.0239375e+04] +indoorSwimming.QEva=[5.1318876953125e+03, 2.1516798828125e+04, 2.1516798828125e+04, 2.1516798828125e+04, 2.1516798828125e+04, 4.916270703125e+04, 6.39115190625e+04, 7.866032968750002e+04, 9.340914687500001e+04, 9.732605687499999e+04, 8.258541875e+04, 6.78254715625e+04, 5.3065524375e+04, 2.1517617578125e+04, 2.1516798828125e+04, 4.74068953125e+04, 6.21557078125e+04, 7.690451718750004e+04, 9.165333437500001e+04, 9.8362515625e+04, 8.434255624999999e+04, 6.958260906250001e+04, 5.482266125e+04, 4.006271171875e+04, 2.1516798828125e+04, 4.56510859375e+04, 6.039989640625e+04, 7.514870468749999e+04, 8.989752187500006e+04, 9.8362515625e+04, 8.6099690625e+04, 7.13397465625e+04, 5.6579795625e+04, 4.181984828125e+04, 2.1516798828125e+04, 4.38952734375e+04, 5.864408671875e+04, 7.339289218749999e+04, 8.814174062500001e+04, 9.8362515625e+04, 8.78568234375e+04, 7.309688031250007e+04, 5.833693296875e+04, 4.357698578125e+04, 2.1516798828125e+04, 4.213946328125e+04, 5.688827421875e+04, 7.163708749999999e+04, 8.63859003125e+04, 9.8362515625e+04, 8.96139609375e+04, 7.485401375e+04, 6.009407046875e+04, 4.533412328125e+04, 2.1516798828125e+04, 4.038365234375e+04, 5.513246437500014e+04, 6.988127499999986e+04, 8.463009218750001e+04, 9.83432228125e+04, 9.13710984375e+04, 7.661115125e+04, 6.18512065625e+04, 4.709125828125e+04, 2.1516798828125e+04, 3.5556794140625e+04, 5.3376653125e+04, 6.812546249999999e+04, 8.287427968750014e+04, 9.762309156249986e+04, 9.312823593749999e+04, 7.836828875000001e+04, 6.36083415625e+04, 4.8848394375e+04, 2.1516798828125e+04, 2.1516798828125e+04, 5.162084171875e+04, 6.63696521875e+04, 8.111846718750001e+04, 9.5867284375e+04, 9.488537343750001e+04, 8.012542624999986e+04, 6.536547906250014e+04, 5.0605531875e+04, 2.1516798828125e+04, 2.1516798828125e+04, 4.986503203125e+04, 6.46138428125e+04, 7.936265468750001e+04, 9.411147125e+04, 9.663508437500001e+04, 8.188256375e+04, 6.71226165625e+04, 5.2362669375e+04, 2.1517208203125e+04, 2.1516798828125e+04, 4.810921953125e+04, 6.28580328125e+04, 7.760684218750001e+04, 9.2355659375e+04, 9.8362515625e+04] From a85762ce8efc3d2be7d4c957fa5a4cadd0417638 Mon Sep 17 00:00:00 2001 From: Larissa Date: Fri, 14 Apr 2023 13:13:25 +0200 Subject: [PATCH 33/34] Delete old package for pools # 1407 --- .../BaseClasses/HeatTransferConduction.mo | 168 ----- AixLib/Fluid/Pool/BaseClasses/package.mo | 6 - AixLib/Fluid/Pool/BaseClasses/package.order | 2 - AixLib/Fluid/Pool/BaseClasses/waveMachine.mo | 100 --- .../Fluid/Pool/Examples/IndoorSwimmingPool.mo | 57 -- ...IndoorSwimmingPoolExternalHeatingSystem.mo | 89 --- AixLib/Fluid/Pool/Examples/package.mo | 4 - AixLib/Fluid/Pool/Examples/package.order | 2 - AixLib/Fluid/Pool/IndoorSwimmingPool.mo | 664 ------------------ AixLib/Fluid/Pool/package.mo | 7 - AixLib/Fluid/Pool/package.order | 3 - 11 files changed, 1102 deletions(-) delete mode 100644 AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo delete mode 100644 AixLib/Fluid/Pool/BaseClasses/package.mo delete mode 100644 AixLib/Fluid/Pool/BaseClasses/package.order delete mode 100644 AixLib/Fluid/Pool/BaseClasses/waveMachine.mo delete mode 100644 AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo delete mode 100644 AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo delete mode 100644 AixLib/Fluid/Pool/Examples/package.mo delete mode 100644 AixLib/Fluid/Pool/Examples/package.order delete mode 100644 AixLib/Fluid/Pool/IndoorSwimmingPool.mo delete mode 100644 AixLib/Fluid/Pool/package.mo delete mode 100644 AixLib/Fluid/Pool/package.order diff --git a/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo b/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo deleted file mode 100644 index efac5362b4..0000000000 --- a/AixLib/Fluid/Pool/BaseClasses/HeatTransferConduction.mo +++ /dev/null @@ -1,168 +0,0 @@ -within AixLib.Fluid.Pool.BaseClasses; -model HeatTransferConduction - "Heat transfer due to conduction through pool walls" - - parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState - "Type of energy balance: dynamic (3 initialization options) or steady state" - annotation(Evaluate=true, Dialog(tab="Dynamics", group="Equations")); - - parameter Modelica.Units.SI.Area AWalInt "Area of pool walls which is connected to inner rooms (inner pool walls)"; - parameter Modelica.Units.SI.Area AWalExt "Area of pool walls which is connected to the ground (pool wall with earth contact)"; - parameter Modelica.Units.SI.Area AFloInt "Area of pool floors which is connected to inner rooms (inner pool floor)"; - parameter Modelica.Units.SI.Area AFloExt "Area of pool floors which is connected to teh ground (pool floor with earth contact)"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterHorizontal "Mean value for the heat transfer coefficient of free convection on horizontal pool floors"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConWaterVertical "Mean value for the heat transfer coefficient of free convection on vertical pool walls"; - - parameter Modelica.Units.SI.Temperature TPool "Set temperature for pool"; - - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature HeatFlowOuter - "Generate Heat Flow for earth contact" annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=180, - origin={74,-28}))); - - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport_a - "Inlet for heattransfer" annotation (Placement(transformation(extent={{-116, - -14},{-90,12}}), - iconTransformation(extent={{-116,-14},{-90,12}}))); - - Modelica.Blocks.Interfaces.RealInput TSoil "Temperature of Soil" annotation (Placement(transformation(extent={{130,-48}, - {90,-8}}), - iconTransformation(extent={{126,16},{86,56}}))); - - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - InnerPoolFloor( - A=AFloInt, - wallRec=PoolWall, - T_start=fill(TPool, PoolWall.n), - energyDynamics=energyDynamics) - annotation (Placement(transformation(extent={{-2,-32},{22,-8}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalInner( - hCon_const=hConWaterHorizontal, - A=AFloInt, - calcMethod=3, - surfaceOrientation=1) - annotation (Placement(transformation( - origin={-50,-20}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalOuter( - hCon_const=hConWaterVertical, - A=AWalExt, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-50,40}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - PoolWallWithEarthContact( - A=AWalExt, - wallRec=PoolWall, - T_start=fill(TPool, PoolWall.n), - energyDynamics=energyDynamics) - annotation (Placement(transformation(extent={{-2,28},{22,52}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterHorizontalOuter( - hCon_const=hConWaterHorizontal, - A=AFloExt, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-50,-60}, - extent={{-10,-10},{10,10}}, - rotation=180))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - PoolFloorWithEarthContact( - A=AFloExt, - wallRec=PoolWall, - T_start=fill(TPool, PoolWall.n), - energyDynamics=energyDynamics) - annotation (Placement(transformation(extent={{-2,-72},{22,-50}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow - prescribedHeatFlow1 "Generate Heat Flow for earth contact" - annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=180, - origin={44,12}))); - AixLib.ThermalZones.HighOrder.Components.Walls.BaseClasses.SimpleNLayer - InnerPoolWall( - A=AWalInt, - wallRec=PoolWall, - T_start=fill(TPool, PoolWall.n), - energyDynamics=energyDynamics) - annotation (Placement(transformation(extent={{-2,68},{22,92}}))); - Modelica.Blocks.Sources.RealExpression HeatFlowInner(y=0) - "Inner pool walls are not connected to other zones, only outer pool walls have earth contact" - annotation (Placement(transformation(extent={{96,2},{76,22}}))); - AixLib.Utilities.HeatTransfer.HeatConvInside HeatConvWaterVerticalInner( - hCon_const=hConWaterVertical, - A=AWalInt, - calcMethod=3, - surfaceOrientation=1) annotation (Placement(transformation( - origin={-50,80}, - extent={{-10,-10},{10,10}}, - rotation=180))); - replaceable parameter AixLib.DataBase.Walls.WallBaseDataDefinition PoolWall - annotation (Placement(transformation(extent={{76,-98},{96,-78}}))); -equation - connect(HeatFlowOuter.T, TSoil) - annotation (Line(points={{81.2,-28},{110,-28}}, color={0,0,127})); - connect(heatport_a, heatport_a) - annotation (Line(points={{-103,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalInner.port_a, InnerPoolFloor.port_a) - annotation (Line(points={{-40,-20},{-2,-20}}, color={191,0,0})); - connect(PoolFloorWithEarthContact.port_b, HeatFlowOuter.port) annotation ( - Line(points={{22,-61},{58,-61},{58,-28},{68,-28}}, color={191,0,0})); - connect(PoolFloorWithEarthContact.port_a, HeatConvWaterHorizontalOuter.port_a) - annotation (Line(points={{-2,-61},{-2,-60},{-40,-60}}, color={191,0,0})); - connect(InnerPoolWall.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{22,80},{30,80},{30,12},{38,12}}, color={191,0,0})); - connect(HeatConvWaterVerticalOuter.port_b, heatport_a) annotation (Line( - points={{-60,40},{-72,40},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalInner.port_b, heatport_a) annotation (Line( - points={{-60,-20},{-72,-20},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(HeatConvWaterHorizontalOuter.port_b, heatport_a) annotation (Line( - points={{-60,-60},{-72,-60},{-72,-1},{-103,-1}}, color={191,0,0})); - connect(prescribedHeatFlow1.Q_flow, HeatFlowInner.y) - annotation (Line(points={{50,12},{75,12}}, color={0,0,127})); - connect(HeatFlowOuter.port, PoolWallWithEarthContact.port_b) annotation (Line( - points={{68,-28},{58,-28},{58,40},{22,40}}, color={191,0,0})); - connect(InnerPoolFloor.port_b, prescribedHeatFlow1.port) annotation (Line( - points={{22,-20},{30,-20},{30,12},{38,12}}, color={191,0,0})); - connect(HeatConvWaterVerticalOuter.port_a, PoolWallWithEarthContact.port_a) - annotation (Line(points={{-40,40},{-2,40}}, color={191,0,0})); - connect(InnerPoolWall.port_a, HeatConvWaterVerticalInner.port_a) annotation ( - Line(points={{-2,80},{-40,80}}, color={191,0,0})); - connect(HeatConvWaterVerticalInner.port_b, heatport_a) annotation (Line( - points={{-60,80},{-72,80},{-72,-1},{-103,-1}},color={191,0,0})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-80,58},{28,-26}}, - lineColor={28,108,200}, - fillColor={28,108,200}, - fillPattern=FillPattern.Solid), - Rectangle( - extent={{28,68},{48,-46}}, - lineColor={135,135,135}, - fillColor={175,175,175}, - fillPattern=FillPattern.Forward), - Rectangle( - extent={{-86,-26},{30,-46}}, - lineColor={135,135,135}, - fillColor={175,175,175}, - fillPattern=FillPattern.Forward), - Polygon( - points={{-16,-10},{-4,6},{58,-52},{46,-62},{-16,-10}}, - lineColor={238,46,47}, - fillColor={238,46,47}, - fillPattern=FillPattern.Solid), - Polygon( - points={{32,-68},{36,-66},{62,-38},{76,-78},{32,-68}}, - lineColor={238,46,47}, - fillColor={238,46,47}, - fillPattern=FillPattern.Solid), - Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0})}), - Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -

    This model is a base model to calculate the heat transfer through pool walls. The pool walls are divided in: vertical walls without earth contact, vertical walls with earth contact, pool floor without earth contact, pool floor with earth contact.

    -")); -end HeatTransferConduction; diff --git a/AixLib/Fluid/Pool/BaseClasses/package.mo b/AixLib/Fluid/Pool/BaseClasses/package.mo deleted file mode 100644 index 3763078530..0000000000 --- a/AixLib/Fluid/Pool/BaseClasses/package.mo +++ /dev/null @@ -1,6 +0,0 @@ -within AixLib.Fluid.Pool; -package BaseClasses - extends Modelica.Icons.BasesPackage; - - -end BaseClasses; diff --git a/AixLib/Fluid/Pool/BaseClasses/package.order b/AixLib/Fluid/Pool/BaseClasses/package.order deleted file mode 100644 index c1967ace29..0000000000 --- a/AixLib/Fluid/Pool/BaseClasses/package.order +++ /dev/null @@ -1,2 +0,0 @@ -HeatTransferConduction -waveMachine diff --git a/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo b/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo deleted file mode 100644 index 26fc8426c0..0000000000 --- a/AixLib/Fluid/Pool/BaseClasses/waveMachine.mo +++ /dev/null @@ -1,100 +0,0 @@ -within AixLib.Fluid.Pool.BaseClasses; -model waveMachine "Calculate energy demands of a wave machine" - - - - - parameter Modelica.Units.SI.Length heightWave "Height of generated wave"; - parameter Modelica.Units.SI.Length widthWave - "Width of generated wave/ width of wave machineoutlet"; - parameter Modelica.Units.SI.Time timeWavePul_start - "Start time of first wave cycle"; - parameter Modelica.Units.SI.Time periodeWavePul "Time of cycling period"; - parameter Real widthWavePul "Fraction of time of wave generation within cycling period"; - - - - - - Modelica.Blocks.Math.RealToBoolean useWavePool(threshold=1) - "If input = 1, then true, else no waves generated" - annotation (Placement(transformation(extent={{-58,-8},{-42,8}}))); - Modelica.Blocks.Tables.CombiTable1Dv tablePWave( - y(unit="W/m"), - tableOnFile=false, - table=[0,0; 0.7,3500; 0.9,6000; 1.3,12000], - extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints) - "Estimate consumed power per width to generate wave of a certain heigth; " - annotation (Placement(transformation(extent={{-46,50},{-26,70}}))); - Modelica.Blocks.Sources.RealExpression get_heightWave(y=heightWave) - "Get height of generated wave" - annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); - Modelica.Blocks.Interfaces.RealInput open "Input profil of wave machine" - annotation (Placement(transformation(extent={{-136,-20},{-96,20}}))); - Modelica.Blocks.Interfaces.RealOutput PWaveMachine( final unit="W", final quantity="Power") - "Power consumption of wave machine" - annotation (Placement(transformation(extent={{96,-10},{116,10}}))); - Modelica.Blocks.Math.Gain multiply(k=widthWave) "Multply by width of wave" - annotation (Placement(transformation(extent={{0,52},{16,68}}))); - Modelica.Blocks.Sources.Constant zero(k=0) - "no output if wave machine is off" - annotation (Placement(transformation(extent={{-14,-78},{0,-64}}))); - Modelica.Blocks.Logical.Switch switchWaveMachine - annotation (Placement(transformation(extent={{60,-10},{80,10}}))); - Modelica.Blocks.Logical.And and1 - annotation (Placement(transformation(extent={{-8,-10},{12,10}}))); - Modelica.Blocks.Sources.BooleanPulse wavePoolCycle( - width=widthWavePul, - period=periodeWavePul, - startTime=timeWavePul_start) - annotation (Placement(transformation(extent={{-60,-50},{-40,-30}}))); -equation - connect(get_heightWave.y, tablePWave.u[1]) annotation (Line(points={{-69,60},{-48, - 60}}, color={0,0,127})); - connect(multiply.u, tablePWave.y[1]) annotation (Line(points={{-1.6,60},{-25,60}}, - color={0,0,127})); - connect(open, useWavePool.u) - annotation (Line(points={{-116,0},{-59.6,0}}, color={0,0,127})); - connect(switchWaveMachine.y, PWaveMachine) annotation (Line(points={{81,0},{ - 106,0}}, color={0,0,127})); - connect(multiply.y, switchWaveMachine.u1) - annotation (Line(points={{16.8,60},{42,60},{42,8},{58,8}}, - color={0,0,127})); - connect(zero.y, switchWaveMachine.u3) annotation (Line(points={{0.7,-71},{52,-71}, - {52,-8},{58,-8}}, color={0,0,127})); - connect(PWaveMachine, PWaveMachine) annotation (Line( - points={{106,0},{101,0},{101,0},{106,0}}, - color={0,0,127}, - smooth=Smooth.Bezier)); - connect(useWavePool.y, and1.u1) - annotation (Line(points={{-41.2,0},{-10,0}}, color={255,0,255})); - connect(and1.y, switchWaveMachine.u2) - annotation (Line(points={{13,0},{58,0}}, color={255,0,255})); - connect(wavePoolCycle.y, and1.u2) annotation (Line(points={{-39,-40},{-24,-40}, - {-24,-8},{-10,-8}}, color={255,0,255})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle(extent={{-100,100},{100,-100}}, lineColor={0,0,0}), - Line( - points={{-98,0},{-52,62},{-2,-24},{50,60},{100,-2}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1), - Line( - points={{-98,-18},{-52,44},{-2,-42},{50,42},{98,-20}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1), - Line( - points={{-98,-36},{-52,26},{-2,-60},{50,24},{96,-36}}, - color={28,108,200}, - smooth=Smooth.Bezier, - thickness=1)}), Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -

    Model to calculate the energy demand of a wavemachine. Based on values of:

    -
      -
    • German Association for the Recreational and Medicinal Bath Industry (Deutsche Gesellschaft für das Badewesen DGfdB), April 2015 : Richtlinien für den Bäderbau
    • -
    • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - Betrieb
    • -
    -")); -end waveMachine; diff --git a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo deleted file mode 100644 index 2f66d01a54..0000000000 --- a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPool.mo +++ /dev/null @@ -1,57 +0,0 @@ -within AixLib.Fluid.Pool.Examples; -model IndoorSwimmingPool - extends Modelica.Icons.Example; - .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= - AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool(), - redeclare package WaterMedium = WaterMedium) - annotation (Placement(transformation(extent={{-20,-40},{30,16}}))); - - replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); - - Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) - annotation (Placement(transformation(extent={{96,44},{80,60}}))); - Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) - annotation (Placement(transformation(extent={{-84,32},{-68,48}}))); - Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) - annotation (Placement(transformation(extent={{-84,56},{-68,72}}))); - Modelica.Blocks.Sources.Pulse timeOpe( - amplitude=1, - width=(13/15)*100, - period=(24 - 7)*3600, - offset=0, - startTime=3600*7) - annotation (Placement(transformation(extent={{-88,-48},{-74,-34}}))); - Modelica.Blocks.Sources.Trapezoid uRelPer( - amplitude=0.5, - rising=7*3600, - width=1*3600, - falling=7*3600, - period=17*3600, - offset=0.3, - startTime=7*3600) - annotation (Placement(transformation(extent={{-86,-6},{-72,8}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature - prescribedTemperature - annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); -equation - connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{79.2,52},{38, - 52},{38,1.16},{30.75,1.16}}, color={0,0,127})); - connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-2.25,16.84},{ - -2.25,24},{-62,24},{-62,40},{-67.2,40}}, - color={0,0,127})); - connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-11.75,16.84}, - {-10,16.84},{-10,64},{-67.2,64}}, - color={0,0,127})); - connect(timeOpe.y, indoorSwimming.timeOpe) annotation (Line(points={{-73.3, - -41},{-30,-41},{-30,-28.24},{-21.5,-28.24}}, color={0,0,127})); - connect(uRelPer.y, indoorSwimming.uRelPer) annotation (Line(points={{-71.3,1}, - {-30,1},{-30,-19.56},{-21.75,-19.56}}, color={0,0,127})); - connect(prescribedTemperature.T, T_Air.y) - annotation (Line(points={{-17.2,80},{-58,80},{-58,64},{-67.2,64}}, - color={0,0,127})); - connect(prescribedTemperature.port, indoorSwimming.convPool) annotation (Line( - points={{-4,80},{23.5,80},{23.5,17.12}}, color={191,0,0})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); -end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo b/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo deleted file mode 100644 index c21e587145..0000000000 --- a/AixLib/Fluid/Pool/Examples/IndoorSwimmingPoolExternalHeatingSystem.mo +++ /dev/null @@ -1,89 +0,0 @@ -within AixLib.Fluid.Pool.Examples; -model IndoorSwimmingPoolExternalHeatingSystem - extends Modelica.Icons.Example; - .AixLib.Fluid.Pool.IndoorSwimmingPool indoorSwimming(poolParam= - AixLib.DataBase.Pools.TypesOfIndoorSwimmingPools.SportPool( - use_idealHeater=false), redeclare package WaterMedium = WaterMedium) - annotation (Placement(transformation(extent={{-32,-38},{16,28}}))); - - replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); - - Modelica.Blocks.Sources.RealExpression TSoil(y=273.15 + 8) - annotation (Placement(transformation(extent={{74,80},{58,96}}))); - Modelica.Blocks.Sources.RealExpression X_W(y=14.3/1000) - annotation (Placement(transformation(extent={{-88,48},{-72,64}}))); - Modelica.Blocks.Sources.RealExpression T_Air(y=273.15 + 30) - annotation (Placement(transformation(extent={{-86,72},{-70,88}}))); - Modelica.Blocks.Sources.Pulse Opening( - amplitude=1, - width=(13/15)*100, - period=(24 - 7)*3600, - offset=0, - startTime=3600*7) - annotation (Placement(transformation(extent={{-94,-44},{-80,-30}}))); - Modelica.Blocks.Sources.Trapezoid Person( - amplitude=0.5, - rising=7*3600, - width=1*3600, - falling=7*3600, - period=17*3600, - offset=0.3, - startTime=7*3600) - annotation (Placement(transformation(extent={{-94,-8},{-80,6}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature - prescribedTemperature - annotation (Placement(transformation(extent={{-16,74},{-4,86}}))); - Controls.Continuous.LimPID PI( - k=1000, - yMax=10000000, - yMin=0, - controllerType=Modelica.Blocks.Types.SimpleController.PI, - Ti=1) annotation(Placement(transformation(extent={{-8,-8}, - {8,8}}, - rotation=180, - origin={82,4}))); - Modelica.Blocks.Sources.RealExpression SetTemperature(y=273.15 + 28) - annotation (Placement(transformation(extent={{96,34},{78,50}}))); - MixingVolumes.MixingVolume vol( - redeclare package Medium = AixLib.Media.Water, - m_flow_nominal=indoorSwimming.m_flow_nominal, - V=2, - nPorts=2) annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - rotation=90, - origin={44,-12}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow prescribedHeatFlow - annotation (Placement(transformation(extent={{62,-50},{42,-30}}))); -equation - connect(TSoil.y, indoorSwimming.TSoil) annotation (Line(points={{57.2,88},{36, - 88},{36,10.51},{16.72,10.51}}, color={0,0,127})); - connect(indoorSwimming.X_w, X_W.y) annotation (Line(points={{-14.96,28.99},{ - -14.96,38},{-64,38},{-64,56},{-71.2,56}}, - color={0,0,127})); - connect(indoorSwimming.TAir, T_Air.y) annotation (Line(points={{-24.08,28.99}, - {-24.08,80},{-69.2,80}}, color={0,0,127})); - connect(Opening.y, indoorSwimming.timeOpe) annotation (Line(points={{-79.3, - -37},{-50,-37},{-50,-24.14},{-33.44,-24.14}}, color={0,0,127})); - connect(Person.y, indoorSwimming.uRelPer) annotation (Line(points={{-79.3,-1}, - {-50,-1},{-50,-13.91},{-33.68,-13.91}}, color={0,0,127})); - connect(prescribedTemperature.T, T_Air.y) - annotation (Line(points={{-17.2,80},{-69.2,80}}, color={0,0,127})); - connect(prescribedTemperature.port, indoorSwimming.convPool) annotation (Line( - points={{-4,80},{9.76,80},{9.76,29.32}}, color={191,0,0})); - connect(PI.u_s, SetTemperature.y) annotation (Line(points={{91.6,4},{98,4},{ - 98,30},{70,30},{70,42},{77.1,42}}, - color={0,0,127})); - connect(indoorSwimming.TPool, PI.u_m) annotation (Line(points={{17.92,0.28},{ - 62,0.28},{62,18},{82,18},{82,13.6}}, color={0,0,127})); - connect(vol.ports[1], indoorSwimming.port_a1) annotation (Line(points={{34, - -13},{16,-13},{16,-14.9}}, color={0,127,255})); - connect(vol.ports[2], indoorSwimming.port_b1) annotation (Line(points={{34, - -11},{20,-11},{20,-22.82},{16,-22.82}}, color={0,127,255})); - connect(prescribedHeatFlow.port, vol.heatPort) - annotation (Line(points={{42,-40},{42,-22},{44,-22}}, color={191,0,0})); - connect(PI.y, prescribedHeatFlow.Q_flow) annotation (Line(points={{73.2,4},{ - 66,4},{66,-20},{70,-20},{70,-40},{62,-40}}, color={0,0,127})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false)), - experiment(StopTime=172800, __Dymola_Algorithm="Dassl")); -end IndoorSwimmingPoolExternalHeatingSystem; diff --git a/AixLib/Fluid/Pool/Examples/package.mo b/AixLib/Fluid/Pool/Examples/package.mo deleted file mode 100644 index f39716d3be..0000000000 --- a/AixLib/Fluid/Pool/Examples/package.mo +++ /dev/null @@ -1,4 +0,0 @@ -within AixLib.Fluid.Pool; -package Examples - extends Modelica.Icons.ExamplesPackage; -end Examples; diff --git a/AixLib/Fluid/Pool/Examples/package.order b/AixLib/Fluid/Pool/Examples/package.order deleted file mode 100644 index 1736d4cc6d..0000000000 --- a/AixLib/Fluid/Pool/Examples/package.order +++ /dev/null @@ -1,2 +0,0 @@ -IndoorSwimmingPool -IndoorSwimmingPoolExternalHeatingSystem diff --git a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo b/AixLib/Fluid/Pool/IndoorSwimmingPool.mo deleted file mode 100644 index 16a1e3f5d9..0000000000 --- a/AixLib/Fluid/Pool/IndoorSwimmingPool.mo +++ /dev/null @@ -1,664 +0,0 @@ -within AixLib.Fluid.Pool; -model IndoorSwimmingPool - parameter AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord poolParam - "Choose setup for this pool" annotation (choicesAllMatching=true); - - replaceable package WaterMedium = AixLib.Media.Water annotation (choicesAllMatching=true); - - parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState - "Type of energy balance: dynamic (3 initialization options) or steady state" - annotation(Evaluate=true, Dialog(tab="Dynamics", group="Equations")); - - // Water transfer coefficients according to VDI 2089 Blatt 1 - parameter Real betaNonUse(unit="m/s")=7/3600 "Water transfer coefficient during non opening hours" annotation (Dialog(group="Water transfer coefficients")); - parameter Real betaCover(unit="m/s")=0.7/3600 "Water transfer coefficient during non opening hours" - annotation (Dialog(group="Water transfer coefficients")); - parameter Real betaWavePool(unit="m/s")=50/3600 "Water transfer coefficient during wavePool operation" - annotation (Dialog(group="Water transfer coefficients")); - - // Parameter and variables for evaporation - constant Modelica.Units.SI.SpecificHeatCapacity RD=461.52 - "Specific gas constant for steam"; // Source: Klaus Lucas, Thermodynamik (2008) - final parameter Modelica.Units.SI.SpecificEnergy h_vapor= - AixLib.Media.Air.enthalpyOfCondensingGas(poolParam.TPool) - "Latent heat of evaporating water"; - Modelica.Units.SI.MassFlowRate m_flow_evap(start=0.0) - "mass flow rate between pool water and air due to evaporation"; - Modelica.Units.SI.Pressure psat_TPool= - Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( - poolWat.T) "Saturation pressure at pool temperature"; - Modelica.Units.SI.Pressure psat_TAir= - Modelica.Media.Air.ReferenceMoistAir.Utilities.Water95_Utilities.psat( - TAir) "Saturation pressure at air temperature"; - Real phi "Relative humidity"; - - // Pump - parameter Modelica.Units.SI.Pressure pumpHead=170000 - "Expected average flow resistance of water cycle"; - - // Pool circulation flow rate - final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal= - poolParam.V_flow_nominal*rhoWater_default - "Nominal circulation mass flow rate to the pool"; - final parameter Modelica.Units.SI.MassFlowRate m_flow_partial= - poolParam.V_flow_partial*rhoWater_default - "Partial circulation mass flow rate to pool during non operating hours"; - Modelica.Units.SI.MassFlowRate m_flow_toPool(start=0.0) - "Actual circulation mass flow rate to the pool"; - - // Fresh water and water recycling - final parameter Modelica.Units.SI.Efficiency eta=if poolParam.use_HRS then - poolParam.etaHRS else 0; - Modelica.Units.SI.MassFlowRate m_flow_add(start=0.0) - "Mass flow of fresh water supplied to pool circulation system"; - - // Convection and Radiation at pool water surface - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hConvAir=3.5 - "Coefficient of heat transfer between the water surface and the room air"; - // approximated for free and forced convection at velocities between 0,05 to 0,2 m/s above a plane area - parameter Real eps = 0.9*0.95 - "Product of expected emission coefficients of water (0.95) and the surrounding wall surfaces (0.95)"; - - AixLib.Fluid.MixingVolumes.MixingVolume poolSto( - redeclare package Medium = WaterMedium, - energyDynamics=energyDynamics, - T_start=poolParam.TPool, - m_flow_nominal=m_flow_nominal, - V=poolParam.VStorage, - nPorts=4) "water storage for pool " - annotation (Placement(transformation(extent={{-38,-56},{-18,-36}}))); - - AixLib.Fluid.Sources.Boundary_pT Sinc( - redeclare package Medium = WaterMedium, nPorts=1) - annotation (Placement(transformation(extent={{30,-92},{22,-84}}))); - AixLib.Fluid.MixingVolumes.MixingVolume poolWat( - redeclare package Medium = WaterMedium, - energyDynamics=energyDynamics, - T_start=poolParam.TPool, - m_flow_nominal=m_flow_nominal, - V=poolParam.VPool, - nPorts=3) "water volume of pool" - annotation (Placement(transformation(extent={{14,-10},{-6,10}}))); - - Modelica.Blocks.Sources.RealExpression getSetMasFlo(y=m_flow_toPool) - "set circulating mass flow of pool water" - annotation (Placement(transformation(extent={{42,-56},{28,-42}}))); - - AixLib.Fluid.Movers.BaseClasses.IdealSource setEva( - redeclare package Medium = WaterMedium, - m_flow_small=0.00001, - control_m_flow=true) annotation (Placement(transformation( - extent={{6,-6},{-6,6}}, - rotation=0, - origin={-30,26}))); - Modelica.Blocks.Sources.RealExpression getEva(y=m_flow_evap) annotation ( - Placement(transformation( - extent={{9,-9},{-9,9}}, - rotation=180, - origin={-81,41}))); - AixLib.Fluid.HeatExchangers.ConstantEffectiveness HeatExchanger( - redeclare package Medium1 = WaterMedium, - redeclare package Medium2 = WaterMedium, - m1_flow_nominal=poolParam.m_flow_out*1.5, - m2_flow_nominal=poolParam.m_flow_out, - dp1_nominal(displayUnit="bar") = 100000, - dp2_nominal(displayUnit="bar") = 100000, - eps=eps) - annotation (Placement(transformation( - extent={{-5,-5},{5,5}}, - rotation=90, - origin={-33,-73}))); - Modelica.Blocks.Interfaces.RealInput timeOpe - "Input profile for opening hours (0: closed, 1: open)" annotation ( - Placement(transformation(extent={{-118,-70},{-94,-46}}), - iconTransformation(extent={{-118,-70},{-94,-46}}))); - Modelica.Blocks.Interfaces.RealInput uRelPer - "relative number of people related to max. value" annotation (Placement( - transformation(extent={{-120,-40},{-94,-14}}), iconTransformation( - extent={{-120,-40},{-94,-14}}))); - - Modelica.Blocks.Interfaces.RealInput TAir( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") "Temperature of the surrounding room air" annotation ( - Placement(transformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-67,103}),iconTransformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-67,103}))); - Modelica.Blocks.Interfaces.RealInput X_w "Absolute humidty of the room Air" annotation (Placement(transformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-29,103}), iconTransformation( - extent={{-15,-15},{15,15}}, - rotation=-90, - origin={-29,103}))); - - AixLib.ThermalZones.ReducedOrder.Multizone.BaseClasses.AbsToRelHum absToRelHum - "Calculation of the relative humidity of the room air " annotation (Placement(transformation( - extent={{-5,-5},{5,5}}, - rotation=-90, - origin={-59,77}))); - - Modelica.Blocks.Sources.RealExpression getAddWat(y=m_flow_add) - "requried added fresh warter to the pool circulation" - annotation (Placement(transformation(extent={{-62,-78},{-48,-62}}))); - - AixLib.Fluid.Sources.Boundary_pT sincEva(redeclare package Medium = - WaterMedium, nPorts=1) annotation (Placement(transformation( - extent={{6,-6},{-6,6}}, - rotation=180, - origin={-64,26}))); - - Modelica.Fluid.Interfaces.FluidPort_b port_b1(redeclare package Medium = - WaterMedium) if not poolParam.use_idealHeater - "Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)" - annotation (Placement(transformation(extent={{90,-64},{110,-44}}), - iconTransformation(extent={{90,-64},{110,-44}}))); - - Modelica.Fluid.Interfaces.FluidPort_a port_a1(redeclare package Medium = - WaterMedium) if not poolParam.use_idealHeater - "Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)" - annotation (Placement(transformation(extent={{90,-40},{110,-20}}), - iconTransformation(extent={{90,-40},{110,-20}}))); - - .AixLib.Fluid.Pool.BaseClasses.waveMachine waveMachine( - heightWave=poolParam.heightWave, - widthWave=poolParam.widthWave, - timeWavePul_start=poolParam.timeWavePul_start, - periodeWavePul=poolParam.periodeWavePul, - widthWavePul=poolParam.widthWavePul) if poolParam.use_wavePool - annotation (Placement(transformation(extent={{-92,-94},{-76,-80}}))); - - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a convPool - "Air temperature in zone" annotation (Placement(transformation(extent={{56,86}, - {80,110}}), iconTransformation(extent={{64,94},{84,114}}))); - - AixLib.Utilities.Interfaces.RadPort radPool - "Mean Radiation Temperature of surrounding walls " annotation (Placement( - transformation( - extent={{-8,-9},{8,9}}, - rotation=-90, - origin={39,100}), iconTransformation( - extent={{-11,-11},{11,11}}, - rotation=-90, - origin={30,100}))); - - Modelica.Thermal.HeatTransfer.Components.BodyRadiation radWaterSurface( - final Gr=eps*poolParam.APool) - "Model to depict the heat flow rate due to radiation between the pool surface an the surrounding walls" annotation (Placement(transformation( - extent={{-7,-7},{7,7}}, - rotation=90, - origin={39,73}))); - - Modelica.Thermal.HeatTransfer.Components.Convection convWaterSurface - "Convection at the watersurface" annotation (Placement(transformation( - extent={{-7,7},{7,-7}}, - rotation=90, - origin={67,75}))); - - Modelica.Blocks.Sources.RealExpression getHeatCoefConv(y=hConvAir*poolParam.APool) - "Coefficient of heat transfer between water surface and room air" annotation (Placement(transformation(extent={{100,66}, - {82,84}}))); - - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeatFlowEvapLoss annotation (Placement(transformation(extent={{-4,52}, - {12,68}}))); - - Modelica.Blocks.Math.Gain hEva(final k=h_vapor) - "Calculation of heat flow rate due to evaporation" annotation (Placement( - transformation( - extent={{-4,-4},{4,4}}, - rotation=0, - origin={-44,52}))); - - Modelica.Blocks.Interfaces.RealOutput m_flow_add_out( - final quantity="MassFlowRate", - final unit= "kg/s") - "Flow rate of added fresh water to the pool and water treatment system" - annotation (Placement(transformation(extent={{98,-102},{118,-82}}), - iconTransformation(extent={{98,-102},{118,-82}}))); - - AixLib.Fluid.Pool.BaseClasses.HeatTransferConduction heatTraCond( - AWalInt=poolParam.AWalInt, - AWalExt=poolParam.AWalExt, - AFloInt=poolParam.AFloInt, - AFloExt=poolParam.AFloExt, - hConWaterHorizontal=poolParam.hConWaterHorizontal, - hConWaterVertical=poolParam.hConWaterVertical, - TPool=poolParam.TPool, - PoolWall=poolParam.PoolWallParam) - "Model to depict the heat flow rate through the pool walls to the bordering room/soil" - annotation (Placement(transformation(extent={{64,32},{80,48}}))); - - Modelica.Blocks.Math.Gain minusGain(final k=-1) annotation (Placement( - transformation( - extent={{-4,-4},{4,4}}, - rotation=0, - origin={-20,60}))); - - Modelica.Blocks.Interfaces.RealOutput QEva( - final quantity="HeatFlowRate", - final unit="W") "Heat due to evaporation" annotation (Placement( - transformation(extent={{-92,46},{-122,76}}), iconTransformation(extent={ - {-94,46},{-114,66}}))); - - Modelica.Blocks.Interfaces.RealOutput QPool( - final quantity="HeatFlowRate", - final unit="W") - if poolParam.use_idealHeater - "Heat flow rate to maintain the pool at the set temperature" annotation ( - Placement(transformation(extent={{98,-16},{118,4}}), iconTransformation( - extent={{98,-16},{118,4}}))); - - Modelica.Blocks.Interfaces.RealInput TSoil( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") "Temperature of Soil" annotation (Placement( - transformation( - extent={{-13,-13},{13,13}}, - rotation=180, - origin={105,49}), iconTransformation( - extent={{-11,-11},{11,11}}, - rotation=180, - origin={103,47}))); - - Modelica.Blocks.Interfaces.RealOutput PPool( - final quantity="Power", - final unit="W") - "Output eletric energy needed for pool operation" annotation (Placement(transformation(extent={{98,-86}, - {118,-66}}), - iconTransformation(extent={{98,-86},{118,-66}}))); - - Modelica.Blocks.Interfaces.RealOutput TPool( - final quantity="ThermodynamicTemperature", - final unit="K") - "current temperature of pool" - annotation (Placement(transformation(extent={{98,6},{118,26}}), - iconTransformation(extent={{98,6},{118,26}}))); - - Modelica.Blocks.Math.MultiSum elPower(nu=if poolParam.use_wavePool then 2 else 1) - "Add electric power of pump and the optional wave pool" - annotation (Placement(transformation(extent={{72,-72},{80,-80}}))); - Sources.MassFlowSource_T bou( - redeclare package Medium = WaterMedium, - use_m_flow_in=true, - T=283.15, - nPorts=1) - annotation (Placement(transformation(extent={{-52,-94},{-40,-82}}))); - Modelica.Blocks.Sources.RealExpression getMeaTPool(y=poolWat.T) annotation ( - Placement(transformation( - extent={{10,-10},{-10,10}}, - rotation=180, - origin={72,16}))); - - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow idealHeater - if poolParam.use_idealHeater - annotation (Placement(transformation(extent={{48,-20},{32,-4}}))); - Controls.Continuous.LimPID PI( - k=poolParam.KHeat, - yMax=poolParam.QMaxHeat, - yMin=poolParam.QMinHeat, - controllerType=Modelica.Blocks.Types.SimpleController.PI, - Ti=poolParam.THeat) if poolParam.use_idealHeater annotation(Placement(transformation(extent={{-4,-4}, - {4,4}}, - rotation=180, - origin={66,-16}))); - Modelica.Blocks.Sources.RealExpression getSetTPool(y=poolParam.TPool) - if poolParam.use_idealHeater - annotation (Placement(transformation(extent={{96,-24},{78,-8}}))); - Controls.Continuous.LimPID PI1( - controllerType=Modelica.Blocks.Types.SimpleController.PI, - k=0.1, - Ti=5, - yMax=m_flow_nominal/0.9, - yMin=0) annotation (Placement(transformation(extent={{18,-54},{8,-44}}))); - Movers.FlowControlled_m_flow cirPump( - redeclare package Medium = WaterMedium, - energyDynamics=energyDynamics, - T_start=poolParam.TPool, - allowFlowReversal=false, - m_flow_nominal=m_flow_nominal, - redeclare Movers.Data.Generic per( - pressure(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, dp={ - pumpHead/0.7,pumpHead,0}), - use_powerCharacteristic=false, - hydraulicEfficiency(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, - eta={0.7,0.8,0.7}), - motorEfficiency(V_flow={0,m_flow_nominal/1000,m_flow_nominal/1000/0.7}, - eta={0.9,0.9,0.9}), - power(V_flow={0,(m_flow_nominal/1000*0.2),(m_flow_nominal/1000*0.5), - m_flow_nominal/1000*0.7,m_flow_nominal/1000,m_flow_nominal/1000/0.7, - m_flow_nominal/1000/0.6,m_flow_nominal/1000/0.5,m_flow_nominal/1000 - /0.4}, P={(m_flow_nominal/0.4)/1000*pumpHead/0.7/0.9,( - m_flow_nominal/0.5)/1000*pumpHead/0.7/0.9,(m_flow_nominal/0.6)/1000 - *pumpHead/0.7/0.9,(m_flow_nominal/0.7)/1000*pumpHead/0.7/0.9, - m_flow_nominal/1000*pumpHead/0.8/0.9,(m_flow_nominal/1000*0.7)* - pumpHead/0.7/0.9,(m_flow_nominal/1000*0.5)*pumpHead/0.7/0.9,( - m_flow_nominal/1000*0.2)*pumpHead/0.7/0.9,0})), - inputType=AixLib.Fluid.Types.InputType.Continuous, - addPowerToMedium=false, - nominalValuesDefineDefaultPressureCurve=true, - dp_nominal=pumpHead, - m_flow_start=m_flow_nominal) - "circulation pump for permanent pool circulation " annotation (Placement( - transformation( - extent={{-8,-8},{8,8}}, - rotation=0, - origin={0,-68}))); - Sensors.MassFlowRate senMasFlo(redeclare package Medium = - WaterMedium, allowFlowReversal=false) - annotation (Placement(transformation(extent={{-6,-6},{6,6}}, - rotation=0, - origin={22,-68}))); - FixedResistances.PressureDrop res( - redeclare package Medium = WaterMedium, - allowFlowReversal=false, - m_flow_nominal=m_flow_nominal, - show_T=false, - from_dp=false, - dp_nominal=pumpHead - poolParam.dpHeaExcPool, - homotopyInitialization=true, - linearized=false, - deltaM=0.3) "representative resistance for whole system " - annotation (Placement(transformation(extent={{32,-76},{44,-60}}))); - - -protected - final parameter Modelica.Units.SI.Density rhoWater_default= - WaterMedium.density_pTX( - p=WaterMedium.p_default, - T=273.15 + 30, - X=WaterMedium.X_default) "Default medium density"; - - - -equation - // Fresh water and water recycling - if poolParam.use_waterRecycling then - m_flow_add=(1-poolParam.x_recycling)*(poolParam.m_flow_out + m_flow_evap); - else - m_flow_add=poolParam.m_flow_out + m_flow_evap; - end if; - - // Pool circulation flow rate - if poolParam.use_partialLoad then - if timeOpe > 0 then - m_flow_toPool = m_flow_nominal; - else - m_flow_toPool = m_flow_partial; - end if; - else - m_flow_toPool = m_flow_nominal; - end if; - - // Evaporation according to VDI 2089 sheet 1, formula (1) - phi=absToRelHum.relHum; - if psat_TPool-phi*psat_TAir<0 then - m_flow_evap=0.0; - else - if timeOpe > 0 then - if uRelPer > 0 then - m_flow_evap =uRelPer*(poolParam.betaInUse/(RD*0.5*(poolWat.T + TAir))*( - psat_TPool - phi*psat_TAir)*poolParam.APool); - else - m_flow_evap =betaNonUse/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* - psat_TAir)*poolParam.APool; - end if; - else - if poolParam.use_poolCover then - m_flow_evap =betaCover/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* - psat_TAir)*poolParam.APool; - else - m_flow_evap =betaNonUse/(RD*0.5*(poolWat.T + TAir))*(psat_TPool - phi* - psat_TAir)*poolParam.APool; - end if; - end if; - end if; - - if poolParam.use_idealHeater then - connect(res.port_b, poolWat.ports[1]) annotation (Line(points={{44,-68},{54, - -68},{54,-24},{6,-24},{6,-10},{5.33333,-10}}, color={0,127,255})); - else - connect(poolWat.ports[1], port_a1) annotation (Line( - points={{5.33333,-10},{6,-10},{6,-22},{56,-22},{56,-30},{100,-30}}, - color={0,127,255}, - pattern=LinePattern.Dash)); - connect(port_b1, res.port_b) annotation (Line( - points={{100,-54},{78,-54},{78,-68},{44,-68}}, - color={0,127,255}, - pattern=LinePattern.Dash)); - end if; - - connect(poolWat.ports[3], setEva.port_a) annotation (Line(points={{2.66667,-10}, - {2,-10},{2,-18},{-12,-18},{-12,26},{-24,26}}, color={0,127,255})); - - connect(poolSto.ports[2], HeatExchanger.port_b1) annotation (Line(points={{-28.5, - -56},{-28.5,-64},{-36,-64},{-36,-68}}, color={0,127,255})); - connect(poolSto.ports[3], HeatExchanger.port_a2) annotation (Line(points={{-27.5, - -56},{-28,-56},{-28,-64},{-30,-64},{-30,-68}}, color={0,127,255})); - connect(poolSto.ports[4], cirPump.port_a) annotation (Line(points={{-26.5,-56}, - {-14,-56},{-14,-68},{-8,-68}}, color={0,127,255})); - connect(poolSto.ports[1], poolWat.ports[2]) annotation (Line(points={{-29.5,-56}, - {-29.5,-60},{-60,-60},{-60,-24},{4,-24},{4,-10}}, color={0,127,255})); - - connect(absToRelHum.TDryBul, TAir) annotation (Line(points={{-61.8,83},{-62,83}, - {-62,88},{-67,88},{-67,103}},color={0,0,127})); - connect(absToRelHum.absHum, X_w) annotation (Line(points={{-56.4,83},{-56,83}, - {-56,88},{-29,88},{-29,103}}, color={0,0,127})); - connect(HeatExchanger.port_b2, Sinc.ports[1]) annotation (Line(points={{-30,-78}, - {-30,-88},{22,-88}}, color={0,127,255})); - connect(setEva.port_b, sincEva.ports[1]) - annotation (Line(points={{-36,26},{-58,26}}, color={0,127,255})); - connect(getEva.y, setEva.m_flow_in) annotation (Line(points={{-71.1,41},{-26.4, - 41},{-26.4,30.8}}, color={0,0,127})); - connect(radWaterSurface.port_b, radPool) - annotation (Line(points={{39,80},{39,100}}, color={191,0,0})); - connect(convWaterSurface.fluid, convPool) - annotation (Line(points={{67,82},{68,82},{68,98}}, color={191,0,0})); - connect(convWaterSurface.solid, poolWat.heatPort) annotation (Line(points={{67, - 68},{66,68},{66,52},{38,52},{38,0},{14,0}}, color={191,0,0})); - connect(radWaterSurface.port_a, poolWat.heatPort) - annotation (Line(points={{39,66},{38,66},{38,0},{14,0}}, color={191,0,0})); - connect(preHeatFlowEvapLoss.port, poolWat.heatPort) - annotation (Line(points={{12,60},{26,60},{26,0},{14,0}}, color={191,0,0})); - connect(getEva.y, hEva.u) annotation (Line(points={{-71.1,41},{-58,41},{-58,52}, - {-48.8,52}}, color={0,0,127})); - connect(heatTraCond.heatport_a, poolWat.heatPort) annotation (Line(points={{63.76, - 39.92},{38,39.92},{38,0},{14,0}}, color={191,0,0})); - connect(hEva.y, minusGain.u) annotation (Line(points={{-39.6,52},{-34,52},{-34, - 60},{-24.8,60}}, color={0,0,127})); - connect(hEva.y, QEva) annotation (Line(points={{-39.6,52},{-34,52},{-34,61},{-107, - 61}}, color={0,0,127})); - connect(heatTraCond.TSoil, TSoil) annotation (Line(points={{80.48,42.88},{82,42.88}, - {82,49},{105,49}}, color={0,0,127})); - connect(convPool, convPool) - annotation (Line(points={{68,98},{68,98}}, color={191,0,0})); - connect(getHeatCoefConv.y, convWaterSurface.Gc) annotation (Line(points={{81.1,75}, - {74,75}}, color={0,0,127})); - connect(minusGain.y, preHeatFlowEvapLoss.Q_flow) - annotation (Line(points={{-15.6,60},{-4,60}}, color={0,0,127})); - - connect(bou.ports[1], HeatExchanger.port_a1) annotation (Line(points={{-40,-88}, - {-40,-78},{-36,-78}}, color={0,127,255})); - connect(waveMachine.open, timeOpe) annotation (Line(points={{-93.28,-87},{-98, - -87},{-98,-74},{-90,-74},{-90,-58},{-106,-58}}, color={0,0,127})); - connect(getMeaTPool.y, TPool) - annotation (Line(points={{83,16},{108,16}}, color={0,0,127})); - - connect(PI.y, idealHeater.Q_flow) annotation (Line(points={{61.6,-16},{54,-16}, - {54,-12},{48,-12}}, color={0,0,127})); - connect(idealHeater.port, poolWat.heatPort) annotation (Line(points={{32,-12}, - {24,-12},{24,0},{14,0}}, color={191,0,0})); - connect(getSetTPool.y, PI.u_s) - annotation (Line(points={{77.1,-16},{70.8,-16}}, color={0,0,127})); - connect(QPool, PI.y) annotation (Line(points={{108,-6},{58,-6},{58,-16},{61.6, - -16}}, color={0,0,127})); - connect(bou.m_flow_in, getAddWat.y) annotation (Line(points={{-53.2,-83.2},{-60, - -83.2},{-60,-76},{-42,-76},{-42,-70},{-47.3,-70}}, color={0,0,127})); - connect(getAddWat.y, m_flow_add_out) annotation (Line(points={{-47.3,-70},{-42,-70}, - {-42,-76},{-60,-76},{-60,-96},{94,-96},{94,-92},{108,-92}}, color={0,0, - 127})); - connect(setEva.port_b, setEva.port_a) annotation (Line( - points={{-36,26},{-30,26},{-24,26}}, - color={0,127,255}, - smooth=Smooth.Bezier)); - connect(cirPump.port_b, senMasFlo.port_a) - annotation (Line(points={{8,-68},{16,-68}}, color={0,127,255})); - connect(senMasFlo.port_b, res.port_a) - annotation (Line(points={{28,-68},{32,-68}}, color={0,127,255})); - connect(PI1.y, cirPump.m_flow_in) - annotation (Line(points={{7.5,-49},{0,-49},{0,-58.4}}, color={0,0,127})); - connect(PI1.u_s,getSetMasFlo. y) - annotation (Line(points={{19,-49},{27.3,-49}}, color={0,0,127})); - connect(senMasFlo.m_flow, PI1.u_m) annotation (Line(points={{22,-61.4},{22,-58}, - {13,-58},{13,-55}}, color={0,0,127})); - - connect(elPower.u[1], cirPump.P) annotation (Line(points={{72,-76},{62,-76},{62, - -60.8},{8.8,-60.8}}, color={0,0,127})); - connect(elPower.y, PPool) annotation (Line(points={{80.68,-76},{108,-76}}, color={0,0,127})); - connect(waveMachine.PWaveMachine, elPower.u[2]) annotation (Line(points={{-75.52, - -87},{-72,-87},{-72,-100},{64,-100},{64,-76},{72,-76}}, - color={0,0,127})); - - connect(PI.u_m,getMeaTPool. y) annotation (Line(points={{66,-11.2},{66,4},{92, - 4},{92,16},{83,16}}, color={0,0,127})); - annotation (Line( - points={{47,-32},{47,-14},{-25,-14},{-25,-6}}, color={0,127,255}), - Line(points={{18.4,-40}, - {18,-40},{18,-44},{-100,-44}}, color={0,127,255}), - Placement(transformation( - extent={{-20,-20},{20,20}}, - rotation=-90, - origin={-50,82}), iconTransformation( - extent={{-20,-20},{20,20}}, - rotation=-90, - origin={-60,80})), - Icon(coordinateSystem(preserveAspectRatio=false), - graphics={ - Rectangle( - extent={{98,98},{-98,-98}}, - fillColor={215,215,215}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Bitmap(extent={{-94,-150},{96,58}}, fileName="modelica://AixLib/Resources/Images/Fluid/Pools/icon_schwimmbecken.jpg")}), - Diagram(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-100,2},{100,100}}, - lineColor={0,128,255}, - fillColor={170,213,255}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Text( - extent={{-98,12},{-6,0}}, - textColor={85,85,255}, - textStyle={TextStyle.Bold}, - horizontalAlignment=TextAlignment.Left, - textString="Heat and mass exchange -at pool surface or pool walls -"), Rectangle( - extent={{-66,-98},{100,-2}}, - lineColor={0,0,127}, - fillColor={155,195,232}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Rectangle( - extent={{-100,-98},{-68,-2}}, - lineColor={95,95,95}, - fillColor={215,215,215}, - fillPattern=FillPattern.Solid, - lineThickness=0.5), - Text( - extent={{-98,-6},{-72,-14}}, - textColor={95,95,95}, - horizontalAlignment=TextAlignment.Left, - textStyle={TextStyle.Bold}, - textString="Pool -operation"), - Text( - extent={{-64,-2},{-22,-24}}, - textColor={0,0,127}, - horizontalAlignment=TextAlignment.Left, - textStyle={TextStyle.Bold}, - textString="Water treatment -circuit -")}), -Documentation(info="

    - Overview -

    -

    - Model for indoor swimming pools to calculate energy and water - demands. Optional use of a wave machine, pool cover, partial load for - the circulation pump and heat recovery from wastewater or recycling. - In addition, an ideal heater can be used to heat the pool. -

    -

    -
    -
    - \"1\" -

    -

    - Important parameters and - Inputs -

    -
      -
    • All pool specific parameters are collected in one AixLib.DataBase.Pools.IndoorSwimmingPoolBaseRecord - record. -
    • -
    • openingHours: Input profile for the opening hours to consider a - pool cover or a reduced circulation flow during non-operating hours. - Also, during non-opening hours pool occupancy is set to 0. -
    • -
    • persons: Input profile for occupancy of the pool to consider - occupancy level for evaportaion. -
    • -
    -

    - Assumptions -

    -
      -
    • Evaporation is determined according to VDI 2089. -
    • -
    • Filter and disinfection units are not explicitly modeled and have - to be considered within the pump delivery head (pumpHead). According - to Saunus 1.7 bar is a good estimation for swimming pools in sport - oriented swimming facilities. -
    • -
    • The type of the filter should be taken into account within the - determination of the volume flow and storage capacities. DIN 19643 - provides standards for the volume flow and storage capacities, taking - into account the pool size and type as well as the filter type. -
    • -
    • There are no water losses or heat gains due to people entering or - leaving the swimming pool. -
    • -
    -

    - References -

    -

    - For automatic generation of a swimming pool within a thermal zone and - multizone model as well as for datasets, see - https://github.com/RWTH-EBC/TEASER -

    -

    - References for implemented constants (use also for parametrization): -

    -
      -
    • German Association of Engineers: Guideline VDI 2089-1, January - 2010: Building Services in swimming baths - Indoor Pools -
    • -
    • German Institute for Standardization DIN 19643-1, November 2012: - Treatment of water of swimming pools and baths - Part 1 General - Requirements -
    • -
    • Chroistoph Saunus, 2005: Schwimmbäder Planung - Ausführung - - Betrieb -
    • -
    -")); -end IndoorSwimmingPool; diff --git a/AixLib/Fluid/Pool/package.mo b/AixLib/Fluid/Pool/package.mo deleted file mode 100644 index d75918bf6d..0000000000 --- a/AixLib/Fluid/Pool/package.mo +++ /dev/null @@ -1,7 +0,0 @@ -within AixLib.Fluid; -package Pool - - - - -end Pool; diff --git a/AixLib/Fluid/Pool/package.order b/AixLib/Fluid/Pool/package.order deleted file mode 100644 index fe272da0eb..0000000000 --- a/AixLib/Fluid/Pool/package.order +++ /dev/null @@ -1,3 +0,0 @@ -IndoorSwimmingPool -BaseClasses -Examples From 9bf75640d7711e6ee4463c90a2f75d2482aabc34 Mon Sep 17 00:00:00 2001 From: Larissa Date: Tue, 6 Jun 2023 09:56:39 +0200 Subject: [PATCH 34/34] Add icon for Pools package #1407 --- AixLib/Fluid/Pools/package.mo | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/AixLib/Fluid/Pools/package.mo b/AixLib/Fluid/Pools/package.mo index e1e4d74320..ed22197509 100644 --- a/AixLib/Fluid/Pools/package.mo +++ b/AixLib/Fluid/Pools/package.mo @@ -1,7 +1,33 @@ within AixLib.Fluid; package Pools + extends Modelica.Icons.Package; - +annotation (Icon(graphics={ + Rectangle( + extent={{-66,-2},{68,-42}}, + lineColor={0,0,0}, + lineThickness=0.5, + fillColor={170,213,255}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Line( + points={{-66,20},{-66,-42}}, + color={0,0,0}, + thickness=1), + Line( + points={{-66,-42},{68,-42}}, + color={0,0,0}, + thickness=1), + Line( + points={{68,20},{68,-42}}, + color={0,0,0}, + thickness=1), Line( + points={{-66,-4},{-60,2},{-56,-4},{-50,2},{-44,-4},{-36,2},{-30,-4},{ + -24,2},{-18,-4},{-12,2},{-6,-4},{0,2},{6,-4},{10,2},{16,-4},{22,2}, + {28,-4},{34,2},{40,-4},{44,2},{50,-4},{56,2},{62,-4},{68,2}}, + color={0,0,0}, + smooth=Smooth.Bezier, + thickness=0.5)})); end Pools;