From 53f86acd0e128ba50dad09778a865343803049a9 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Wed, 6 Sep 2023 08:58:39 +0200 Subject: [PATCH 01/48] First version of the intermediate results of the SimpleHouse exercise, developed using Dymola --- .../SimpleHouse1.mo | 22 ++++ .../SimpleHouse2.mo | 33 ++++++ .../SimpleHouse3.mo | 38 +++++++ .../SimpleHouse4.mo | 69 ++++++++++++ .../SimpleHouse5.mo | 36 +++++++ .../SimpleHouse6.mo | 86 +++++++++++++++ .../SimpleHouseTemplate.mo | 100 ++++++++++++++++++ .../WorkshopModelicaConference/package.mo | 4 + .../WorkshopModelicaConference/package.order | 7 ++ IBPSA/Fluid/Examples/package.order | 9 +- 10 files changed, 400 insertions(+), 4 deletions(-) create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse2.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse3.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse4.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse5.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse6.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouseTemplate.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/package.mo create mode 100644 IBPSA/Fluid/Examples/WorkshopModelicaConference/package.order diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo new file mode 100644 index 0000000000..e0dd0779f8 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo @@ -0,0 +1,22 @@ +within IBPSA.Fluid.Examples.WorkshopModelicaConference; +model SimpleHouse1 "Building wall model" + extends SimpleHouseTemplate; + + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( + C=A_wall*d_wall*cp_wall*rho_wall) + "Thermal mass of walls" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={150,0}))); +equation + connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{130,0}, + {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + annotation (Documentation(revisions=" + +")); +end SimpleHouse1; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse2.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse2.mo new file mode 100644 index 0000000000..1d10e11ca8 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse2.mo @@ -0,0 +1,33 @@ +within IBPSA.Fluid.Examples.WorkshopModelicaConference; +model SimpleHouse2 "Building window model" + extends SimpleHouse1; + + parameter Modelica.Units.SI.Area A_win=2 "Window area"; + + Modelica.Blocks.Math.Gain gaiWin(k=A_win) + "Gain for solar irradiance through the window" + annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow window + "Very simple window model" + annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); +equation + connect(gaiWin.y,window. Q_flow) annotation (Line(points={{-39,-30},{-20,-30}}, + color={0,0,127})); + connect(window.port, walCap.port) annotation (Line(points={{0,-30},{132,-30},{ + 132,1.77636e-15},{140,1.77636e-15}}, + color={191,0,0})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-62,-30},{-150,-30}, + {-150,-10}}, color={0,0,127}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + annotation (Documentation(revisions=" + +")); +end SimpleHouse2; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse3.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse3.mo new file mode 100644 index 0000000000..93b892a691 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse3.mo @@ -0,0 +1,38 @@ +within IBPSA.Fluid.Examples.WorkshopModelicaConference; +model SimpleHouse3 "Air model" + extends SimpleHouse2; + + parameter Modelica.Units.SI.Volume V_zone=8*8*3 "Zone volume"; + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=0.1 + "Nominal mass flow rate for air loop"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer h_wall=2 + "Convective heat transfer coefficient at the wall"; + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor convRes(R=1/2/A_wall) + "Thermal resistance for convective heat transfer" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={130,20}))); + MixingVolumes.MixingVolume zone( + redeclare package Medium = MediumAir, + V=V_zone, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + m_flow_nominal=mAir_flow_nominal, + massDynamics=Modelica.Fluid.Types.Dynamics.DynamicFreeInitial) + "Very simple zone air model" + annotation (Placement(transformation(extent={{110,130},{90,150}}))); +equation + connect(convRes.port_b, walCap.port) + annotation (Line(points={{130,10},{130,1.77636e-15},{140,1.77636e-15}}, + color={191,0,0})); + connect(zone.heatPort, convRes.port_a) + annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); + annotation (Documentation(revisions=" + +")); +end SimpleHouse3; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse4.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse4.mo new file mode 100644 index 0000000000..026a7fe886 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse4.mo @@ -0,0 +1,69 @@ +within IBPSA.Fluid.Examples.WorkshopModelicaConference; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean constantSourceHeater=true + "To enable/disable the connection between the constant source and heater"; + + HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=3000) "Radiator" + annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); + HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); + Movers.FlowControlled_m_flow pump( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + nominalValuesDefineDefaultPressureCurve=true, + inputType=IBPSA.Fluid.Types.InputType.Constant) + "Pump" + annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); + Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={10,-170}))); + Modelica.Blocks.Sources.Constant const(k=1) + annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, + color={0,127,255})); + connect(rad.port_b,pump. port_a) annotation (Line(points={{130,-100},{148,-100}, + {148,-170},{110,-170}},color={0,127,255})); + connect(heaWat.port_a,pump. port_b) annotation (Line(points={{60,-100},{49.75, + -100},{49.75,-170},{90,-170}}, color={0,127,255})); + connect(rad.heatPortCon, zone.heatPort) annotation (Line(points={{118,-92.8}, + {118,140},{110,140}},color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, + -30},{132,-30},{132,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + if constantSourceHeater then + connect(const.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50,-94}, + {58,-94}}, color={0,0,127})); + end if; + connect(bouWat.ports[1], pump.port_b) + annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); + annotation (Documentation(revisions=" + +")); +end SimpleHouse4; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse5.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse5.mo new file mode 100644 index 0000000000..680b547d14 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse5.mo @@ -0,0 +1,36 @@ +within IBPSA.Fluid.Examples.WorkshopModelicaConference; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(pump(inputType=IBPSA.Fluid.Types.InputType.Stages, + massFlowRates=mWat_flow_nominal*{1}), + constantSourceHeater=false); + + Modelica.Blocks.Math.BooleanToInteger booleanToInt "Boolean to integer" + annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); + Modelica.Blocks.Math.BooleanToReal booleanToReal "Boolean to real" + annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,150},{70,170}}))); +equation + connect(booleanToInt.y, pump.stage) annotation (Line(points={{21,-140},{100,-140}, + {100,-158}}, color={255,127,0})); + connect(booleanToInt.u,not1. y) annotation (Line(points={{-2,-140},{-11.5,-140}, + {-11.5,-100},{-19,-100}}, + color={255,0,255})); + connect(booleanToReal.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100}, + {40.5,-94},{58,-94}}, color={0,0,127})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, + {-230,-100},{-82,-100}}, color={0,0,127})); + connect(senTemZonAir.port, zone.heatPort) annotation (Line(points={{90,160},{ + 110,160},{110,140}}, color={191,0,0})); + connect(not1.y, booleanToReal.u) + annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); +end SimpleHouse5; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse6.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse6.mo new file mode 100644 index 0000000000..d2133f3d73 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse6.mo @@ -0,0 +1,86 @@ +within IBPSA.Fluid.Examples.WorkshopModelicaConference; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5(zone(nPorts=2), + mAir_flow_nominal=0.1, + A_win=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential + vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={50,110}))); + IBPSA.Fluid.Movers.FlowControlled_dp + fan( + redeclare package Medium = MediumAir, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + nominalValuesDefineDefaultPressureCurve=true, + m_flow_nominal=mAir_flow_nominal, + show_T=true) "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={-50,110}))); + Modelica.Blocks.Sources.Constant const_dp(k=dpAir_nominal) "Pressure head" + annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness + hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); + IBPSA.Fluid.Sources.Boundary_pT + bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-130,130}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{-20,70},{0,90}}))); + Modelica.Blocks.Math.BooleanToReal booleanToReal1 + "Boolean to real" + annotation (Placement(transformation(extent={{20,70},{40,90}}))); +equation + connect(const_dp.y,fan. dp_in) annotation (Line(points={{-69,80},{-50,80},{ + -50,98}}, color={0,0,127})); + connect(hexRec.port_a1, zone.ports[1]) annotation (Line(points={{-80,129.6},{59, + 129.6},{59,130},{100,130}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ + -150,134},{-150,-10}},color={0,0,127})); + connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, + 110.4},{-69,110},{-60,110}}, color={0,127,255})); + connect(vavDam.port_b, zone.ports[2]) annotation (Line(points={{60,110},{100,110}, + {100,130}}, color={0,127,255})); + connect(booleanToReal1.y, vavDam.y) + annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); + connect(hysAir.y, booleanToReal1.u) + annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, + 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); + connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, + {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); + connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, + {-120,110.4},{-110,110.4}}, color={0,127,255})); + annotation (Documentation(revisions=" + +")); +end SimpleHouse6; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouseTemplate.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouseTemplate.mo new file mode 100644 index 0000000000..89713deb04 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouseTemplate.mo @@ -0,0 +1,100 @@ +within IBPSA.Fluid.Examples.WorkshopModelicaConference; +model SimpleHouseTemplate + "Template file for simple house example" + extends Modelica.Icons.Example; + + package MediumAir = IBPSA.Media.Air "Medium model for air"; + package MediumWater = IBPSA.Media.Water "Medium model for water"; + + parameter Modelica.Units.SI.Area A_wall = 100 "Wall area"; + parameter Modelica.Units.SI.Length d_wall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity k_wall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rho_wall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cp_wall = 1000 "Wall specific heat capacity"; + + IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + "Weather data reader" + annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); + IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature Tout + "Exterior temperature boundary condition" + annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes( + R=d_wall/A_wall/k_wall) + "Thermal resistor for wall: 25 cm of rockwool" + annotation (Placement(transformation(extent={{80,-10},{100,10}}))); +equation + connect(weaDat.weaBus, weaBus) annotation (Line( + points={{-180,-10},{-150,-10}}, + color={255,204,51}, + thickness=0.5)); + connect(Tout.T, weaBus.TDryBul) + annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); + connect(Tout.port,wallRes. port_a) + annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}}), graphics={ + Rectangle( + extent={{-220,40},{20,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,-60},{180,-200}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,180},{180,60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{40,40},{180,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Text( + extent={{98,20},{32,38}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Wall"), + Text( + extent={{-148,-86},{-214,-68}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Heating"), + Text( + extent={{-118,18},{-214,40}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Weather inputs"), + Text( + extent={{-76,158},{-214,180}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Cooling and ventilation")}), + experiment(StopTime=1e+06), + Documentation(revisions=" + +", info=" +

This model is used as the starting point of an exercise for the IBPSA Modelica Working Group workshop for the Modelica Conference and was copied from the Modelica crash course organised by KU Leuven (https://github.com/open-ideas/__CrashCourse__).

+")); +end SimpleHouseTemplate; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/package.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/package.mo new file mode 100644 index 0000000000..021a3b2722 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/package.mo @@ -0,0 +1,4 @@ +within IBPSA.Fluid.Examples; +package WorkshopModelicaConference +extends Modelica.Icons.ExamplesPackage; +end WorkshopModelicaConference; diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/package.order b/IBPSA/Fluid/Examples/WorkshopModelicaConference/package.order new file mode 100644 index 0000000000..d7aab4bb28 --- /dev/null +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/package.order @@ -0,0 +1,7 @@ +SimpleHouseTemplate +SimpleHouse1 +SimpleHouse2 +SimpleHouse3 +SimpleHouse4 +SimpleHouse5 +SimpleHouse6 diff --git a/IBPSA/Fluid/Examples/package.order b/IBPSA/Fluid/Examples/package.order index dfba118b86..fe1d536451 100644 --- a/IBPSA/Fluid/Examples/package.order +++ b/IBPSA/Fluid/Examples/package.order @@ -1,4 +1,5 @@ -ResistanceVolumeFlowReversal -SimpleHouse -FlowSystem -Performance +ResistanceVolumeFlowReversal +SimpleHouse +FlowSystem +Performance +WorkshopModelicaConference From 0cc1328a8ceb37c762886e64111dcab2f7d80acc Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Wed, 6 Sep 2023 09:11:18 +0200 Subject: [PATCH 02/48] Include diagram and experiment annotations in all models since this information is not included in the extension within OpenModelica --- .../WorkshopModelicaConference/SimpleHouse1.mo | 5 ++++- .../WorkshopModelicaConference/SimpleHouse2.mo | 5 ++++- .../WorkshopModelicaConference/SimpleHouse3.mo | 5 ++++- .../WorkshopModelicaConference/SimpleHouse4.mo | 5 ++++- .../WorkshopModelicaConference/SimpleHouse5.mo | 11 +++++++++++ .../WorkshopModelicaConference/SimpleHouse6.mo | 5 ++++- 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo index e0dd0779f8..61c3962a93 100644 --- a/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo +++ b/IBPSA/Fluid/Examples/WorkshopModelicaConference/SimpleHouse1.mo @@ -11,7 +11,10 @@ model SimpleHouse1 "Building wall model" equation connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{130,0}, {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - annotation (Documentation(revisions=" + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(StopTime=1e+06), + Documentation(revisions=" +", info=" +

+This part of the model adds a hysteresis controller for the heating circuit +that uses the room temperature as an input. +

")); end SimpleHouse5; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 507e598468..eeabaf152c 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -85,5 +85,11 @@ September 4, 2023, by Jelger Jansen:
First implementation. +", info=" +

+This part of the model adds a ventilation system consisting of a fan, a damper, +a heat recovery unit, and a hysteresis controller, +that allows to perform free cooling using outside air. +

")); end SimpleHouse6; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo index fcd75911ba..882e96bb60 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo @@ -95,6 +95,10 @@ First implementation. ", info=" -

This model is used as the starting point of an exercise for the IBPSA Modelica Working Group workshop for the Modelica Conference and was copied from the Modelica crash course organised by KU Leuven (https://github.com/open-ideas/__CrashCourse__).

+

+This model is used as the starting point for the SimpleHouse tutorial. +It was copied from the Modelica crash course organised by KU Leuven +(https://github.com/open-ideas/__CrashCourse__). +

")); end SimpleHouseTemplate; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo index 6bff672ea4..24ded141ee 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo @@ -1,4 +1,63 @@ within IBPSA.Fluid.Examples.Tutorial; -package SimpleHouse +package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" extends Modelica.Icons.ExamplesPackage; + + annotation (Documentation(info=" +

+This package contains examples with step-by-step instructions for how to build a system model +for a simple house with a heating system, ventilation, and weather boundary conditions. +It serves as a demonstration case of how the IBPSA library can be used. +

+

+A detailed description of how the system model can be built up can be found in + +IBPSA.Resources.Documentation.Fluid.Examples.Tutorial.SimpleHouse. +

+

+The model has been created in the following stages: +

+
    +
  1. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate +contains a weather data reader which connects the thermal resistance of the building wall +to the dry bulb temperature and serves as a template to implement the entire SimpleHouse model. +
  2. +
  3. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse1 +implements the building wall by adding a thermal capacity. +
  4. +
  5. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse2 +adds a window to the building wall. +It is assumed that the total injected heat through the window equals the window surface area +multiplied by the direct horizontal solar irradiance. +
  6. +
  7. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse3 +adds an air model which represents the room in the building. +
  8. +
  9. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse4 +adds heating circuit consisting of a boiler, a radiator, +and an on/off circulation pump with a constant mass flow rate. +No controller is implemented yet, i.e. the pump and heater are always on. +
  10. +
  11. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse5 +adds a hysteresis controller for the heating circuit that uses the room temperature as an input. +
  12. +
  13. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse6 +adds a ventilation system consisting of a fan, a damper, a heat recovery unit, +and a hysteresis controller, that allows to perform free cooling using outside air. +
  14. +
+")); end SimpleHouse; diff --git a/IBPSA/Fluid/Examples/Tutorial/package.mo b/IBPSA/Fluid/Examples/Tutorial/package.mo index c16c910199..df598c1356 100644 --- a/IBPSA/Fluid/Examples/Tutorial/package.mo +++ b/IBPSA/Fluid/Examples/Tutorial/package.mo @@ -1,4 +1,11 @@ within IBPSA.Fluid.Examples; package Tutorial extends Modelica.Icons.Information; + +annotation (Documentation(info=" +

+This package contains examples of system models with step by step instructions for how to build such models. +The examples are meant to instruct new users on how to build large system models. +

+")); end Tutorial; diff --git a/IBPSA/Fluid/Examples/package.order b/IBPSA/Fluid/Examples/package.order index 1043755e98..c9f7482449 100644 --- a/IBPSA/Fluid/Examples/package.order +++ b/IBPSA/Fluid/Examples/package.order @@ -1,5 +1,5 @@ +Tutorial ResistanceVolumeFlowReversal SimpleHouse FlowSystem Performance -Tutorial From 8264fefaa98c4f30a8dd569cc20a9491ed131735 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Thu, 7 Sep 2023 13:31:27 +0200 Subject: [PATCH 08/48] Add regression tests for each model. --- .../Examples/Tutorial/SimpleHouse/SimpleHouse1.mo | 7 +++++-- .../Examples/Tutorial/SimpleHouse/SimpleHouse2.mo | 5 ++++- .../Examples/Tutorial/SimpleHouse/SimpleHouse3.mo | 10 ++++++---- .../Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 5 ++++- .../Examples/Tutorial/SimpleHouse/SimpleHouse5.mo | 5 ++++- .../Examples/Tutorial/SimpleHouse/SimpleHouse6.mo | 10 +++++++--- .../Examples/Tutorial/SimpleHouse/SimpleHouse1.mos | 2 ++ .../Examples/Tutorial/SimpleHouse/SimpleHouse2.mos | 2 ++ .../Examples/Tutorial/SimpleHouse/SimpleHouse3.mos | 2 ++ .../Examples/Tutorial/SimpleHouse/SimpleHouse4.mos | 3 +++ .../Examples/Tutorial/SimpleHouse/SimpleHouse5.mos | 3 +++ .../Examples/Tutorial/SimpleHouse/SimpleHouse6.mos | 5 +++++ 12 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos create mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos create mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos create mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos create mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos create mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 74d2ff2333..5f5fa3aaab 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -3,7 +3,7 @@ model SimpleHouse1 "Building wall model" extends SimpleHouseTemplate; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - C=A_wall*d_wall*cp_wall*rho_wall) + C=A_wall*d_wall*cp_wall*rho_wall, T(fixed=true)) "Thermal mass of walls" annotation (Placement(transformation(extent={{-10,-10},{10,10}}, rotation=270, @@ -28,5 +28,8 @@ thermal capacity to the thermal resistance that was already modeled in IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate.

-")); +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" + "Simulate and plot")); end SimpleHouse1; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index 31d54446ca..cf3ac33d7f 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -38,5 +38,8 @@ This part of the system model adds a window to the building wall. It is assumed that the total injected heat through the window equals the window surface area multiplied by the direct horizontal solar irradiance.

-")); +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" + "Simulate and plot")); end SimpleHouse2; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 1e37b7c960..642d53a076 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -3,7 +3,7 @@ model SimpleHouse3 "Air model" extends SimpleHouse2; parameter Modelica.Units.SI.Volume V_zone=8*8*3 "Zone volume"; - parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=0.1 + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 "Nominal mass flow rate for air loop"; parameter Modelica.Units.SI.CoefficientOfHeatTransfer h_wall=2 "Convective heat transfer coefficient at the wall"; @@ -17,8 +17,7 @@ model SimpleHouse3 "Air model" redeclare package Medium = MediumAir, V=V_zone, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - m_flow_nominal=mAir_flow_nominal, - massDynamics=Modelica.Fluid.Types.Dynamics.DynamicFreeInitial) + m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" annotation (Placement(transformation(extent={{110,130},{90,150}}))); equation @@ -41,5 +40,8 @@ First implementation.

This part of the model adds an air model which represents the room in the building.

-")); +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" + "Simulate and plot")); end SimpleHouse3; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 5606724d08..60317ef088 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -74,5 +74,8 @@ This part of the model adds heating circuit consisting of a boiler, a radiator, and an on/off circulation pump with a constant mass flow rate. No controller is implemented yet, i.e. the pump and heater are always on.

-")); +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); end SimpleHouse4; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 460205747b..0251cbabad 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -48,5 +48,8 @@ First implementation. This part of the model adds a hysteresis controller for the heating circuit that uses the room temperature as an input.

-")); +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); end SimpleHouse5; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index eeabaf152c..8acc3d025e 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -18,12 +18,13 @@ model SimpleHouse6 "Free cooling model" IBPSA.Fluid.Movers.FlowControlled_dp fan( redeclare package Medium = MediumAir, + show_T=true, dp_nominal=dpAir_nominal, use_inputFilter=false, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, nominalValuesDefineDefaultPressureCurve=true, - m_flow_nominal=mAir_flow_nominal, - show_T=true) "Constant head fan" annotation (Placement(transformation( + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( extent={{-10,10},{10,-10}}, origin={-50,110}))); Modelica.Blocks.Sources.Constant const_dp(k=dpAir_nominal) "Pressure head" @@ -91,5 +92,8 @@ This part of the model adds a ventilation system consisting of a fan, a damper, a heat recovery unit, and a hysteresis controller, that allows to perform free cooling using outside air.

-")); +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); end SimpleHouse6; diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos new file mode 100644 index 0000000000..258a2bf2e7 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse1", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse1"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos new file mode 100644 index 0000000000..d4c7b5c21b --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse2", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse2"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos new file mode 100644 index 0000000000..6f1012a4aa --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse3", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse3"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos new file mode 100644 index 0000000000..f791fd0f62 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos @@ -0,0 +1,3 @@ +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse4", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse4"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 80}, grid=true, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos new file mode 100644 index 0000000000..f91eedf8db --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos @@ -0,0 +1,3 @@ +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse5", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse5"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 24}, grid=true, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos new file mode 100644 index 0000000000..6e141f0d3c --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos @@ -0,0 +1,5 @@ +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse6", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse6"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 26}, grid=true, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 413}, y={"vavDam.y"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=3, colors={{28,108,200}}); +createPlot(id=2, position={818, 10, 662, 377}, y={"fan.sta_a.T", "fan.sta_b.T"}, range={0.0, 380.0, 18.0, 22.5}, grid=true, colors={{28,108,200}, {238,46,47}}); From b55edbd1e2b2644c07bc5e1b6a6d80a36e5f412d Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Thu, 7 Sep 2023 13:52:16 +0200 Subject: [PATCH 09/48] Add Tolerance to experiment annotation --- IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo | 2 +- IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo | 2 +- IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo | 2 +- IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 2 +- IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo | 2 +- IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 5f5fa3aaab..c86b353ba5 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -13,7 +13,7 @@ equation {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(StopTime=1e+06), + experiment(Tolerance=1e-4, StopTime=1e+06), Documentation(revisions="
  • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index cf3ac33d7f..88569d3039 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -24,7 +24,7 @@ equation horizontalAlignment=TextAlignment.Right)); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(StopTime=1e+06), + experiment(Tolerance=1e-4, StopTime=1e+06), Documentation(revisions="
    • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 642d53a076..2b8aae7c24 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -28,7 +28,7 @@ equation annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(StopTime=1e+06), + experiment(Tolerance=1e-4, StopTime=1e+06), Documentation(revisions="
      • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 60317ef088..56af4bff50 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -60,7 +60,7 @@ equation annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(StopTime=1e+06), + experiment(Tolerance=1e-4, StopTime=1e+06), Documentation(revisions="
        • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 0251cbabad..8293eab729 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -35,7 +35,7 @@ equation annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(StopTime=1e+06), + experiment(Tolerance=1e-4, StopTime=1e+06), Documentation(revisions="
          • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 8acc3d025e..cadf0eb4e9 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -78,7 +78,7 @@ equation {-120,110.4},{-110,110.4}}, color={0,127,255})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(StopTime=1e+06), + experiment(Tolerance=1e-4, StopTime=1e+06), Documentation(revisions="
            • From 5766402ebddd558f745653a23856320975ebbc0a Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Thu, 7 Sep 2023 17:30:20 -0700 Subject: [PATCH 10/48] Made editorial revision --- .../Tutorial/SimpleHouse/SimpleHouse.tex | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex b/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex index 8e143770c5..071515f8a9 100644 --- a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex +++ b/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex @@ -41,13 +41,13 @@ \section*{Introduction} The goal of this exercise is to become familiar with Modelica and the IBPSA library. Since the IBPSA library components are typically used by combining several components graphically, the use of equations falls outside of the scope of this exercise.\\ -For this exercise you will create a model of a simple house, consisting of a heating system, one building zone, and a ventilation model. The exercise starts from a template file that should not produce any errors. This file will be extended in several steps, adding complexity. In between each step the user should be able to simulate the model, i.e. no errors should be produced and simulation results may be compared.\\ +For this exercise you will create a model of a simple house, consisting of a heating system, one building zone, and a ventilation model. The exercise starts from a template file that should not produce any errors. This file will be extended in several steps, adding complexity. In between each step the user should be able to simulate the model, i.e., no errors should be produced and simulation results may be compared.\\ -Prerequisites are that you should have the latest version of OpenModelica installed, which can be downloaded from \href{https://openmodelica.org/}{this link}. The latest version from the \href{https://github.com/ibpsa/modelica-ibpsa}{IBPSA library} should be downloaded and opened in Dymola. To verify your installation, try to simulate \path{IBPSA.Fluid.Actuators.Dampers.Examples.Damper} by clicking \textit{Simulate} (\includegraphics[scale=0.35]{img/simulate.png}) in the bar at the top. Finally, create your own package (in which you can save your own models) and create a duplicate of \path{IBPSA.Fluid.Examples.WorkshopModelicaConference.SimpleHouseTemplate.mo} in your own package.\\ +Prerequisites are that you should have the latest version of OpenModelica installed, which can be downloaded from \href{https://openmodelica.org/}{this link}. The latest version from the \href{https://github.com/ibpsa/modelica-ibpsa}{IBPSA library} should be downloaded and opened in OMEdit. To verify your installation, try to simulate \path{IBPSA.Fluid.Actuators.Dampers.Examples.Damper} by clicking \textit{Simulate} (\includegraphics[scale=0.35]{img/simulate.png}) in the bar at the top. Finally, create your own package (in which you can save your own models) and create a duplicate of \path{IBPSA.Fluid.Examples.WorkshopModelicaConference.SimpleHouseTemplate} in your own package.\\ -In the following sections the simple house model is discussed in several steps. The graphical representation of the final model is given in Figure~\ref{fig:simpleHouse}. Each step first qualitatively explains the model part. Secondly, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. Thirdly, we provide high-level instructions of how to set up the model. If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, try out some things, make an educated guess, etc. Finally, we provide reference results that allow you to check if your implementation is correct. Depending on the parameter values that you choose, results may differ.\\ +In the following sections, the simple house model is discussed in several steps. The graphical representation of the final model is given in Figure~\ref{fig:simpleHouse}. First, each step qualitatively explains the model part. Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. Finally, we provide high-level instructions of how to set up the model. If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, try out some things, make an educated guess, etc. Finally, we provide reference results that allow you to check if your implementation is correct. Depending on the parameter values that you choose, results may differ.\\ -Save your models regularly such that you don't lose all your progress if OpenModelica would crash. +Save your models regularly to avoid losing your progress if the program were to crash. \begin{figure} \centering @@ -64,18 +64,18 @@ \section{Building wall model} The heat capacity value of a wall may be computed as $C=A\cdot d \cdot c_p \cdot \rho$. \paragraph{Required models} -In this first step only the Modelica Standard Library (MSL) model \path{Modelica.Thermal.HeatTransfer.Components.HeatCapacitor} is required. +In this first step, only the Modelica Standard Library (MSL) model \path{Modelica.Thermal.HeatTransfer.Components.HeatCapacitor} is required. \paragraph{Connection instructions} Connect the heat capacitor to the thermal resistor. \paragraph{Reference result} -If you correctly added the model of the heat capacitor, connected it to the resistor and added the parameter values for $C$\footnote{Double-click on a component to see a list of its parameters. Gray values indicated default values.}, then you should be able to simulate the model. To do this, press the \textit{Simulation Setup} and set the model \textit{Stop time} to 1e6 seconds. You can now simulate the model by pressing the \textit{Simulate} button. You can plot individual variables values by clicking on their name in the variable browser on the left. Now plot the wall capacitor temperature value $T$. It should look like Figure~\ref{fig:res1}. +If you correctly added the model of the heat capacitor, connected it to the resistor and added the parameter values for $C$\footnote{Double-click on a component to see a list of its parameters. Gray values indicate default values.}, then you should be able to simulate the model. To do this, press the \textit{Simulation Setup} and set the model \textit{Stop time} to 1e6 seconds. You can now simulate the model by pressing the \textit{Simulate} button. You can plot individual variables values by clicking on their name in the variable browser on the left. Now plot the wall capacitor temperature value $T$. It should look like Figure~\ref{fig:res1}. \begin{figure}[h] \centering \includegraphics[width=0.6\columnwidth]{img/result1.png} -\caption{Wall temperature as function of time.} +\caption{Wall temperature as function of time. (1 Ms is around 12 days.} \label{fig:res1} \end{figure} @@ -109,7 +109,7 @@ \section{Building window model} \newpage \section{Air model} \paragraph{Qualitative discussion} -To increase the model detail we now add an air model assuming the zone is 8~$m$ x 8~$m$ x 3~$m$ in size. The air will exchange heat with the wall. This may be modelled using a thermal resistance representing the convective heat resistance which is equal to $R_{conv}=\frac{1}{hA}$. $A$ represents the heat exchange surface area and $h$ represents the convective heat transfer coefficient and is equal to $h$ = 2~${W/(m^2\cdot K)}$. +To increase the model detail we now add an air model assuming the zone is 8~$m$ x 8~$m$ x 3~$m$ in size. The air will exchange heat with the wall. This may be modelled using a thermal resistance representing the convective heat resistance which is equal to $R_{conv}={1}/{(hA)}$, where $A$ is the heat exchange surface area and $h = 2~W/(m^2\cdot K)$ is the convective heat transfer coefficient. \paragraph{Required models} \begin{itemize} @@ -140,7 +140,7 @@ \section{Air model} \newpage \section{Heating model} \paragraph{Qualitative discussion} -The wall temperature (and therefore the room temperature) is quite low. In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60$^{\circ}C$ and 40$^{\circ}C$, respectively. The pump has a (nominal) mass flow rate of 0.1~$kg/s$. Since the heating system uses water as a heat carrier fluid, the media for the models in the heating circuit should be set to \textit{MediumWater}. +The wall temperature (and therefore the room temperature) is quite low. In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60$^{\circ}C$ and 40$^{\circ}C$, and a room air and radiative temperature of 20$^{\circ}C$. The pump has a (nominal) mass flow rate of 0.1~$kg/s$. Since the heating system uses water as a heat carrier fluid, the media for the models in the heating circuit should be set to \textit{MediumWater}. \paragraph{Required models} \begin{itemize} @@ -152,7 +152,7 @@ \section{Heating model} \end{itemize} \paragraph{Connection instructions} -The radiator contains one port for convective heat transfer and one for radiative heat transfer. Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, the media for the models should be set to \textit{MediumWater}. The \path{Boundary_pT} model needs to be used to set an absolute pressure somewhere in the system. Otherwise the absolute pressure in the system is undefined. Pressure difference modelling may be disregarded in the heating circuit since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. Set the heater input to 1, meaning that it will produce 1 time its nominal power. +The radiator contains one port for convective heat transfer and one for radiative heat transfer. Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, the media for the models should be set to \textit{MediumWater}. The \path{Boundary_pT} model needs to be used to set an absolute pressure somewhere in the system. Otherwise the absolute pressure in the system is undefined. Pressure difference modelling may be disregarded in the heating circuit since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. Set the heater input to 1, meaning that it will produce 1 times its nominal power. \paragraph{Reference result} The result of the air temperature is plotted in Figure~\ref{fig:res4}. The temperature rises very steeply since the wall is relatively well insulated ($k$ = 0.04~$W/(m\cdot K)$) and the heater is not disabled when it becomes too warm. @@ -198,7 +198,7 @@ \section{Heating controller model} \section{Ventilation model} \label{sec:ventilation} \paragraph{Qualitative discussion} -For this last exercise, we first increase the \textbf{window size} from 2~$m^2$ to \textbf{6~$m^2$}. We will add a ventilation model that allows to perform free cooling using outside air when solar irradiation heats up the room too much. The system consists of a fan, a damper, a controller with an air temperature set-point between 23$^{\circ}C$ and 25$^{\circ}C$, and a heat recovery unit with a constant effectivity of 85\%. The damper and fan have a nominal pressure drop/raise of 200~$Pa$. The heat recovery unit has a nominal pressure drop of 10~$Pa$ at both sides. The nominal mass flow rate of the ventilation system is 0.1~$kg/s$. +For this last exercise, we first increase the \textbf{window size} from 2~$m^2$ to \textbf{6~$m^2$}. We will add a ventilation model that allows to perform free cooling using outside air when solar irradiation heats up the room too much. The system consists of a fan, a damper, a controller with an air temperature set-point between 23$^{\circ}C$ and 25$^{\circ}C$, and a heat recovery unit with a constant effectiveness of 85\%. The damper and fan have a nominal pressure drop/raise of 200~$Pa$. The heat recovery unit has a nominal pressure drop of 10~$Pa$ at both sides. The nominal mass flow rate of the ventilation system is 0.1~$kg/s$. \paragraph{Required models} @@ -206,7 +206,7 @@ \section{Ventilation model} \label{sec:ventilation} \begin{itemize} \item \path{IBPSA.Fluid.HeatExchangers.ConstantEffectiveness} \item \path{IBPSA.Fluid.Movers.FlowControlled_dp} -\item \path{IBPSA.Fluid.Actuators.Dampers.VAV} +\item \path{IBPSA.Fluid.Actuators.Dampers.Exponential} \end{itemize} \paragraph{Connection instructions} @@ -227,4 +227,4 @@ \section{Ventilation model} \label{sec:ventilation} \label{fig:res7} \end{figure} -\end{document} \ No newline at end of file +\end{document} From 7665717961ee437d18ebc7f584c5392f583d7127 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 8 Sep 2023 17:02:17 +0200 Subject: [PATCH 11/48] Add exercise to the info section of the Modelica models. --- .../Tutorial/SimpleHouse/SimpleHouse1.mo | 49 +++- .../Tutorial/SimpleHouse/SimpleHouse2.mo | 41 +++- .../Tutorial/SimpleHouse/SimpleHouse3.mo | 43 +++- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 60 ++++- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 38 ++- .../Tutorial/SimpleHouse/SimpleHouse6.mo | 52 +++- .../Examples/Tutorial/SimpleHouse/package.mo | 30 ++- .../Tutorial/SimpleHouse/SimpleHouse.pdf | Bin 484688 -> 0 bytes .../Tutorial/SimpleHouse/SimpleHouse.tex | 230 ------------------ .../Tutorial/SimpleHouse}/airModel.png | Bin .../SimpleHouse}/heatingControllerModel.png | Bin .../Tutorial/SimpleHouse}/result1.png | Bin .../Tutorial/SimpleHouse}/result2.png | Bin .../Tutorial/SimpleHouse}/result3.png | Bin .../Tutorial/SimpleHouse}/result4.png | Bin .../Tutorial/SimpleHouse}/result5.png | Bin .../Tutorial/SimpleHouse}/result6.png | Bin .../Tutorial/SimpleHouse}/result7.png | Bin .../Tutorial/SimpleHouse}/simpleHouse.png | Bin .../Tutorial/SimpleHouse}/simulate.png | Bin 20 files changed, 291 insertions(+), 252 deletions(-) delete mode 100644 IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.pdf delete mode 100644 IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/airModel.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/heatingControllerModel.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/result1.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/result2.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/result3.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/result4.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/result5.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/result6.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/result7.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/simpleHouse.png (100%) rename IBPSA/Resources/{Documentation/Fluid/Examples/Tutorial/SimpleHouse/img => Images/Fluid/Examples/Tutorial/SimpleHouse}/simulate.png (100%) diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index c86b353ba5..0eab7688a4 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -23,10 +23,51 @@ First implementation.
            ", info="

            -This part of the system model implements the building wall by adding a -thermal capacity to the thermal resistance that was already modeled in - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate. +A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. +The house consists of a wall represented by a single heat capacitor and a thermal resistor. +The thermal resistor and boundary temperature are already included in the template. +The wall has a surface area of Awall=100 m2, +a thickness of dwall=25 cm, +a thermal conductivity of kwall=0.04 W/(m K), +a density of ρwall=2000 kg/m3, +and a specific heat capacity of cp,wall= 1000 J/(kg K) +

            +

            +These parameters are already declared in the equation section of +SimpleHouseTemplate. +You can use this way of declaring parameters in the remainder of this exercise, but this is not required. +

            +

            +The conductive thermal resistance value of a wall may be computed as R=d/(A*k). +The heat capacity value of a wall may be computed as C=A*d*c_p*ρ +

            +

            Required models

            + +

            Connection instructions

            +

            +Connect the heat capacitor to the thermal resistor. +

            +

            Reference result

            +

            +If you correctly added the model of the heat capacitor, +connected it to the resistor and added the parameter values for C, +then you should be able to simulate the model. +To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. +You can now simulate the model by pressing the Simulate button. +

            +

            +You can plot individual variables values by clicking on their name in the variable browser on the left. +Now plot the wall capacitor temperature value T. +It should look like the figure below (1 Ms is around 12 days). +

            +

            +\"Wall

            "), __Dymola_Commands(file= diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index 88569d3039..e4ca0620c2 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -34,9 +34,44 @@ First implementation.
          ", info="

          -This part of the system model adds a window to the building wall. -It is assumed that the total injected heat through the window equals -the window surface area multiplied by the direct horizontal solar irradiance. +The window has a surface area of 2 m2. +In this simple model we will therefore assume that +two times the outdoor solar irradiance is injected as heat onto the inside of the wall. +

          +

          Required models

          + +

          Connection instructions

          +

          +To be able to use the value of the outdoor solar irradiance +you will need to access the weather data reader. +To do this, make a connection to the weaBus. +In the dialog box select and here type HDirNor, +which is the direct solar irradiance on a surface of 1 m2, +perpendicular to the sun rays. +Set the gain factor k to 2, +in order to get the solar irradiance through the window of 2 m2. +

          +

          +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

          +

          Reference result

          +

          +The result with and without the window model is plotted in the figure below. +

          +

          +\"Wall

          "), __Dymola_Commands(file= diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 2b8aae7c24..940413a0ac 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -38,7 +38,48 @@ First implementation.
        ", info="

        -This part of the model adds an air model which represents the room in the building. +To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. +The air will exchange heat with the wall. +This may be modelled using a thermal resistance representing +the convective heat resistance which is equal to Rconv=1/(h*A), +where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. +

        +

        Required models

        + +

        Connection instructions

        +

        +The MixingVolume Medium parameter contains information about +the type of fluid and its properties that should be modelled by the MixingVolume. +Set its value to MediumAir, which is declared in the template, +by typing redeclare package Medium = MediumAir. +For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. +You will have to change this value once you add a ventilation system to the model (see + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse6). +Finally, set the energyDynamics of the MixingVolume, +which can be found in the Dynamics tab of the model parameter window, to FixedInitial. +

        +

        +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

        +

        Reference result

        +

        +The result with and without the air model is plotted in the figure below. +

        +

        +\"Wall

        "), __Dymola_Commands(file= diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 56af4bff50..8019f23c6b 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,4 +1,4 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; +within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; model SimpleHouse4 "Heating model" extends SimpleHouse3; @@ -70,9 +70,61 @@ First implementation.
      ", info="

      -This part of the model adds heating circuit consisting of a boiler, a radiator, -and an on/off circulation pump with a constant mass flow rate. -No controller is implemented yet, i.e. the pump and heater are always on. +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60°C<\\i> +and 40°C<\\i>, and a room air and radiative temperature of 20°C<\\i>. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater<\\i>. +

      +

      Required models

      + +

      Connection instructions

      +

      +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

      +

      +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

      +

      +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

      +

      Reference result

      +

      +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

      +

      +\"Air

      "), __Dymola_Commands(file= diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 8293eab729..92040ad226 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,4 +1,4 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; +within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; model SimpleHouse5 "Heating controller model" extends SimpleHouse4(pump(inputType=IBPSA.Fluid.Types.InputType.Stages, massFlowRates=mWat_flow_nominal*{1}), @@ -45,8 +45,40 @@ First implementation.
    ", info="

    -This part of the model adds a hysteresis controller for the heating circuit -that uses the room temperature as an input. +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

    +

    Required models

    + +

    Connection instructions

    +

    +The heater modulation level should be set to one when the heater is on and to zero otherwise. +

    +

    Reference result

    +

    +The figure below shows the air temperature when the controller is added. +

    +

    +\"Air

    "), __Dymola_Commands(file= diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index cadf0eb4e9..b5e1f368d0 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,4 +1,4 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; +within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; model SimpleHouse6 "Free cooling model" extends SimpleHouse5(zone(nPorts=2), mAir_flow_nominal=0.1, @@ -88,9 +88,53 @@ First implementation.
", info="

-This part of the model adds a ventilation system consisting of a fan, a damper, -a heat recovery unit, and a hysteresis controller, -that allows to perform free cooling using outside air. +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

+We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

+

Required models

+ +

Connection instructions

+

+Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +

+

Reference result

+

+The figures below show the results. +

+

+\"Air +

+

+\"Ventilation

"), __Dymola_Commands(file= diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo index 24ded141ee..fb17f14a8e 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo @@ -9,11 +9,19 @@ for a simple house with a heating system, ventilation, and weather boundary cond It serves as a demonstration case of how the IBPSA library can be used.

-A detailed description of how the system model can be built up can be found in - -IBPSA.Resources.Documentation.Fluid.Examples.Tutorial.SimpleHouse. +The goal of this exercise is to become familiar with Modelica and the IBPSA library. +Since the IBPSA library components are typically used by combining several components graphically, +the use of equations falls outside of the scope of this exercise.

+For this exercise you will create a model of a simple house, +consisting of a heating system, one building zone, and a ventilation model. +The exercise starts from a template file that should not produce any errors. +This file will be extended in several steps, adding complexity. +In between each step the user should be able to simulate the model, +i.e., no errors should be produced and simulation results may be compared. +<\\p> +

The model has been created in the following stages:

    @@ -59,5 +67,21 @@ adds a ventilation system consisting of a fan, a damper, a heat recovery unit, and a hysteresis controller, that allows to perform free cooling using outside air.
+

+For each stage, firstly the model part is qualitatively explained. +Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. +Finally, we provide high-level instructions of how to set up the model. +If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, +try out some things, make an educated guess, etc. +Finally, we provide reference results that allow you to check if your implementation is correct. +Depending on the parameter values that you choose, results may differ. +<\\p> +

+The graphical representation of the final model is given below. +<\\p> +

+\"Graphical +

")); end SimpleHouse; diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.pdf b/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.pdf deleted file mode 100644 index 03cc0d9e2b7015ade64127ed14ada47b8b33cab2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 484688 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

%FcWY@O_Vo{|AAJbLeT>nyRr1MhSz!9} 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 diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex b/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex deleted file mode 100644 index 071515f8a9..0000000000 --- a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse.tex +++ /dev/null @@ -1,230 +0,0 @@ -\documentclass[10pt,a4paper]{article} -\usepackage[utf8]{inputenc} -\usepackage{amsmath} -\usepackage{amsfonts} -\usepackage{amssymb} -\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry} -\usepackage{url} -\usepackage{graphicx} -\usepackage[per-mode=symbol]{siunitx} -% Package for hyperlink, without ugly box around and nice blue color for text -\usepackage{hyperref} -\usepackage{xcolor} -\hypersetup{ - colorlinks, - linkcolor={red!50!black}, - citecolor={blue!50!black}, - urlcolor={blue!80!black} -} -\setlength\parindent{0pt} - -\usepackage[ - type={CC}, - modifier={by-sa}, - version={4.0}, -]{doclicense} - - -\usepackage{color,soul} - - -\begin{document} -\title{Exercise: SimpleHouse} -\author{Filip Jorissen, Damien Picard\\ \thanks{Review} Jelger Jansen, Iago Cupeiro Figueroa, Lucas Verleyen} -\date{Workshop Modelica Conference, October 9, 2023} -\maketitle - - -\doclicenseThis - - -\section*{Introduction} -The goal of this exercise is to become familiar with Modelica and the IBPSA library. Since the IBPSA library components are typically used by combining several components graphically, the use of equations falls outside of the scope of this exercise.\\ - -For this exercise you will create a model of a simple house, consisting of a heating system, one building zone, and a ventilation model. The exercise starts from a template file that should not produce any errors. This file will be extended in several steps, adding complexity. In between each step the user should be able to simulate the model, i.e., no errors should be produced and simulation results may be compared.\\ - -Prerequisites are that you should have the latest version of OpenModelica installed, which can be downloaded from \href{https://openmodelica.org/}{this link}. The latest version from the \href{https://github.com/ibpsa/modelica-ibpsa}{IBPSA library} should be downloaded and opened in OMEdit. To verify your installation, try to simulate \path{IBPSA.Fluid.Actuators.Dampers.Examples.Damper} by clicking \textit{Simulate} (\includegraphics[scale=0.35]{img/simulate.png}) in the bar at the top. Finally, create your own package (in which you can save your own models) and create a duplicate of \path{IBPSA.Fluid.Examples.WorkshopModelicaConference.SimpleHouseTemplate} in your own package.\\ - -In the following sections, the simple house model is discussed in several steps. The graphical representation of the final model is given in Figure~\ref{fig:simpleHouse}. First, each step qualitatively explains the model part. Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. Finally, we provide high-level instructions of how to set up the model. If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, try out some things, make an educated guess, etc. Finally, we provide reference results that allow you to check if your implementation is correct. Depending on the parameter values that you choose, results may differ.\\ - -Save your models regularly to avoid losing your progress if the program were to crash. - -\begin{figure} -\centering -\includegraphics[width=0.8\columnwidth]{img/simpleHouse.png} -\caption{Graphical representation of the final simple house model.} -\label{fig:simpleHouse} -\end{figure} - - -\newpage -\section{Building wall model} -\paragraph{Qualitative discussion} -A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. The house consists of a wall represented by a single heat capacitor and a thermal resistor. The thermal resistor and boundary temperature are already included in the template. The wall has a surface area of $A_{wall}$ = 100 $m^2$, a thickness of $d_{wall}$ = 25 $cm$, a thermal conductivity of $k_{wall}$ = 0.04 $W/(m \cdot K)$, a density of $\rho_{wall}$ = 2000 $kg/m^3$, and a specific heat capacity of $c_{p,wall}$ = 1000 $J/(kg \cdot K)$ \footnote{These parameters are already declared in the equation section of \path{SimpleHouseTemplate.mo}. You can use this way of declaring parameters in the remainder of this exercise, but this is not required.}. The conductive thermal resistance value of a wall may be computed as $R=d/(A\cdot k)$. -The heat capacity value of a wall may be computed as $C=A\cdot d \cdot c_p \cdot \rho$. - -\paragraph{Required models} -In this first step, only the Modelica Standard Library (MSL) model \path{Modelica.Thermal.HeatTransfer.Components.HeatCapacitor} is required. - -\paragraph{Connection instructions} -Connect the heat capacitor to the thermal resistor. - -\paragraph{Reference result} -If you correctly added the model of the heat capacitor, connected it to the resistor and added the parameter values for $C$\footnote{Double-click on a component to see a list of its parameters. Gray values indicate default values.}, then you should be able to simulate the model. To do this, press the \textit{Simulation Setup} and set the model \textit{Stop time} to 1e6 seconds. You can now simulate the model by pressing the \textit{Simulate} button. You can plot individual variables values by clicking on their name in the variable browser on the left. Now plot the wall capacitor temperature value $T$. It should look like Figure~\ref{fig:res1}. - -\begin{figure}[h] -\centering -\includegraphics[width=0.6\columnwidth]{img/result1.png} -\caption{Wall temperature as function of time. (1 Ms is around 12 days.} -\label{fig:res1} -\end{figure} - - - -\newpage -\section{Building window model} -\paragraph{Qualitative discussion} -The window has a surface area of 2~$m^2$. In this simple model we will therefore assume that two times the outdoor solar irradiance is injected as heat onto the inside of the wall. - -\paragraph{Required models} -\begin{itemize} -\item \path{Modelica.Blocks.Math.Gain} -\item \path{Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow} -\end{itemize} - -\paragraph{Connection instructions} -To be able to use the value of the outdoor solar irradiance you will need to access the weather data reader. To do this, make a connection to the \path{weaBus} block. In the dialog box select \textit{\textless New Variable\textgreater} and here type \textit{HDirNor}, which is the direct solar irradiance on a surface of 1~$m^2$, perpendicular to the sun rays. Set the gain factor \textit{k} to 2, in order to get the solar irradiance through the window of 2~$m^2$. Make a connection with the \path{PrescribedHeatFlow} as well. This block makes the connection between the heat flow from the gain, represented as a real value, and a heat port that is compatible with the connectors of the thermal capacitance and resistance. - -\paragraph{Reference result} -The result with and without the window model is plotted in Figure~\ref{fig:res2}. -\begin{figure}[h] -\centering -\includegraphics[width=0.6\columnwidth]{img/result2.png} -\caption{Wall temperature as function of time, with (blue) and without (red) window.} -\label{fig:res2} -\end{figure} - - - -\newpage -\section{Air model} -\paragraph{Qualitative discussion} -To increase the model detail we now add an air model assuming the zone is 8~$m$ x 8~$m$ x 3~$m$ in size. The air will exchange heat with the wall. This may be modelled using a thermal resistance representing the convective heat resistance which is equal to $R_{conv}={1}/{(hA)}$, where $A$ is the heat exchange surface area and $h = 2~W/(m^2\cdot K)$ is the convective heat transfer coefficient. - -\paragraph{Required models} -\begin{itemize} -\item \path{IBPSA.Fluid.MixingVolumes.MixingVolume} -\item \path{Modelica.Thermal.HeatTransfer.Components.ThermalResistor} -\end{itemize} - -\paragraph{Connection instructions} -The \path{MixingVolume} \textit{Medium} parameter contains information about the type of fluid and its properties that should be modelled by the \path{MixingVolume}. Set its value to \textit{MediumAir}, which is declared in the template, by typing \textit{redeclare package Medium = MediumAir}. For the nominal mass flow rate you may assume a value of 1~$kg/m^3$ for now. You will have to change this value once you add a ventilation system to the model (part \ref{sec:ventilation}). Finally, set the \textit{energyDynamics} of the \path{MixingVolume}, which can be found in the \textit{Dynamics} tab of the model parameter window, to \textit{FixedInitial}. Your model should now look like Figure~\ref{fig:airModel}. -\begin{figure}[h] -\centering -\includegraphics[width=0.45\columnwidth]{img/airModel.png} -\caption{Simple house model with a wall, a window, and an air model.} -\label{fig:airModel} -\end{figure} - -\paragraph{Reference result} -The result with and without the air model is plotted in Figure~\ref{fig:res3}. -\begin{figure}[h] -\centering -\includegraphics[width=0.6\columnwidth]{img/result3.png} -\caption{Wall temperature as function of time, with (green) and without (blue) air model.} -\label{fig:res3} -\end{figure} - - - -\newpage -\section{Heating model} -\paragraph{Qualitative discussion} -The wall temperature (and therefore the room temperature) is quite low. In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60$^{\circ}C$ and 40$^{\circ}C$, and a room air and radiative temperature of 20$^{\circ}C$. The pump has a (nominal) mass flow rate of 0.1~$kg/s$. Since the heating system uses water as a heat carrier fluid, the media for the models in the heating circuit should be set to \textit{MediumWater}. - -\paragraph{Required models} -\begin{itemize} -\item \path{IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2} -\item \path{IBPSA.Fluid.HeatExchangers.HeaterCooler_u} -\item \path{IBPSA.Fluid.Movers.FlowControlled_m_flow} -\item \path{IBPSA.Fluid.Sources.Boundary_pT} -\item \path{Modelica.Blocks.Sources.Constant} -\end{itemize} - -\paragraph{Connection instructions} -The radiator contains one port for convective heat transfer and one for radiative heat transfer. Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, the media for the models should be set to \textit{MediumWater}. The \path{Boundary_pT} model needs to be used to set an absolute pressure somewhere in the system. Otherwise the absolute pressure in the system is undefined. Pressure difference modelling may be disregarded in the heating circuit since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. Set the heater input to 1, meaning that it will produce 1 times its nominal power. - -\paragraph{Reference result} -The result of the air temperature is plotted in Figure~\ref{fig:res4}. The temperature rises very steeply since the wall is relatively well insulated ($k$ = 0.04~$W/(m\cdot K)$) and the heater is not disabled when it becomes too warm. -\begin{figure}[h] -\centering -\includegraphics[width=0.6\columnwidth]{img/result4.png} -\caption{Air temperature as function of time.} -\label{fig:res4} -\end{figure} - - -\newpage -\section{Heating controller model} -\paragraph{Qualitative discussion} -Since the zone becomes too warm, a controller is required that disables the heater when a set-point is reached. We will implement a hysteresis controller with a set-point of $295.15 \pm 1 K$ (21-23~$^{\circ}C$). A temperature sensor will measure the zone air temperature. - -\paragraph{Required models} -\begin{itemize} -\item \path{Modelica.Blocks.Logical.Hysteresis} -\item \path{Modelica.Blocks.Logical.Not} -\item \path{Modelica.Blocks.Math.BooleanToReal} -\item \path{Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor} -\end{itemize} - -\paragraph{Connection instructions} -The heater modulation level should be set to one when the heater is on and to zero otherwise. Your model should now look like Figure~\ref{fig:heatingControllerModel}. -\begin{figure}[h] -\centering -\includegraphics[scale=0.4]{img/heatingControllerModel.png} -\caption{Simple house model with heating controller model.} -\label{fig:heatingControllerModel} -\end{figure} - -\paragraph{Reference result} -Figure~\ref{fig:res5} shows the air temperature when the controller is added. -\begin{figure}[h] -\centering -\includegraphics[width=0.6\columnwidth]{img/result5.png} -\caption{Air temperature as function of time with hysteresis controller.} -\label{fig:res5} -\end{figure} - - -\section{Ventilation model} \label{sec:ventilation} -\paragraph{Qualitative discussion} -For this last exercise, we first increase the \textbf{window size} from 2~$m^2$ to \textbf{6~$m^2$}. We will add a ventilation model that allows to perform free cooling using outside air when solar irradiation heats up the room too much. The system consists of a fan, a damper, a controller with an air temperature set-point between 23$^{\circ}C$ and 25$^{\circ}C$, and a heat recovery unit with a constant effectiveness of 85\%. The damper and fan have a nominal pressure drop/raise of 200~$Pa$. The heat recovery unit has a nominal pressure drop of 10~$Pa$ at both sides. The nominal mass flow rate of the ventilation system is 0.1~$kg/s$. - - -\paragraph{Required models} -Use some of the previously used models and in addition to this: -\begin{itemize} -\item \path{IBPSA.Fluid.HeatExchangers.ConstantEffectiveness} -\item \path{IBPSA.Fluid.Movers.FlowControlled_dp} -\item \path{IBPSA.Fluid.Actuators.Dampers.Exponential} -\end{itemize} - -\paragraph{Connection instructions} -Connect the components such that they exchange mass (and therefore also energy) with the \path{MixingVolume} representing the zone air. Add a \path{boundary_pT} to draw air from the environment. Enable its temperature input and connect it to the \textit{TDryBul} variable in the weather data reader. Also reconsider the nominal mass flow rate parameter value in the \path{MixingVolume} given the flow rate information of the ventilation system. The final model will look like Figure~\ref{fig:simpleHouse}. - -\paragraph{Reference result} -Figure~\ref{fig:res6} shows the result. -\begin{figure}[h] -\centering -\includegraphics[width=0.6\columnwidth]{img/result6.png} -\caption{Air temperature as function of time.} -\label{fig:res6} -\end{figure} -\begin{figure}[h] - \centering - \includegraphics[width=0.6\columnwidth]{img/result7.png} - \caption{Ventilation control signal as function of time.} - \label{fig:res7} -\end{figure} - -\end{document} diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/airModel.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/airModel.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/airModel.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/airModel.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/heatingControllerModel.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/heatingControllerModel.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/heatingControllerModel.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/heatingControllerModel.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result1.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result1.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result1.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result1.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result2.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result2.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result2.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result2.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result3.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result3.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result3.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result3.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result4.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result4.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result4.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result4.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result5.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result5.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result5.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result5.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result6.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result6.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result6.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result6.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result7.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result7.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/result7.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result7.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/simpleHouse.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simpleHouse.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/simpleHouse.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simpleHouse.png diff --git a/IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/simulate.png b/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simulate.png similarity index 100% rename from IBPSA/Resources/Documentation/Fluid/Examples/Tutorial/SimpleHouse/img/simulate.png rename to IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simulate.png From d2a82e07087eefbf741c0751c41669a16acd7fae Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 8 Sep 2023 10:54:46 -0700 Subject: [PATCH 12/48] Corrected typo --- IBPSA/Fluid/Examples/SimpleHouse.mo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IBPSA/Fluid/Examples/SimpleHouse.mo b/IBPSA/Fluid/Examples/SimpleHouse.mo index 13c57eb561..b4d8fd3ce0 100644 --- a/IBPSA/Fluid/Examples/SimpleHouse.mo +++ b/IBPSA/Fluid/Examples/SimpleHouse.mo @@ -340,7 +340,7 @@ First implementation.

This model contains a simple model of a house with a heating system, ventilation and weather boundary conditions. -It servers as a demonstration case of how the IBPSA library can be used. +It serves as a demonstration case of how the IBPSA library can be used.

"), __Dymola_Commands(file= From 5c82475c413e9e27775181d748bc38d4b6269be3 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 8 Sep 2023 10:55:47 -0700 Subject: [PATCH 13/48] Added full name (so that renaming works robustly) --- IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 0eab7688a4..cecf87b3f6 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -34,7 +34,8 @@ and a specific heat capacity of cp,wall= 1000 J/(kg K)

These parameters are already declared in the equation section of -SimpleHouseTemplate. + +IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate.SimpleHouseTemplate. You can use this way of declaring parameters in the remainder of this exercise, but this is not required.

From 7f93094869a261e06adde6d6abe6ab4302758340 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 8 Sep 2023 11:03:14 -0700 Subject: [PATCH 14/48] Increased tolerances to 1E-6, added test case and results --- .../Tutorial/SimpleHouse/SimpleHouse1.mo | 2 +- .../Tutorial/SimpleHouse/SimpleHouse2.mo | 4 +- .../Tutorial/SimpleHouse/SimpleHouse3.mo | 4 +- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 8 +- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 2 +- .../Tutorial/SimpleHouse/SimpleHouse6.mo | 2 +- .../SimpleHouse/SimpleHouseTemplate.mo | 207 +++++++++--------- ...ples_Tutorial_SimpleHouse_SimpleHouse1.txt | 10 + ...ples_Tutorial_SimpleHouse_SimpleHouse2.txt | 10 + ...ples_Tutorial_SimpleHouse_SimpleHouse3.txt | 10 + ...ples_Tutorial_SimpleHouse_SimpleHouse4.txt | 16 ++ ...ples_Tutorial_SimpleHouse_SimpleHouse5.txt | 16 ++ ...ples_Tutorial_SimpleHouse_SimpleHouse6.txt | 19 ++ ...torial_SimpleHouse_SimpleHouseTemplate.txt | 9 + .../Tutorial/SimpleHouse/SimpleHouse1.mos | 2 +- .../Tutorial/SimpleHouse/SimpleHouse2.mos | 2 +- .../Tutorial/SimpleHouse/SimpleHouse3.mos | 2 +- .../Tutorial/SimpleHouse/SimpleHouse4.mos | 2 +- .../Tutorial/SimpleHouse/SimpleHouse5.mos | 2 +- .../Tutorial/SimpleHouse/SimpleHouse6.mos | 2 +- .../SimpleHouse/SimpleHouseTemplate.mos | 2 + 21 files changed, 212 insertions(+), 121 deletions(-) create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt create mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index cecf87b3f6..99f78168ae 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -13,7 +13,7 @@ equation {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(Tolerance=1e-4, StopTime=1e+06), + experiment(Tolerance=1e-6, StopTime=1e+06), Documentation(revisions="

  • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index e4ca0620c2..d54653b6bd 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -24,7 +24,7 @@ equation horizontalAlignment=TextAlignment.Right)); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(Tolerance=1e-4, StopTime=1e+06), + experiment(Tolerance=1e-6, StopTime=1e+06), Documentation(revisions="
    • @@ -63,7 +63,7 @@ in order to get the solar irradiance through the window of 2 m2.

      Make a connection with the PrescribedHeatFlow as well. This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +and a heat port that is compatible with the connectors of the thermal capacitance and resistance.

      Reference result

      diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 940413a0ac..2dbd794d93 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -28,7 +28,7 @@ equation annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(Tolerance=1e-4, StopTime=1e+06), + experiment(Tolerance=1e-6, StopTime=1e+06), Documentation(revisions="

      • @@ -71,7 +71,7 @@ which can be found in the Dynamics tab of the model parameter window, to

        Make a connection with the PrescribedHeatFlow as well. This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +and a heat port that is compatible with the connectors of the thermal capacitance and resistance.

        Reference result

        diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 8019f23c6b..1cfbcbd815 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -60,7 +60,7 @@ equation annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(Tolerance=1e-4, StopTime=1e+06), + experiment(Tolerance=1e-6, StopTime=1e+06), Documentation(revisions="

        • @@ -70,10 +70,10 @@ First implementation.
        ", info="

        -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60°C<\\i> -and 40°C<\\i>, and a room air and radiative temperature of 20°C<\\i>. +and 40°C<\\i>, and a room air and radiative temperature of 20°C<\\i>. The pump has a (nominal) mass flow rate of 0.1 kg/s. Since the heating system uses water as a heat carrier fluid, the media for the models in the heating circuit should be set to MediumWater<\\i>. diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 92040ad226..0cf0e0e393 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -35,7 +35,7 @@ equation annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(Tolerance=1e-4, StopTime=1e+06), + experiment(Tolerance=1e-6, StopTime=1e+06), Documentation(revisions="

        • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index b5e1f368d0..30caf7c8a2 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -78,7 +78,7 @@ equation {-120,110.4},{-110,110.4}}, color={0,127,255})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), - experiment(Tolerance=1e-4, StopTime=1e+06), + experiment(Tolerance=1e-6, StopTime=1e+06), Documentation(revisions="
          • diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo index 882e96bb60..646e050e67 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo +++ b/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo @@ -1,104 +1,103 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; -model SimpleHouseTemplate - "Template file for simple house example" - extends Modelica.Icons.Example; - - package MediumAir = IBPSA.Media.Air "Medium model for air"; - package MediumWater = IBPSA.Media.Water "Medium model for water"; - - parameter Modelica.Units.SI.Area A_wall = 100 "Wall area"; - parameter Modelica.Units.SI.Length d_wall = 0.25 "Wall thickness"; - parameter Modelica.Units.SI.ThermalConductivity k_wall = 0.04 "Wall thermal conductivity"; - parameter Modelica.Units.SI.Density rho_wall = 2000 "Wall density"; - parameter Modelica.Units.SI.SpecificHeatCapacity cp_wall = 1000 "Wall specific heat capacity"; - - IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= - ModelicaServices.ExternalReferences.loadResource( - "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) - "Weather data reader" - annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); - IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" - annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature Tout - "Exterior temperature boundary condition" - annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); - - Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes( - R=d_wall/A_wall/k_wall) - "Thermal resistor for wall: 25 cm of rockwool" - annotation (Placement(transformation(extent={{80,-10},{100,10}}))); -equation - connect(weaDat.weaBus, weaBus) annotation (Line( - points={{-180,-10},{-150,-10}}, - color={255,204,51}, - thickness=0.5)); - connect(Tout.T, weaBus.TDryBul) - annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); - connect(Tout.port,wallRes. port_a) - annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}}), graphics={ - Rectangle( - extent={{-220,40},{20,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,-60},{180,-200}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,180},{180,60}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{40,40},{180,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Text( - extent={{98,20},{32,38}}, - lineColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Wall"), - Text( - extent={{-148,-86},{-214,-68}}, - lineColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Heating"), - Text( - extent={{-118,18},{-214,40}}, - lineColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Weather inputs"), - Text( - extent={{-76,158},{-214,180}}, - lineColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Cooling and ventilation")}), - experiment(StopTime=1e+06), - Documentation(revisions=" -
              -
            • -September 4, 2023, by Jelger Jansen:
              -Replace IDEAS by IBPSA models. -
            • -
            • -October 11, 2016, by Filip Jorissen:
              -First implementation. -
            • -
            -", info=" -

            -This model is used as the starting point for the SimpleHouse tutorial. -It was copied from the Modelica crash course organised by KU Leuven -(https://github.com/open-ideas/__CrashCourse__). -

            -")); -end SimpleHouseTemplate; +within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; +model SimpleHouseTemplate + "Template file for simple house example" + extends Modelica.Icons.Example; + package MediumAir = IBPSA.Media.Air "Medium model for air"; + package MediumWater = IBPSA.Media.Water "Medium model for water"; + parameter Modelica.Units.SI.Area A_wall = 100 "Wall area"; + parameter Modelica.Units.SI.Length d_wall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity k_wall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rho_wall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cp_wall = 1000 "Wall specific heat capacity"; + IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + "Weather data reader" + annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); + IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature Tout + "Exterior temperature boundary condition" + annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes( + R=d_wall/A_wall/k_wall) + "Thermal resistor for wall: 25 cm of rockwool" + annotation (Placement(transformation(extent={{80,-10},{100,10}}))); +equation + connect(weaDat.weaBus, weaBus) annotation (Line( + points={{-180,-10},{-150,-10}}, + color={255,204,51}, + thickness=0.5)); + connect(Tout.T, weaBus.TDryBul) + annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); + connect(Tout.port,wallRes. port_a) + annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}}), graphics={ + Rectangle( + extent={{-220,40},{20,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,-60},{180,-200}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,180},{180,60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{40,40},{180,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Text( + extent={{98,20},{32,38}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Wall"), + Text( + extent={{-148,-86},{-214,-68}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Heating"), + Text( + extent={{-118,18},{-214,40}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Weather inputs"), + Text( + extent={{-76,158},{-214,180}}, + lineColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Cooling and ventilation")}), + experiment(Tolerance=1E-6, StopTime=1e+06), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" + "Simulate and plot"), + Documentation(revisions=" +
              +
            • +September 4, 2023, by Jelger Jansen:
              +Replace IDEAS by IBPSA models. +
            • +
            • +October 11, 2016, by Filip Jorissen:
              +First implementation. +
            • +
            +", info=" +

            +This model is used as the starting point for the SimpleHouse tutorial. +It was copied from the Modelica crash course organised by KU Leuven +(https://github.com/open-ideas/__CrashCourse__). +

            +")); +end SimpleHouseTemplate; diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt new file mode 100644 index 0000000000..f7f50b5866 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt @@ -0,0 +1,10 @@ +last-generated=2023-09-08 +statistics-simulation= +{ + "linear": " ", + "nonlinear": "1", + "number of continuous time states": "1", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +walCap.T=[2.931499938964844e+02, 2.930488891601562e+02, 2.929534912109375e+02, 2.928625793457031e+02, 2.927890625e+02, 2.927221069335938e+02, 2.926539916992188e+02, 2.925841979980469e+02, 2.925122985839844e+02, 2.924403991699219e+02, 2.923712768554688e+02, 2.923157653808594e+02, 2.9226025390625e+02, 2.922047119140625e+02, 2.921505126953125e+02, 2.920964660644531e+02, 2.920424194335938e+02, 2.919769897460938e+02, 2.919044799804688e+02, 2.918319702148438e+02, 2.917594604492188e+02, 2.916893310546875e+02, 2.916217041015625e+02, 2.915540466308594e+02, 2.914863586425781e+02, 2.914178771972656e+02, 2.91349365234375e+02, 2.912808837890625e+02, 2.912074890136719e+02, 2.911309814453125e+02, 2.91054443359375e+02, 2.909779357910156e+02, 2.909013977050781e+02, 2.908248596191406e+02, 2.907483520507812e+02, 2.906789855957031e+02, 2.906123962402344e+02, 2.905458068847656e+02, 2.904791870117188e+02, 2.9041259765625e+02, 2.903459777832031e+02, 2.902665405273438e+02, 2.901768493652344e+02, 2.90087158203125e+02, 2.899946594238281e+02, 2.898983154296875e+02, 2.89802001953125e+02, 2.89703369140625e+02, 2.895991516113281e+02, 2.894949340820312e+02, 2.893912353515625e+02, 2.892901611328125e+02, 2.891891174316406e+02, 2.890880432128906e+02, 2.889869689941406e+02, 2.888859252929688e+02, 2.887772521972656e+02, 2.8866162109375e+02, 2.885459899902344e+02, 2.884303283691406e+02, 2.88314697265625e+02, 2.881990661621094e+02, 2.880933837890625e+02, 2.87989013671875e+02, 2.878941650390625e+02, 2.878175659179688e+02, 2.877409362792969e+02, 2.876662292480469e+02, 2.875919799804688e+02, 2.875189208984375e+02, 2.874469909667969e+02, 2.873750305175781e+02, 2.87322509765625e+02, 2.872810363769531e+02, 2.872395629882812e+02, 2.8719775390625e+02, 2.871559143066406e+02, 2.8711181640625e+02, 2.87065673828125e+02, 2.8701953125e+02, 2.86973388671875e+02, 2.8692724609375e+02, 2.868709716796875e+02, 2.8681298828125e+02, 2.867549743652344e+02, 2.866969604492188e+02, 2.86641357421875e+02, 2.865965576171875e+02, 2.865517272949219e+02, 2.865069274902344e+02, 2.864621276855469e+02, 2.864214782714844e+02, 2.863848266601562e+02, 2.863481750488281e+02, 2.863114929199219e+02, 2.862760925292969e+02, 2.862434387207031e+02, 2.862107849121094e+02, 2.861781311035156e+02, 2.861456604003906e+02, 2.861146240234375e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt new file mode 100644 index 0000000000..8f376300c9 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt @@ -0,0 +1,10 @@ +last-generated=2023-09-08 +statistics-simulation= +{ + "linear": " ", + "nonlinear": "1", + "number of continuous time states": "1", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +walCap.T=[2.931499938964844e+02, 2.930488891601562e+02, 2.92951171875e+02, 2.929077758789062e+02, 2.930664672851562e+02, 2.930569763183594e+02, 2.929950561523438e+02, 2.929273986816406e+02, 2.9286083984375e+02, 2.927947387695312e+02, 2.927286376953125e+02, 2.926658325195312e+02, 2.926102905273438e+02, 2.925547485351562e+02, 2.924992065429688e+02, 2.924436645507812e+02, 2.923881225585938e+02, 2.923204345703125e+02, 2.922474060058594e+02, 2.921743774414062e+02, 2.921013488769531e+02, 2.920283203125e+02, 2.919590759277344e+02, 2.918905639648438e+02, 2.918220825195312e+02, 2.917535705566406e+02, 2.916881408691406e+02, 2.9162451171875e+02, 2.915609130859375e+02, 2.91497314453125e+02, 2.914298400878906e+02, 2.913567810058594e+02, 2.9128369140625e+02, 2.912106323242188e+02, 2.911360778808594e+02, 2.910520324707031e+02, 2.909473266601562e+02, 2.908467712402344e+02, 2.909483642578125e+02, 2.911876220703125e+02, 2.913215637207031e+02, 2.912642822265625e+02, 2.911821594238281e+02, 2.910911865234375e+02, 2.909936218261719e+02, 2.908921813964844e+02, 2.908085327148438e+02, 2.909213256835938e+02, 2.908730163574219e+02, 2.907909545898438e+02, 2.906813049316406e+02, 2.905657348632812e+02, 2.904463195800781e+02, 2.90326904296875e+02, 2.902008972167969e+02, 2.90253662109375e+02, 2.904949340820312e+02, 2.9073388671875e+02, 2.9076318359375e+02, 2.906505737304688e+02, 2.905325927734375e+02, 2.904100036621094e+02, 2.902860107421875e+02, 2.902075805664062e+02, 2.903280944824219e+02, 2.9051171875e+02, 2.906920471191406e+02, 2.906356506347656e+02, 2.905503234863281e+02, 2.904665222167969e+02, 2.90384765625e+02, 2.903038330078125e+02, 2.902547912597656e+02, 2.902696228027344e+02, 2.903644714355469e+02, 2.903743896484375e+02, 2.903198852539062e+02, 2.902648620605469e+02, 2.902106628417969e+02, 2.901565856933594e+02, 2.901155700683594e+02, 2.901807250976562e+02, 2.904189147949219e+02, 2.906371154785156e+02, 2.906368408203125e+02, 2.905658569335938e+02, 2.904955444335938e+02, 2.904268493652344e+02, 2.903612060546875e+02, 2.902947387695312e+02, 2.902566833496094e+02, 2.903972473144531e+02, 2.905760498046875e+02, 2.90551513671875e+02, 2.905042419433594e+02, 2.904523620605469e+02, 2.904047546386719e+02, 2.903594665527344e+02, 2.903141784667969e+02, 2.902702331542969e+02, 2.902278442382812e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt new file mode 100644 index 0000000000..32dcfc4a3c --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt @@ -0,0 +1,10 @@ +last-generated=2023-09-08 +statistics-simulation= +{ + "linear": " ", + "nonlinear": "1", + "number of continuous time states": "4", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +zone.T=[2.931499938964844e+02, 2.930606689453125e+02, 2.929643249511719e+02, 2.928974304199219e+02, 2.930238342285156e+02, 2.930650634765625e+02, 2.930123291015625e+02, 2.929456481933594e+02, 2.928767395019531e+02, 2.928078918457031e+02, 2.927404479980469e+02, 2.9267724609375e+02, 2.926165771484375e+02, 2.925605163574219e+02, 2.925022888183594e+02, 2.924439086914062e+02, 2.923875122070312e+02, 2.923274841308594e+02, 2.92265869140625e+02, 2.922026977539062e+02, 2.921306457519531e+02, 2.920592956542969e+02, 2.919894714355469e+02, 2.919207763671875e+02, 2.918522338867188e+02, 2.917841491699219e+02, 2.917159729003906e+02, 2.916467895507812e+02, 2.915788269042969e+02, 2.915138549804688e+02, 2.914527893066406e+02, 2.913910827636719e+02, 2.913223266601562e+02, 2.912518920898438e+02, 2.911763610839844e+02, 2.910963134765625e+02, 2.91012939453125e+02, 2.909146118164062e+02, 2.909188232421875e+02, 2.911439819335938e+02, 2.913373718261719e+02, 2.9132763671875e+02, 2.912524108886719e+02, 2.911689758300781e+02, 2.910796508789062e+02, 2.909833679199219e+02, 2.9088916015625e+02, 2.909557800292969e+02, 2.909430236816406e+02, 2.908749084472656e+02, 2.907784423828125e+02, 2.906665649414062e+02, 2.905516052246094e+02, 2.904307250976562e+02, 2.903084411621094e+02, 2.902685852050781e+02, 2.904729614257812e+02, 2.90720458984375e+02, 2.908230285644531e+02, 2.907205505371094e+02, 2.906036071777344e+02, 2.904841613769531e+02, 2.90362548828125e+02, 2.902437438964844e+02, 2.902868347167969e+02, 2.904608154296875e+02, 2.906579284667969e+02, 2.906626892089844e+02, 2.905770263671875e+02, 2.904942626953125e+02, 2.904112548828125e+02, 2.90329833984375e+02, 2.902554016113281e+02, 2.902565612792969e+02, 2.903314819335938e+02, 2.903802490234375e+02, 2.903304748535156e+02, 2.902759704589844e+02, 2.902184753417969e+02, 2.901612548828125e+02, 2.901092224121094e+02, 2.901262512207031e+02, 2.903362731933594e+02, 2.905704040527344e+02, 2.906482238769531e+02, 2.905876770019531e+02, 2.905180358886719e+02, 2.904518127441406e+02, 2.903863830566406e+02, 2.903204040527344e+02, 2.902714538574219e+02, 2.903493041992188e+02, 2.905325927734375e+02, 2.905527954101562e+02, 2.905055541992188e+02, 2.904557495117188e+02, 2.904060974121094e+02, 2.903577270507812e+02, 2.903117370605469e+02, 2.902666931152344e+02, 2.902240600585938e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt new file mode 100644 index 0000000000..bc2dbab834 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt @@ -0,0 +1,16 @@ +last-generated=2023-09-08 +statistics-initialization= +{ + "nonlinear": "5", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": "0, 0, 0, 0, 0", + "nonlinear": "1", + "number of continuous time states": "9", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +zone.T=[2.931499938964844e+02, 3.018652954101562e+02, 3.023765258789062e+02, 3.028914794921875e+02, 3.035993041992188e+02, 3.042365112304688e+02, 3.047744750976562e+02, 3.05290771484375e+02, 3.058043518066406e+02, 3.063145751953125e+02, 3.068218383789062e+02, 3.073329162597656e+02, 3.078472290039062e+02, 3.083641052246094e+02, 3.088750305175781e+02, 3.093839111328125e+02, 3.09893310546875e+02, 3.104012756347656e+02, 3.109044189453125e+02, 3.114033813476562e+02, 3.118929748535156e+02, 3.123785400390625e+02, 3.128649291992188e+02, 3.133509521484375e+02, 3.138353881835938e+02, 3.143179016113281e+02, 3.147996215820312e+02, 3.152798156738281e+02, 3.157587890625e+02, 3.162375793457031e+02, 3.167167358398438e+02, 3.171956787109375e+02, 3.176707153320312e+02, 3.181366271972656e+02, 3.185990600585938e+02, 3.190547790527344e+02, 3.195059204101562e+02, 3.199426879882812e+02, 3.204760131835938e+02, 3.212296752929688e+02, 3.219649047851562e+02, 3.224814147949219e+02, 3.229290466308594e+02, 3.233672485351562e+02, 3.237968139648438e+02, 3.242164001464844e+02, 3.2463623046875e+02, 3.252275695800781e+02, 3.257299194335938e+02, 3.261766662597656e+02, 3.265938110351562e+02, 3.269905395507812e+02, 3.273827819824219e+02, 3.277706298828125e+02, 3.281524353027344e+02, 3.285976257324219e+02, 3.293054809570312e+02, 3.300552368164062e+02, 3.306694946289062e+02, 3.310607299804688e+02, 3.314381103515625e+02, 3.318106689453125e+02, 3.321793823242188e+02, 3.325464172363281e+02, 3.330693054199219e+02, 3.33726806640625e+02, 3.344093933105469e+02, 3.349058532714844e+02, 3.353015441894531e+02, 3.356973266601562e+02, 3.360923461914062e+02, 3.364874877929688e+02, 3.36885986328125e+02, 3.373557434082031e+02, 3.378902282714844e+02, 3.384234008789062e+02, 3.388450622558594e+02, 3.392593994140625e+02, 3.396685180664062e+02, 3.400756225585938e+02, 3.404804382324219e+02, 3.409362487792969e+02, 3.416002807617188e+02, 3.423026733398438e+02, 3.428507385253906e+02, 3.432394714355469e+02, 3.436236572265625e+02, 3.440080871582031e+02, 3.443947143554688e+02, 3.447819519042969e+02, 3.451823425292969e+02, 3.457003173828125e+02, 3.46326171875e+02, 3.468087768554688e+02, 3.472050476074219e+02, 3.475966491699219e+02, 3.479892883300781e+02, 3.483822021484375e+02, 3.487869262695312e+02, 3.491904907226562e+02, 3.49581298828125e+02] +heaWat.u=[1e+00, 1e+00] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt new file mode 100644 index 0000000000..aeeebea78a --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt @@ -0,0 +1,16 @@ +last-generated=2023-09-08 +statistics-initialization= +{ + "nonlinear": "5", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": "0, 0, 0, 0, 0", + "nonlinear": "1", + "number of continuous time states": "9", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +zone.T=[2.931499938964844e+02, 2.945088500976562e+02, 2.959101867675781e+02, 2.966435546875e+02, 2.963061828613281e+02, 2.943134765625e+02, 2.955157165527344e+02, 2.947713317871094e+02, 2.949506225585938e+02, 2.954654846191406e+02, 2.949836730957031e+02, 2.943354187011719e+02, 2.95562255859375e+02, 2.943411865234375e+02, 2.964649658203125e+02, 2.953833618164062e+02, 2.944506530761719e+02, 2.941693420410156e+02, 2.967954406738281e+02, 2.956394958496094e+02, 2.947533264160156e+02, 2.943429870605469e+02, 2.941551513671875e+02, 2.967920837402344e+02, 2.954975280761719e+02, 2.946376953125e+02, 2.942773742675781e+02, 2.945584716796875e+02, 2.964990844726562e+02, 2.9513818359375e+02, 2.944798889160156e+02, 2.942196655273438e+02, 2.952792663574219e+02, 2.963535461425781e+02, 2.950684814453125e+02, 2.944270324707031e+02, 2.941518249511719e+02, 2.964158020019531e+02, 2.948146362304688e+02, 2.942771301269531e+02, 2.944650268554688e+02, 2.944434509277344e+02, 2.943599548339844e+02, 2.942665710449219e+02, 2.941667785644531e+02, 2.942500915527344e+02, 2.942366638183594e+02, 2.943132629394531e+02, 2.941784362792969e+02, 2.943945007324219e+02, 2.946878356933594e+02, 2.944981079101562e+02, 2.942091064453125e+02, 2.966917724609375e+02, 2.947072448730469e+02, 2.950520935058594e+02, 2.942230224609375e+02, 2.94413330078125e+02, 2.945167541503906e+02, 2.94404541015625e+02, 2.942772216796875e+02, 2.942956848144531e+02, 2.945955810546875e+02, 2.966785278320312e+02, 2.95890869140625e+02, 2.943241577148438e+02, 2.944898376464844e+02, 2.944913635253906e+02, 2.943954162597656e+02, 2.943005065917969e+02, 2.942054138183594e+02, 2.951721496582031e+02, 2.958705444335938e+02, 2.944257202148438e+02, 2.942926330566406e+02, 2.942910766601562e+02, 2.9422998046875e+02, 2.941651000976562e+02, 2.943297424316406e+02, 2.947159729003906e+02, 2.951884765625e+02, 2.956945190429688e+02, 2.9439013671875e+02, 2.946013793945312e+02, 2.946728820800781e+02, 2.94598388671875e+02, 2.945144958496094e+02, 2.944308471679688e+02, 2.943534240722656e+02, 2.942757568359375e+02, 2.942055969238281e+02, 2.942643432617188e+02, 2.944358215332031e+02, 2.9445458984375e+02, 2.943978271484375e+02, 2.943378601074219e+02, 2.942750549316406e+02, 2.942183227539062e+02, 2.94168212890625e+02, 2.954824829101562e+02, 2.941523742675781e+02] +heaWat.u=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 1e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt new file mode 100644 index 0000000000..a85657b166 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt @@ -0,0 +1,19 @@ +last-generated=2023-09-08 +statistics-initialization= +{ + "nonlinear": "5, 1", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": "0, 0, 0, 0, 0", + "nonlinear": "1, 0, 1", + "number of continuous time states": "11", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +zone.T=[2.931499938964844e+02, 2.945050964355469e+02, 2.959047546386719e+02, 2.96646484375e+02, 2.943834838867188e+02, 2.942815856933594e+02, 2.942722473144531e+02, 2.942023620605469e+02, 2.9615576171875e+02, 2.945042724609375e+02, 2.941602172851562e+02, 2.941692199707031e+02, 2.941705627441406e+02, 2.941705932617188e+02, 2.941704406738281e+02, 2.941652526855469e+02, 2.941562194824219e+02, 2.941512756347656e+02, 2.944099426269531e+02, 2.951903076171875e+02, 2.966014404296875e+02, 2.966050109863281e+02, 2.957460021972656e+02, 2.950239562988281e+02, 2.945757141113281e+02, 2.943212280273438e+02, 2.941802368164062e+02, 2.960645446777344e+02, 2.962243957519531e+02, 2.950863647460938e+02, 2.945101013183594e+02, 2.942584533691406e+02, 2.941826782226562e+02, 2.967984619140625e+02, 2.956029663085938e+02, 2.946762084960938e+02, 2.942572631835938e+02, 2.9655712890625e+02, 2.942179870605469e+02, 2.950230712890625e+02, 2.957950439453125e+02, 2.958896789550781e+02, 2.958037719726562e+02, 2.957060852050781e+02, 2.956017150878906e+02, 2.954903564453125e+02, 2.953819580078125e+02, 2.957755432128906e+02, 2.959239501953125e+02, 2.958983764648438e+02, 2.958122863769531e+02, 2.956854858398438e+02, 2.955560913085938e+02, 2.954240417480469e+02, 2.9528759765625e+02, 2.95342041015625e+02, 2.961524658203125e+02, 2.970876770019531e+02, 2.97622314453125e+02, 2.975182495117188e+02, 2.973820190429688e+02, 2.972417297363281e+02, 2.970984191894531e+02, 2.969559326171875e+02, 2.972681274414062e+02, 2.979461669921875e+02, 2.965861511230469e+02, 2.966249084472656e+02, 2.964938659667969e+02, 2.963466186523438e+02, 2.961501159667969e+02, 2.980364990234375e+02, 2.979473571777344e+02, 2.980525207519531e+02, 2.969268188476562e+02, 2.971317443847656e+02, 2.969201354980469e+02, 2.968055725097656e+02, 2.965866394042969e+02, 2.964843139648438e+02, 2.962891540527344e+02, 2.97805908203125e+02, 2.971761474609375e+02, 2.978529968261719e+02, 2.979222412109375e+02, 2.9753515625e+02, 2.973719787597656e+02, 2.972562866210938e+02, 2.971741333007812e+02, 2.969613037109375e+02, 2.969106140136719e+02, 2.973577270507812e+02, 2.980824584960938e+02, 2.980605163574219e+02, 2.979991455078125e+02, 2.977561340332031e+02, 2.976838989257812e+02, 2.976190185546875e+02, 2.974039306640625e+02, 2.974400024414062e+02, 2.973416442871094e+02] +heaWat.u=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] +vavDam.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00] +fan.sta_a.T=[2.609500122070312e+02, 2.619339904785156e+02, 2.625560607910156e+02, 2.634340515136719e+02, 2.68343994140625e+02, 2.720289611816406e+02, 2.720545959472656e+02, 2.713428955078125e+02, 2.719671630859375e+02, 2.692550048828125e+02, 2.701675109863281e+02, 2.723510437011719e+02, 2.733544006347656e+02, 2.748542175292969e+02, 2.725393981933594e+02, 2.727891845703125e+02, 2.745196228027344e+02, 2.731544494628906e+02, 2.731544799804688e+02, 2.722991333007812e+02, 2.698099365234375e+02, 2.689096374511719e+02, 2.703550109863281e+02, 2.703549194335938e+02, 2.703548583984375e+02, 2.703548278808594e+02, 2.703548278808594e+02, 2.703550720214844e+02, 2.698551635742188e+02, 2.706847229003906e+02, 2.716439208984375e+02, 2.725196838378906e+02, 2.705011901855469e+02, 2.680314636230469e+02, 2.676664733886719e+02, 2.660458374023438e+02, 2.64255615234375e+02, 2.581173400878906e+02, 2.604478149414062e+02, 2.657221984863281e+02, 2.69406005859375e+02, 2.682219848632812e+02, 2.657222900390625e+02, 2.637669982910156e+02, 2.618729248046875e+02, 2.592564392089844e+02, 2.581830444335938e+02, 2.604674377441406e+02, 2.616646728515625e+02, 2.608386535644531e+02, 2.561106262207031e+02, 2.546563415527344e+02, 2.54271484375e+02, 2.5302392578125e+02, 2.509575042724609e+02, 2.541974792480469e+02, 2.587733154296875e+02, 2.602138671875e+02, 2.569418334960938e+02, 2.549216613769531e+02, 2.536201782226562e+02, 2.520576171875e+02, 2.519818878173828e+02, 2.514576568603516e+02, 2.582303466796875e+02, 2.619276123046875e+02, 2.916773986816406e+02, 2.916036682128906e+02, 2.916499633789062e+02, 2.915554504394531e+02, 2.914026489257812e+02, 2.648560485839844e+02, 2.6535595703125e+02, 2.700713195800781e+02, 2.935654602050781e+02, 2.937233581542969e+02, 2.933609008789062e+02, 2.932672424316406e+02, 2.929061584472656e+02, 2.9293359375e+02, 2.925202331542969e+02, 2.720550537109375e+02, 2.93810791015625e+02, 2.944085388183594e+02, 2.939564208984375e+02, 2.931130676269531e+02, 2.929986877441406e+02, 2.930928344726562e+02, 2.931185607910156e+02, 2.927966613769531e+02, 2.930165100097656e+02, 2.939817199707031e+02, 2.949109191894531e+02, 2.94682861328125e+02, 2.947590026855469e+02, 2.942391662597656e+02, 2.944219665527344e+02, 2.943655395507812e+02, 2.939534912109375e+02, 2.942164916992188e+02, 2.942030029296875e+02] +fan.sta_b.T=[2.612852783203125e+02, 2.619520263671875e+02, 2.625741271972656e+02, 2.634520874023438e+02, 2.68362060546875e+02, 2.720469970703125e+02, 2.720726623535156e+02, 2.713609619140625e+02, 2.719852294921875e+02, 2.692730407714844e+02, 2.701855773925781e+02, 2.723690795898438e+02, 2.733724670410156e+02, 2.748722839355469e+02, 2.725574645996094e+02, 2.728072509765625e+02, 2.745376586914062e+02, 2.731724853515625e+02, 2.731725158691406e+02, 2.723171997070312e+02, 2.698280029296875e+02, 2.689277038574219e+02, 2.703730773925781e+02, 2.703729858398438e+02, 2.703729248046875e+02, 2.703728942871094e+02, 2.703728637695312e+02, 2.703731079101562e+02, 2.698731994628906e+02, 2.707027893066406e+02, 2.716619567871094e+02, 2.725377502441406e+02, 2.705192260742188e+02, 2.680495300292969e+02, 2.676845092773438e+02, 2.660639038085938e+02, 2.64273681640625e+02, 2.581353759765625e+02, 2.604658813476562e+02, 2.657402648925781e+02, 2.69424072265625e+02, 2.682400512695312e+02, 2.657403564453125e+02, 2.637850341796875e+02, 2.618909606933594e+02, 2.592745056152344e+02, 2.582011108398438e+02, 2.604854736328125e+02, 2.616827392578125e+02, 2.60856689453125e+02, 2.56128662109375e+02, 2.546744079589844e+02, 2.542895355224609e+02, 2.530419769287109e+02, 2.509755554199219e+02, 2.542155303955078e+02, 2.587913818359375e+02, 2.6023193359375e+02, 2.569598693847656e+02, 2.549397125244141e+02, 2.536382293701172e+02, 2.520756683349609e+02, 2.519999389648438e+02, 2.514757080078125e+02, 2.582484130859375e+02, 2.619456787109375e+02, 2.920126953125e+02, 2.9193896484375e+02, 2.919852600097656e+02, 2.918907470703125e+02, 2.917379150390625e+02, 2.648740844726562e+02, 2.653740234375e+02, 2.7008935546875e+02, 2.939007568359375e+02, 2.940586547851562e+02, 2.936961669921875e+02, 2.936025085449219e+02, 2.93241455078125e+02, 2.932688903808594e+02, 2.928554992675781e+02, 2.720731201171875e+02, 2.941460571289062e+02, 2.947438354492188e+02, 2.942916870117188e+02, 2.934483642578125e+02, 2.933339538574219e+02, 2.934281311035156e+02, 2.93453857421875e+02, 2.931319580078125e+02, 2.93351806640625e+02, 2.943170166015625e+02, 2.952462158203125e+02, 2.950181579589844e+02, 2.950942993164062e+02, 2.94574462890625e+02, 2.947572631835938e+02, 2.947008056640625e+02, 2.942887878417969e+02, 2.945517883300781e+02, 2.945382995605469e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt new file mode 100644 index 0000000000..66aac03fd5 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt @@ -0,0 +1,9 @@ +last-generated=2023-09-08 +statistics-simulation= +{ + "linear": " ", + "nonlinear": "1", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +Tout.T=[2.609500122070312e+02, 2.619280090332031e+02, 2.625499877929688e+02, 2.634280090332031e+02, 2.683388977050781e+02, 2.720243530273438e+02, 2.720499877929688e+02, 2.713381958007812e+02, 2.719623107910156e+02, 2.6925e+02, 2.701626892089844e+02, 2.723464965820312e+02, 2.733500061035156e+02, 2.748500061035156e+02, 2.725348815917969e+02, 2.727846984863281e+02, 2.745153503417969e+02, 2.731499938964844e+02, 2.731499938964844e+02, 2.7229443359375e+02, 2.698047180175781e+02, 2.689043273925781e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.698500061035156e+02, 2.706798400878906e+02, 2.716392211914062e+02, 2.7251513671875e+02, 2.704963989257812e+02, 2.680260009765625e+02, 2.676611022949219e+02, 2.660404052734375e+02, 2.6425e+02, 2.58110595703125e+02, 2.604417114257812e+02, 2.657166748046875e+02, 2.6940087890625e+02, 2.682166748046875e+02, 2.657166748046875e+02, 2.637611083984375e+02, 2.618667907714844e+02, 2.5925e+02, 2.581764831542969e+02, 2.604611206054688e+02, 2.616584777832031e+02, 2.608323364257812e+02, 2.561037292480469e+02, 2.546492767333984e+02, 2.542643737792969e+02, 2.530166625976562e+02, 2.509499969482422e+02, 2.541903991699219e+02, 2.587667236328125e+02, 2.602073364257812e+02, 2.569347839355469e+02, 2.549143829345703e+02, 2.536127471923828e+02, 2.520500030517578e+02, 2.519742736816406e+02, 2.514499969482422e+02, 2.582235412597656e+02, 2.619212036132812e+02, 2.638611145019531e+02, 2.631499938964844e+02, 2.642012023925781e+02, 2.644055480957031e+02, 2.645002136230469e+02, 2.648500061035156e+02, 2.653500061035156e+02, 2.700659484863281e+02, 2.745177612304688e+02, 2.744092712402344e+02, 2.731917419433594e+02, 2.732166748046875e+02, 2.720499877929688e+02, 2.728128356933594e+02, 2.71162841796875e+02, 2.720499877929688e+02, 2.747403564453125e+02, 2.748898315429688e+02, 2.714833374023438e+02, 2.680546264648438e+02, 2.682166748046875e+02, 2.695e+02, 2.701371154785156e+02, 2.691971130371094e+02, 2.709500122070312e+02, 2.748510131835938e+02, 2.769389038085938e+02, 2.755428771972656e+02, 2.76398193359375e+02, 2.743096923828125e+02, 2.759377136230469e+02, 2.759291076660156e+02, 2.744010620117188e+02, 2.759500122070312e+02, 2.764174499511719e+02] diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos index 258a2bf2e7..b89a0cf735 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos @@ -1,2 +1,2 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse1", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse1"); +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse1", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse1"); createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos index d4c7b5c21b..407e952a31 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos @@ -1,2 +1,2 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse2", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse2"); +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse2", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse2"); createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos index 6f1012a4aa..0e74776c7d 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos @@ -1,2 +1,2 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse3", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse3"); +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse3", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse3"); createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos index f791fd0f62..643b361a7e 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos @@ -1,3 +1,3 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse4", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse4"); +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse4", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse4"); createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 80}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos index f91eedf8db..2f1dbbcb07 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos @@ -1,3 +1,3 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse5", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse5"); +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse5", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse5"); createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 24}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos index 6e141f0d3c..3233744180 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos @@ -1,4 +1,4 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse6", stopTime=1e+06, method="Dassl", tolerance=1e-04, resultFile="SimpleHouse6"); +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse6", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse6"); createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 26}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"vavDam.y"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=3, colors={{28,108,200}}); diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos new file mode 100644 index 0000000000..a5dd484d72 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouseTemplate"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"Tout.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file From 98c56b0b988373cd02127d6a95b32a1bc9ef9d88 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Mon, 11 Sep 2023 07:38:39 -0700 Subject: [PATCH 15/48] Moved tutorial --- .../Tutorial/SimpleHouse/SimpleHouse1.mo | 154 +++++----- .../Tutorial/SimpleHouse/SimpleHouse2.mo | 160 +++++----- .../Tutorial/SimpleHouse/SimpleHouse3.mo | 176 +++++------ .../Tutorial/SimpleHouse/SimpleHouse4.mo | 266 ++++++++-------- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 174 +++++------ .../Tutorial/SimpleHouse/SimpleHouse6.mo | 286 +++++++++--------- .../SimpleHouse/SimpleHouseTemplate.mo | 4 +- .../Examples/Tutorial/SimpleHouse/package.mo | 174 +++++------ .../Tutorial/SimpleHouse/package.order | 14 +- IBPSA/Examples/Tutorial/package.mo | 13 + IBPSA/Examples/Tutorial/package.order | 1 + IBPSA/Examples/package.mo | 11 + IBPSA/Examples/package.order | 1 + IBPSA/Fluid/Examples/Tutorial/package.order | 1 - IBPSA/Fluid/Examples/package.order | 10 +- .../Tutorial/SimpleHouse/airModel.png | Bin .../SimpleHouse/heatingControllerModel.png | Bin .../Examples/Tutorial/SimpleHouse/result1.png | Bin .../Examples/Tutorial/SimpleHouse/result2.png | Bin .../Examples/Tutorial/SimpleHouse/result3.png | Bin .../Examples/Tutorial/SimpleHouse/result4.png | Bin .../Examples/Tutorial/SimpleHouse/result5.png | Bin .../Examples/Tutorial/SimpleHouse/result6.png | Bin .../Examples/Tutorial/SimpleHouse/result7.png | Bin .../Tutorial/SimpleHouse/simpleHouse.png | Bin .../Tutorial/SimpleHouse/simulate.png | Bin ...les_Tutorial_SimpleHouse_SimpleHouse1.txt} | 0 ...les_Tutorial_SimpleHouse_SimpleHouse2.txt} | 0 ...les_Tutorial_SimpleHouse_SimpleHouse3.txt} | 0 ...les_Tutorial_SimpleHouse_SimpleHouse4.txt} | 0 ...les_Tutorial_SimpleHouse_SimpleHouse5.txt} | 0 ...les_Tutorial_SimpleHouse_SimpleHouse6.txt} | 0 ...orial_SimpleHouse_SimpleHouseTemplate.txt} | 0 .../Tutorial/SimpleHouse/SimpleHouse1.mos | 2 + .../Tutorial/SimpleHouse/SimpleHouse2.mos | 2 + .../Tutorial/SimpleHouse/SimpleHouse3.mos | 2 + .../Tutorial/SimpleHouse/SimpleHouse4.mos | 4 +- .../Tutorial/SimpleHouse/SimpleHouse5.mos | 4 +- .../Tutorial/SimpleHouse/SimpleHouse6.mos | 10 +- .../SimpleHouse/SimpleHouseTemplate.mos | 2 + .../Tutorial/SimpleHouse/SimpleHouse1.mos | 2 - .../Tutorial/SimpleHouse/SimpleHouse2.mos | 2 - .../Tutorial/SimpleHouse/SimpleHouse3.mos | 2 - .../SimpleHouse/SimpleHouseTemplate.mos | 2 - IBPSA/package.order | 1 + 45 files changed, 753 insertions(+), 727 deletions(-) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo (84%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo (89%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo (87%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo (89%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo (90%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo (92%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo (96%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/package.mo (72%) rename IBPSA/{Fluid => }/Examples/Tutorial/SimpleHouse/package.order (93%) create mode 100644 IBPSA/Examples/Tutorial/package.mo create mode 100644 IBPSA/Examples/Tutorial/package.order create mode 100644 IBPSA/Examples/package.mo create mode 100644 IBPSA/Examples/package.order rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/airModel.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/heatingControllerModel.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/result1.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/result2.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/result3.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/result4.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/result5.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/result6.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/result7.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/simpleHouse.png (100%) rename IBPSA/Resources/Images/{Fluid => }/Examples/Tutorial/SimpleHouse/simulate.png (100%) rename IBPSA/Resources/ReferenceResults/Dymola/{IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt => IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt} (100%) rename IBPSA/Resources/ReferenceResults/Dymola/{IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt => IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt} (100%) rename IBPSA/Resources/ReferenceResults/Dymola/{IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt => IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt} (100%) rename IBPSA/Resources/ReferenceResults/Dymola/{IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt => IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt} (100%) rename IBPSA/Resources/ReferenceResults/Dymola/{IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt => IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt} (100%) rename IBPSA/Resources/ReferenceResults/Dymola/{IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt => IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt} (100%) rename IBPSA/Resources/ReferenceResults/Dymola/{IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt => IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt} (100%) create mode 100644 IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos create mode 100644 IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos create mode 100644 IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos rename IBPSA/Resources/Scripts/Dymola/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos (62%) rename IBPSA/Resources/Scripts/Dymola/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos (62%) rename IBPSA/Resources/Scripts/Dymola/{Fluid => }/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos (77%) create mode 100644 IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos delete mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos delete mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos delete mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos delete mode 100644 IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo similarity index 84% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 99f78168ae..fa68236ba3 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -1,77 +1,77 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; -model SimpleHouse1 "Building wall model" - extends SimpleHouseTemplate; - - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - C=A_wall*d_wall*cp_wall*rho_wall, T(fixed=true)) - "Thermal mass of walls" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={150,0}))); -equation - connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{130,0}, - {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
              -
            • -September 4, 2023, by Jelger Jansen:
              -First implementation. -
            • -
            -", info=" -

            -A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. -The house consists of a wall represented by a single heat capacitor and a thermal resistor. -The thermal resistor and boundary temperature are already included in the template. -The wall has a surface area of Awall=100 m2, -a thickness of dwall=25 cm, -a thermal conductivity of kwall=0.04 W/(m K), -a density of ρwall=2000 kg/m3, -and a specific heat capacity of cp,wall= 1000 J/(kg K) -

            -

            -These parameters are already declared in the equation section of - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate.SimpleHouseTemplate. -You can use this way of declaring parameters in the remainder of this exercise, but this is not required. -

            -

            -The conductive thermal resistance value of a wall may be computed as R=d/(A*k). -The heat capacity value of a wall may be computed as C=A*d*c_p*ρ -

            -

            Required models

            - -

            Connection instructions

            -

            -Connect the heat capacitor to the thermal resistor. -

            -

            Reference result

            -

            -If you correctly added the model of the heat capacitor, -connected it to the resistor and added the parameter values for C, -then you should be able to simulate the model. -To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. -You can now simulate the model by pressing the Simulate button. -

            -

            -You can plot individual variables values by clicking on their name in the variable browser on the left. -Now plot the wall capacitor temperature value T. -It should look like the figure below (1 Ms is around 12 days). -

            -

            -\"Wall -

            -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" - "Simulate and plot")); -end SimpleHouse1; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse1 "Building wall model" + extends SimpleHouseTemplate; + + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( + C=A_wall*d_wall*cp_wall*rho_wall, T(fixed=true)) + "Thermal mass of walls" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={150,0}))); +equation + connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{130,0}, + {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
              +
            • +September 4, 2023, by Jelger Jansen:
              +First implementation. +
            • +
            +", info=" +

            +A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. +The house consists of a wall represented by a single heat capacitor and a thermal resistor. +The thermal resistor and boundary temperature are already included in the template. +The wall has a surface area of Awall=100 m2, +a thickness of dwall=25 cm, +a thermal conductivity of kwall=0.04 W/(m K), +a density of ρwall=2000 kg/m3, +and a specific heat capacity of cp,wall= 1000 J/(kg K) +

            +

            +These parameters are already declared in the equation section of + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate.SimpleHouseTemplate. +You can use this way of declaring parameters in the remainder of this exercise, but this is not required. +

            +

            +The conductive thermal resistance value of a wall may be computed as R=d/(A*k). +The heat capacity value of a wall may be computed as C=A*d*c_p*ρ +

            +

            Required models

            + +

            Connection instructions

            +

            +Connect the heat capacitor to the thermal resistor. +

            +

            Reference result

            +

            +If you correctly added the model of the heat capacitor, +connected it to the resistor and added the parameter values for C, +then you should be able to simulate the model. +To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. +You can now simulate the model by pressing the Simulate button. +

            +

            +You can plot individual variables values by clicking on their name in the variable browser on the left. +Now plot the wall capacitor temperature value T. +It should look like the figure below (1 Ms is around 12 days). +

            +

            +\"Wall +

            +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" + "Simulate and plot")); +end SimpleHouse1; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo similarity index 89% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index d54653b6bd..512c2c5a4d 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -1,80 +1,80 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; -model SimpleHouse2 "Building window model" - extends SimpleHouse1; - - parameter Modelica.Units.SI.Area A_win=2 "Window area"; - - Modelica.Blocks.Math.Gain gaiWin(k=A_win) - "Gain for solar irradiance through the window" - annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow window - "Very simple window model" - annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); -equation - connect(gaiWin.y,window. Q_flow) annotation (Line(points={{-39,-30},{-20,-30}}, - color={0,0,127})); - connect(window.port, walCap.port) annotation (Line(points={{0,-30},{132,-30},{ - 132,1.77636e-15},{140,1.77636e-15}}, - color={191,0,0})); - connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-62,-30},{-150,-30}, - {-150,-10}}, color={0,0,127}), Text( - string="%second", - index=1, - extent={{-6,3},{-6,3}}, - horizontalAlignment=TextAlignment.Right)); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
              -
            • -September 4, 2023, by Jelger Jansen:
              -First implementation. -
            • -
            -", info=" -

            -The window has a surface area of 2 m2. -In this simple model we will therefore assume that -two times the outdoor solar irradiance is injected as heat onto the inside of the wall. -

            -

            Required models

            - -

            Connection instructions

            -

            -To be able to use the value of the outdoor solar irradiance -you will need to access the weather data reader. -To do this, make a connection to the weaBus. -In the dialog box select and here type HDirNor, -which is the direct solar irradiance on a surface of 1 m2, -perpendicular to the sun rays. -Set the gain factor k to 2, -in order to get the solar irradiance through the window of 2 m2. -

            -

            -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

            -

            Reference result

            -

            -The result with and without the window model is plotted in the figure below. -

            -

            -\"Wall -

            -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" - "Simulate and plot")); -end SimpleHouse2; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse2 "Building window model" + extends SimpleHouse1; + + parameter Modelica.Units.SI.Area A_win=2 "Window area"; + + Modelica.Blocks.Math.Gain gaiWin(k=A_win) + "Gain for solar irradiance through the window" + annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow window + "Very simple window model" + annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); +equation + connect(gaiWin.y,window. Q_flow) annotation (Line(points={{-39,-30},{-20,-30}}, + color={0,0,127})); + connect(window.port, walCap.port) annotation (Line(points={{0,-30},{132,-30},{ + 132,1.77636e-15},{140,1.77636e-15}}, + color={191,0,0})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-62,-30},{-150,-30}, + {-150,-10}}, color={0,0,127}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
              +
            • +September 4, 2023, by Jelger Jansen:
              +First implementation. +
            • +
            +", info=" +

            +The window has a surface area of 2 m2. +In this simple model we will therefore assume that +two times the outdoor solar irradiance is injected as heat onto the inside of the wall. +

            +

            Required models

            + +

            Connection instructions

            +

            +To be able to use the value of the outdoor solar irradiance +you will need to access the weather data reader. +To do this, make a connection to the weaBus. +In the dialog box select and here type HDirNor, +which is the direct solar irradiance on a surface of 1 m2, +perpendicular to the sun rays. +Set the gain factor k to 2, +in order to get the solar irradiance through the window of 2 m2. +

            +

            +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

            +

            Reference result

            +

            +The result with and without the window model is plotted in the figure below. +

            +

            +\"Wall +

            +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" + "Simulate and plot")); +end SimpleHouse2; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo similarity index 87% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 2dbd794d93..8535ebcac8 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -1,88 +1,88 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; -model SimpleHouse3 "Air model" - extends SimpleHouse2; - - parameter Modelica.Units.SI.Volume V_zone=8*8*3 "Zone volume"; - parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 - "Nominal mass flow rate for air loop"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer h_wall=2 - "Convective heat transfer coefficient at the wall"; - - Modelica.Thermal.HeatTransfer.Components.ThermalResistor convRes(R=1/2/A_wall) - "Thermal resistance for convective heat transfer" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={130,20}))); - MixingVolumes.MixingVolume zone( - redeclare package Medium = MediumAir, - V=V_zone, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - m_flow_nominal=mAir_flow_nominal) - "Very simple zone air model" - annotation (Placement(transformation(extent={{110,130},{90,150}}))); -equation - connect(convRes.port_b, walCap.port) - annotation (Line(points={{130,10},{130,1.77636e-15},{140,1.77636e-15}}, - color={191,0,0})); - connect(zone.heatPort, convRes.port_a) - annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
              -
            • -September 4, 2023, by Jelger Jansen:
              -First implementation. -
            • -
            -", info=" -

            -To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. -The air will exchange heat with the wall. -This may be modelled using a thermal resistance representing -the convective heat resistance which is equal to Rconv=1/(h*A), -where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. -

            -

            Required models

            - -

            Connection instructions

            -

            -The MixingVolume Medium parameter contains information about -the type of fluid and its properties that should be modelled by the MixingVolume. -Set its value to MediumAir, which is declared in the template, -by typing redeclare package Medium = MediumAir. -For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. -You will have to change this value once you add a ventilation system to the model (see - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse6). -Finally, set the energyDynamics of the MixingVolume, -which can be found in the Dynamics tab of the model parameter window, to FixedInitial. -

            -

            -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

            -

            Reference result

            -

            -The result with and without the air model is plotted in the figure below. -

            -

            -\"Wall -

            -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" - "Simulate and plot")); -end SimpleHouse3; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse3 "Air model" + extends SimpleHouse2; + + parameter Modelica.Units.SI.Volume V_zone=8*8*3 "Zone volume"; + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 + "Nominal mass flow rate for air loop"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer h_wall=2 + "Convective heat transfer coefficient at the wall"; + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor convRes(R=1/2/A_wall) + "Thermal resistance for convective heat transfer" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={130,20}))); + IBPSA.Fluid.MixingVolumes.MixingVolume zone( + redeclare package Medium = MediumAir, + V=V_zone, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + m_flow_nominal=mAir_flow_nominal) + "Very simple zone air model" + annotation (Placement(transformation(extent={{110,130},{90,150}}))); +equation + connect(convRes.port_b, walCap.port) + annotation (Line(points={{130,10},{130,1.77636e-15},{140,1.77636e-15}}, + color={191,0,0})); + connect(zone.heatPort, convRes.port_a) + annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
              +
            • +September 4, 2023, by Jelger Jansen:
              +First implementation. +
            • +
            +", info=" +

            +To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. +The air will exchange heat with the wall. +This may be modelled using a thermal resistance representing +the convective heat resistance which is equal to Rconv=1/(h*A), +where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. +

            +

            Required models

            + +

            Connection instructions

            +

            +The MixingVolume Medium parameter contains information about +the type of fluid and its properties that should be modelled by the MixingVolume. +Set its value to MediumAir, which is declared in the template, +by typing redeclare package Medium = MediumAir. +For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. +You will have to change this value once you add a ventilation system to the model (see + +IBPSA.Examples.Tutorial.SimpleHouse6). +Finally, set the energyDynamics of the MixingVolume, +which can be found in the Dynamics tab of the model parameter window, to FixedInitial. +

            +

            +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

            +

            Reference result

            +

            +The result with and without the air model is plotted in the figure below. +

            +

            +\"Wall +

            +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" + "Simulate and plot")); +end SimpleHouse3; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo similarity index 89% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 1cfbcbd815..bff508b2c0 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,133 +1,133 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; -model SimpleHouse4 "Heating model" - extends SimpleHouse3; - - parameter Modelica.Units.SI.HeatFlowRate QHea_nominal=3000 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 - "Nominal mass flow rate for water loop"; - parameter Boolean constantSourceHeater=true - "To enable/disable the connection between the constant source and heater"; - - HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=333.15, - T_b_nominal=313.15, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=false, - Q_flow_nominal=3000) "Radiator" - annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); - HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - dp_nominal=5000, - Q_flow_nominal=QHea_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); - Movers.FlowControlled_m_flow pump( - redeclare package Medium = MediumWater, - use_inputFilter=false, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - nominalValuesDefineDefaultPressureCurve=true, - inputType=IBPSA.Fluid.Types.InputType.Constant) - "Pump" - annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); - Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={10,-170}))); - Modelica.Blocks.Sources.Constant const(k=1) - annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); -equation - connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, - color={0,127,255})); - connect(rad.port_b,pump. port_a) annotation (Line(points={{130,-100},{148,-100}, - {148,-170},{110,-170}},color={0,127,255})); - connect(heaWat.port_a,pump. port_b) annotation (Line(points={{60,-100},{49.75, - -100},{49.75,-170},{90,-170}}, color={0,127,255})); - connect(rad.heatPortCon, zone.heatPort) annotation (Line(points={{118,-92.8}, - {118,140},{110,140}},color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, - -30},{132,-30},{132,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - if constantSourceHeater then - connect(const.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50,-94}, - {58,-94}}, color={0,0,127})); - end if; - connect(bouWat.ports[1], pump.port_b) - annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
              -
            • -September 4, 2023, by Jelger Jansen:
              -First implementation. -
            • -
            -", info=" -

            -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60°C<\\i> -and 40°C<\\i>, and a room air and radiative temperature of 20°C<\\i>. -The pump has a (nominal) mass flow rate of 0.1 kg/s. -Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater<\\i>. -

            -

            Required models

            - -

            Connection instructions

            -

            -The radiator contains one port for convective heat transfer and one for radiative heat transfer. -Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, -the media for the models should be set to MediumWater. -

            -

            -The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. -Otherwise the absolute pressure in the system is undefined. -Pressure difference modelling may be disregarded in the heating circuit -since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. -

            -

            -Set the heater input to 1, meaning that it will produce 1 times its nominal power. -

            -

            Reference result

            -

            -The result of the air temperature is plotted in the figure below. -The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) -and the heater is not disabled when it becomes too warm. -

            -

            -\"Air -

            -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" - "Simulate and plot")); -end SimpleHouse4; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean constantSourceHeater=true + "To enable/disable the connection between the constant source and heater"; + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=3000) "Radiator" + annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); + IBPSA.Fluid.Movers.FlowControlled_m_flow pump( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + nominalValuesDefineDefaultPressureCurve=true, + inputType=IBPSA.Fluid.Types.InputType.Constant) + "Pump" + annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); + IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={10,-170}))); + Modelica.Blocks.Sources.Constant const(k=1) + annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, + color={0,127,255})); + connect(rad.port_b,pump. port_a) annotation (Line(points={{130,-100},{148,-100}, + {148,-170},{110,-170}},color={0,127,255})); + connect(heaWat.port_a,pump. port_b) annotation (Line(points={{60,-100},{49.75, + -100},{49.75,-170},{90,-170}}, color={0,127,255})); + connect(rad.heatPortCon, zone.heatPort) annotation (Line(points={{118,-92.8}, + {118,140},{110,140}},color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, + -30},{132,-30},{132,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + if constantSourceHeater then + connect(const.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50,-94}, + {58,-94}}, color={0,0,127})); + end if; + connect(bouWat.ports[1], pump.port_b) + annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
              +
            • +September 4, 2023, by Jelger Jansen:
              +First implementation. +
            • +
            +", info=" +

            +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60°C<\\i> +and 40°C<\\i>, and a room air and radiative temperature of 20°C<\\i>. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater<\\i>. +

            +

            Required models

            + +

            Connection instructions

            +

            +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

            +

            +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

            +

            +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

            +

            Reference result

            +

            +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

            +

            +\"Air +

            +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo similarity index 90% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 0cf0e0e393..2c8d59b714 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,87 +1,87 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; -model SimpleHouse5 "Heating controller model" - extends SimpleHouse4(pump(inputType=IBPSA.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}), - constantSourceHeater=false); - - Modelica.Blocks.Math.BooleanToInteger booleanToInt "Boolean to integer" - annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); - Modelica.Blocks.Math.BooleanToReal booleanToReal "Boolean to real" - annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); - Modelica.Blocks.Logical.Not not1 - "Negation for enabling heating when temperature is low" - annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{90,150},{70,170}}))); -equation - connect(booleanToInt.y, pump.stage) annotation (Line(points={{21,-140},{100,-140}, - {100,-158}}, color={255,127,0})); - connect(booleanToInt.u,not1. y) annotation (Line(points={{-2,-140},{-11.5,-140}, - {-11.5,-100},{-19,-100}}, - color={255,0,255})); - connect(booleanToReal.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100}, - {40.5,-94},{58,-94}}, color={0,0,127})); - connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, - color={255,0,255})); - connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, - {-230,-100},{-82,-100}}, color={0,0,127})); - connect(senTemZonAir.port, zone.heatPort) annotation (Line(points={{90,160},{ - 110,160},{110,140}}, color={191,0,0})); - connect(not1.y, booleanToReal.u) - annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
              -
            • -September 4, 2023, by Jelger Jansen:
              -First implementation. -
            • -
            -", info=" -

            -Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. -We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). -A temperature sensor will measure the zone air temperature. -

            -

            Required models

            - -

            Connection instructions

            -

            -The heater modulation level should be set to one when the heater is on and to zero otherwise. -

            -

            Reference result

            -

            -The figure below shows the air temperature when the controller is added. -

            -

            -\"Air -

            -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" - "Simulate and plot")); -end SimpleHouse5; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(pump(inputType=IBPSA.Fluid.Types.InputType.Stages, + massFlowRates=mWat_flow_nominal*{1}), + constantSourceHeater=false); + + Modelica.Blocks.Math.BooleanToInteger booleanToInt "Boolean to integer" + annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); + Modelica.Blocks.Math.BooleanToReal booleanToReal "Boolean to real" + annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,150},{70,170}}))); +equation + connect(booleanToInt.y, pump.stage) annotation (Line(points={{21,-140},{100,-140}, + {100,-158}}, color={255,127,0})); + connect(booleanToInt.u,not1. y) annotation (Line(points={{-2,-140},{-11.5,-140}, + {-11.5,-100},{-19,-100}}, + color={255,0,255})); + connect(booleanToReal.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100}, + {40.5,-94},{58,-94}}, color={0,0,127})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, + {-230,-100},{-82,-100}}, color={0,0,127})); + connect(senTemZonAir.port, zone.heatPort) annotation (Line(points={{90,160},{ + 110,160},{110,140}}, color={191,0,0})); + connect(not1.y, booleanToReal.u) + annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
              +
            • +September 4, 2023, by Jelger Jansen:
              +First implementation. +
            • +
            +", info=" +

            +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

            +

            Required models

            + +

            Connection instructions

            +

            +The heater modulation level should be set to one when the heater is on and to zero otherwise. +

            +

            Reference result

            +

            +The figure below shows the air temperature when the controller is added. +

            +

            +\"Air +

            +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo similarity index 92% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 30caf7c8a2..7163bc357e 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,143 +1,143 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; -model SimpleHouse6 "Free cooling model" - extends SimpleHouse5(zone(nPorts=2), - mAir_flow_nominal=0.1, - A_win=6); - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - - IBPSA.Fluid.Actuators.Dampers.Exponential - vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=dpAir_nominal) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={50,110}))); - IBPSA.Fluid.Movers.FlowControlled_dp - fan( - redeclare package Medium = MediumAir, - show_T=true, - dp_nominal=dpAir_nominal, - use_inputFilter=false, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - nominalValuesDefineDefaultPressureCurve=true, - m_flow_nominal=mAir_flow_nominal) - "Constant head fan" annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - origin={-50,110}))); - Modelica.Blocks.Sources.Constant const_dp(k=dpAir_nominal) "Pressure head" - annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); - IBPSA.Fluid.HeatExchangers.ConstantEffectiveness - hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=10, - dp2_nominal=10, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); - IBPSA.Fluid.Sources.Boundary_pT - bouAir( - redeclare package Medium = MediumAir, - use_T_in=true, - nPorts=2) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-130,130}))); - Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) - "Hysteresis controller for damper" - annotation (Placement(transformation(extent={{-20,70},{0,90}}))); - Modelica.Blocks.Math.BooleanToReal booleanToReal1 - "Boolean to real" - annotation (Placement(transformation(extent={{20,70},{40,90}}))); -equation - connect(const_dp.y,fan. dp_in) annotation (Line(points={{-69,80},{-50,80},{ - -50,98}}, color={0,0,127})); - connect(hexRec.port_a1, zone.ports[1]) annotation (Line(points={{-80,129.6},{97, - 129.6},{97,130},{100,130}}, color={0,127,255})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ - -150,134},{-150,-10}},color={0,0,127})); - connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, - 110.4},{-69,110},{-60,110}}, color={0,127,255})); - connect(vavDam.port_b, zone.ports[2]) annotation (Line(points={{60,110},{100,110}, - {100,130}}, color={0,127,255})); - connect(booleanToReal1.y, vavDam.y) - annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); - connect(hysAir.y, booleanToReal1.u) - annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); - connect(vavDam.port_a, fan.port_b) - annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); - connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, - 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); - connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, - {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); - connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, - {-120,110.4},{-110,110.4}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
              -
            • -September 4, 2023, by Jelger Jansen:
              -First implementation. -
            • -
            -", info=" -

            -For this last exercise, we first increase the window size -from 2 m2 to 6 m2. -

            -We will add a ventilation model that allows to perform free cooling -using outside air when solar irradiation heats up the room too much. -The system consists of a fan, a damper, a controller with an air temperature setpoint -between 23°C and 25°C, -and a heat recovery unit with a constant effectiveness of 85%. -The damper and fan have a nominal pressure drop/raise of 200 Pa. -The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. -The nominal mass flow rate of the ventilation system is 0.1 kg/s. -

            -

            Required models

            - -

            Connection instructions

            -

            -Connect the components such that they exchange mass (and therefore also energy) -with the MixingVolume representing the zone air. -Add a boundary_pT to draw air from the environment. -Enable its temperature input and connect it to the TDryBul variable in the weather data reader. -Also reconsider the nominal mass flow rate parameter value in the MixingVolume -given the flow rate information of the ventilation system. -

            -

            Reference result

            -

            -The figures below show the results. -

            -

            -\"Air -

            -

            -\"Ventilation -

            -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" - "Simulate and plot")); -end SimpleHouse6; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5(zone(nPorts=2), + mAir_flow_nominal=0.1, + A_win=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential + vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={50,110}))); + IBPSA.Fluid.Movers.FlowControlled_dp + fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + nominalValuesDefineDefaultPressureCurve=true, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={-50,110}))); + Modelica.Blocks.Sources.Constant const_dp(k=dpAir_nominal) "Pressure head" + annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness + hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); + IBPSA.Fluid.Sources.Boundary_pT + bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-130,130}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{-20,70},{0,90}}))); + Modelica.Blocks.Math.BooleanToReal booleanToReal1 + "Boolean to real" + annotation (Placement(transformation(extent={{20,70},{40,90}}))); +equation + connect(const_dp.y,fan. dp_in) annotation (Line(points={{-69,80},{-50,80},{ + -50,98}}, color={0,0,127})); + connect(hexRec.port_a1, zone.ports[1]) annotation (Line(points={{-80,129.6},{97, + 129.6},{97,130},{100,130}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ + -150,134},{-150,-10}},color={0,0,127})); + connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, + 110.4},{-69,110},{-60,110}}, color={0,127,255})); + connect(vavDam.port_b, zone.ports[2]) annotation (Line(points={{60,110},{100,110}, + {100,130}}, color={0,127,255})); + connect(booleanToReal1.y, vavDam.y) + annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); + connect(hysAir.y, booleanToReal1.u) + annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, + 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); + connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, + {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); + connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, + {-120,110.4},{-110,110.4}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
              +
            • +September 4, 2023, by Jelger Jansen:
              +First implementation. +
            • +
            +", info=" +

            +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

            +We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

            +

            Required models

            + +

            Connection instructions

            +

            +Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +

            +

            Reference result

            +

            +The figures below show the results. +

            +

            +\"Air +

            +

            +\"Ventilation +

            +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo similarity index 96% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo index 646e050e67..7d15a03902 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo @@ -1,4 +1,4 @@ -within IBPSA.Fluid.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouseTemplate "Template file for simple house example" extends Modelica.Icons.Example; @@ -80,7 +80,7 @@ equation textString="Cooling and ventilation")}), experiment(Tolerance=1E-6, StopTime=1e+06), __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" "Simulate and plot"), Documentation(revisions="
              diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo similarity index 72% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/package.mo index fb17f14a8e..db0815a96f 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo @@ -1,87 +1,87 @@ -within IBPSA.Fluid.Examples.Tutorial; -package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" -extends Modelica.Icons.ExamplesPackage; - - annotation (Documentation(info=" -

              -This package contains examples with step-by-step instructions for how to build a system model -for a simple house with a heating system, ventilation, and weather boundary conditions. -It serves as a demonstration case of how the IBPSA library can be used. -

              -

              -The goal of this exercise is to become familiar with Modelica and the IBPSA library. -Since the IBPSA library components are typically used by combining several components graphically, -the use of equations falls outside of the scope of this exercise. -

              -

              -For this exercise you will create a model of a simple house, -consisting of a heating system, one building zone, and a ventilation model. -The exercise starts from a template file that should not produce any errors. -This file will be extended in several steps, adding complexity. -In between each step the user should be able to simulate the model, -i.e., no errors should be produced and simulation results may be compared. -<\\p> -

              -The model has been created in the following stages: -

              -
                -
              1. - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate -contains a weather data reader which connects the thermal resistance of the building wall -to the dry bulb temperature and serves as a template to implement the entire SimpleHouse model. -
              2. -
              3. - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse1 -implements the building wall by adding a thermal capacity. -
              4. -
              5. - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse2 -adds a window to the building wall. -It is assumed that the total injected heat through the window equals the window surface area -multiplied by the direct horizontal solar irradiance. -
              6. -
              7. - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse3 -adds an air model which represents the room in the building. -
              8. -
              9. - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse4 -adds heating circuit consisting of a boiler, a radiator, -and an on/off circulation pump with a constant mass flow rate. -No controller is implemented yet, i.e. the pump and heater are always on. -
              10. -
              11. - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse5 -adds a hysteresis controller for the heating circuit that uses the room temperature as an input. -
              12. -
              13. - -IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse6 -adds a ventilation system consisting of a fan, a damper, a heat recovery unit, -and a hysteresis controller, that allows to perform free cooling using outside air. -
              14. -
              -

              -For each stage, firstly the model part is qualitatively explained. -Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. -Finally, we provide high-level instructions of how to set up the model. -If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, -try out some things, make an educated guess, etc. -Finally, we provide reference results that allow you to check if your implementation is correct. -Depending on the parameter values that you choose, results may differ. -<\\p> -

              -The graphical representation of the final model is given below. -<\\p> -

              -\"Graphical -

              -")); -end SimpleHouse; +within IBPSA.Examples.Tutorial; +package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" +extends Modelica.Icons.ExamplesPackage; + + annotation (Documentation(info=" +

              +This package contains examples with step-by-step instructions for how to build a system model +for a simple house with a heating system, ventilation, and weather boundary conditions. +It serves as a demonstration case of how the IBPSA library can be used. +

              +

              +The goal of this exercise is to become familiar with Modelica and the IBPSA library. +Since the IBPSA library components are typically used by combining several components graphically, +the use of equations falls outside of the scope of this exercise. +

              +

              +For this exercise you will create a model of a simple house, +consisting of a heating system, one building zone, and a ventilation model. +The exercise starts from a template file that should not produce any errors. +This file will be extended in several steps, adding complexity. +In between each step the user should be able to simulate the model, +i.e., no errors should be produced and simulation results may be compared. +<\\p> +

              +The model has been created in the following stages: +

              +
                +
              1. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate +contains a weather data reader which connects the thermal resistance of the building wall +to the dry bulb temperature and serves as a template to implement the entire SimpleHouse model. +
              2. +
              3. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse1 +implements the building wall by adding a thermal capacity. +
              4. +
              5. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse2 +adds a window to the building wall. +It is assumed that the total injected heat through the window equals the window surface area +multiplied by the direct horizontal solar irradiance. +
              6. +
              7. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse3 +adds an air model which represents the room in the building. +
              8. +
              9. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse4 +adds heating circuit consisting of a boiler, a radiator, +and an on/off circulation pump with a constant mass flow rate. +No controller is implemented yet, i.e. the pump and heater are always on. +
              10. +
              11. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse5 +adds a hysteresis controller for the heating circuit that uses the room temperature as an input. +
              12. +
              13. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6 +adds a ventilation system consisting of a fan, a damper, a heat recovery unit, +and a hysteresis controller, that allows to perform free cooling using outside air. +
              14. +
              +

              +For each stage, firstly the model part is qualitatively explained. +Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. +Finally, we provide high-level instructions of how to set up the model. +If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, +try out some things, make an educated guess, etc. +Finally, we provide reference results that allow you to check if your implementation is correct. +Depending on the parameter values that you choose, results may differ. +<\\p> +

              +The graphical representation of the final model is given below. +<\\p> +

              +\"Graphical +

              +")); +end SimpleHouse; diff --git a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.order b/IBPSA/Examples/Tutorial/SimpleHouse/package.order similarity index 93% rename from IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.order rename to IBPSA/Examples/Tutorial/SimpleHouse/package.order index d7aab4bb28..799bd75e29 100644 --- a/IBPSA/Fluid/Examples/Tutorial/SimpleHouse/package.order +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.order @@ -1,7 +1,7 @@ -SimpleHouseTemplate -SimpleHouse1 -SimpleHouse2 -SimpleHouse3 -SimpleHouse4 -SimpleHouse5 -SimpleHouse6 +SimpleHouse1 +SimpleHouse2 +SimpleHouse3 +SimpleHouse4 +SimpleHouse5 +SimpleHouse6 +SimpleHouseTemplate diff --git a/IBPSA/Examples/Tutorial/package.mo b/IBPSA/Examples/Tutorial/package.mo new file mode 100644 index 0000000000..c949a59d8e --- /dev/null +++ b/IBPSA/Examples/Tutorial/package.mo @@ -0,0 +1,13 @@ +within IBPSA.Examples; +package Tutorial "Tutorial with step by step instructions for how to build system models" + extends Modelica.Icons.Information; + +annotation (preferredView="info", Documentation(info=" +

              +This package contains examples of system models with step by step +instructions for how to build such models. +The examples are meant to instruct new users on how to build +large system models. +

              +")); +end Tutorial; diff --git a/IBPSA/Examples/Tutorial/package.order b/IBPSA/Examples/Tutorial/package.order new file mode 100644 index 0000000000..6e0ff92568 --- /dev/null +++ b/IBPSA/Examples/Tutorial/package.order @@ -0,0 +1 @@ +SimpleHouse diff --git a/IBPSA/Examples/package.mo b/IBPSA/Examples/package.mo new file mode 100644 index 0000000000..e6c1857adb --- /dev/null +++ b/IBPSA/Examples/package.mo @@ -0,0 +1,11 @@ +within IBPSA; +package Examples "Collection of models that illustrate model use and test models" + extends Modelica.Icons.ExamplesPackage; +annotation (preferredView="info", Documentation(info=" +

              +This package contains examples for the use of models that can be found in + +IBPSA. +

              +")); +end Examples; diff --git a/IBPSA/Examples/package.order b/IBPSA/Examples/package.order new file mode 100644 index 0000000000..cb1be3b6b6 --- /dev/null +++ b/IBPSA/Examples/package.order @@ -0,0 +1 @@ +Tutorial diff --git a/IBPSA/Fluid/Examples/Tutorial/package.order b/IBPSA/Fluid/Examples/Tutorial/package.order index 718da42793..e69de29bb2 100644 --- a/IBPSA/Fluid/Examples/Tutorial/package.order +++ b/IBPSA/Fluid/Examples/Tutorial/package.order @@ -1 +0,0 @@ -SimpleHouse diff --git a/IBPSA/Fluid/Examples/package.order b/IBPSA/Fluid/Examples/package.order index c9f7482449..60761ce170 100644 --- a/IBPSA/Fluid/Examples/package.order +++ b/IBPSA/Fluid/Examples/package.order @@ -1,5 +1,5 @@ -Tutorial -ResistanceVolumeFlowReversal -SimpleHouse -FlowSystem -Performance +Tutorial +ResistanceVolumeFlowReversal +SimpleHouse +FlowSystem +Performance diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/airModel.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/airModel.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/airModel.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/airModel.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/heatingControllerModel.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/heatingControllerModel.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/heatingControllerModel.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/heatingControllerModel.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result1.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result1.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result1.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result1.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result2.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result2.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result2.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result2.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result3.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result3.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result3.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result3.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result4.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result4.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result4.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result4.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result5.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result5.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result5.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result5.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result6.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result6.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result6.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result6.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result7.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result7.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/result7.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/result7.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simpleHouse.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/simpleHouse.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simpleHouse.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/simpleHouse.png diff --git a/IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simulate.png b/IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/simulate.png similarity index 100% rename from IBPSA/Resources/Images/Fluid/Examples/Tutorial/SimpleHouse/simulate.png rename to IBPSA/Resources/Images/Examples/Tutorial/SimpleHouse/simulate.png diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt similarity index 100% rename from IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt rename to IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse1.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt similarity index 100% rename from IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt rename to IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse2.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt similarity index 100% rename from IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt rename to IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt similarity index 100% rename from IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt rename to IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt similarity index 100% rename from IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt rename to IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt similarity index 100% rename from IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt rename to IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt similarity index 100% rename from IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt rename to IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos new file mode 100644 index 0000000000..4ad1c90598 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse1", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse1"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos new file mode 100644 index 0000000000..8761414bb7 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse2", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse2"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos new file mode 100644 index 0000000000..f3178944ed --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse3", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse3"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos similarity index 62% rename from IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos rename to IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos index 643b361a7e..2aa9e1d9d0 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos @@ -1,3 +1,3 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse4", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse4"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 80}, grid=true, colors={{28,108,200}}); +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse4", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse4"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 80}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos similarity index 62% rename from IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos rename to IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos index 2f1dbbcb07..39f7d7c6d0 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos @@ -1,3 +1,3 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse5", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse5"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 24}, grid=true, colors={{28,108,200}}); +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse5", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse5"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 24}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos similarity index 77% rename from IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos rename to IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos index 3233744180..09659816a9 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos @@ -1,5 +1,5 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse6", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse6"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 26}, grid=true, colors={{28,108,200}}); -createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); -createPlot(id=1, position={0, 0, 792, 413}, y={"vavDam.y"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=3, colors={{28,108,200}}); -createPlot(id=2, position={818, 10, 662, 377}, y={"fan.sta_a.T", "fan.sta_b.T"}, range={0.0, 380.0, 18.0, 22.5}, grid=true, colors={{28,108,200}, {238,46,47}}); +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse6"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 26}, grid=true, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 413}, y={"vavDam.y"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=3, colors={{28,108,200}}); +createPlot(id=2, position={818, 10, 662, 377}, y={"fan.sta_a.T", "fan.sta_b.T"}, range={0.0, 380.0, 18.0, 22.5}, grid=true, colors={{28,108,200}, {238,46,47}}); diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos new file mode 100644 index 0000000000..eda0138cac --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos @@ -0,0 +1,2 @@ +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouseTemplate"); +createPlot(id=1,position={0, 0, 792, 1247}, y={"Tout.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos deleted file mode 100644 index b89a0cf735..0000000000 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos +++ /dev/null @@ -1,2 +0,0 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse1", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse1"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos deleted file mode 100644 index 407e952a31..0000000000 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos +++ /dev/null @@ -1,2 +0,0 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse2", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse2"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"walCap.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos deleted file mode 100644 index 0e74776c7d..0000000000 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos +++ /dev/null @@ -1,2 +0,0 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouse3", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse3"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos deleted file mode 100644 index a5dd484d72..0000000000 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos +++ /dev/null @@ -1,2 +0,0 @@ -simulateModel("IBPSA.Fluid.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouseTemplate"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"Tout.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/package.order b/IBPSA/package.order index 6db2633767..93b5597f59 100644 --- a/IBPSA/package.order +++ b/IBPSA/package.order @@ -8,5 +8,6 @@ Media ThermalZones Utilities Types +Examples Experimental Obsolete From 625b981799c9c1bfca40303791d1dc75f09eb5f3 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Mon, 11 Sep 2023 07:43:42 -0700 Subject: [PATCH 16/48] Corrected hyperlinks --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo | 2 +- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index 512c2c5a4d..8865980418 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -45,7 +45,7 @@ two times the outdoor solar irradiance is injected as heat onto the inside of th Modelica.Blocks.Math.Gain
            • - + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow
            diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 8535ebcac8..29dc82911c 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -63,8 +63,8 @@ Set its value to MediumAir, which is declared in the template, by typing redeclare package Medium = MediumAir. For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. You will have to change this value once you add a ventilation system to the model (see - -IBPSA.Examples.Tutorial.SimpleHouse6). + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). Finally, set the energyDynamics of the MixingVolume, which can be found in the Dynamics tab of the model parameter window, to FixedInitial.

            From e0007678cec11797345ed98695ad8eda859df5a2 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Mon, 11 Sep 2023 07:56:08 -0700 Subject: [PATCH 17/48] Deleted old files --- IBPSA/Fluid/Examples/Tutorial/package.mo | 11 ----------- IBPSA/Fluid/Examples/Tutorial/package.order | 0 IBPSA/Fluid/Examples/package.order | 1 - 3 files changed, 12 deletions(-) delete mode 100644 IBPSA/Fluid/Examples/Tutorial/package.mo delete mode 100644 IBPSA/Fluid/Examples/Tutorial/package.order diff --git a/IBPSA/Fluid/Examples/Tutorial/package.mo b/IBPSA/Fluid/Examples/Tutorial/package.mo deleted file mode 100644 index df598c1356..0000000000 --- a/IBPSA/Fluid/Examples/Tutorial/package.mo +++ /dev/null @@ -1,11 +0,0 @@ -within IBPSA.Fluid.Examples; -package Tutorial -extends Modelica.Icons.Information; - -annotation (Documentation(info=" -

            -This package contains examples of system models with step by step instructions for how to build such models. -The examples are meant to instruct new users on how to build large system models. -

            -")); -end Tutorial; diff --git a/IBPSA/Fluid/Examples/Tutorial/package.order b/IBPSA/Fluid/Examples/Tutorial/package.order deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/IBPSA/Fluid/Examples/package.order b/IBPSA/Fluid/Examples/package.order index 60761ce170..dfba118b86 100644 --- a/IBPSA/Fluid/Examples/package.order +++ b/IBPSA/Fluid/Examples/package.order @@ -1,4 +1,3 @@ -Tutorial ResistanceVolumeFlowReversal SimpleHouse FlowSystem From 5747b731ef3581240600607763abfcfc2af168fd Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Mon, 11 Sep 2023 07:59:04 -0700 Subject: [PATCH 18/48] Added IBPSA.Examples to CI tests --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 900f28fe0c..59a2e8a6dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,8 +29,8 @@ env: # Test matrix for regression tests. # The documentation is tested using github actions. - TEST_ARG="make test-bestest" - - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.Experimental\"" - - TEST_ARG="make test-openmodelica PACKAGE=\"IBPSA.Experimental\"" + - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.{Examples,Experimental}\"" + - TEST_ARG="make test-openmodelica PACKAGE=\"IBPSA.{Examples,Experimental}\"" - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.Fluid.{Actuators,BaseClasses,Chillers,Delays,Geothermal,Examples,FMI,FixedResistances}\"" - TEST_ARG="make test-openmodelica PACKAGE=\"IBPSA.Fluid.{Actuators,BaseClasses,Chillers,Delays,Geothermal,Examples,FMI,FixedResistances}\"" - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.Fluid.{HeatExchangers,HeatPumps,Humidifiers,Interfaces,MassExchangers,MixingVolumes,Movers,Sensors,Sources,Storage}\"" From b63b01d605f20396d93c2957c0a6fa303425632a Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Mon, 11 Sep 2023 08:30:51 -0700 Subject: [PATCH 19/48] Corrected html syntax --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo | 6 +++--- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo | 4 ++-- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 6 +++--- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo | 3 ++- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index fa68236ba3..f673a51f75 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -26,10 +26,10 @@ First implementation. A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. The house consists of a wall represented by a single heat capacitor and a thermal resistor. The thermal resistor and boundary temperature are already included in the template. -The wall has a surface area of Awall=100 m2, +The wall has a surface area of Awall=100 m2, a thickness of dwall=25 cm, a thermal conductivity of kwall=0.04 W/(m K), -a density of ρwall=2000 kg/m3, +a density of ρwall=2000 kg/m3, and a specific heat capacity of cp,wall= 1000 J/(kg K)

            @@ -40,7 +40,7 @@ You can use this way of declaring parameters in the remainder of this exercise,

            The conductive thermal resistance value of a wall may be computed as R=d/(A*k). -The heat capacity value of a wall may be computed as C=A*d*c_p*ρ +The heat capacity value of a wall may be computed as C=A*d*c_p*ρ

            Required models

              diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index 8865980418..cd68775e50 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -54,11 +54,11 @@ Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow To be able to use the value of the outdoor solar irradiance you will need to access the weather data reader. To do this, make a connection to the weaBus. -In the dialog box select and here type HDirNor, +In the dialog box select <New Variable> and here type HDirNor, which is the direct solar irradiance on a surface of 1 m2, perpendicular to the sun rays. Set the gain factor k to 2, -in order to get the solar irradiance through the window of 2 m2. +in order to get the solar irradiance through the window of 2 m2.

              Make a connection with the PrescribedHeatFlow as well. diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index bff508b2c0..a99ce51720 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -72,11 +72,11 @@ First implementation.

              The wall temperature (and therefore the room temperature) is quite low. In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60°C<\\i> -and 40°C<\\i>, and a room air and radiative temperature of 20°C<\\i>. +The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. The pump has a (nominal) mass flow rate of 0.1 kg/s. Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater<\\i>. +the media for the models in the heating circuit should be set to MediumWater.

              Required models

                diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 7163bc357e..4b744a7eec 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -89,8 +89,9 @@ First implementation. ", info="

                For this last exercise, we first increase the window size -from 2 m2 to 6 m2. +from 2 m2 to 6 m2.

                +

                We will add a ventilation model that allows to perform free cooling using outside air when solar irradiation heats up the room too much. The system consists of a fan, a damper, a controller with an air temperature setpoint From b8951a9f1155be9560349c426e56a4e8f333dcc3 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Mon, 11 Sep 2023 10:05:57 -0700 Subject: [PATCH 20/48] Corrected annotation --- .../Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo index 7d15a03902..10dcdda6dc 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo @@ -56,25 +56,25 @@ equation pattern=LinePattern.None), Text( extent={{98,20},{32,38}}, - lineColor={0,0,127}, + textColor={0,0,127}, fillColor={255,213,170}, fillPattern=FillPattern.Solid, textString="Wall"), Text( extent={{-148,-86},{-214,-68}}, - lineColor={0,0,127}, + textColor={0,0,127}, fillColor={255,213,170}, fillPattern=FillPattern.Solid, textString="Heating"), Text( extent={{-118,18},{-214,40}}, - lineColor={0,0,127}, + textColor={0,0,127}, fillColor={255,213,170}, fillPattern=FillPattern.Solid, textString="Weather inputs"), Text( extent={{-76,158},{-214,180}}, - lineColor={0,0,127}, + textColor={0,0,127}, fillColor={255,213,170}, fillPattern=FillPattern.Solid, textString="Cooling and ventilation")}), From fa4023091e4e9601b092b5619c01b0afd83f188b Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 15:28:02 +0200 Subject: [PATCH 21/48] Rename SimpleHouseTemplate to SimpleHouse0 --- ...SimpleHouseTemplate.mo => SimpleHouse0.mo} | 206 +++++++++--------- .../Tutorial/SimpleHouse/SimpleHouse1.mo | 154 ++++++------- .../Tutorial/SimpleHouse/package.order | 14 +- 3 files changed, 187 insertions(+), 187 deletions(-) rename IBPSA/Examples/Tutorial/SimpleHouse/{SimpleHouseTemplate.mo => SimpleHouse0.mo} (96%) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo similarity index 96% rename from IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo rename to IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index 10dcdda6dc..938a9cd943 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -1,103 +1,103 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouseTemplate - "Template file for simple house example" - extends Modelica.Icons.Example; - package MediumAir = IBPSA.Media.Air "Medium model for air"; - package MediumWater = IBPSA.Media.Water "Medium model for water"; - parameter Modelica.Units.SI.Area A_wall = 100 "Wall area"; - parameter Modelica.Units.SI.Length d_wall = 0.25 "Wall thickness"; - parameter Modelica.Units.SI.ThermalConductivity k_wall = 0.04 "Wall thermal conductivity"; - parameter Modelica.Units.SI.Density rho_wall = 2000 "Wall density"; - parameter Modelica.Units.SI.SpecificHeatCapacity cp_wall = 1000 "Wall specific heat capacity"; - IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= - ModelicaServices.ExternalReferences.loadResource( - "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) - "Weather data reader" - annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); - IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" - annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature Tout - "Exterior temperature boundary condition" - annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes( - R=d_wall/A_wall/k_wall) - "Thermal resistor for wall: 25 cm of rockwool" - annotation (Placement(transformation(extent={{80,-10},{100,10}}))); -equation - connect(weaDat.weaBus, weaBus) annotation (Line( - points={{-180,-10},{-150,-10}}, - color={255,204,51}, - thickness=0.5)); - connect(Tout.T, weaBus.TDryBul) - annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); - connect(Tout.port,wallRes. port_a) - annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}}), graphics={ - Rectangle( - extent={{-220,40},{20,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,-60},{180,-200}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,180},{180,60}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{40,40},{180,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Text( - extent={{98,20},{32,38}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Wall"), - Text( - extent={{-148,-86},{-214,-68}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Heating"), - Text( - extent={{-118,18},{-214,40}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Weather inputs"), - Text( - extent={{-76,158},{-214,180}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Cooling and ventilation")}), - experiment(Tolerance=1E-6, StopTime=1e+06), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" - "Simulate and plot"), - Documentation(revisions=" -

                  -
                • -September 4, 2023, by Jelger Jansen:
                  -Replace IDEAS by IBPSA models. -
                • -
                • -October 11, 2016, by Filip Jorissen:
                  -First implementation. -
                • -
                -", info=" -

                -This model is used as the starting point for the SimpleHouse tutorial. -It was copied from the Modelica crash course organised by KU Leuven -(https://github.com/open-ideas/__CrashCourse__). -

                -")); -end SimpleHouseTemplate; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse0 + "Template file for simple house example" + extends Modelica.Icons.Example; + package MediumAir = IBPSA.Media.Air "Medium model for air"; + package MediumWater = IBPSA.Media.Water "Medium model for water"; + parameter Modelica.Units.SI.Area A_wall = 100 "Wall area"; + parameter Modelica.Units.SI.Length d_wall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity k_wall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rho_wall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cp_wall = 1000 "Wall specific heat capacity"; + IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + "Weather data reader" + annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); + IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature Tout + "Exterior temperature boundary condition" + annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes( + R=d_wall/A_wall/k_wall) + "Thermal resistor for wall: 25 cm of rockwool" + annotation (Placement(transformation(extent={{80,-10},{100,10}}))); +equation + connect(weaDat.weaBus, weaBus) annotation (Line( + points={{-180,-10},{-150,-10}}, + color={255,204,51}, + thickness=0.5)); + connect(Tout.T, weaBus.TDryBul) + annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); + connect(Tout.port,wallRes. port_a) + annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}}), graphics={ + Rectangle( + extent={{-220,40},{20,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,-60},{180,-200}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,180},{180,60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{40,40},{180,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Text( + extent={{98,20},{32,38}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Wall"), + Text( + extent={{-148,-86},{-214,-68}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Heating"), + Text( + extent={{-118,18},{-214,40}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Weather inputs"), + Text( + extent={{-76,158},{-214,180}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Cooling and ventilation")}), + experiment(Tolerance=1E-6, StopTime=1e+06), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" + "Simulate and plot"), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +Replace IDEAS by IBPSA models. +
                • +
                • +October 11, 2016, by Filip Jorissen:
                  +First implementation. +
                • +
                +", info=" +

                +This model is used as the starting point for the SimpleHouse tutorial. +It was copied from the Modelica crash course organised by KU Leuven +(https://github.com/open-ideas/__CrashCourse__). +

                +")); +end SimpleHouse0; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index f673a51f75..28620b845f 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -1,77 +1,77 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse1 "Building wall model" - extends SimpleHouseTemplate; - - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - C=A_wall*d_wall*cp_wall*rho_wall, T(fixed=true)) - "Thermal mass of walls" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={150,0}))); -equation - connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{130,0}, - {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                  -
                • -September 4, 2023, by Jelger Jansen:
                  -First implementation. -
                • -
                -", info=" -

                -A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. -The house consists of a wall represented by a single heat capacitor and a thermal resistor. -The thermal resistor and boundary temperature are already included in the template. -The wall has a surface area of Awall=100 m2, -a thickness of dwall=25 cm, -a thermal conductivity of kwall=0.04 W/(m K), -a density of ρwall=2000 kg/m3, -and a specific heat capacity of cp,wall= 1000 J/(kg K) -

                -

                -These parameters are already declared in the equation section of - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate.SimpleHouseTemplate. -You can use this way of declaring parameters in the remainder of this exercise, but this is not required. -

                -

                -The conductive thermal resistance value of a wall may be computed as R=d/(A*k). -The heat capacity value of a wall may be computed as C=A*d*c_p*ρ -

                -

                Required models

                - -

                Connection instructions

                -

                -Connect the heat capacitor to the thermal resistor. -

                -

                Reference result

                -

                -If you correctly added the model of the heat capacitor, -connected it to the resistor and added the parameter values for C, -then you should be able to simulate the model. -To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. -You can now simulate the model by pressing the Simulate button. -

                -

                -You can plot individual variables values by clicking on their name in the variable browser on the left. -Now plot the wall capacitor temperature value T. -It should look like the figure below (1 Ms is around 12 days). -

                -

                -\"Wall -

                -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" - "Simulate and plot")); -end SimpleHouse1; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse1 "Building wall model" + extends SimpleHouse0; + + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( + C=A_wall*d_wall*cp_wall*rho_wall, T(fixed=true)) + "Thermal mass of walls" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={150,0}))); +equation + connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{130,0}, + {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +First implementation. +
                • +
                +", info=" +

                +A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. +The house consists of a wall represented by a single heat capacitor and a thermal resistor. +The thermal resistor and boundary temperature are already included in the template. +The wall has a surface area of Awall=100 m2, +a thickness of dwall=25 cm, +a thermal conductivity of kwall=0.04 W/(m K), +a density of ρwall=2000 kg/m3, +and a specific heat capacity of cp,wall= 1000 J/(kg K) +

                +

                +These parameters are already declared in the equation section of + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate.SimpleHouseTemplate. +You can use this way of declaring parameters in the remainder of this exercise, but this is not required. +

                +

                +The conductive thermal resistance value of a wall may be computed as R=d/(A*k). +The heat capacity value of a wall may be computed as C=A*d*c_p*ρ +

                +

                Required models

                + +

                Connection instructions

                +

                +Connect the heat capacitor to the thermal resistor. +

                +

                Reference result

                +

                +If you correctly added the model of the heat capacitor, +connected it to the resistor and added the parameter values for C, +then you should be able to simulate the model. +To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. +You can now simulate the model by pressing the Simulate button. +

                +

                +You can plot individual variables values by clicking on their name in the variable browser on the left. +Now plot the wall capacitor temperature value T. +It should look like the figure below (1 Ms is around 12 days). +

                +

                +\"Wall +

                +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" + "Simulate and plot")); +end SimpleHouse1; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/package.order b/IBPSA/Examples/Tutorial/SimpleHouse/package.order index 799bd75e29..c7d826c325 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/package.order +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.order @@ -1,7 +1,7 @@ -SimpleHouse1 -SimpleHouse2 -SimpleHouse3 -SimpleHouse4 -SimpleHouse5 -SimpleHouse6 -SimpleHouseTemplate +SimpleHouse0 +SimpleHouse1 +SimpleHouse2 +SimpleHouse3 +SimpleHouse4 +SimpleHouse5 +SimpleHouse6 From beb647c7b85c0427273203c0ad669c57043280e8 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 15:40:53 +0200 Subject: [PATCH 22/48] Remove the thermal resistor of the wall from SimpleHouse0 and include it in SimpleHouse1. Furthermore, the information section of SimpleHouse1 is updated with the modeling information of the thermal resistor. --- .../Tutorial/SimpleHouse/SimpleHouse0.mo | 8 +----- .../Tutorial/SimpleHouse/SimpleHouse1.mo | 27 ++++++++++++++----- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index 938a9cd943..fe8e3a5eb0 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -1,6 +1,6 @@ within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse0 - "Template file for simple house example" + "Start file for simple house example" extends Modelica.Icons.Example; package MediumAir = IBPSA.Media.Air "Medium model for air"; package MediumWater = IBPSA.Media.Water "Medium model for water"; @@ -19,10 +19,6 @@ model SimpleHouse0 Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature Tout "Exterior temperature boundary condition" annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes( - R=d_wall/A_wall/k_wall) - "Thermal resistor for wall: 25 cm of rockwool" - annotation (Placement(transformation(extent={{80,-10},{100,10}}))); equation connect(weaDat.weaBus, weaBus) annotation (Line( points={{-180,-10},{-150,-10}}, @@ -30,8 +26,6 @@ equation thickness=0.5)); connect(Tout.T, weaBus.TDryBul) annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); - connect(Tout.port,wallRes. port_a) - annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}}), graphics={ Rectangle( diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 28620b845f..6787a68270 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -8,9 +8,15 @@ model SimpleHouse1 "Building wall model" annotation (Placement(transformation(extent={{-10,-10},{10,10}}, rotation=270, origin={150,0}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes(R=d_wall/ + A_wall/k_wall) + "Thermal resistor for wall: 25 cm of rockwool" + annotation (Placement(transformation(extent={{80,-10},{100,10}}))); equation - connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{130,0}, - {130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{112,0}, + {112,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + connect(Tout.port, wallRes.port_a) + annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), experiment(Tolerance=1e-6, StopTime=1e+06), @@ -25,7 +31,9 @@ First implementation.

                A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. The house consists of a wall represented by a single heat capacitor and a thermal resistor. -The thermal resistor and boundary temperature are already included in the template. +The boundary temperature are already included in + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. The wall has a surface area of Awall=100 m2, a thickness of dwall=25 cm, a thermal conductivity of kwall=0.04 W/(m K), @@ -34,24 +42,29 @@ and a specific heat capacity of cp,wall= 1000 J/(kg K)

                These parameters are already declared in the equation section of - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate.SimpleHouseTemplate. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. You can use this way of declaring parameters in the remainder of this exercise, but this is not required.

                The conductive thermal resistance value of a wall may be computed as R=d/(A*k). -The heat capacity value of a wall may be computed as C=A*d*c_p*ρ +The heat capacity value of a wall may be computed as C=A*d*cp

                Required models

                Connection instructions

                -Connect the heat capacitor to the thermal resistor. +Connect one side of the thermal resistor to the output of Tout and +the other side of the thermal resistor to the heat capacitor.

                Reference result

                From 586d68934a1ea6aa482909837a4b8d5acbcd530c Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 16:16:22 +0200 Subject: [PATCH 23/48] Rename parameters to comply with the naming convention, fix appearance of 3kW in documentation --- .../Tutorial/SimpleHouse/SimpleHouse0.mo | 14 +- .../Tutorial/SimpleHouse/SimpleHouse1.mo | 17 +- .../Tutorial/SimpleHouse/SimpleHouse2.mo | 159 +++++----- .../Tutorial/SimpleHouse/SimpleHouse3.mo | 175 ++++++----- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 265 ++++++++-------- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 172 ++++++----- .../Tutorial/SimpleHouse/SimpleHouse6.mo | 285 +++++++++--------- 7 files changed, 539 insertions(+), 548 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index fe8e3a5eb0..573d0e319b 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -4,11 +4,11 @@ model SimpleHouse0 extends Modelica.Icons.Example; package MediumAir = IBPSA.Media.Air "Medium model for air"; package MediumWater = IBPSA.Media.Water "Medium model for water"; - parameter Modelica.Units.SI.Area A_wall = 100 "Wall area"; - parameter Modelica.Units.SI.Length d_wall = 0.25 "Wall thickness"; - parameter Modelica.Units.SI.ThermalConductivity k_wall = 0.04 "Wall thermal conductivity"; - parameter Modelica.Units.SI.Density rho_wall = 2000 "Wall density"; - parameter Modelica.Units.SI.SpecificHeatCapacity cp_wall = 1000 "Wall specific heat capacity"; + parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; + parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= ModelicaServices.ExternalReferences.loadResource( "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) @@ -16,7 +16,7 @@ model SimpleHouse0 annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature Tout + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut "Exterior temperature boundary condition" annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); equation @@ -24,7 +24,7 @@ equation points={{-180,-10},{-150,-10}}, color={255,204,51}, thickness=0.5)); - connect(Tout.T, weaBus.TDryBul) + connect(TOut.T, weaBus.TDryBul) annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}}), graphics={ diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 6787a68270..6cfca3a935 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -3,19 +3,18 @@ model SimpleHouse1 "Building wall model" extends SimpleHouse0; Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - C=A_wall*d_wall*cp_wall*rho_wall, T(fixed=true)) - "Thermal mass of walls" + C=AWall*dWall*cpWall*rhoWall, T(fixed=true)) + "Thermal mass of wall" annotation (Placement(transformation(extent={{-10,-10},{10,10}}, rotation=270, origin={150,0}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes(R=d_wall/ - A_wall/k_wall) - "Thermal resistor for wall: 25 cm of rockwool" + Modelica.Thermal.HeatTransfer.Components.ThermalResistor walRes(R=dWall/AWall + /kWall) "Thermal resistor for wall: 25 cm of rockwool" annotation (Placement(transformation(extent={{80,-10},{100,10}}))); equation - connect(wallRes.port_b, walCap.port) annotation (Line(points={{100,0},{112,0}, + connect(walRes.port_b, walCap.port) annotation (Line(points={{100,0},{112,0}, {112,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - connect(Tout.port, wallRes.port_a) + connect(TOut.port, walRes.port_a) annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), @@ -63,8 +62,8 @@ Modelica.Thermal.HeatTransfer.Components.HeatCapacitor

              Connection instructions

              -Connect one side of the thermal resistor to the output of Tout and -the other side of the thermal resistor to the heat capacitor. +Connect one side of the thermal resistor to the output of PrescribedTemperature +and the other side of the thermal resistor to the heat capacitor.

              Reference result

              diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index cd68775e50..1ad4c663ca 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -1,80 +1,79 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse2 "Building window model" - extends SimpleHouse1; - - parameter Modelica.Units.SI.Area A_win=2 "Window area"; - - Modelica.Blocks.Math.Gain gaiWin(k=A_win) - "Gain for solar irradiance through the window" - annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow window - "Very simple window model" - annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); -equation - connect(gaiWin.y,window. Q_flow) annotation (Line(points={{-39,-30},{-20,-30}}, - color={0,0,127})); - connect(window.port, walCap.port) annotation (Line(points={{0,-30},{132,-30},{ - 132,1.77636e-15},{140,1.77636e-15}}, - color={191,0,0})); - connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-62,-30},{-150,-30}, - {-150,-10}}, color={0,0,127}), Text( - string="%second", - index=1, - extent={{-6,3},{-6,3}}, - horizontalAlignment=TextAlignment.Right)); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -

                -
              • -September 4, 2023, by Jelger Jansen:
                -First implementation. -
              • -
              -", info=" -

              -The window has a surface area of 2 m2. -In this simple model we will therefore assume that -two times the outdoor solar irradiance is injected as heat onto the inside of the wall. -

              -

              Required models

              - -

              Connection instructions

              -

              -To be able to use the value of the outdoor solar irradiance -you will need to access the weather data reader. -To do this, make a connection to the weaBus. -In the dialog box select <New Variable> and here type HDirNor, -which is the direct solar irradiance on a surface of 1 m2, -perpendicular to the sun rays. -Set the gain factor k to 2, -in order to get the solar irradiance through the window of 2 m2. -

              -

              -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

              -

              Reference result

              -

              -The result with and without the window model is plotted in the figure below. -

              -

              -\"Wall -

              -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" - "Simulate and plot")); -end SimpleHouse2; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse2 "Building window model" + extends SimpleHouse1; + + parameter Modelica.Units.SI.Area AWin=2 "Window area"; + + Modelica.Blocks.Math.Gain gaiWin(k=AWin) + "Gain for solar irradiance through the window" + annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win + "Very simple window model" + annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); +equation + connect(gaiWin.y, win.Q_flow) + annotation (Line(points={{-39,-30},{-20,-30}}, color={0,0,127})); + connect(win.port, walCap.port) annotation (Line(points={{0,-30},{132,-30},{132, + 1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-62,-30},{-150,-30}, + {-150,-10}}, color={0,0,127}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                +
              • +September 4, 2023, by Jelger Jansen:
                +First implementation. +
              • +
              +", info=" +

              +The window has a surface area of 2 m2. +In this simple model we will therefore assume that +two times the outdoor solar irradiance is injected as heat onto the inside of the wall. +

              +

              Required models

              + +

              Connection instructions

              +

              +To be able to use the value of the outdoor solar irradiance +you will need to access the weather data reader. +To do this, make a connection to the weaBus. +In the dialog box select <New Variable> and here type HDirNor, +which is the direct solar irradiance on a surface of 1 m2, +perpendicular to the sun rays. +Set the gain factor k to 2, +in order to get the solar irradiance through the window of 2 m2. +

              +

              +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

              +

              Reference result

              +

              +The result with and without the window model is plotted in the figure below. +

              +

              +\"Wall +

              +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" + "Simulate and plot")); +end SimpleHouse2; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 29dc82911c..154ae4da84 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -1,88 +1,87 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse3 "Air model" - extends SimpleHouse2; - - parameter Modelica.Units.SI.Volume V_zone=8*8*3 "Zone volume"; - parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 - "Nominal mass flow rate for air loop"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer h_wall=2 - "Convective heat transfer coefficient at the wall"; - - Modelica.Thermal.HeatTransfer.Components.ThermalResistor convRes(R=1/2/A_wall) - "Thermal resistance for convective heat transfer" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={130,20}))); - IBPSA.Fluid.MixingVolumes.MixingVolume zone( - redeclare package Medium = MediumAir, - V=V_zone, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - m_flow_nominal=mAir_flow_nominal) - "Very simple zone air model" - annotation (Placement(transformation(extent={{110,130},{90,150}}))); -equation - connect(convRes.port_b, walCap.port) - annotation (Line(points={{130,10},{130,1.77636e-15},{140,1.77636e-15}}, - color={191,0,0})); - connect(zone.heatPort, convRes.port_a) - annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                -
              • -September 4, 2023, by Jelger Jansen:
                -First implementation. -
              • -
              -", info=" -

              -To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. -The air will exchange heat with the wall. -This may be modelled using a thermal resistance representing -the convective heat resistance which is equal to Rconv=1/(h*A), -where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. -

              -

              Required models

              - -

              Connection instructions

              -

              -The MixingVolume Medium parameter contains information about -the type of fluid and its properties that should be modelled by the MixingVolume. -Set its value to MediumAir, which is declared in the template, -by typing redeclare package Medium = MediumAir. -For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. -You will have to change this value once you add a ventilation system to the model (see - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). -Finally, set the energyDynamics of the MixingVolume, -which can be found in the Dynamics tab of the model parameter window, to FixedInitial. -

              -

              -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

              -

              Reference result

              -

              -The result with and without the air model is plotted in the figure below. -

              -

              -\"Wall -

              -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" - "Simulate and plot")); -end SimpleHouse3; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse3 "Air model" + extends SimpleHouse2; + + parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 + "Nominal mass flow rate for air loop"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 + "Convective heat transfer coefficient at the wall"; + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ + AWall) "Thermal resistance for convective heat transfer" annotation ( + Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={130,20}))); + IBPSA.Fluid.MixingVolumes.MixingVolume zon( + redeclare package Medium = MediumAir, + V=VZone, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" + annotation (Placement(transformation(extent={{110,130},{90,150}}))); +equation + connect(conRes.port_b, walCap.port) annotation (Line(points={{130,10},{130, + 1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + connect(zon.heatPort, conRes.port_a) + annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                +
              • +September 4, 2023, by Jelger Jansen:
                +First implementation. +
              • +
              +", info=" +

              +To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. +The air will exchange heat with the wall. +This may be modelled using a thermal resistance representing +the convective heat resistance which is equal to Rconv=1/(h*A), +where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. +

              +

              Required models

              + +

              Connection instructions

              +

              +The MixingVolume Medium parameter contains information about +the type of fluid and its properties that should be modelled by the MixingVolume. +Set its value to MediumAir, which is declared in the template, +by typing redeclare package Medium = MediumAir. +For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. +You will have to change this value once you add a ventilation system to the model (see + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). +Finally, set the energyDynamics of the MixingVolume, +which can be found in the Dynamics tab of the model parameter window, to FixedInitial. +

              +

              +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

              +

              Reference result

              +

              +The result with and without the air model is plotted in the figure below. +

              +

              +\"Wall +

              +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" + "Simulate and plot")); +end SimpleHouse3; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index a99ce51720..99baddce76 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,133 +1,132 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse4 "Heating model" - extends SimpleHouse3; - - parameter Modelica.Units.SI.HeatFlowRate QHea_nominal=3000 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 - "Nominal mass flow rate for water loop"; - parameter Boolean constantSourceHeater=true - "To enable/disable the connection between the constant source and heater"; - - IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=333.15, - T_b_nominal=313.15, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=false, - Q_flow_nominal=3000) "Radiator" - annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); - IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - dp_nominal=5000, - Q_flow_nominal=QHea_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); - IBPSA.Fluid.Movers.FlowControlled_m_flow pump( - redeclare package Medium = MediumWater, - use_inputFilter=false, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - nominalValuesDefineDefaultPressureCurve=true, - inputType=IBPSA.Fluid.Types.InputType.Constant) - "Pump" - annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); - IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={10,-170}))); - Modelica.Blocks.Sources.Constant const(k=1) - annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); -equation - connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, - color={0,127,255})); - connect(rad.port_b,pump. port_a) annotation (Line(points={{130,-100},{148,-100}, - {148,-170},{110,-170}},color={0,127,255})); - connect(heaWat.port_a,pump. port_b) annotation (Line(points={{60,-100},{49.75, - -100},{49.75,-170},{90,-170}}, color={0,127,255})); - connect(rad.heatPortCon, zone.heatPort) annotation (Line(points={{118,-92.8}, - {118,140},{110,140}},color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, - -30},{132,-30},{132,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - if constantSourceHeater then - connect(const.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50,-94}, - {58,-94}}, color={0,0,127})); - end if; - connect(bouWat.ports[1], pump.port_b) - annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                -
              • -September 4, 2023, by Jelger Jansen:
                -First implementation. -
              • -
              -", info=" -

              -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3~$kW$ for an inlet and outlet temperature of the radiator of 60°C -and 40°C, and a room air and radiative temperature of 20°C. -The pump has a (nominal) mass flow rate of 0.1 kg/s. -Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater. -

              -

              Required models

              - -

              Connection instructions

              -

              -The radiator contains one port for convective heat transfer and one for radiative heat transfer. -Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, -the media for the models should be set to MediumWater. -

              -

              -The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. -Otherwise the absolute pressure in the system is undefined. -Pressure difference modelling may be disregarded in the heating circuit -since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. -

              -

              -Set the heater input to 1, meaning that it will produce 1 times its nominal power. -

              -

              Reference result

              -

              -The result of the air temperature is plotted in the figure below. -The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) -and the heater is not disabled when it becomes too warm. -

              -

              -\"Air -

              -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" - "Simulate and plot")); -end SimpleHouse4; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean useConstantHeater=true + "To enable/disable the connection between the constant source and heater"; + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=QHea_flow_nominal) "Radiator" + annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); + IBPSA.Fluid.Movers.FlowControlled_m_flow pum( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + nominalValuesDefineDefaultPressureCurve=true, + inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" + annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); + IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={10,-170}))); + Modelica.Blocks.Sources.Constant conHea(k=1) + annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, + color={0,127,255})); + connect(rad.port_b, pum.port_a) annotation (Line(points={{130,-100},{148,-100}, + {148,-170},{110,-170}}, color={0,127,255})); + connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-100},{49.75, + -100},{49.75,-170},{90,-170}}, color={0,127,255})); + connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{118,-92.8},{ + 118,140},{110,140}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, + -30},{132,-30},{132,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + if useConstantHeater then + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50, + -94},{58,-94}}, color={0,0,127})); + end if; + connect(bouWat.ports[1], pum.port_b) + annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                +
              • +September 4, 2023, by Jelger Jansen:
                +First implementation. +
              • +
              +", info=" +

              +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater. +

              +

              Required models

              + +

              Connection instructions

              +

              +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

              +

              +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

              +

              +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

              +

              Reference result

              +

              +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

              +

              +\"Air +

              +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 2c8d59b714..98edea89a0 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,87 +1,85 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse5 "Heating controller model" - extends SimpleHouse4(pump(inputType=IBPSA.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}), - constantSourceHeater=false); - - Modelica.Blocks.Math.BooleanToInteger booleanToInt "Boolean to integer" - annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); - Modelica.Blocks.Math.BooleanToReal booleanToReal "Boolean to real" - annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); - Modelica.Blocks.Logical.Not not1 - "Negation for enabling heating when temperature is low" - annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{90,150},{70,170}}))); -equation - connect(booleanToInt.y, pump.stage) annotation (Line(points={{21,-140},{100,-140}, - {100,-158}}, color={255,127,0})); - connect(booleanToInt.u,not1. y) annotation (Line(points={{-2,-140},{-11.5,-140}, - {-11.5,-100},{-19,-100}}, - color={255,0,255})); - connect(booleanToReal.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100}, - {40.5,-94},{58,-94}}, color={0,0,127})); - connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, - color={255,0,255})); - connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, - {-230,-100},{-82,-100}}, color={0,0,127})); - connect(senTemZonAir.port, zone.heatPort) annotation (Line(points={{90,160},{ - 110,160},{110,140}}, color={191,0,0})); - connect(not1.y, booleanToReal.u) - annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                -
              • -September 4, 2023, by Jelger Jansen:
                -First implementation. -
              • -
              -", info=" -

              -Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. -We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). -A temperature sensor will measure the zone air temperature. -

              -

              Required models

              - -

              Connection instructions

              -

              -The heater modulation level should be set to one when the heater is on and to zero otherwise. -

              -

              Reference result

              -

              -The figure below shows the air temperature when the controller is added. -

              -

              -\"Air -

              -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" - "Simulate and plot")); -end SimpleHouse5; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, + massFlowRates=mWat_flow_nominal*{1}), final useConstantHeater=false); + + Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" + annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); + Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" + annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,150},{70,170}}))); +equation + connect(booInt.y, pum.stage) annotation (Line(points={{21,-140},{100,-140},{ + 100,-158}}, color={255,127,0})); + connect(booInt.u, not1.y) annotation (Line(points={{-2,-140},{-11.5,-140},{-11.5, + -100},{-19,-100}}, color={255,0,255})); + connect(booRea.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100},{ + 40.5,-94},{58,-94}}, color={0,0,127})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, + {-230,-100},{-82,-100}}, color={0,0,127})); + connect(senTemZonAir.port, zon.heatPort) + annotation (Line(points={{90,160},{110,160},{110,140}}, color={191,0,0})); + connect(not1.y, booRea.u) + annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                +
              • +September 4, 2023, by Jelger Jansen:
                +First implementation. +
              • +
              +", info=" +

              +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

              +

              Required models

              + +

              Connection instructions

              +

              +The heater modulation level should be set to one when the heater is on and to zero otherwise. +

              +

              Reference result

              +

              +The figure below shows the air temperature when the controller is added. +

              +

              +\"Air +

              +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 4b744a7eec..d907559f3a 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,144 +1,141 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse6 "Free cooling model" - extends SimpleHouse5(zone(nPorts=2), - mAir_flow_nominal=0.1, - A_win=6); - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - - IBPSA.Fluid.Actuators.Dampers.Exponential - vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=dpAir_nominal) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={50,110}))); - IBPSA.Fluid.Movers.FlowControlled_dp - fan( - redeclare package Medium = MediumAir, - show_T=true, - dp_nominal=dpAir_nominal, - use_inputFilter=false, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - nominalValuesDefineDefaultPressureCurve=true, - m_flow_nominal=mAir_flow_nominal) - "Constant head fan" annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - origin={-50,110}))); - Modelica.Blocks.Sources.Constant const_dp(k=dpAir_nominal) "Pressure head" - annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); - IBPSA.Fluid.HeatExchangers.ConstantEffectiveness - hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=10, - dp2_nominal=10, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); - IBPSA.Fluid.Sources.Boundary_pT - bouAir( - redeclare package Medium = MediumAir, - use_T_in=true, - nPorts=2) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-130,130}))); - Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) - "Hysteresis controller for damper" - annotation (Placement(transformation(extent={{-20,70},{0,90}}))); - Modelica.Blocks.Math.BooleanToReal booleanToReal1 - "Boolean to real" - annotation (Placement(transformation(extent={{20,70},{40,90}}))); -equation - connect(const_dp.y,fan. dp_in) annotation (Line(points={{-69,80},{-50,80},{ - -50,98}}, color={0,0,127})); - connect(hexRec.port_a1, zone.ports[1]) annotation (Line(points={{-80,129.6},{97, - 129.6},{97,130},{100,130}}, color={0,127,255})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ - -150,134},{-150,-10}},color={0,0,127})); - connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, - 110.4},{-69,110},{-60,110}}, color={0,127,255})); - connect(vavDam.port_b, zone.ports[2]) annotation (Line(points={{60,110},{100,110}, - {100,130}}, color={0,127,255})); - connect(booleanToReal1.y, vavDam.y) - annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); - connect(hysAir.y, booleanToReal1.u) - annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); - connect(vavDam.port_a, fan.port_b) - annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); - connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, - 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); - connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, - {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); - connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, - {-120,110.4},{-110,110.4}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                -
              • -September 4, 2023, by Jelger Jansen:
                -First implementation. -
              • -
              -", info=" -

              -For this last exercise, we first increase the window size -from 2 m2 to 6 m2. -

              -

              -We will add a ventilation model that allows to perform free cooling -using outside air when solar irradiation heats up the room too much. -The system consists of a fan, a damper, a controller with an air temperature setpoint -between 23°C and 25°C, -and a heat recovery unit with a constant effectiveness of 85%. -The damper and fan have a nominal pressure drop/raise of 200 Pa. -The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. -The nominal mass flow rate of the ventilation system is 0.1 kg/s. -

              -

              Required models

              - -

              Connection instructions

              -

              -Connect the components such that they exchange mass (and therefore also energy) -with the MixingVolume representing the zone air. -Add a boundary_pT to draw air from the environment. -Enable its temperature input and connect it to the TDryBul variable in the weather data reader. -Also reconsider the nominal mass flow rate parameter value in the MixingVolume -given the flow rate information of the ventilation system. -

              -

              Reference result

              -

              -The figures below show the results. -

              -

              -\"Air -

              -

              -\"Ventilation -

              -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" - "Simulate and plot")); -end SimpleHouse6; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5( + zon(nPorts=2), + mAir_flow_nominal=0.1, + AWin=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={50,110}))); + IBPSA.Fluid.Movers.FlowControlled_dp fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + nominalValuesDefineDefaultPressureCurve=true, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={-50,110}))); + Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" + annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); + IBPSA.Fluid.Sources.Boundary_pT + bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-130,130}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{-20,70},{0,90}}))); + Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" + annotation (Placement(transformation(extent={{20,70},{40,90}}))); +equation + connect(con_dp.y, fan.dp_in) + annotation (Line(points={{-69,80},{-50,80},{-50,98}}, color={0,0,127})); + connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-80,129.6},{ + 97,129.6},{97,130},{100,130}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ + -150,134},{-150,-10}},color={0,0,127})); + connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, + 110.4},{-69,110},{-60,110}}, color={0,127,255})); + connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{60,110},{100, + 110},{100,130}}, color={0,127,255})); + connect(booToRea1.y, vavDam.y) + annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); + connect(hysAir.y, booToRea1.u) + annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, + 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); + connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, + {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); + connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, + {-120,110.4},{-110,110.4}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                +
              • +September 4, 2023, by Jelger Jansen:
                +First implementation. +
              • +
              +", info=" +

              +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

              +

              +We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

              +

              Required models

              + +

              Connection instructions

              +

              +Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +

              +

              Reference result

              +

              +The figures below show the results. +

              +

              +\"Air +

              +

              +\"Ventilation +

              +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; From 32ba036cda13376eaa312c71ceaf73fffc3772d8 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 16:25:18 +0200 Subject: [PATCH 24/48] Move window to 'wall' block --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo | 12 ++++++------ IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo | 13 +++++++------ IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 5 +++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index 573d0e319b..032dc42fe4 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -18,18 +18,18 @@ model SimpleHouse0 annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut "Exterior temperature boundary condition" - annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); + annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); equation connect(weaDat.weaBus, weaBus) annotation (Line( points={{-180,-10},{-150,-10}}, color={255,204,51}, thickness=0.5)); connect(TOut.T, weaBus.TDryBul) - annotation (Line(points={{-22,0},{-150,0},{-150,-10}},color={0,0,127})); + annotation (Line(points={{-82,0},{-150,0},{-150,-10}},color={0,0,127})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}}), graphics={ Rectangle( - extent={{-220,40},{20,-40}}, + extent={{-220,40},{-38,-40}}, fillColor={238,238,238}, fillPattern=FillPattern.Solid, pattern=LinePattern.None), @@ -44,18 +44,18 @@ equation fillPattern=FillPattern.Solid, pattern=LinePattern.None), Rectangle( - extent={{40,40},{180,-40}}, + extent={{-20,40},{180,-40}}, fillColor={238,238,238}, fillPattern=FillPattern.Solid, pattern=LinePattern.None), Text( - extent={{98,20},{32,38}}, + extent={{22,22},{-23,39}}, textColor={0,0,127}, fillColor={255,213,170}, fillPattern=FillPattern.Solid, textString="Wall"), Text( - extent={{-148,-86},{-214,-68}}, + extent={{-157,-79},{-223,-61}}, textColor={0,0,127}, fillColor={255,213,170}, fillPattern=FillPattern.Solid, diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index 1ad4c663ca..3139e7e34c 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -6,16 +6,17 @@ model SimpleHouse2 "Building window model" Modelica.Blocks.Math.Gain gaiWin(k=AWin) "Gain for solar irradiance through the window" - annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); + annotation (Placement(transformation(extent={{0,-30},{20,-10}}))); Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win "Very simple window model" - annotation (Placement(transformation(extent={{-20,-40},{0,-20}}))); + annotation (Placement(transformation(extent={{40,-30},{60,-10}}))); equation connect(gaiWin.y, win.Q_flow) - annotation (Line(points={{-39,-30},{-20,-30}}, color={0,0,127})); - connect(win.port, walCap.port) annotation (Line(points={{0,-30},{132,-30},{132, - 1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-62,-30},{-150,-30}, + annotation (Line(points={{21,-20},{40,-20}}, color={0,0,127})); + connect(win.port, walCap.port) annotation (Line(points={{60,-20},{130,-20},{ + 130,1.77636e-15},{140,1.77636e-15}}, + color={191,0,0})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-2,-20},{-150,-20}, {-150,-10}}, color={0,0,127}), Text( string="%second", index=1, diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 99baddce76..69363c8a9d 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -49,8 +49,9 @@ equation -100},{49.75,-170},{90,-170}}, color={0,127,255})); connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{118,-92.8},{ 118,140},{110,140}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, - -30},{132,-30},{132,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{ + 122,-20},{130,-20},{130,1.77636e-15},{140,1.77636e-15}}, + color={191,0,0})); if useConstantHeater then connect(conHea.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50, -94},{58,-94}}, color={0,0,127})); From 61d4828097273df35cfc12fda90270e548ff29d8 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 16:31:04 +0200 Subject: [PATCH 25/48] Update documentation of SimpleHouse0 --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index 032dc42fe4..30d5609fe5 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -90,7 +90,7 @@ First implementation. ", info="

              This model is used as the starting point for the SimpleHouse tutorial. -It was copied from the Modelica crash course organised by KU Leuven +It was based on from the Modelica crash course organised by KU Leuven (https://github.com/open-ideas/__CrashCourse__).

              ")); From 59b6d118b34cd8765e4f776e7f5fc08d45789b2f Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 16:34:39 +0200 Subject: [PATCH 26/48] Extend information section of SimpleHouse0 --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index 30d5609fe5..ae6a6c043e 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -90,6 +90,8 @@ First implementation. ", info="

              This model is used as the starting point for the SimpleHouse tutorial. +It contains a weather data reader and a PrescribedTemperature component +that allows the user to connect thermal components to the dry bulb temperature. It was based on from the Modelica crash course organised by KU Leuven (https://github.com/open-ideas/__CrashCourse__).

              From 9ddbbde672168c532fa96e0ce64a203fd9a1ed3f Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 16:44:49 +0200 Subject: [PATCH 27/48] Rename useConstantHeater to use_constantHeater to comply with the IBPSA naming conventions. --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 9 ++++----- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 69363c8a9d..4f6207165d 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -6,7 +6,7 @@ model SimpleHouse4 "Heating model" "Nominal capacity of heating system"; parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 "Nominal mass flow rate for water loop"; - parameter Boolean useConstantHeater=true + parameter Boolean use_constantHeater=true "To enable/disable the connection between the constant source and heater"; IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( @@ -49,10 +49,9 @@ equation -100},{49.75,-170},{90,-170}}, color={0,127,255})); connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{118,-92.8},{ 118,140},{110,140}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{ - 122,-20},{130,-20},{130,1.77636e-15},{140,1.77636e-15}}, - color={191,0,0})); - if useConstantHeater then + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, + -20},{130,-20},{130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + if use_constantHeater then connect(conHea.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50, -94},{58,-94}}, color={0,0,127})); end if; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 98edea89a0..aa8c1a4202 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,7 +1,7 @@ within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse5 "Heating controller model" extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}), final useConstantHeater=false); + massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); From 8e4eb4504ca371ac19974b3bcee0f7b4e87e5aeb Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 17:20:18 +0200 Subject: [PATCH 28/48] Fix small typo in information section of the SimpleHouse package --- .../Examples/Tutorial/SimpleHouse/package.mo | 174 +++++++++--------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/package.mo b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo index db0815a96f..610c009165 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/package.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo @@ -1,87 +1,87 @@ -within IBPSA.Examples.Tutorial; -package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" -extends Modelica.Icons.ExamplesPackage; - - annotation (Documentation(info=" -

              -This package contains examples with step-by-step instructions for how to build a system model -for a simple house with a heating system, ventilation, and weather boundary conditions. -It serves as a demonstration case of how the IBPSA library can be used. -

              -

              -The goal of this exercise is to become familiar with Modelica and the IBPSA library. -Since the IBPSA library components are typically used by combining several components graphically, -the use of equations falls outside of the scope of this exercise. -

              -

              -For this exercise you will create a model of a simple house, -consisting of a heating system, one building zone, and a ventilation model. -The exercise starts from a template file that should not produce any errors. -This file will be extended in several steps, adding complexity. -In between each step the user should be able to simulate the model, -i.e., no errors should be produced and simulation results may be compared. -<\\p> -

              -The model has been created in the following stages: -

              -
                -
              1. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate -contains a weather data reader which connects the thermal resistance of the building wall -to the dry bulb temperature and serves as a template to implement the entire SimpleHouse model. -
              2. -
              3. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse1 -implements the building wall by adding a thermal capacity. -
              4. -
              5. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse2 -adds a window to the building wall. -It is assumed that the total injected heat through the window equals the window surface area -multiplied by the direct horizontal solar irradiance. -
              6. -
              7. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse3 -adds an air model which represents the room in the building. -
              8. -
              9. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse4 -adds heating circuit consisting of a boiler, a radiator, -and an on/off circulation pump with a constant mass flow rate. -No controller is implemented yet, i.e. the pump and heater are always on. -
              10. -
              11. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse5 -adds a hysteresis controller for the heating circuit that uses the room temperature as an input. -
              12. -
              13. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6 -adds a ventilation system consisting of a fan, a damper, a heat recovery unit, -and a hysteresis controller, that allows to perform free cooling using outside air. -
              14. -
              -

              -For each stage, firstly the model part is qualitatively explained. -Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. -Finally, we provide high-level instructions of how to set up the model. -If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, -try out some things, make an educated guess, etc. -Finally, we provide reference results that allow you to check if your implementation is correct. -Depending on the parameter values that you choose, results may differ. -<\\p> -

              -The graphical representation of the final model is given below. -<\\p> -

              -\"Graphical -

              -")); -end SimpleHouse; +within IBPSA.Examples.Tutorial; +package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" +extends Modelica.Icons.ExamplesPackage; + + annotation (Documentation(info=" +

              +This package contains examples with step-by-step instructions for how to build a system model +for a simple house with a heating system, ventilation, and weather boundary conditions. +It serves as a demonstration case of how the IBPSA library can be used. +

              +

              +The goal of this exercise is to become familiar with Modelica and the IBPSA library. +Since the IBPSA library components are typically used by combining several components graphically, +the use of equations falls outside of the scope of this exercise. +

              +

              +For this exercise you will create a model of a simple house, +consisting of a heating system, one building zone, and a ventilation model. +The exercise starts from a template file that should not produce any errors. +This file will be extended in several steps, adding complexity. +In between each step the user should be able to simulate the model, +i.e., no errors should be produced and simulation results may be compared. +

              +

              +The model has been created in the following stages: +

              +
                +
              1. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate +contains a weather data reader which connects the thermal resistance of the building wall +to the dry bulb temperature and serves as a template to implement the entire SimpleHouse model. +
              2. +
              3. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse1 +implements the building wall by adding a thermal capacity. +
              4. +
              5. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse2 +adds a window to the building wall. +It is assumed that the total injected heat through the window equals the window surface area +multiplied by the direct horizontal solar irradiance. +
              6. +
              7. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse3 +adds an air model which represents the room in the building. +
              8. +
              9. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse4 +adds heating circuit consisting of a boiler, a radiator, +and an on/off circulation pump with a constant mass flow rate. +No controller is implemented yet, i.e. the pump and heater are always on. +
              10. +
              11. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse5 +adds a hysteresis controller for the heating circuit that uses the room temperature as an input. +
              12. +
              13. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6 +adds a ventilation system consisting of a fan, a damper, a heat recovery unit, +and a hysteresis controller, that allows to perform free cooling using outside air. +
              14. +
              +

              +For each stage, firstly the model part is qualitatively explained. +Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. +Finally, we provide high-level instructions of how to set up the model. +If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, +try out some things, make an educated guess, etc. +Finally, we provide reference results that allow you to check if your implementation is correct. +Depending on the parameter values that you choose, results may differ. +<\\p> +

              +The graphical representation of the final model is given below. +<\\p> +

              +\"Graphical +

              +")); +end SimpleHouse; From b5fef2fe1e62c6fa9ef6a93f17005c6d7546f5af Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Fri, 15 Sep 2023 18:16:18 +0200 Subject: [PATCH 29/48] Update information section of the package itself. --- IBPSA/Examples/Tutorial/SimpleHouse/package.mo | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/package.mo b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo index 610c009165..2665e07f4d 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/package.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo @@ -26,10 +26,11 @@ The model has been created in the following stages:

              1. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate -contains a weather data reader which connects the thermal resistance of the building wall -to the dry bulb temperature and serves as a template to implement the entire SimpleHouse model. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0 +contains a weather data reader which connects the data of the dry bulb temperature +to a PrescribedTemperature component +and serves as a starting model to implement the entire SimpleHouse model.
              2. @@ -75,10 +76,10 @@ If these instructions are not clear immediately, have a look at the model docume try out some things, make an educated guess, etc. Finally, we provide reference results that allow you to check if your implementation is correct. Depending on the parameter values that you choose, results may differ. -<\\p> +

                The graphical representation of the final model is given below. -<\\p> +

                \"Graphical From f003250768b02c9b30a50c2d33ea71b7316e4f43 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 15 Sep 2023 11:23:28 -0700 Subject: [PATCH 30/48] Run dos2unix --- .../Tutorial/SimpleHouse/SimpleHouse0.mo | 198 ++++++------ .../Tutorial/SimpleHouse/SimpleHouse1.mo | 178 +++++------ .../Tutorial/SimpleHouse/SimpleHouse2.mo | 160 +++++----- .../Tutorial/SimpleHouse/SimpleHouse3.mo | 174 +++++------ .../Tutorial/SimpleHouse/SimpleHouse4.mo | 264 ++++++++-------- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 170 +++++------ .../Tutorial/SimpleHouse/SimpleHouse6.mo | 282 +++++++++--------- .../Examples/Tutorial/SimpleHouse/package.mo | 176 +++++------ .../Tutorial/SimpleHouse/package.order | 14 +- 9 files changed, 808 insertions(+), 808 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index ae6a6c043e..0fd3a4a63d 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -1,99 +1,99 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse0 - "Start file for simple house example" - extends Modelica.Icons.Example; - package MediumAir = IBPSA.Media.Air "Medium model for air"; - package MediumWater = IBPSA.Media.Water "Medium model for water"; - parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; - parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; - parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; - parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; - parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; - IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= - ModelicaServices.ExternalReferences.loadResource( - "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) - "Weather data reader" - annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); - IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" - annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut - "Exterior temperature boundary condition" - annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); -equation - connect(weaDat.weaBus, weaBus) annotation (Line( - points={{-180,-10},{-150,-10}}, - color={255,204,51}, - thickness=0.5)); - connect(TOut.T, weaBus.TDryBul) - annotation (Line(points={{-82,0},{-150,0},{-150,-10}},color={0,0,127})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}}), graphics={ - Rectangle( - extent={{-220,40},{-38,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,-60},{180,-200}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,180},{180,60}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-20,40},{180,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Text( - extent={{22,22},{-23,39}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Wall"), - Text( - extent={{-157,-79},{-223,-61}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Heating"), - Text( - extent={{-118,18},{-214,40}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Weather inputs"), - Text( - extent={{-76,158},{-214,180}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Cooling and ventilation")}), - experiment(Tolerance=1E-6, StopTime=1e+06), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" - "Simulate and plot"), - Documentation(revisions=" -

                  -
                • -September 4, 2023, by Jelger Jansen:
                  -Replace IDEAS by IBPSA models. -
                • -
                • -October 11, 2016, by Filip Jorissen:
                  -First implementation. -
                • -
                -", info=" -

                -This model is used as the starting point for the SimpleHouse tutorial. -It contains a weather data reader and a PrescribedTemperature component -that allows the user to connect thermal components to the dry bulb temperature. -It was based on from the Modelica crash course organised by KU Leuven -(https://github.com/open-ideas/__CrashCourse__). -

                -")); -end SimpleHouse0; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse0 + "Start file for simple house example" + extends Modelica.Icons.Example; + package MediumAir = IBPSA.Media.Air "Medium model for air"; + package MediumWater = IBPSA.Media.Water "Medium model for water"; + parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; + parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; + IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + "Weather data reader" + annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); + IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut + "Exterior temperature boundary condition" + annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); +equation + connect(weaDat.weaBus, weaBus) annotation (Line( + points={{-180,-10},{-150,-10}}, + color={255,204,51}, + thickness=0.5)); + connect(TOut.T, weaBus.TDryBul) + annotation (Line(points={{-82,0},{-150,0},{-150,-10}},color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}}), graphics={ + Rectangle( + extent={{-220,40},{-38,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,-60},{180,-200}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-220,180},{180,60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-20,40},{180,-40}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Text( + extent={{22,22},{-23,39}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Wall"), + Text( + extent={{-157,-79},{-223,-61}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Heating"), + Text( + extent={{-118,18},{-214,40}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Weather inputs"), + Text( + extent={{-76,158},{-214,180}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Cooling and ventilation")}), + experiment(Tolerance=1E-6, StopTime=1e+06), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" + "Simulate and plot"), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +Replace IDEAS by IBPSA models. +
                • +
                • +October 11, 2016, by Filip Jorissen:
                  +First implementation. +
                • +
                +", info=" +

                +This model is used as the starting point for the SimpleHouse tutorial. +It contains a weather data reader and a PrescribedTemperature component +that allows the user to connect thermal components to the dry bulb temperature. +It was based on from the Modelica crash course organised by KU Leuven +(https://github.com/open-ideas/__CrashCourse__). +

                +")); +end SimpleHouse0; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 6cfca3a935..ae829a5559 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -1,89 +1,89 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse1 "Building wall model" - extends SimpleHouse0; - - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - C=AWall*dWall*cpWall*rhoWall, T(fixed=true)) - "Thermal mass of wall" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={150,0}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor walRes(R=dWall/AWall - /kWall) "Thermal resistor for wall: 25 cm of rockwool" - annotation (Placement(transformation(extent={{80,-10},{100,10}}))); -equation - connect(walRes.port_b, walCap.port) annotation (Line(points={{100,0},{112,0}, - {112,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - connect(TOut.port, walRes.port_a) - annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                  -
                • -September 4, 2023, by Jelger Jansen:
                  -First implementation. -
                • -
                -", info=" -

                -A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. -The house consists of a wall represented by a single heat capacitor and a thermal resistor. -The boundary temperature are already included in - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. -The wall has a surface area of Awall=100 m2, -a thickness of dwall=25 cm, -a thermal conductivity of kwall=0.04 W/(m K), -a density of ρwall=2000 kg/m3, -and a specific heat capacity of cp,wall= 1000 J/(kg K) -

                -

                -These parameters are already declared in the equation section of - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. -You can use this way of declaring parameters in the remainder of this exercise, but this is not required. -

                -

                -The conductive thermal resistance value of a wall may be computed as R=d/(A*k). -The heat capacity value of a wall may be computed as C=A*d*cp -

                -

                Required models

                - -

                Connection instructions

                -

                -Connect one side of the thermal resistor to the output of PrescribedTemperature -and the other side of the thermal resistor to the heat capacitor. -

                -

                Reference result

                -

                -If you correctly added the model of the heat capacitor, -connected it to the resistor and added the parameter values for C, -then you should be able to simulate the model. -To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. -You can now simulate the model by pressing the Simulate button. -

                -

                -You can plot individual variables values by clicking on their name in the variable browser on the left. -Now plot the wall capacitor temperature value T. -It should look like the figure below (1 Ms is around 12 days). -

                -

                -\"Wall -

                -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" - "Simulate and plot")); -end SimpleHouse1; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse1 "Building wall model" + extends SimpleHouse0; + + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( + C=AWall*dWall*cpWall*rhoWall, T(fixed=true)) + "Thermal mass of wall" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={150,0}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor walRes(R=dWall/AWall + /kWall) "Thermal resistor for wall: 25 cm of rockwool" + annotation (Placement(transformation(extent={{80,-10},{100,10}}))); +equation + connect(walRes.port_b, walCap.port) annotation (Line(points={{100,0},{112,0}, + {112,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + connect(TOut.port, walRes.port_a) + annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +First implementation. +
                • +
                +", info=" +

                +A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. +The house consists of a wall represented by a single heat capacitor and a thermal resistor. +The boundary temperature are already included in + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +The wall has a surface area of Awall=100 m2, +a thickness of dwall=25 cm, +a thermal conductivity of kwall=0.04 W/(m K), +a density of ρwall=2000 kg/m3, +and a specific heat capacity of cp,wall= 1000 J/(kg K) +

                +

                +These parameters are already declared in the equation section of + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +You can use this way of declaring parameters in the remainder of this exercise, but this is not required. +

                +

                +The conductive thermal resistance value of a wall may be computed as R=d/(A*k). +The heat capacity value of a wall may be computed as C=A*d*cp +

                +

                Required models

                + +

                Connection instructions

                +

                +Connect one side of the thermal resistor to the output of PrescribedTemperature +and the other side of the thermal resistor to the heat capacitor. +

                +

                Reference result

                +

                +If you correctly added the model of the heat capacitor, +connected it to the resistor and added the parameter values for C, +then you should be able to simulate the model. +To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. +You can now simulate the model by pressing the Simulate button. +

                +

                +You can plot individual variables values by clicking on their name in the variable browser on the left. +Now plot the wall capacitor temperature value T. +It should look like the figure below (1 Ms is around 12 days). +

                +

                +\"Wall +

                +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" + "Simulate and plot")); +end SimpleHouse1; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index 3139e7e34c..e9611bdc13 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -1,80 +1,80 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse2 "Building window model" - extends SimpleHouse1; - - parameter Modelica.Units.SI.Area AWin=2 "Window area"; - - Modelica.Blocks.Math.Gain gaiWin(k=AWin) - "Gain for solar irradiance through the window" - annotation (Placement(transformation(extent={{0,-30},{20,-10}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win - "Very simple window model" - annotation (Placement(transformation(extent={{40,-30},{60,-10}}))); -equation - connect(gaiWin.y, win.Q_flow) - annotation (Line(points={{21,-20},{40,-20}}, color={0,0,127})); - connect(win.port, walCap.port) annotation (Line(points={{60,-20},{130,-20},{ - 130,1.77636e-15},{140,1.77636e-15}}, - color={191,0,0})); - connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-2,-20},{-150,-20}, - {-150,-10}}, color={0,0,127}), Text( - string="%second", - index=1, - extent={{-6,3},{-6,3}}, - horizontalAlignment=TextAlignment.Right)); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                  -
                • -September 4, 2023, by Jelger Jansen:
                  -First implementation. -
                • -
                -", info=" -

                -The window has a surface area of 2 m2. -In this simple model we will therefore assume that -two times the outdoor solar irradiance is injected as heat onto the inside of the wall. -

                -

                Required models

                - -

                Connection instructions

                -

                -To be able to use the value of the outdoor solar irradiance -you will need to access the weather data reader. -To do this, make a connection to the weaBus. -In the dialog box select <New Variable> and here type HDirNor, -which is the direct solar irradiance on a surface of 1 m2, -perpendicular to the sun rays. -Set the gain factor k to 2, -in order to get the solar irradiance through the window of 2 m2. -

                -

                -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

                -

                Reference result

                -

                -The result with and without the window model is plotted in the figure below. -

                -

                -\"Wall -

                -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" - "Simulate and plot")); -end SimpleHouse2; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse2 "Building window model" + extends SimpleHouse1; + + parameter Modelica.Units.SI.Area AWin=2 "Window area"; + + Modelica.Blocks.Math.Gain gaiWin(k=AWin) + "Gain for solar irradiance through the window" + annotation (Placement(transformation(extent={{0,-30},{20,-10}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win + "Very simple window model" + annotation (Placement(transformation(extent={{40,-30},{60,-10}}))); +equation + connect(gaiWin.y, win.Q_flow) + annotation (Line(points={{21,-20},{40,-20}}, color={0,0,127})); + connect(win.port, walCap.port) annotation (Line(points={{60,-20},{130,-20},{ + 130,1.77636e-15},{140,1.77636e-15}}, + color={191,0,0})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-2,-20},{-150,-20}, + {-150,-10}}, color={0,0,127}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +First implementation. +
                • +
                +", info=" +

                +The window has a surface area of 2 m2. +In this simple model we will therefore assume that +two times the outdoor solar irradiance is injected as heat onto the inside of the wall. +

                +

                Required models

                + +

                Connection instructions

                +

                +To be able to use the value of the outdoor solar irradiance +you will need to access the weather data reader. +To do this, make a connection to the weaBus. +In the dialog box select <New Variable> and here type HDirNor, +which is the direct solar irradiance on a surface of 1 m2, +perpendicular to the sun rays. +Set the gain factor k to 2, +in order to get the solar irradiance through the window of 2 m2. +

                +

                +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

                +

                Reference result

                +

                +The result with and without the window model is plotted in the figure below. +

                +

                +\"Wall +

                +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" + "Simulate and plot")); +end SimpleHouse2; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 154ae4da84..ca649707b4 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -1,87 +1,87 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse3 "Air model" - extends SimpleHouse2; - - parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; - parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 - "Nominal mass flow rate for air loop"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 - "Convective heat transfer coefficient at the wall"; - - Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ - AWall) "Thermal resistance for convective heat transfer" annotation ( - Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=270, - origin={130,20}))); - IBPSA.Fluid.MixingVolumes.MixingVolume zon( - redeclare package Medium = MediumAir, - V=VZone, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" - annotation (Placement(transformation(extent={{110,130},{90,150}}))); -equation - connect(conRes.port_b, walCap.port) annotation (Line(points={{130,10},{130, - 1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - connect(zon.heatPort, conRes.port_a) - annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                  -
                • -September 4, 2023, by Jelger Jansen:
                  -First implementation. -
                • -
                -", info=" -

                -To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. -The air will exchange heat with the wall. -This may be modelled using a thermal resistance representing -the convective heat resistance which is equal to Rconv=1/(h*A), -where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. -

                -

                Required models

                - -

                Connection instructions

                -

                -The MixingVolume Medium parameter contains information about -the type of fluid and its properties that should be modelled by the MixingVolume. -Set its value to MediumAir, which is declared in the template, -by typing redeclare package Medium = MediumAir. -For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. -You will have to change this value once you add a ventilation system to the model (see - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). -Finally, set the energyDynamics of the MixingVolume, -which can be found in the Dynamics tab of the model parameter window, to FixedInitial. -

                -

                -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

                -

                Reference result

                -

                -The result with and without the air model is plotted in the figure below. -

                -

                -\"Wall -

                -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" - "Simulate and plot")); -end SimpleHouse3; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse3 "Air model" + extends SimpleHouse2; + + parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 + "Nominal mass flow rate for air loop"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 + "Convective heat transfer coefficient at the wall"; + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ + AWall) "Thermal resistance for convective heat transfer" annotation ( + Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={130,20}))); + IBPSA.Fluid.MixingVolumes.MixingVolume zon( + redeclare package Medium = MediumAir, + V=VZone, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" + annotation (Placement(transformation(extent={{110,130},{90,150}}))); +equation + connect(conRes.port_b, walCap.port) annotation (Line(points={{130,10},{130, + 1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + connect(zon.heatPort, conRes.port_a) + annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +First implementation. +
                • +
                +", info=" +

                +To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. +The air will exchange heat with the wall. +This may be modelled using a thermal resistance representing +the convective heat resistance which is equal to Rconv=1/(h*A), +where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. +

                +

                Required models

                + +

                Connection instructions

                +

                +The MixingVolume Medium parameter contains information about +the type of fluid and its properties that should be modelled by the MixingVolume. +Set its value to MediumAir, which is declared in the template, +by typing redeclare package Medium = MediumAir. +For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. +You will have to change this value once you add a ventilation system to the model (see + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). +Finally, set the energyDynamics of the MixingVolume, +which can be found in the Dynamics tab of the model parameter window, to FixedInitial. +

                +

                +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

                +

                Reference result

                +

                +The result with and without the air model is plotted in the figure below. +

                +

                +\"Wall +

                +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" + "Simulate and plot")); +end SimpleHouse3; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 4f6207165d..753cb7d1f9 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,132 +1,132 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse4 "Heating model" - extends SimpleHouse3; - - parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 - "Nominal mass flow rate for water loop"; - parameter Boolean use_constantHeater=true - "To enable/disable the connection between the constant source and heater"; - - IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=333.15, - T_b_nominal=313.15, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=false, - Q_flow_nominal=QHea_flow_nominal) "Radiator" - annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); - IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - dp_nominal=5000, - Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); - IBPSA.Fluid.Movers.FlowControlled_m_flow pum( - redeclare package Medium = MediumWater, - use_inputFilter=false, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - nominalValuesDefineDefaultPressureCurve=true, - inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" - annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); - IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={10,-170}))); - Modelica.Blocks.Sources.Constant conHea(k=1) - annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); -equation - connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, - color={0,127,255})); - connect(rad.port_b, pum.port_a) annotation (Line(points={{130,-100},{148,-100}, - {148,-170},{110,-170}}, color={0,127,255})); - connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-100},{49.75, - -100},{49.75,-170},{90,-170}}, color={0,127,255})); - connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{118,-92.8},{ - 118,140},{110,140}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, - -20},{130,-20},{130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - if use_constantHeater then - connect(conHea.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50, - -94},{58,-94}}, color={0,0,127})); - end if; - connect(bouWat.ports[1], pum.port_b) - annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                  -
                • -September 4, 2023, by Jelger Jansen:
                  -First implementation. -
                • -
                -", info=" -

                -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C -and 40°C, and a room air and radiative temperature of 20°C. -The pump has a (nominal) mass flow rate of 0.1 kg/s. -Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater. -

                -

                Required models

                - -

                Connection instructions

                -

                -The radiator contains one port for convective heat transfer and one for radiative heat transfer. -Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, -the media for the models should be set to MediumWater. -

                -

                -The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. -Otherwise the absolute pressure in the system is undefined. -Pressure difference modelling may be disregarded in the heating circuit -since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. -

                -

                -Set the heater input to 1, meaning that it will produce 1 times its nominal power. -

                -

                Reference result

                -

                -The result of the air temperature is plotted in the figure below. -The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) -and the heater is not disabled when it becomes too warm. -

                -

                -\"Air -

                -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" - "Simulate and plot")); -end SimpleHouse4; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean use_constantHeater=true + "To enable/disable the connection between the constant source and heater"; + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=QHea_flow_nominal) "Radiator" + annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); + IBPSA.Fluid.Movers.FlowControlled_m_flow pum( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + nominalValuesDefineDefaultPressureCurve=true, + inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" + annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); + IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={10,-170}))); + Modelica.Blocks.Sources.Constant conHea(k=1) + annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, + color={0,127,255})); + connect(rad.port_b, pum.port_a) annotation (Line(points={{130,-100},{148,-100}, + {148,-170},{110,-170}}, color={0,127,255})); + connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-100},{49.75, + -100},{49.75,-170},{90,-170}}, color={0,127,255})); + connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{118,-92.8},{ + 118,140},{110,140}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, + -20},{130,-20},{130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); + if use_constantHeater then + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50, + -94},{58,-94}}, color={0,0,127})); + end if; + connect(bouWat.ports[1], pum.port_b) + annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +First implementation. +
                • +
                +", info=" +

                +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater. +

                +

                Required models

                + +

                Connection instructions

                +

                +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

                +

                +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

                +

                +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

                +

                Reference result

                +

                +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

                +

                +\"Air +

                +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index aa8c1a4202..bc6bef72b3 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,85 +1,85 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse5 "Heating controller model" - extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); - - Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" - annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); - Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" - annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); - Modelica.Blocks.Logical.Not not1 - "Negation for enabling heating when temperature is low" - annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{90,150},{70,170}}))); -equation - connect(booInt.y, pum.stage) annotation (Line(points={{21,-140},{100,-140},{ - 100,-158}}, color={255,127,0})); - connect(booInt.u, not1.y) annotation (Line(points={{-2,-140},{-11.5,-140},{-11.5, - -100},{-19,-100}}, color={255,0,255})); - connect(booRea.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100},{ - 40.5,-94},{58,-94}}, color={0,0,127})); - connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, - color={255,0,255})); - connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, - {-230,-100},{-82,-100}}, color={0,0,127})); - connect(senTemZonAir.port, zon.heatPort) - annotation (Line(points={{90,160},{110,160},{110,140}}, color={191,0,0})); - connect(not1.y, booRea.u) - annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                  -
                • -September 4, 2023, by Jelger Jansen:
                  -First implementation. -
                • -
                -", info=" -

                -Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. -We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). -A temperature sensor will measure the zone air temperature. -

                -

                Required models

                - -

                Connection instructions

                -

                -The heater modulation level should be set to one when the heater is on and to zero otherwise. -

                -

                Reference result

                -

                -The figure below shows the air temperature when the controller is added. -

                -

                -\"Air -

                -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" - "Simulate and plot")); -end SimpleHouse5; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, + massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); + + Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" + annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); + Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" + annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,150},{70,170}}))); +equation + connect(booInt.y, pum.stage) annotation (Line(points={{21,-140},{100,-140},{ + 100,-158}}, color={255,127,0})); + connect(booInt.u, not1.y) annotation (Line(points={{-2,-140},{-11.5,-140},{-11.5, + -100},{-19,-100}}, color={255,0,255})); + connect(booRea.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100},{ + 40.5,-94},{58,-94}}, color={0,0,127})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, + {-230,-100},{-82,-100}}, color={0,0,127})); + connect(senTemZonAir.port, zon.heatPort) + annotation (Line(points={{90,160},{110,160},{110,140}}, color={191,0,0})); + connect(not1.y, booRea.u) + annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +First implementation. +
                • +
                +", info=" +

                +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

                +

                Required models

                + +

                Connection instructions

                +

                +The heater modulation level should be set to one when the heater is on and to zero otherwise. +

                +

                Reference result

                +

                +The figure below shows the air temperature when the controller is added. +

                +

                +\"Air +

                +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index d907559f3a..db5249ee7a 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,141 +1,141 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse6 "Free cooling model" - extends SimpleHouse5( - zon(nPorts=2), - mAir_flow_nominal=0.1, - AWin=6); - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - - IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=dpAir_nominal) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={50,110}))); - IBPSA.Fluid.Movers.FlowControlled_dp fan( - redeclare package Medium = MediumAir, - show_T=true, - dp_nominal=dpAir_nominal, - use_inputFilter=false, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - nominalValuesDefineDefaultPressureCurve=true, - m_flow_nominal=mAir_flow_nominal) - "Constant head fan" annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - origin={-50,110}))); - Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" - annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); - IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=10, - dp2_nominal=10, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); - IBPSA.Fluid.Sources.Boundary_pT - bouAir( - redeclare package Medium = MediumAir, - use_T_in=true, - nPorts=2) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-130,130}))); - Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) - "Hysteresis controller for damper" - annotation (Placement(transformation(extent={{-20,70},{0,90}}))); - Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" - annotation (Placement(transformation(extent={{20,70},{40,90}}))); -equation - connect(con_dp.y, fan.dp_in) - annotation (Line(points={{-69,80},{-50,80},{-50,98}}, color={0,0,127})); - connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-80,129.6},{ - 97,129.6},{97,130},{100,130}}, color={0,127,255})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ - -150,134},{-150,-10}},color={0,0,127})); - connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, - 110.4},{-69,110},{-60,110}}, color={0,127,255})); - connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{60,110},{100, - 110},{100,130}}, color={0,127,255})); - connect(booToRea1.y, vavDam.y) - annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); - connect(hysAir.y, booToRea1.u) - annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); - connect(vavDam.port_a, fan.port_b) - annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); - connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, - 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); - connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, - {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); - connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, - {-120,110.4},{-110,110.4}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                  -
                • -September 4, 2023, by Jelger Jansen:
                  -First implementation. -
                • -
                -", info=" -

                -For this last exercise, we first increase the window size -from 2 m2 to 6 m2. -

                -

                -We will add a ventilation model that allows to perform free cooling -using outside air when solar irradiation heats up the room too much. -The system consists of a fan, a damper, a controller with an air temperature setpoint -between 23°C and 25°C, -and a heat recovery unit with a constant effectiveness of 85%. -The damper and fan have a nominal pressure drop/raise of 200 Pa. -The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. -The nominal mass flow rate of the ventilation system is 0.1 kg/s. -

                -

                Required models

                - -

                Connection instructions

                -

                -Connect the components such that they exchange mass (and therefore also energy) -with the MixingVolume representing the zone air. -Add a boundary_pT to draw air from the environment. -Enable its temperature input and connect it to the TDryBul variable in the weather data reader. -Also reconsider the nominal mass flow rate parameter value in the MixingVolume -given the flow rate information of the ventilation system. -

                -

                Reference result

                -

                -The figures below show the results. -

                -

                -\"Air -

                -

                -\"Ventilation -

                -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" - "Simulate and plot")); -end SimpleHouse6; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5( + zon(nPorts=2), + mAir_flow_nominal=0.1, + AWin=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={50,110}))); + IBPSA.Fluid.Movers.FlowControlled_dp fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + nominalValuesDefineDefaultPressureCurve=true, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={-50,110}))); + Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" + annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); + IBPSA.Fluid.Sources.Boundary_pT + bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-130,130}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{-20,70},{0,90}}))); + Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" + annotation (Placement(transformation(extent={{20,70},{40,90}}))); +equation + connect(con_dp.y, fan.dp_in) + annotation (Line(points={{-69,80},{-50,80},{-50,98}}, color={0,0,127})); + connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-80,129.6},{ + 97,129.6},{97,130},{100,130}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ + -150,134},{-150,-10}},color={0,0,127})); + connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, + 110.4},{-69,110},{-60,110}}, color={0,127,255})); + connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{60,110},{100, + 110},{100,130}}, color={0,127,255})); + connect(booToRea1.y, vavDam.y) + annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); + connect(hysAir.y, booToRea1.u) + annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, + 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); + connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, + {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); + connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, + {-120,110.4},{-110,110.4}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, + -220},{200,200}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                  +
                • +September 4, 2023, by Jelger Jansen:
                  +First implementation. +
                • +
                +", info=" +

                +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

                +

                +We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

                +

                Required models

                + +

                Connection instructions

                +

                +Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +

                +

                Reference result

                +

                +The figures below show the results. +

                +

                +\"Air +

                +

                +\"Ventilation +

                +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/package.mo b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo index 2665e07f4d..fbc13637ba 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/package.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo @@ -1,88 +1,88 @@ -within IBPSA.Examples.Tutorial; -package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" -extends Modelica.Icons.ExamplesPackage; - - annotation (Documentation(info=" -

                -This package contains examples with step-by-step instructions for how to build a system model -for a simple house with a heating system, ventilation, and weather boundary conditions. -It serves as a demonstration case of how the IBPSA library can be used. -

                -

                -The goal of this exercise is to become familiar with Modelica and the IBPSA library. -Since the IBPSA library components are typically used by combining several components graphically, -the use of equations falls outside of the scope of this exercise. -

                -

                -For this exercise you will create a model of a simple house, -consisting of a heating system, one building zone, and a ventilation model. -The exercise starts from a template file that should not produce any errors. -This file will be extended in several steps, adding complexity. -In between each step the user should be able to simulate the model, -i.e., no errors should be produced and simulation results may be compared. -

                -

                -The model has been created in the following stages: -

                -
                  -
                1. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0 -contains a weather data reader which connects the data of the dry bulb temperature -to a PrescribedTemperature component -and serves as a starting model to implement the entire SimpleHouse model. -
                2. -
                3. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse1 -implements the building wall by adding a thermal capacity. -
                4. -
                5. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse2 -adds a window to the building wall. -It is assumed that the total injected heat through the window equals the window surface area -multiplied by the direct horizontal solar irradiance. -
                6. -
                7. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse3 -adds an air model which represents the room in the building. -
                8. -
                9. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse4 -adds heating circuit consisting of a boiler, a radiator, -and an on/off circulation pump with a constant mass flow rate. -No controller is implemented yet, i.e. the pump and heater are always on. -
                10. -
                11. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse5 -adds a hysteresis controller for the heating circuit that uses the room temperature as an input. -
                12. -
                13. - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6 -adds a ventilation system consisting of a fan, a damper, a heat recovery unit, -and a hysteresis controller, that allows to perform free cooling using outside air. -
                14. -
                -

                -For each stage, firstly the model part is qualitatively explained. -Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. -Finally, we provide high-level instructions of how to set up the model. -If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, -try out some things, make an educated guess, etc. -Finally, we provide reference results that allow you to check if your implementation is correct. -Depending on the parameter values that you choose, results may differ. -

                -

                -The graphical representation of the final model is given below. -

                -

                -\"Graphical -

                -")); -end SimpleHouse; +within IBPSA.Examples.Tutorial; +package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" +extends Modelica.Icons.ExamplesPackage; + + annotation (Documentation(info=" +

                +This package contains examples with step-by-step instructions for how to build a system model +for a simple house with a heating system, ventilation, and weather boundary conditions. +It serves as a demonstration case of how the IBPSA library can be used. +

                +

                +The goal of this exercise is to become familiar with Modelica and the IBPSA library. +Since the IBPSA library components are typically used by combining several components graphically, +the use of equations falls outside of the scope of this exercise. +

                +

                +For this exercise you will create a model of a simple house, +consisting of a heating system, one building zone, and a ventilation model. +The exercise starts from a template file that should not produce any errors. +This file will be extended in several steps, adding complexity. +In between each step the user should be able to simulate the model, +i.e., no errors should be produced and simulation results may be compared. +

                +

                +The model has been created in the following stages: +

                +
                  +
                1. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0 +contains a weather data reader which connects the data of the dry bulb temperature +to a PrescribedTemperature component +and serves as a starting model to implement the entire SimpleHouse model. +
                2. +
                3. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse1 +implements the building wall by adding a thermal capacity. +
                4. +
                5. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse2 +adds a window to the building wall. +It is assumed that the total injected heat through the window equals the window surface area +multiplied by the direct horizontal solar irradiance. +
                6. +
                7. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse3 +adds an air model which represents the room in the building. +
                8. +
                9. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse4 +adds heating circuit consisting of a boiler, a radiator, +and an on/off circulation pump with a constant mass flow rate. +No controller is implemented yet, i.e. the pump and heater are always on. +
                10. +
                11. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse5 +adds a hysteresis controller for the heating circuit that uses the room temperature as an input. +
                12. +
                13. + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6 +adds a ventilation system consisting of a fan, a damper, a heat recovery unit, +and a hysteresis controller, that allows to perform free cooling using outside air. +
                14. +
                +

                +For each stage, firstly the model part is qualitatively explained. +Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. +Finally, we provide high-level instructions of how to set up the model. +If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, +try out some things, make an educated guess, etc. +Finally, we provide reference results that allow you to check if your implementation is correct. +Depending on the parameter values that you choose, results may differ. +

                +

                +The graphical representation of the final model is given below. +

                +

                +\"Graphical +

                +")); +end SimpleHouse; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/package.order b/IBPSA/Examples/Tutorial/SimpleHouse/package.order index c7d826c325..e975e02c46 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/package.order +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.order @@ -1,7 +1,7 @@ -SimpleHouse0 -SimpleHouse1 -SimpleHouse2 -SimpleHouse3 -SimpleHouse4 -SimpleHouse5 -SimpleHouse6 +SimpleHouse0 +SimpleHouse1 +SimpleHouse2 +SimpleHouse3 +SimpleHouse4 +SimpleHouse5 +SimpleHouse6 From 4e2f13fdfd152d3436a78d651cbbeaf0577a537a Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 15 Sep 2023 11:27:55 -0700 Subject: [PATCH 31/48] Corrected wrong model name --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo | 2 +- .../Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index 0fd3a4a63d..b84d2e4e5a 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -74,7 +74,7 @@ equation textString="Cooling and ventilation")}), experiment(Tolerance=1E-6, StopTime=1e+06), __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos" + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse0.mos" "Simulate and plot"), Documentation(revisions="
                  diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos index eda0138cac..42dc530eae 100644 --- a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos @@ -1,2 +1,2 @@ -simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouseTemplate", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouseTemplate"); +simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse0"); createPlot(id=1,position={0, 0, 792, 1247}, y={"Tout.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file From 6ced3f0d0d2a5222bfd4ad60bb48c12bb2a06d17 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 15 Sep 2023 11:34:35 -0700 Subject: [PATCH 32/48] Corrected old use of variable name in scripts --- .../Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt | 2 +- .../Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt | 2 +- .../Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt | 2 +- .../Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt | 2 +- .../IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt | 2 +- .../Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt | 2 +- .../Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos | 2 +- .../Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos | 2 +- .../Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos | 2 +- .../Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos | 2 +- .../Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos | 2 +- IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt index 32dcfc4a3c..067c1f0e8d 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse3.txt @@ -7,4 +7,4 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 1e+06] -zone.T=[2.931499938964844e+02, 2.930606689453125e+02, 2.929643249511719e+02, 2.928974304199219e+02, 2.930238342285156e+02, 2.930650634765625e+02, 2.930123291015625e+02, 2.929456481933594e+02, 2.928767395019531e+02, 2.928078918457031e+02, 2.927404479980469e+02, 2.9267724609375e+02, 2.926165771484375e+02, 2.925605163574219e+02, 2.925022888183594e+02, 2.924439086914062e+02, 2.923875122070312e+02, 2.923274841308594e+02, 2.92265869140625e+02, 2.922026977539062e+02, 2.921306457519531e+02, 2.920592956542969e+02, 2.919894714355469e+02, 2.919207763671875e+02, 2.918522338867188e+02, 2.917841491699219e+02, 2.917159729003906e+02, 2.916467895507812e+02, 2.915788269042969e+02, 2.915138549804688e+02, 2.914527893066406e+02, 2.913910827636719e+02, 2.913223266601562e+02, 2.912518920898438e+02, 2.911763610839844e+02, 2.910963134765625e+02, 2.91012939453125e+02, 2.909146118164062e+02, 2.909188232421875e+02, 2.911439819335938e+02, 2.913373718261719e+02, 2.9132763671875e+02, 2.912524108886719e+02, 2.911689758300781e+02, 2.910796508789062e+02, 2.909833679199219e+02, 2.9088916015625e+02, 2.909557800292969e+02, 2.909430236816406e+02, 2.908749084472656e+02, 2.907784423828125e+02, 2.906665649414062e+02, 2.905516052246094e+02, 2.904307250976562e+02, 2.903084411621094e+02, 2.902685852050781e+02, 2.904729614257812e+02, 2.90720458984375e+02, 2.908230285644531e+02, 2.907205505371094e+02, 2.906036071777344e+02, 2.904841613769531e+02, 2.90362548828125e+02, 2.902437438964844e+02, 2.902868347167969e+02, 2.904608154296875e+02, 2.906579284667969e+02, 2.906626892089844e+02, 2.905770263671875e+02, 2.904942626953125e+02, 2.904112548828125e+02, 2.90329833984375e+02, 2.902554016113281e+02, 2.902565612792969e+02, 2.903314819335938e+02, 2.903802490234375e+02, 2.903304748535156e+02, 2.902759704589844e+02, 2.902184753417969e+02, 2.901612548828125e+02, 2.901092224121094e+02, 2.901262512207031e+02, 2.903362731933594e+02, 2.905704040527344e+02, 2.906482238769531e+02, 2.905876770019531e+02, 2.905180358886719e+02, 2.904518127441406e+02, 2.903863830566406e+02, 2.903204040527344e+02, 2.902714538574219e+02, 2.903493041992188e+02, 2.905325927734375e+02, 2.905527954101562e+02, 2.905055541992188e+02, 2.904557495117188e+02, 2.904060974121094e+02, 2.903577270507812e+02, 2.903117370605469e+02, 2.902666931152344e+02, 2.902240600585938e+02] +zon.T=[2.931499938964844e+02, 2.930606689453125e+02, 2.929643249511719e+02, 2.928974304199219e+02, 2.930238342285156e+02, 2.930650634765625e+02, 2.930123291015625e+02, 2.929456481933594e+02, 2.928767395019531e+02, 2.928078918457031e+02, 2.927404479980469e+02, 2.9267724609375e+02, 2.926165771484375e+02, 2.925605163574219e+02, 2.925022888183594e+02, 2.924439086914062e+02, 2.923875122070312e+02, 2.923274841308594e+02, 2.92265869140625e+02, 2.922026977539062e+02, 2.921306457519531e+02, 2.920592956542969e+02, 2.919894714355469e+02, 2.919207763671875e+02, 2.918522338867188e+02, 2.917841491699219e+02, 2.917159729003906e+02, 2.916467895507812e+02, 2.915788269042969e+02, 2.915138549804688e+02, 2.914527893066406e+02, 2.913910827636719e+02, 2.913223266601562e+02, 2.912518920898438e+02, 2.911763610839844e+02, 2.910963134765625e+02, 2.91012939453125e+02, 2.909146118164062e+02, 2.909188232421875e+02, 2.911439819335938e+02, 2.913373718261719e+02, 2.9132763671875e+02, 2.912524108886719e+02, 2.911689758300781e+02, 2.910796508789062e+02, 2.909833679199219e+02, 2.9088916015625e+02, 2.909557800292969e+02, 2.909430236816406e+02, 2.908749084472656e+02, 2.907784423828125e+02, 2.906665649414062e+02, 2.905516052246094e+02, 2.904307250976562e+02, 2.903084411621094e+02, 2.902685852050781e+02, 2.904729614257812e+02, 2.90720458984375e+02, 2.908230285644531e+02, 2.907205505371094e+02, 2.906036071777344e+02, 2.904841613769531e+02, 2.90362548828125e+02, 2.902437438964844e+02, 2.902868347167969e+02, 2.904608154296875e+02, 2.906579284667969e+02, 2.906626892089844e+02, 2.905770263671875e+02, 2.904942626953125e+02, 2.904112548828125e+02, 2.90329833984375e+02, 2.902554016113281e+02, 2.902565612792969e+02, 2.903314819335938e+02, 2.903802490234375e+02, 2.903304748535156e+02, 2.902759704589844e+02, 2.902184753417969e+02, 2.901612548828125e+02, 2.901092224121094e+02, 2.901262512207031e+02, 2.903362731933594e+02, 2.905704040527344e+02, 2.906482238769531e+02, 2.905876770019531e+02, 2.905180358886719e+02, 2.904518127441406e+02, 2.903863830566406e+02, 2.903204040527344e+02, 2.902714538574219e+02, 2.903493041992188e+02, 2.905325927734375e+02, 2.905527954101562e+02, 2.905055541992188e+02, 2.904557495117188e+02, 2.904060974121094e+02, 2.903577270507812e+02, 2.903117370605469e+02, 2.902666931152344e+02, 2.902240600585938e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt index bc2dbab834..d9fd9f1534 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt @@ -12,5 +12,5 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 1e+06] -zone.T=[2.931499938964844e+02, 3.018652954101562e+02, 3.023765258789062e+02, 3.028914794921875e+02, 3.035993041992188e+02, 3.042365112304688e+02, 3.047744750976562e+02, 3.05290771484375e+02, 3.058043518066406e+02, 3.063145751953125e+02, 3.068218383789062e+02, 3.073329162597656e+02, 3.078472290039062e+02, 3.083641052246094e+02, 3.088750305175781e+02, 3.093839111328125e+02, 3.09893310546875e+02, 3.104012756347656e+02, 3.109044189453125e+02, 3.114033813476562e+02, 3.118929748535156e+02, 3.123785400390625e+02, 3.128649291992188e+02, 3.133509521484375e+02, 3.138353881835938e+02, 3.143179016113281e+02, 3.147996215820312e+02, 3.152798156738281e+02, 3.157587890625e+02, 3.162375793457031e+02, 3.167167358398438e+02, 3.171956787109375e+02, 3.176707153320312e+02, 3.181366271972656e+02, 3.185990600585938e+02, 3.190547790527344e+02, 3.195059204101562e+02, 3.199426879882812e+02, 3.204760131835938e+02, 3.212296752929688e+02, 3.219649047851562e+02, 3.224814147949219e+02, 3.229290466308594e+02, 3.233672485351562e+02, 3.237968139648438e+02, 3.242164001464844e+02, 3.2463623046875e+02, 3.252275695800781e+02, 3.257299194335938e+02, 3.261766662597656e+02, 3.265938110351562e+02, 3.269905395507812e+02, 3.273827819824219e+02, 3.277706298828125e+02, 3.281524353027344e+02, 3.285976257324219e+02, 3.293054809570312e+02, 3.300552368164062e+02, 3.306694946289062e+02, 3.310607299804688e+02, 3.314381103515625e+02, 3.318106689453125e+02, 3.321793823242188e+02, 3.325464172363281e+02, 3.330693054199219e+02, 3.33726806640625e+02, 3.344093933105469e+02, 3.349058532714844e+02, 3.353015441894531e+02, 3.356973266601562e+02, 3.360923461914062e+02, 3.364874877929688e+02, 3.36885986328125e+02, 3.373557434082031e+02, 3.378902282714844e+02, 3.384234008789062e+02, 3.388450622558594e+02, 3.392593994140625e+02, 3.396685180664062e+02, 3.400756225585938e+02, 3.404804382324219e+02, 3.409362487792969e+02, 3.416002807617188e+02, 3.423026733398438e+02, 3.428507385253906e+02, 3.432394714355469e+02, 3.436236572265625e+02, 3.440080871582031e+02, 3.443947143554688e+02, 3.447819519042969e+02, 3.451823425292969e+02, 3.457003173828125e+02, 3.46326171875e+02, 3.468087768554688e+02, 3.472050476074219e+02, 3.475966491699219e+02, 3.479892883300781e+02, 3.483822021484375e+02, 3.487869262695312e+02, 3.491904907226562e+02, 3.49581298828125e+02] +zon.T=[2.931499938964844e+02, 3.018652954101562e+02, 3.023765258789062e+02, 3.028914794921875e+02, 3.035993041992188e+02, 3.042365112304688e+02, 3.047744750976562e+02, 3.05290771484375e+02, 3.058043518066406e+02, 3.063145751953125e+02, 3.068218383789062e+02, 3.073329162597656e+02, 3.078472290039062e+02, 3.083641052246094e+02, 3.088750305175781e+02, 3.093839111328125e+02, 3.09893310546875e+02, 3.104012756347656e+02, 3.109044189453125e+02, 3.114033813476562e+02, 3.118929748535156e+02, 3.123785400390625e+02, 3.128649291992188e+02, 3.133509521484375e+02, 3.138353881835938e+02, 3.143179016113281e+02, 3.147996215820312e+02, 3.152798156738281e+02, 3.157587890625e+02, 3.162375793457031e+02, 3.167167358398438e+02, 3.171956787109375e+02, 3.176707153320312e+02, 3.181366271972656e+02, 3.185990600585938e+02, 3.190547790527344e+02, 3.195059204101562e+02, 3.199426879882812e+02, 3.204760131835938e+02, 3.212296752929688e+02, 3.219649047851562e+02, 3.224814147949219e+02, 3.229290466308594e+02, 3.233672485351562e+02, 3.237968139648438e+02, 3.242164001464844e+02, 3.2463623046875e+02, 3.252275695800781e+02, 3.257299194335938e+02, 3.261766662597656e+02, 3.265938110351562e+02, 3.269905395507812e+02, 3.273827819824219e+02, 3.277706298828125e+02, 3.281524353027344e+02, 3.285976257324219e+02, 3.293054809570312e+02, 3.300552368164062e+02, 3.306694946289062e+02, 3.310607299804688e+02, 3.314381103515625e+02, 3.318106689453125e+02, 3.321793823242188e+02, 3.325464172363281e+02, 3.330693054199219e+02, 3.33726806640625e+02, 3.344093933105469e+02, 3.349058532714844e+02, 3.353015441894531e+02, 3.356973266601562e+02, 3.360923461914062e+02, 3.364874877929688e+02, 3.36885986328125e+02, 3.373557434082031e+02, 3.378902282714844e+02, 3.384234008789062e+02, 3.388450622558594e+02, 3.392593994140625e+02, 3.396685180664062e+02, 3.400756225585938e+02, 3.404804382324219e+02, 3.409362487792969e+02, 3.416002807617188e+02, 3.423026733398438e+02, 3.428507385253906e+02, 3.432394714355469e+02, 3.436236572265625e+02, 3.440080871582031e+02, 3.443947143554688e+02, 3.447819519042969e+02, 3.451823425292969e+02, 3.457003173828125e+02, 3.46326171875e+02, 3.468087768554688e+02, 3.472050476074219e+02, 3.475966491699219e+02, 3.479892883300781e+02, 3.483822021484375e+02, 3.487869262695312e+02, 3.491904907226562e+02, 3.49581298828125e+02] heaWat.u=[1e+00, 1e+00] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt index aeeebea78a..7f09d717c0 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt @@ -12,5 +12,5 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 1e+06] -zone.T=[2.931499938964844e+02, 2.945088500976562e+02, 2.959101867675781e+02, 2.966435546875e+02, 2.963061828613281e+02, 2.943134765625e+02, 2.955157165527344e+02, 2.947713317871094e+02, 2.949506225585938e+02, 2.954654846191406e+02, 2.949836730957031e+02, 2.943354187011719e+02, 2.95562255859375e+02, 2.943411865234375e+02, 2.964649658203125e+02, 2.953833618164062e+02, 2.944506530761719e+02, 2.941693420410156e+02, 2.967954406738281e+02, 2.956394958496094e+02, 2.947533264160156e+02, 2.943429870605469e+02, 2.941551513671875e+02, 2.967920837402344e+02, 2.954975280761719e+02, 2.946376953125e+02, 2.942773742675781e+02, 2.945584716796875e+02, 2.964990844726562e+02, 2.9513818359375e+02, 2.944798889160156e+02, 2.942196655273438e+02, 2.952792663574219e+02, 2.963535461425781e+02, 2.950684814453125e+02, 2.944270324707031e+02, 2.941518249511719e+02, 2.964158020019531e+02, 2.948146362304688e+02, 2.942771301269531e+02, 2.944650268554688e+02, 2.944434509277344e+02, 2.943599548339844e+02, 2.942665710449219e+02, 2.941667785644531e+02, 2.942500915527344e+02, 2.942366638183594e+02, 2.943132629394531e+02, 2.941784362792969e+02, 2.943945007324219e+02, 2.946878356933594e+02, 2.944981079101562e+02, 2.942091064453125e+02, 2.966917724609375e+02, 2.947072448730469e+02, 2.950520935058594e+02, 2.942230224609375e+02, 2.94413330078125e+02, 2.945167541503906e+02, 2.94404541015625e+02, 2.942772216796875e+02, 2.942956848144531e+02, 2.945955810546875e+02, 2.966785278320312e+02, 2.95890869140625e+02, 2.943241577148438e+02, 2.944898376464844e+02, 2.944913635253906e+02, 2.943954162597656e+02, 2.943005065917969e+02, 2.942054138183594e+02, 2.951721496582031e+02, 2.958705444335938e+02, 2.944257202148438e+02, 2.942926330566406e+02, 2.942910766601562e+02, 2.9422998046875e+02, 2.941651000976562e+02, 2.943297424316406e+02, 2.947159729003906e+02, 2.951884765625e+02, 2.956945190429688e+02, 2.9439013671875e+02, 2.946013793945312e+02, 2.946728820800781e+02, 2.94598388671875e+02, 2.945144958496094e+02, 2.944308471679688e+02, 2.943534240722656e+02, 2.942757568359375e+02, 2.942055969238281e+02, 2.942643432617188e+02, 2.944358215332031e+02, 2.9445458984375e+02, 2.943978271484375e+02, 2.943378601074219e+02, 2.942750549316406e+02, 2.942183227539062e+02, 2.94168212890625e+02, 2.954824829101562e+02, 2.941523742675781e+02] +zon.T=[2.931499938964844e+02, 2.945088500976562e+02, 2.959101867675781e+02, 2.966435546875e+02, 2.963061828613281e+02, 2.943134765625e+02, 2.955157165527344e+02, 2.947713317871094e+02, 2.949506225585938e+02, 2.954654846191406e+02, 2.949836730957031e+02, 2.943354187011719e+02, 2.95562255859375e+02, 2.943411865234375e+02, 2.964649658203125e+02, 2.953833618164062e+02, 2.944506530761719e+02, 2.941693420410156e+02, 2.967954406738281e+02, 2.956394958496094e+02, 2.947533264160156e+02, 2.943429870605469e+02, 2.941551513671875e+02, 2.967920837402344e+02, 2.954975280761719e+02, 2.946376953125e+02, 2.942773742675781e+02, 2.945584716796875e+02, 2.964990844726562e+02, 2.9513818359375e+02, 2.944798889160156e+02, 2.942196655273438e+02, 2.952792663574219e+02, 2.963535461425781e+02, 2.950684814453125e+02, 2.944270324707031e+02, 2.941518249511719e+02, 2.964158020019531e+02, 2.948146362304688e+02, 2.942771301269531e+02, 2.944650268554688e+02, 2.944434509277344e+02, 2.943599548339844e+02, 2.942665710449219e+02, 2.941667785644531e+02, 2.942500915527344e+02, 2.942366638183594e+02, 2.943132629394531e+02, 2.941784362792969e+02, 2.943945007324219e+02, 2.946878356933594e+02, 2.944981079101562e+02, 2.942091064453125e+02, 2.966917724609375e+02, 2.947072448730469e+02, 2.950520935058594e+02, 2.942230224609375e+02, 2.94413330078125e+02, 2.945167541503906e+02, 2.94404541015625e+02, 2.942772216796875e+02, 2.942956848144531e+02, 2.945955810546875e+02, 2.966785278320312e+02, 2.95890869140625e+02, 2.943241577148438e+02, 2.944898376464844e+02, 2.944913635253906e+02, 2.943954162597656e+02, 2.943005065917969e+02, 2.942054138183594e+02, 2.951721496582031e+02, 2.958705444335938e+02, 2.944257202148438e+02, 2.942926330566406e+02, 2.942910766601562e+02, 2.9422998046875e+02, 2.941651000976562e+02, 2.943297424316406e+02, 2.947159729003906e+02, 2.951884765625e+02, 2.956945190429688e+02, 2.9439013671875e+02, 2.946013793945312e+02, 2.946728820800781e+02, 2.94598388671875e+02, 2.945144958496094e+02, 2.944308471679688e+02, 2.943534240722656e+02, 2.942757568359375e+02, 2.942055969238281e+02, 2.942643432617188e+02, 2.944358215332031e+02, 2.9445458984375e+02, 2.943978271484375e+02, 2.943378601074219e+02, 2.942750549316406e+02, 2.942183227539062e+02, 2.94168212890625e+02, 2.954824829101562e+02, 2.941523742675781e+02] heaWat.u=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 1e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt index a85657b166..84a855e6e1 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt @@ -12,7 +12,7 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 1e+06] -zone.T=[2.931499938964844e+02, 2.945050964355469e+02, 2.959047546386719e+02, 2.96646484375e+02, 2.943834838867188e+02, 2.942815856933594e+02, 2.942722473144531e+02, 2.942023620605469e+02, 2.9615576171875e+02, 2.945042724609375e+02, 2.941602172851562e+02, 2.941692199707031e+02, 2.941705627441406e+02, 2.941705932617188e+02, 2.941704406738281e+02, 2.941652526855469e+02, 2.941562194824219e+02, 2.941512756347656e+02, 2.944099426269531e+02, 2.951903076171875e+02, 2.966014404296875e+02, 2.966050109863281e+02, 2.957460021972656e+02, 2.950239562988281e+02, 2.945757141113281e+02, 2.943212280273438e+02, 2.941802368164062e+02, 2.960645446777344e+02, 2.962243957519531e+02, 2.950863647460938e+02, 2.945101013183594e+02, 2.942584533691406e+02, 2.941826782226562e+02, 2.967984619140625e+02, 2.956029663085938e+02, 2.946762084960938e+02, 2.942572631835938e+02, 2.9655712890625e+02, 2.942179870605469e+02, 2.950230712890625e+02, 2.957950439453125e+02, 2.958896789550781e+02, 2.958037719726562e+02, 2.957060852050781e+02, 2.956017150878906e+02, 2.954903564453125e+02, 2.953819580078125e+02, 2.957755432128906e+02, 2.959239501953125e+02, 2.958983764648438e+02, 2.958122863769531e+02, 2.956854858398438e+02, 2.955560913085938e+02, 2.954240417480469e+02, 2.9528759765625e+02, 2.95342041015625e+02, 2.961524658203125e+02, 2.970876770019531e+02, 2.97622314453125e+02, 2.975182495117188e+02, 2.973820190429688e+02, 2.972417297363281e+02, 2.970984191894531e+02, 2.969559326171875e+02, 2.972681274414062e+02, 2.979461669921875e+02, 2.965861511230469e+02, 2.966249084472656e+02, 2.964938659667969e+02, 2.963466186523438e+02, 2.961501159667969e+02, 2.980364990234375e+02, 2.979473571777344e+02, 2.980525207519531e+02, 2.969268188476562e+02, 2.971317443847656e+02, 2.969201354980469e+02, 2.968055725097656e+02, 2.965866394042969e+02, 2.964843139648438e+02, 2.962891540527344e+02, 2.97805908203125e+02, 2.971761474609375e+02, 2.978529968261719e+02, 2.979222412109375e+02, 2.9753515625e+02, 2.973719787597656e+02, 2.972562866210938e+02, 2.971741333007812e+02, 2.969613037109375e+02, 2.969106140136719e+02, 2.973577270507812e+02, 2.980824584960938e+02, 2.980605163574219e+02, 2.979991455078125e+02, 2.977561340332031e+02, 2.976838989257812e+02, 2.976190185546875e+02, 2.974039306640625e+02, 2.974400024414062e+02, 2.973416442871094e+02] +zon.T=[2.931499938964844e+02, 2.945050964355469e+02, 2.959047546386719e+02, 2.96646484375e+02, 2.943834838867188e+02, 2.942815856933594e+02, 2.942722473144531e+02, 2.942023620605469e+02, 2.9615576171875e+02, 2.945042724609375e+02, 2.941602172851562e+02, 2.941692199707031e+02, 2.941705627441406e+02, 2.941705932617188e+02, 2.941704406738281e+02, 2.941652526855469e+02, 2.941562194824219e+02, 2.941512756347656e+02, 2.944099426269531e+02, 2.951903076171875e+02, 2.966014404296875e+02, 2.966050109863281e+02, 2.957460021972656e+02, 2.950239562988281e+02, 2.945757141113281e+02, 2.943212280273438e+02, 2.941802368164062e+02, 2.960645446777344e+02, 2.962243957519531e+02, 2.950863647460938e+02, 2.945101013183594e+02, 2.942584533691406e+02, 2.941826782226562e+02, 2.967984619140625e+02, 2.956029663085938e+02, 2.946762084960938e+02, 2.942572631835938e+02, 2.9655712890625e+02, 2.942179870605469e+02, 2.950230712890625e+02, 2.957950439453125e+02, 2.958896789550781e+02, 2.958037719726562e+02, 2.957060852050781e+02, 2.956017150878906e+02, 2.954903564453125e+02, 2.953819580078125e+02, 2.957755432128906e+02, 2.959239501953125e+02, 2.958983764648438e+02, 2.958122863769531e+02, 2.956854858398438e+02, 2.955560913085938e+02, 2.954240417480469e+02, 2.9528759765625e+02, 2.95342041015625e+02, 2.961524658203125e+02, 2.970876770019531e+02, 2.97622314453125e+02, 2.975182495117188e+02, 2.973820190429688e+02, 2.972417297363281e+02, 2.970984191894531e+02, 2.969559326171875e+02, 2.972681274414062e+02, 2.979461669921875e+02, 2.965861511230469e+02, 2.966249084472656e+02, 2.964938659667969e+02, 2.963466186523438e+02, 2.961501159667969e+02, 2.980364990234375e+02, 2.979473571777344e+02, 2.980525207519531e+02, 2.969268188476562e+02, 2.971317443847656e+02, 2.969201354980469e+02, 2.968055725097656e+02, 2.965866394042969e+02, 2.964843139648438e+02, 2.962891540527344e+02, 2.97805908203125e+02, 2.971761474609375e+02, 2.978529968261719e+02, 2.979222412109375e+02, 2.9753515625e+02, 2.973719787597656e+02, 2.972562866210938e+02, 2.971741333007812e+02, 2.969613037109375e+02, 2.969106140136719e+02, 2.973577270507812e+02, 2.980824584960938e+02, 2.980605163574219e+02, 2.979991455078125e+02, 2.977561340332031e+02, 2.976838989257812e+02, 2.976190185546875e+02, 2.974039306640625e+02, 2.974400024414062e+02, 2.973416442871094e+02] heaWat.u=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] vavDam.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00] fan.sta_a.T=[2.609500122070312e+02, 2.619339904785156e+02, 2.625560607910156e+02, 2.634340515136719e+02, 2.68343994140625e+02, 2.720289611816406e+02, 2.720545959472656e+02, 2.713428955078125e+02, 2.719671630859375e+02, 2.692550048828125e+02, 2.701675109863281e+02, 2.723510437011719e+02, 2.733544006347656e+02, 2.748542175292969e+02, 2.725393981933594e+02, 2.727891845703125e+02, 2.745196228027344e+02, 2.731544494628906e+02, 2.731544799804688e+02, 2.722991333007812e+02, 2.698099365234375e+02, 2.689096374511719e+02, 2.703550109863281e+02, 2.703549194335938e+02, 2.703548583984375e+02, 2.703548278808594e+02, 2.703548278808594e+02, 2.703550720214844e+02, 2.698551635742188e+02, 2.706847229003906e+02, 2.716439208984375e+02, 2.725196838378906e+02, 2.705011901855469e+02, 2.680314636230469e+02, 2.676664733886719e+02, 2.660458374023438e+02, 2.64255615234375e+02, 2.581173400878906e+02, 2.604478149414062e+02, 2.657221984863281e+02, 2.69406005859375e+02, 2.682219848632812e+02, 2.657222900390625e+02, 2.637669982910156e+02, 2.618729248046875e+02, 2.592564392089844e+02, 2.581830444335938e+02, 2.604674377441406e+02, 2.616646728515625e+02, 2.608386535644531e+02, 2.561106262207031e+02, 2.546563415527344e+02, 2.54271484375e+02, 2.5302392578125e+02, 2.509575042724609e+02, 2.541974792480469e+02, 2.587733154296875e+02, 2.602138671875e+02, 2.569418334960938e+02, 2.549216613769531e+02, 2.536201782226562e+02, 2.520576171875e+02, 2.519818878173828e+02, 2.514576568603516e+02, 2.582303466796875e+02, 2.619276123046875e+02, 2.916773986816406e+02, 2.916036682128906e+02, 2.916499633789062e+02, 2.915554504394531e+02, 2.914026489257812e+02, 2.648560485839844e+02, 2.6535595703125e+02, 2.700713195800781e+02, 2.935654602050781e+02, 2.937233581542969e+02, 2.933609008789062e+02, 2.932672424316406e+02, 2.929061584472656e+02, 2.9293359375e+02, 2.925202331542969e+02, 2.720550537109375e+02, 2.93810791015625e+02, 2.944085388183594e+02, 2.939564208984375e+02, 2.931130676269531e+02, 2.929986877441406e+02, 2.930928344726562e+02, 2.931185607910156e+02, 2.927966613769531e+02, 2.930165100097656e+02, 2.939817199707031e+02, 2.949109191894531e+02, 2.94682861328125e+02, 2.947590026855469e+02, 2.942391662597656e+02, 2.944219665527344e+02, 2.943655395507812e+02, 2.939534912109375e+02, 2.942164916992188e+02, 2.942030029296875e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt index 66aac03fd5..6814e25039 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt @@ -6,4 +6,4 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 1e+06] -Tout.T=[2.609500122070312e+02, 2.619280090332031e+02, 2.625499877929688e+02, 2.634280090332031e+02, 2.683388977050781e+02, 2.720243530273438e+02, 2.720499877929688e+02, 2.713381958007812e+02, 2.719623107910156e+02, 2.6925e+02, 2.701626892089844e+02, 2.723464965820312e+02, 2.733500061035156e+02, 2.748500061035156e+02, 2.725348815917969e+02, 2.727846984863281e+02, 2.745153503417969e+02, 2.731499938964844e+02, 2.731499938964844e+02, 2.7229443359375e+02, 2.698047180175781e+02, 2.689043273925781e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.698500061035156e+02, 2.706798400878906e+02, 2.716392211914062e+02, 2.7251513671875e+02, 2.704963989257812e+02, 2.680260009765625e+02, 2.676611022949219e+02, 2.660404052734375e+02, 2.6425e+02, 2.58110595703125e+02, 2.604417114257812e+02, 2.657166748046875e+02, 2.6940087890625e+02, 2.682166748046875e+02, 2.657166748046875e+02, 2.637611083984375e+02, 2.618667907714844e+02, 2.5925e+02, 2.581764831542969e+02, 2.604611206054688e+02, 2.616584777832031e+02, 2.608323364257812e+02, 2.561037292480469e+02, 2.546492767333984e+02, 2.542643737792969e+02, 2.530166625976562e+02, 2.509499969482422e+02, 2.541903991699219e+02, 2.587667236328125e+02, 2.602073364257812e+02, 2.569347839355469e+02, 2.549143829345703e+02, 2.536127471923828e+02, 2.520500030517578e+02, 2.519742736816406e+02, 2.514499969482422e+02, 2.582235412597656e+02, 2.619212036132812e+02, 2.638611145019531e+02, 2.631499938964844e+02, 2.642012023925781e+02, 2.644055480957031e+02, 2.645002136230469e+02, 2.648500061035156e+02, 2.653500061035156e+02, 2.700659484863281e+02, 2.745177612304688e+02, 2.744092712402344e+02, 2.731917419433594e+02, 2.732166748046875e+02, 2.720499877929688e+02, 2.728128356933594e+02, 2.71162841796875e+02, 2.720499877929688e+02, 2.747403564453125e+02, 2.748898315429688e+02, 2.714833374023438e+02, 2.680546264648438e+02, 2.682166748046875e+02, 2.695e+02, 2.701371154785156e+02, 2.691971130371094e+02, 2.709500122070312e+02, 2.748510131835938e+02, 2.769389038085938e+02, 2.755428771972656e+02, 2.76398193359375e+02, 2.743096923828125e+02, 2.759377136230469e+02, 2.759291076660156e+02, 2.744010620117188e+02, 2.759500122070312e+02, 2.764174499511719e+02] +TOut.T=[2.609500122070312e+02, 2.619280090332031e+02, 2.625499877929688e+02, 2.634280090332031e+02, 2.683388977050781e+02, 2.720243530273438e+02, 2.720499877929688e+02, 2.713381958007812e+02, 2.719623107910156e+02, 2.6925e+02, 2.701626892089844e+02, 2.723464965820312e+02, 2.733500061035156e+02, 2.748500061035156e+02, 2.725348815917969e+02, 2.727846984863281e+02, 2.745153503417969e+02, 2.731499938964844e+02, 2.731499938964844e+02, 2.7229443359375e+02, 2.698047180175781e+02, 2.689043273925781e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.698500061035156e+02, 2.706798400878906e+02, 2.716392211914062e+02, 2.7251513671875e+02, 2.704963989257812e+02, 2.680260009765625e+02, 2.676611022949219e+02, 2.660404052734375e+02, 2.6425e+02, 2.58110595703125e+02, 2.604417114257812e+02, 2.657166748046875e+02, 2.6940087890625e+02, 2.682166748046875e+02, 2.657166748046875e+02, 2.637611083984375e+02, 2.618667907714844e+02, 2.5925e+02, 2.581764831542969e+02, 2.604611206054688e+02, 2.616584777832031e+02, 2.608323364257812e+02, 2.561037292480469e+02, 2.546492767333984e+02, 2.542643737792969e+02, 2.530166625976562e+02, 2.509499969482422e+02, 2.541903991699219e+02, 2.587667236328125e+02, 2.602073364257812e+02, 2.569347839355469e+02, 2.549143829345703e+02, 2.536127471923828e+02, 2.520500030517578e+02, 2.519742736816406e+02, 2.514499969482422e+02, 2.582235412597656e+02, 2.619212036132812e+02, 2.638611145019531e+02, 2.631499938964844e+02, 2.642012023925781e+02, 2.644055480957031e+02, 2.645002136230469e+02, 2.648500061035156e+02, 2.653500061035156e+02, 2.700659484863281e+02, 2.745177612304688e+02, 2.744092712402344e+02, 2.731917419433594e+02, 2.732166748046875e+02, 2.720499877929688e+02, 2.728128356933594e+02, 2.71162841796875e+02, 2.720499877929688e+02, 2.747403564453125e+02, 2.748898315429688e+02, 2.714833374023438e+02, 2.680546264648438e+02, 2.682166748046875e+02, 2.695e+02, 2.701371154785156e+02, 2.691971130371094e+02, 2.709500122070312e+02, 2.748510131835938e+02, 2.769389038085938e+02, 2.755428771972656e+02, 2.76398193359375e+02, 2.743096923828125e+02, 2.759377136230469e+02, 2.759291076660156e+02, 2.744010620117188e+02, 2.759500122070312e+02, 2.764174499511719e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt index 7150f143e5..c7c87ba983 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt @@ -12,7 +12,7 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 3.1536e+07] -zone.T=[2.931499938964844e+02, 2.938165893554688e+02, 2.948394775390625e+02, 2.951160888671875e+02, 2.933800964355469e+02, 2.949007263183594e+02, 2.937331848144531e+02, 2.949746704101562e+02, 2.94963623046875e+02, 2.944449768066406e+02, 2.949704284667969e+02, 2.932081604003906e+02, 2.945489196777344e+02, 2.949959106445312e+02, 2.950682983398438e+02, 2.951320190429688e+02, 2.94079345703125e+02, 2.940500793457031e+02, 2.93251708984375e+02, 2.933990783691406e+02, 2.932026672363281e+02, 2.936112365722656e+02, 2.94181396484375e+02, 2.951331481933594e+02, 2.93716552734375e+02, 2.932184143066406e+02, 2.950964050292969e+02, 2.934932556152344e+02, 2.940997009277344e+02, 2.96098876953125e+02, 2.970375061035156e+02, 2.962566223144531e+02, 2.963293762207031e+02, 2.957511291503906e+02, 2.968561096191406e+02, 2.973106079101562e+02, 2.972330017089844e+02, 2.974053955078125e+02, 2.972986145019531e+02, 2.974791564941406e+02, 2.975252075195312e+02, 2.975371398925781e+02, 2.97523681640625e+02, 2.975829772949219e+02, 2.975098876953125e+02, 2.974816284179688e+02, 2.975858459472656e+02, 2.975862426757812e+02, 2.97521728515625e+02, 2.975988159179688e+02, 2.974871520996094e+02, 2.975801086425781e+02, 2.97568115234375e+02, 2.975059204101562e+02, 2.975872802734375e+02, 2.97644775390625e+02, 2.975877075195312e+02, 2.975962524414062e+02, 2.976087341308594e+02, 2.975819396972656e+02, 2.975243835449219e+02, 2.975371398925781e+02, 2.974706420898438e+02, 2.975225830078125e+02, 2.975242614746094e+02, 2.97474609375e+02, 2.974830017089844e+02, 2.974789428710938e+02, 2.974937438964844e+02, 2.974887390136719e+02, 2.974450988769531e+02, 2.974119873046875e+02, 2.970668029785156e+02, 2.966719360351562e+02, 2.971568603515625e+02, 2.972576599121094e+02, 2.966737670898438e+02, 2.959289245605469e+02, 2.957213745117188e+02, 2.9481201171875e+02, 2.944169616699219e+02, 2.947103271484375e+02, 2.939195556640625e+02, 2.940602722167969e+02, 2.940169677734375e+02, 2.937295227050781e+02, 2.931671142578125e+02, 2.933880310058594e+02, 2.950133056640625e+02, 2.940987243652344e+02, 2.951145935058594e+02, 2.951122131347656e+02, 2.931902465820312e+02, 2.951495361328125e+02, 2.950298767089844e+02, 2.942200012207031e+02, 2.936318054199219e+02, 2.943542785644531e+02, 2.931622009277344e+02, 2.951441650390625e+02, 2.932530822753906e+02] +zon.T=[2.931499938964844e+02, 2.938165893554688e+02, 2.948394775390625e+02, 2.951160888671875e+02, 2.933800964355469e+02, 2.949007263183594e+02, 2.937331848144531e+02, 2.949746704101562e+02, 2.94963623046875e+02, 2.944449768066406e+02, 2.949704284667969e+02, 2.932081604003906e+02, 2.945489196777344e+02, 2.949959106445312e+02, 2.950682983398438e+02, 2.951320190429688e+02, 2.94079345703125e+02, 2.940500793457031e+02, 2.93251708984375e+02, 2.933990783691406e+02, 2.932026672363281e+02, 2.936112365722656e+02, 2.94181396484375e+02, 2.951331481933594e+02, 2.93716552734375e+02, 2.932184143066406e+02, 2.950964050292969e+02, 2.934932556152344e+02, 2.940997009277344e+02, 2.96098876953125e+02, 2.970375061035156e+02, 2.962566223144531e+02, 2.963293762207031e+02, 2.957511291503906e+02, 2.968561096191406e+02, 2.973106079101562e+02, 2.972330017089844e+02, 2.974053955078125e+02, 2.972986145019531e+02, 2.974791564941406e+02, 2.975252075195312e+02, 2.975371398925781e+02, 2.97523681640625e+02, 2.975829772949219e+02, 2.975098876953125e+02, 2.974816284179688e+02, 2.975858459472656e+02, 2.975862426757812e+02, 2.97521728515625e+02, 2.975988159179688e+02, 2.974871520996094e+02, 2.975801086425781e+02, 2.97568115234375e+02, 2.975059204101562e+02, 2.975872802734375e+02, 2.97644775390625e+02, 2.975877075195312e+02, 2.975962524414062e+02, 2.976087341308594e+02, 2.975819396972656e+02, 2.975243835449219e+02, 2.975371398925781e+02, 2.974706420898438e+02, 2.975225830078125e+02, 2.975242614746094e+02, 2.97474609375e+02, 2.974830017089844e+02, 2.974789428710938e+02, 2.974937438964844e+02, 2.974887390136719e+02, 2.974450988769531e+02, 2.974119873046875e+02, 2.970668029785156e+02, 2.966719360351562e+02, 2.971568603515625e+02, 2.972576599121094e+02, 2.966737670898438e+02, 2.959289245605469e+02, 2.957213745117188e+02, 2.9481201171875e+02, 2.944169616699219e+02, 2.947103271484375e+02, 2.939195556640625e+02, 2.940602722167969e+02, 2.940169677734375e+02, 2.937295227050781e+02, 2.931671142578125e+02, 2.933880310058594e+02, 2.950133056640625e+02, 2.940987243652344e+02, 2.951145935058594e+02, 2.951122131347656e+02, 2.931902465820312e+02, 2.951495361328125e+02, 2.950298767089844e+02, 2.942200012207031e+02, 2.936318054199219e+02, 2.943542785644531e+02, 2.931622009277344e+02, 2.951441650390625e+02, 2.932530822753906e+02] heaWat.u=[1e+00, 0e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00] vavDam.y=[2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.554025948047638e-01, 2.5e-01, 3.29160213470459e-01, 3.752192556858063e-01, 3.871423006057739e-01, 3.736800849437714e-01, 4.329911172389984e-01, 3.599009811878204e-01, 3.316185176372528e-01, 4.358335733413696e-01, 4.362431168556213e-01, 3.717152774333954e-01, 4.48826789855957e-01, 3.371655642986298e-01, 4.301155805587769e-01, 4.181102514266968e-01, 3.559122383594513e-01, 4.37283456325531e-01, 4.947710633277893e-01, 4.377006590366364e-01, 4.462576806545258e-01, 4.58719402551651e-01, 4.31939035654068e-01, 3.743763864040375e-01, 3.871388733386993e-01, 3.206299543380737e-01, 3.725927770137787e-01, 3.742593824863434e-01, 3.246186673641205e-01, 3.33006888628006e-01, 3.289314806461334e-01, 3.437333405017853e-01, 3.387492895126343e-01, 2.950859367847443e-01, 2.619776129722595e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01] fan.sta_a.T=[2.883200073242188e+02, 2.90562744140625e+02, 2.883319396972656e+02, 2.920919799804688e+02, 2.906665649414062e+02, 2.918930969238281e+02, 2.898759155273438e+02, 2.901109619140625e+02, 2.89111572265625e+02, 2.908656616210938e+02, 2.898673706054688e+02, 2.899195861816406e+02, 2.912050170898438e+02, 2.915523681640625e+02, 2.904037475585938e+02, 2.919996948242188e+02, 2.906729431152344e+02, 2.909330749511719e+02, 2.910764465332031e+02, 2.914588623046875e+02, 2.901047668457031e+02, 2.916375122070312e+02, 2.910815734863281e+02, 2.919293212890625e+02, 2.92504638671875e+02, 2.907031555175781e+02, 2.918236694335938e+02, 2.916273803710938e+02, 2.919345703125e+02, 2.964934997558594e+02, 2.946243896484375e+02, 2.942006225585938e+02, 2.941107788085938e+02, 2.946829528808594e+02, 2.956533813476562e+02, 2.953515014648438e+02, 2.958345642089844e+02, 2.946706848144531e+02, 2.963741760253906e+02, 2.969334106445312e+02, 2.952789306640625e+02, 2.982248229980469e+02, 2.966036376953125e+02, 2.979476318359375e+02, 2.962223205566406e+02, 2.965768737792969e+02, 2.962604675292969e+02, 2.985108032226562e+02, 2.948568725585938e+02, 2.9739111328125e+02, 2.97256591796875e+02, 2.973014831542969e+02, 2.968691101074219e+02, 2.978995361328125e+02, 2.976356811523438e+02, 2.979755554199219e+02, 2.981031188964844e+02, 2.967643127441406e+02, 2.979931640625e+02, 2.976788024902344e+02, 2.957882080078125e+02, 2.974443054199219e+02, 2.967668151855469e+02, 2.963309020996094e+02, 2.979713745117188e+02, 2.966609191894531e+02, 2.968990478515625e+02, 2.969129638671875e+02, 2.965253295898438e+02, 2.967495727539062e+02, 2.962158203125e+02, 2.966826782226562e+02, 2.9535986328125e+02, 2.960602416992188e+02, 2.956841430664062e+02, 2.958915100097656e+02, 2.955003356933594e+02, 2.934600830078125e+02, 2.941224365234375e+02, 2.925818786621094e+02, 2.921419067382812e+02, 2.928599243164062e+02, 2.915148315429688e+02, 2.920691223144531e+02, 2.939436645507812e+02, 2.926375732421875e+02, 2.904195556640625e+02, 2.91980224609375e+02, 2.920718688964844e+02, 2.905301208496094e+02, 2.907398986816406e+02, 2.901202697753906e+02, 2.900093688964844e+02, 2.924759521484375e+02, 2.906303100585938e+02, 2.909695129394531e+02, 2.895492553710938e+02, 2.903458862304688e+02, 2.896872253417969e+02, 2.911193237304688e+02, 2.893901062011719e+02] diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos index f3178944ed..566d5a6dd2 100644 --- a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos @@ -1,2 +1,2 @@ simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse3", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse3"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file +createPlot(id=1,position={0, 0, 792, 1247}, y={"zon.T"}, range={0.0, 1e+06, 16.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos index 2aa9e1d9d0..41d3e524e7 100644 --- a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos @@ -1,3 +1,3 @@ simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse4", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse4"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 80}, grid=true, colors={{28,108,200}}); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zon.T"}, range={0.0, 1e+06, 20, 80}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos index 39f7d7c6d0..3beb683207 100644 --- a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos @@ -1,3 +1,3 @@ simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse5", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse5"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 24}, grid=true, colors={{28,108,200}}); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zon.T"}, range={0.0, 1e+06, 20, 24}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos index 09659816a9..6f301bf5ae 100644 --- a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos @@ -1,5 +1,5 @@ simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse6"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 1e+06, 20, 26}, grid=true, colors={{28,108,200}}); +createPlot(id=1,position={0, 0, 792, 1247}, y={"zon.T"}, range={0.0, 1e+06, 20, 26}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"vavDam.y"}, range={0.0, 1e+06, -0.1, 1.1}, grid=true, subPlot=3, colors={{28,108,200}}); createPlot(id=2, position={818, 10, 662, 377}, y={"fan.sta_a.T", "fan.sta_b.T"}, range={0.0, 380.0, 18.0, 22.5}, grid=true, colors={{28,108,200}, {238,46,47}}); diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos index 42dc530eae..0296806fd5 100644 --- a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos +++ b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos @@ -1,2 +1,2 @@ simulateModel("IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0", stopTime=1e+06, method="CVode", tolerance=1e-06, resultFile="SimpleHouse0"); -createPlot(id=1,position={0, 0, 792, 1247}, y={"Tout.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file +createPlot(id=1,position={0, 0, 792, 1247}, y={"TOut.T"}, range={0.0, 1e+06, 12.5, 20.5}, grid=true, colors={{28,108,200}}); \ No newline at end of file diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos index 295589b0b8..df41096db6 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos @@ -1,5 +1,5 @@ simulateModel("IBPSA.Fluid.Examples.SimpleHouse", stopTime=3.1536e+07, method="Lsodar", tolerance=1e-06, resultFile="SimpleHouse"); -createPlot(id=1, position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 32000000.0, 19.5, 24.5}, grid=true, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 1247}, y={"zon.T"}, range={0.0, 32000000.0, 19.5, 24.5}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 32000000.0, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"vavDam.y"}, range={0.0, 380.0, 0.098, 0.124}, grid=true, subPlot=3, colors={{28,108,200}}); createPlot(id=2, position={818, 10, 662, 377}, y={"fan.sta_a.T", "fan.sta_b.T"}, range={0.0, 380.0, 18.0, 22.5}, grid=true, colors={{28,108,200}, {238,46,47}}); From 4315a72f9a619d2cf218a728780e3b1b6beb43f8 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 15 Sep 2023 11:35:01 -0700 Subject: [PATCH 33/48] Corrected name of mos script --- .../SimpleHouse/{SimpleHouseTemplate.mos => SimpleHouse0.mos} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/{SimpleHouseTemplate.mos => SimpleHouse0.mos} (100%) diff --git a/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos b/IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse0.mos similarity index 100% rename from IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouseTemplate.mos rename to IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse0.mos From 5d2a6d76df41e4ea14f4564f6cae7639b819c9dc Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 15 Sep 2023 13:49:42 -0700 Subject: [PATCH 34/48] Deleted old mos file --- ...Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt deleted file mode 100644 index 6814e25039..0000000000 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouseTemplate.txt +++ /dev/null @@ -1,9 +0,0 @@ -last-generated=2023-09-08 -statistics-simulation= -{ - "linear": " ", - "nonlinear": "1", - "numerical Jacobians": "0" -} -time=[0e+00, 1e+06] -TOut.T=[2.609500122070312e+02, 2.619280090332031e+02, 2.625499877929688e+02, 2.634280090332031e+02, 2.683388977050781e+02, 2.720243530273438e+02, 2.720499877929688e+02, 2.713381958007812e+02, 2.719623107910156e+02, 2.6925e+02, 2.701626892089844e+02, 2.723464965820312e+02, 2.733500061035156e+02, 2.748500061035156e+02, 2.725348815917969e+02, 2.727846984863281e+02, 2.745153503417969e+02, 2.731499938964844e+02, 2.731499938964844e+02, 2.7229443359375e+02, 2.698047180175781e+02, 2.689043273925781e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.698500061035156e+02, 2.706798400878906e+02, 2.716392211914062e+02, 2.7251513671875e+02, 2.704963989257812e+02, 2.680260009765625e+02, 2.676611022949219e+02, 2.660404052734375e+02, 2.6425e+02, 2.58110595703125e+02, 2.604417114257812e+02, 2.657166748046875e+02, 2.6940087890625e+02, 2.682166748046875e+02, 2.657166748046875e+02, 2.637611083984375e+02, 2.618667907714844e+02, 2.5925e+02, 2.581764831542969e+02, 2.604611206054688e+02, 2.616584777832031e+02, 2.608323364257812e+02, 2.561037292480469e+02, 2.546492767333984e+02, 2.542643737792969e+02, 2.530166625976562e+02, 2.509499969482422e+02, 2.541903991699219e+02, 2.587667236328125e+02, 2.602073364257812e+02, 2.569347839355469e+02, 2.549143829345703e+02, 2.536127471923828e+02, 2.520500030517578e+02, 2.519742736816406e+02, 2.514499969482422e+02, 2.582235412597656e+02, 2.619212036132812e+02, 2.638611145019531e+02, 2.631499938964844e+02, 2.642012023925781e+02, 2.644055480957031e+02, 2.645002136230469e+02, 2.648500061035156e+02, 2.653500061035156e+02, 2.700659484863281e+02, 2.745177612304688e+02, 2.744092712402344e+02, 2.731917419433594e+02, 2.732166748046875e+02, 2.720499877929688e+02, 2.728128356933594e+02, 2.71162841796875e+02, 2.720499877929688e+02, 2.747403564453125e+02, 2.748898315429688e+02, 2.714833374023438e+02, 2.680546264648438e+02, 2.682166748046875e+02, 2.695e+02, 2.701371154785156e+02, 2.691971130371094e+02, 2.709500122070312e+02, 2.748510131835938e+02, 2.769389038085938e+02, 2.755428771972656e+02, 2.76398193359375e+02, 2.743096923828125e+02, 2.759377136230469e+02, 2.759291076660156e+02, 2.744010620117188e+02, 2.759500122070312e+02, 2.764174499511719e+02] From 4a6ab6a1afeb9b30520490684aa703f00f9d1f8a Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 15 Sep 2023 13:53:29 -0700 Subject: [PATCH 35/48] Added missing reference results --- .../IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse0.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse0.txt diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse0.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse0.txt new file mode 100644 index 0000000000..edb3888914 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse0.txt @@ -0,0 +1,9 @@ +last-generated=2023-09-15 +statistics-simulation= +{ + "linear": " ", + "nonlinear": "1", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+06] +TOut.T=[2.609500122070312e+02, 2.619280090332031e+02, 2.625499877929688e+02, 2.634280090332031e+02, 2.683388977050781e+02, 2.720243530273438e+02, 2.720499877929688e+02, 2.713381958007812e+02, 2.719623107910156e+02, 2.6925e+02, 2.701626892089844e+02, 2.723464965820312e+02, 2.733500061035156e+02, 2.748500061035156e+02, 2.725348815917969e+02, 2.727846984863281e+02, 2.745153503417969e+02, 2.731499938964844e+02, 2.731499938964844e+02, 2.7229443359375e+02, 2.698047180175781e+02, 2.689043273925781e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.698500061035156e+02, 2.706798400878906e+02, 2.716392211914062e+02, 2.7251513671875e+02, 2.704963989257812e+02, 2.680260009765625e+02, 2.676611022949219e+02, 2.660404052734375e+02, 2.6425e+02, 2.58110595703125e+02, 2.604417114257812e+02, 2.657166748046875e+02, 2.6940087890625e+02, 2.682166748046875e+02, 2.657166748046875e+02, 2.637611083984375e+02, 2.618667907714844e+02, 2.5925e+02, 2.581764831542969e+02, 2.604611206054688e+02, 2.616584777832031e+02, 2.608323364257812e+02, 2.561037292480469e+02, 2.546492767333984e+02, 2.542643737792969e+02, 2.530166625976562e+02, 2.509499969482422e+02, 2.541903991699219e+02, 2.587667236328125e+02, 2.602073364257812e+02, 2.569347839355469e+02, 2.549143829345703e+02, 2.536127471923828e+02, 2.520500030517578e+02, 2.519742736816406e+02, 2.514499969482422e+02, 2.582235412597656e+02, 2.619212036132812e+02, 2.638611145019531e+02, 2.631499938964844e+02, 2.642012023925781e+02, 2.644055480957031e+02, 2.645002136230469e+02, 2.648500061035156e+02, 2.653500061035156e+02, 2.700659484863281e+02, 2.745177612304688e+02, 2.744092712402344e+02, 2.731917419433594e+02, 2.732166748046875e+02, 2.720499877929688e+02, 2.728128356933594e+02, 2.71162841796875e+02, 2.720499877929688e+02, 2.747403564453125e+02, 2.748898315429688e+02, 2.714833374023438e+02, 2.680546264648438e+02, 2.682166748046875e+02, 2.695e+02, 2.701371154785156e+02, 2.691971130371094e+02, 2.709500122070312e+02, 2.748510131835938e+02, 2.769389038085938e+02, 2.755428771972656e+02, 2.76398193359375e+02, 2.743096923828125e+02, 2.759377136230469e+02, 2.759291076660156e+02, 2.744010620117188e+02, 2.759500122070312e+02, 2.764174499511719e+02] From bee48eda0b0b1c50ad17a3906eb99edc9ad99fed Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Sat, 16 Sep 2023 07:25:37 -0700 Subject: [PATCH 36/48] Corrected variable names --- .../Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt | 2 +- IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt index c7c87ba983..7150f143e5 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_Examples_SimpleHouse.txt @@ -12,7 +12,7 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 3.1536e+07] -zon.T=[2.931499938964844e+02, 2.938165893554688e+02, 2.948394775390625e+02, 2.951160888671875e+02, 2.933800964355469e+02, 2.949007263183594e+02, 2.937331848144531e+02, 2.949746704101562e+02, 2.94963623046875e+02, 2.944449768066406e+02, 2.949704284667969e+02, 2.932081604003906e+02, 2.945489196777344e+02, 2.949959106445312e+02, 2.950682983398438e+02, 2.951320190429688e+02, 2.94079345703125e+02, 2.940500793457031e+02, 2.93251708984375e+02, 2.933990783691406e+02, 2.932026672363281e+02, 2.936112365722656e+02, 2.94181396484375e+02, 2.951331481933594e+02, 2.93716552734375e+02, 2.932184143066406e+02, 2.950964050292969e+02, 2.934932556152344e+02, 2.940997009277344e+02, 2.96098876953125e+02, 2.970375061035156e+02, 2.962566223144531e+02, 2.963293762207031e+02, 2.957511291503906e+02, 2.968561096191406e+02, 2.973106079101562e+02, 2.972330017089844e+02, 2.974053955078125e+02, 2.972986145019531e+02, 2.974791564941406e+02, 2.975252075195312e+02, 2.975371398925781e+02, 2.97523681640625e+02, 2.975829772949219e+02, 2.975098876953125e+02, 2.974816284179688e+02, 2.975858459472656e+02, 2.975862426757812e+02, 2.97521728515625e+02, 2.975988159179688e+02, 2.974871520996094e+02, 2.975801086425781e+02, 2.97568115234375e+02, 2.975059204101562e+02, 2.975872802734375e+02, 2.97644775390625e+02, 2.975877075195312e+02, 2.975962524414062e+02, 2.976087341308594e+02, 2.975819396972656e+02, 2.975243835449219e+02, 2.975371398925781e+02, 2.974706420898438e+02, 2.975225830078125e+02, 2.975242614746094e+02, 2.97474609375e+02, 2.974830017089844e+02, 2.974789428710938e+02, 2.974937438964844e+02, 2.974887390136719e+02, 2.974450988769531e+02, 2.974119873046875e+02, 2.970668029785156e+02, 2.966719360351562e+02, 2.971568603515625e+02, 2.972576599121094e+02, 2.966737670898438e+02, 2.959289245605469e+02, 2.957213745117188e+02, 2.9481201171875e+02, 2.944169616699219e+02, 2.947103271484375e+02, 2.939195556640625e+02, 2.940602722167969e+02, 2.940169677734375e+02, 2.937295227050781e+02, 2.931671142578125e+02, 2.933880310058594e+02, 2.950133056640625e+02, 2.940987243652344e+02, 2.951145935058594e+02, 2.951122131347656e+02, 2.931902465820312e+02, 2.951495361328125e+02, 2.950298767089844e+02, 2.942200012207031e+02, 2.936318054199219e+02, 2.943542785644531e+02, 2.931622009277344e+02, 2.951441650390625e+02, 2.932530822753906e+02] +zone.T=[2.931499938964844e+02, 2.938165893554688e+02, 2.948394775390625e+02, 2.951160888671875e+02, 2.933800964355469e+02, 2.949007263183594e+02, 2.937331848144531e+02, 2.949746704101562e+02, 2.94963623046875e+02, 2.944449768066406e+02, 2.949704284667969e+02, 2.932081604003906e+02, 2.945489196777344e+02, 2.949959106445312e+02, 2.950682983398438e+02, 2.951320190429688e+02, 2.94079345703125e+02, 2.940500793457031e+02, 2.93251708984375e+02, 2.933990783691406e+02, 2.932026672363281e+02, 2.936112365722656e+02, 2.94181396484375e+02, 2.951331481933594e+02, 2.93716552734375e+02, 2.932184143066406e+02, 2.950964050292969e+02, 2.934932556152344e+02, 2.940997009277344e+02, 2.96098876953125e+02, 2.970375061035156e+02, 2.962566223144531e+02, 2.963293762207031e+02, 2.957511291503906e+02, 2.968561096191406e+02, 2.973106079101562e+02, 2.972330017089844e+02, 2.974053955078125e+02, 2.972986145019531e+02, 2.974791564941406e+02, 2.975252075195312e+02, 2.975371398925781e+02, 2.97523681640625e+02, 2.975829772949219e+02, 2.975098876953125e+02, 2.974816284179688e+02, 2.975858459472656e+02, 2.975862426757812e+02, 2.97521728515625e+02, 2.975988159179688e+02, 2.974871520996094e+02, 2.975801086425781e+02, 2.97568115234375e+02, 2.975059204101562e+02, 2.975872802734375e+02, 2.97644775390625e+02, 2.975877075195312e+02, 2.975962524414062e+02, 2.976087341308594e+02, 2.975819396972656e+02, 2.975243835449219e+02, 2.975371398925781e+02, 2.974706420898438e+02, 2.975225830078125e+02, 2.975242614746094e+02, 2.97474609375e+02, 2.974830017089844e+02, 2.974789428710938e+02, 2.974937438964844e+02, 2.974887390136719e+02, 2.974450988769531e+02, 2.974119873046875e+02, 2.970668029785156e+02, 2.966719360351562e+02, 2.971568603515625e+02, 2.972576599121094e+02, 2.966737670898438e+02, 2.959289245605469e+02, 2.957213745117188e+02, 2.9481201171875e+02, 2.944169616699219e+02, 2.947103271484375e+02, 2.939195556640625e+02, 2.940602722167969e+02, 2.940169677734375e+02, 2.937295227050781e+02, 2.931671142578125e+02, 2.933880310058594e+02, 2.950133056640625e+02, 2.940987243652344e+02, 2.951145935058594e+02, 2.951122131347656e+02, 2.931902465820312e+02, 2.951495361328125e+02, 2.950298767089844e+02, 2.942200012207031e+02, 2.936318054199219e+02, 2.943542785644531e+02, 2.931622009277344e+02, 2.951441650390625e+02, 2.932530822753906e+02] heaWat.u=[1e+00, 0e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00] vavDam.y=[2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.554025948047638e-01, 2.5e-01, 3.29160213470459e-01, 3.752192556858063e-01, 3.871423006057739e-01, 3.736800849437714e-01, 4.329911172389984e-01, 3.599009811878204e-01, 3.316185176372528e-01, 4.358335733413696e-01, 4.362431168556213e-01, 3.717152774333954e-01, 4.48826789855957e-01, 3.371655642986298e-01, 4.301155805587769e-01, 4.181102514266968e-01, 3.559122383594513e-01, 4.37283456325531e-01, 4.947710633277893e-01, 4.377006590366364e-01, 4.462576806545258e-01, 4.58719402551651e-01, 4.31939035654068e-01, 3.743763864040375e-01, 3.871388733386993e-01, 3.206299543380737e-01, 3.725927770137787e-01, 3.742593824863434e-01, 3.246186673641205e-01, 3.33006888628006e-01, 3.289314806461334e-01, 3.437333405017853e-01, 3.387492895126343e-01, 2.950859367847443e-01, 2.619776129722595e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01, 2.5e-01] fan.sta_a.T=[2.883200073242188e+02, 2.90562744140625e+02, 2.883319396972656e+02, 2.920919799804688e+02, 2.906665649414062e+02, 2.918930969238281e+02, 2.898759155273438e+02, 2.901109619140625e+02, 2.89111572265625e+02, 2.908656616210938e+02, 2.898673706054688e+02, 2.899195861816406e+02, 2.912050170898438e+02, 2.915523681640625e+02, 2.904037475585938e+02, 2.919996948242188e+02, 2.906729431152344e+02, 2.909330749511719e+02, 2.910764465332031e+02, 2.914588623046875e+02, 2.901047668457031e+02, 2.916375122070312e+02, 2.910815734863281e+02, 2.919293212890625e+02, 2.92504638671875e+02, 2.907031555175781e+02, 2.918236694335938e+02, 2.916273803710938e+02, 2.919345703125e+02, 2.964934997558594e+02, 2.946243896484375e+02, 2.942006225585938e+02, 2.941107788085938e+02, 2.946829528808594e+02, 2.956533813476562e+02, 2.953515014648438e+02, 2.958345642089844e+02, 2.946706848144531e+02, 2.963741760253906e+02, 2.969334106445312e+02, 2.952789306640625e+02, 2.982248229980469e+02, 2.966036376953125e+02, 2.979476318359375e+02, 2.962223205566406e+02, 2.965768737792969e+02, 2.962604675292969e+02, 2.985108032226562e+02, 2.948568725585938e+02, 2.9739111328125e+02, 2.97256591796875e+02, 2.973014831542969e+02, 2.968691101074219e+02, 2.978995361328125e+02, 2.976356811523438e+02, 2.979755554199219e+02, 2.981031188964844e+02, 2.967643127441406e+02, 2.979931640625e+02, 2.976788024902344e+02, 2.957882080078125e+02, 2.974443054199219e+02, 2.967668151855469e+02, 2.963309020996094e+02, 2.979713745117188e+02, 2.966609191894531e+02, 2.968990478515625e+02, 2.969129638671875e+02, 2.965253295898438e+02, 2.967495727539062e+02, 2.962158203125e+02, 2.966826782226562e+02, 2.9535986328125e+02, 2.960602416992188e+02, 2.956841430664062e+02, 2.958915100097656e+02, 2.955003356933594e+02, 2.934600830078125e+02, 2.941224365234375e+02, 2.925818786621094e+02, 2.921419067382812e+02, 2.928599243164062e+02, 2.915148315429688e+02, 2.920691223144531e+02, 2.939436645507812e+02, 2.926375732421875e+02, 2.904195556640625e+02, 2.91980224609375e+02, 2.920718688964844e+02, 2.905301208496094e+02, 2.907398986816406e+02, 2.901202697753906e+02, 2.900093688964844e+02, 2.924759521484375e+02, 2.906303100585938e+02, 2.909695129394531e+02, 2.895492553710938e+02, 2.903458862304688e+02, 2.896872253417969e+02, 2.911193237304688e+02, 2.893901062011719e+02] diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos index df41096db6..295589b0b8 100644 --- a/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/Examples/SimpleHouse.mos @@ -1,5 +1,5 @@ simulateModel("IBPSA.Fluid.Examples.SimpleHouse", stopTime=3.1536e+07, method="Lsodar", tolerance=1e-06, resultFile="SimpleHouse"); -createPlot(id=1, position={0, 0, 792, 1247}, y={"zon.T"}, range={0.0, 32000000.0, 19.5, 24.5}, grid=true, colors={{28,108,200}}); +createPlot(id=1, position={0, 0, 792, 1247}, y={"zone.T"}, range={0.0, 32000000.0, 19.5, 24.5}, grid=true, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"heaWat.u"}, range={0.0, 32000000.0, -0.1, 1.1}, grid=true, subPlot=2, colors={{28,108,200}}); createPlot(id=1, position={0, 0, 792, 413}, y={"vavDam.y"}, range={0.0, 380.0, 0.098, 0.124}, grid=true, subPlot=3, colors={{28,108,200}}); createPlot(id=2, position={818, 10, 662, 377}, y={"fan.sta_a.T", "fan.sta_b.T"}, range={0.0, 380.0, 18.0, 22.5}, grid=true, colors={{28,108,200}, {238,46,47}}); From bee86ba6cfff5cefb7de10f18fe4f306bbc758ef Mon Sep 17 00:00:00 2001 From: "fabian.wuellhorst" Date: Mon, 18 Sep 2023 08:35:38 +0200 Subject: [PATCH 37/48] fix poorly displayed connection in OM [ci-skip] --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index ae829a5559..e9d382f1de 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -14,8 +14,8 @@ model SimpleHouse1 "Building wall model" equation connect(walRes.port_b, walCap.port) annotation (Line(points={{100,0},{112,0}, {112,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - connect(TOut.port, walRes.port_a) - annotation (Line(points={{0,0},{80,0}}, color={191,0,0})); + connect(TOut.port, walRes.port_a) annotation( + Line(points = {{-60, 0}, {80, 0}}, color = {191, 0, 0})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, -220},{200,200}})), experiment(Tolerance=1e-6, StopTime=1e+06), From 6e96fd5655def4d35ef244e16c4ffc21749392cd Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Mon, 18 Sep 2023 13:42:31 +0200 Subject: [PATCH 38/48] Restructure diagram and components and move all building envelope components in one block. --- .../Tutorial/SimpleHouse/SimpleHouse0.mo | 199 ++++++------ .../Tutorial/SimpleHouse/SimpleHouse1.mo | 178 +++++------ .../Tutorial/SimpleHouse/SimpleHouse2.mo | 159 +++++----- .../Tutorial/SimpleHouse/SimpleHouse3.mo | 174 +++++------ .../Tutorial/SimpleHouse/SimpleHouse4.mo | 264 ++++++++-------- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 170 +++++------ .../Tutorial/SimpleHouse/SimpleHouse6.mo | 285 +++++++++--------- 7 files changed, 716 insertions(+), 713 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index b84d2e4e5a..8950434730 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -1,99 +1,100 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse0 - "Start file for simple house example" - extends Modelica.Icons.Example; - package MediumAir = IBPSA.Media.Air "Medium model for air"; - package MediumWater = IBPSA.Media.Water "Medium model for water"; - parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; - parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; - parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; - parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; - parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; - IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= - ModelicaServices.ExternalReferences.loadResource( - "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) - "Weather data reader" - annotation (Placement(transformation(extent={{-200,-20},{-180,0}}))); - IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" - annotation (Placement(transformation(extent={{-160,-20},{-140,0}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut - "Exterior temperature boundary condition" - annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); -equation - connect(weaDat.weaBus, weaBus) annotation (Line( - points={{-180,-10},{-150,-10}}, - color={255,204,51}, - thickness=0.5)); - connect(TOut.T, weaBus.TDryBul) - annotation (Line(points={{-82,0},{-150,0},{-150,-10}},color={0,0,127})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}}), graphics={ - Rectangle( - extent={{-220,40},{-38,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,-60},{180,-200}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-220,180},{180,60}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-20,40},{180,-40}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Text( - extent={{22,22},{-23,39}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Wall"), - Text( - extent={{-157,-79},{-223,-61}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Heating"), - Text( - extent={{-118,18},{-214,40}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Weather inputs"), - Text( - extent={{-76,158},{-214,180}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Cooling and ventilation")}), - experiment(Tolerance=1E-6, StopTime=1e+06), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse0.mos" - "Simulate and plot"), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -Replace IDEAS by IBPSA models. -
                  • -
                  • -October 11, 2016, by Filip Jorissen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -This model is used as the starting point for the SimpleHouse tutorial. -It contains a weather data reader and a PrescribedTemperature component -that allows the user to connect thermal components to the dry bulb temperature. -It was based on from the Modelica crash course organised by KU Leuven -(https://github.com/open-ideas/__CrashCourse__). -

                  -")); -end SimpleHouse0; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse0 + "Start file for simple house example" + extends Modelica.Icons.Example; + package MediumAir = IBPSA.Media.Air "Medium model for air"; + package MediumWater = IBPSA.Media.Water "Medium model for water"; + parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; + parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; + IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + "Weather data reader" + annotation (Placement(transformation(extent={{-180,-10},{-160,10}}))); + IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement(transformation(extent={{-140,-10},{-120,10}}), + iconTransformation(extent={{-152,-10},{-132,10}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut + "Exterior temperature boundary condition" + annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); +equation + connect(weaDat.weaBus, weaBus) annotation (Line( + points={{-160,0},{-130,0}}, + color={255,204,51}, + thickness=0.5)); + connect(TOut.T, weaBus.TDryBul) + annotation (Line(points={{-82,0},{-130,0}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}}), graphics={ + Rectangle( + extent={{-200,60},{-20,-60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-200,-80},{200,-200}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-200,200},{200,80}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{0,60},{200,-60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Text( + extent={{57.25,40.25},{2.75,59.75}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Building"), + Text( + extent={{-137,-99},{-203,-81}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Heating"), + Text( + extent={{-102,39},{-198,61}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Weather inputs"), + Text( + extent={{-61,179},{-199,201}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Cooling and ventilation")}), + experiment(Tolerance=1E-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +Replace IDEAS by IBPSA models and general revision/update of the model. +
                  • +
                  • +October 11, 2016, by Filip Jorissen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +This model is used as the starting point for the SimpleHouse tutorial. +It contains a weather data reader and a PrescribedTemperature component +that allows the user to connect thermal components to the dry bulb temperature. +It was based on from the Modelica crash course organised by KU Leuven +(https://github.com/open-ideas/__CrashCourse__). +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse0.mos" + "Simulate and plot")); +end SimpleHouse0; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index e9d382f1de..0f4e308dfc 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -1,89 +1,89 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse1 "Building wall model" - extends SimpleHouse0; - - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - C=AWall*dWall*cpWall*rhoWall, T(fixed=true)) - "Thermal mass of wall" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={150,0}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor walRes(R=dWall/AWall - /kWall) "Thermal resistor for wall: 25 cm of rockwool" - annotation (Placement(transformation(extent={{80,-10},{100,10}}))); -equation - connect(walRes.port_b, walCap.port) annotation (Line(points={{100,0},{112,0}, - {112,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - connect(TOut.port, walRes.port_a) annotation( - Line(points = {{-60, 0}, {80, 0}}, color = {191, 0, 0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. -The house consists of a wall represented by a single heat capacitor and a thermal resistor. -The boundary temperature are already included in - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. -The wall has a surface area of Awall=100 m2, -a thickness of dwall=25 cm, -a thermal conductivity of kwall=0.04 W/(m K), -a density of ρwall=2000 kg/m3, -and a specific heat capacity of cp,wall= 1000 J/(kg K) -

                  -

                  -These parameters are already declared in the equation section of - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. -You can use this way of declaring parameters in the remainder of this exercise, but this is not required. -

                  -

                  -The conductive thermal resistance value of a wall may be computed as R=d/(A*k). -The heat capacity value of a wall may be computed as C=A*d*cp -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -Connect one side of the thermal resistor to the output of PrescribedTemperature -and the other side of the thermal resistor to the heat capacitor. -

                  -

                  Reference result

                  -

                  -If you correctly added the model of the heat capacitor, -connected it to the resistor and added the parameter values for C, -then you should be able to simulate the model. -To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. -You can now simulate the model by pressing the Simulate button. -

                  -

                  -You can plot individual variables values by clicking on their name in the variable browser on the left. -Now plot the wall capacitor temperature value T. -It should look like the figure below (1 Ms is around 12 days). -

                  -

                  -\"Wall -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" - "Simulate and plot")); -end SimpleHouse1; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse1 "Building wall model" + extends SimpleHouse0; + + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( + C=AWall*dWall*cpWall*rhoWall, T(fixed=true)) + "Thermal mass of wall" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={170,0}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor walRes(R=dWall/AWall + /kWall) "Thermal resistor for wall: 25 cm of rockwool" + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); +equation + connect(walRes.port_b, walCap.port) annotation (Line(points={{80,0},{100,0},{100, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + connect(TOut.port, walRes.port_a) + annotation (Line(points={{-60,0},{60,0}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. +The house consists of a wall represented by a single heat capacitor and a thermal resistor. +The boundary temperature are already included in + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +The wall has a surface area of Awall=100 m2, +a thickness of dwall=25 cm, +a thermal conductivity of kwall=0.04 W/(m K), +a density of ρwall=2000 kg/m3, +and a specific heat capacity of cp,wall= 1000 J/(kg K) +

                  +

                  +These parameters are already declared in the equation section of + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +You can use this way of declaring parameters in the remainder of this exercise, but this is not required. +

                  +

                  +The conductive thermal resistance value of a wall may be computed as R=d/(A*k). +The heat capacity value of a wall may be computed as C=A*d*cp +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +Connect one side of the thermal resistor to the output of PrescribedTemperature +and the other side of the thermal resistor to the heat capacitor. +

                  +

                  Reference result

                  +

                  +If you correctly added the model of the heat capacitor, +connected it to the resistor and added the parameter values for C, +then you should be able to simulate the model. +To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. +You can now simulate the model by pressing the Simulate button. +

                  +

                  +You can plot individual variables values by clicking on their name in the variable browser on the left. +Now plot the wall capacitor temperature value T. +It should look like the figure below (1 Ms is around 12 days). +

                  +

                  +\"Wall +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" + "Simulate and plot")); +end SimpleHouse1; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index e9611bdc13..9dd59a9f8a 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -1,80 +1,79 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse2 "Building window model" - extends SimpleHouse1; - - parameter Modelica.Units.SI.Area AWin=2 "Window area"; - - Modelica.Blocks.Math.Gain gaiWin(k=AWin) - "Gain for solar irradiance through the window" - annotation (Placement(transformation(extent={{0,-30},{20,-10}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win - "Very simple window model" - annotation (Placement(transformation(extent={{40,-30},{60,-10}}))); -equation - connect(gaiWin.y, win.Q_flow) - annotation (Line(points={{21,-20},{40,-20}}, color={0,0,127})); - connect(win.port, walCap.port) annotation (Line(points={{60,-20},{130,-20},{ - 130,1.77636e-15},{140,1.77636e-15}}, - color={191,0,0})); - connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{-2,-20},{-150,-20}, - {-150,-10}}, color={0,0,127}), Text( - string="%second", - index=1, - extent={{-6,3},{-6,3}}, - horizontalAlignment=TextAlignment.Right)); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -The window has a surface area of 2 m2. -In this simple model we will therefore assume that -two times the outdoor solar irradiance is injected as heat onto the inside of the wall. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -To be able to use the value of the outdoor solar irradiance -you will need to access the weather data reader. -To do this, make a connection to the weaBus. -In the dialog box select <New Variable> and here type HDirNor, -which is the direct solar irradiance on a surface of 1 m2, -perpendicular to the sun rays. -Set the gain factor k to 2, -in order to get the solar irradiance through the window of 2 m2. -

                  -

                  -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

                  -

                  Reference result

                  -

                  -The result with and without the window model is plotted in the figure below. -

                  -

                  -\"Wall -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" - "Simulate and plot")); -end SimpleHouse2; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse2 "Building window model" + extends SimpleHouse1; + + parameter Modelica.Units.SI.Area AWin=2 "Window area"; + + Modelica.Blocks.Math.Gain gaiWin(k=AWin) + "Gain for solar irradiance through the window" + annotation (Placement(transformation(extent={{20,-50},{40,-30}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win + "Very simple window model" + annotation (Placement(transformation(extent={{60,-50},{80,-30}}))); +equation + connect(gaiWin.y, win.Q_flow) + annotation (Line(points={{41,-40},{60,-40}}, color={0,0,127})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{18,-40},{-130,-40}, + {-130,0}}, color={0,0,127}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + connect(win.port, walCap.port) annotation (Line(points={{80,-40},{110,-40},{110, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +The window has a surface area of 2 m2. +In this simple model we will therefore assume that +two times the outdoor solar irradiance is injected as heat onto the inside of the wall. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +To be able to use the value of the outdoor solar irradiance +you will need to access the weather data reader. +To do this, make a connection to the weaBus. +In the dialog box select <New Variable> and here type HDirNor, +which is the direct solar irradiance on a surface of 1 m2, +perpendicular to the sun rays. +Set the gain factor k to 2, +in order to get the solar irradiance through the window of 2 m2. +

                  +

                  +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

                  +

                  Reference result

                  +

                  +The result with and without the window model is plotted in the figure below. +

                  +

                  +\"Wall +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" + "Simulate and plot")); +end SimpleHouse2; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index ca649707b4..0446f28da8 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -1,87 +1,87 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse3 "Air model" - extends SimpleHouse2; - - parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; - parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 - "Nominal mass flow rate for air loop"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 - "Convective heat transfer coefficient at the wall"; - - Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ - AWall) "Thermal resistance for convective heat transfer" annotation ( - Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=270, - origin={130,20}))); - IBPSA.Fluid.MixingVolumes.MixingVolume zon( - redeclare package Medium = MediumAir, - V=VZone, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" - annotation (Placement(transformation(extent={{110,130},{90,150}}))); -equation - connect(conRes.port_b, walCap.port) annotation (Line(points={{130,10},{130, - 1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - connect(zon.heatPort, conRes.port_a) - annotation (Line(points={{110,140},{130,140},{130,30}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. -The air will exchange heat with the wall. -This may be modelled using a thermal resistance representing -the convective heat resistance which is equal to Rconv=1/(h*A), -where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -The MixingVolume Medium parameter contains information about -the type of fluid and its properties that should be modelled by the MixingVolume. -Set its value to MediumAir, which is declared in the template, -by typing redeclare package Medium = MediumAir. -For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. -You will have to change this value once you add a ventilation system to the model (see - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). -Finally, set the energyDynamics of the MixingVolume, -which can be found in the Dynamics tab of the model parameter window, to FixedInitial. -

                  -

                  -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

                  -

                  Reference result

                  -

                  -The result with and without the air model is plotted in the figure below. -

                  -

                  -\"Wall -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" - "Simulate and plot")); -end SimpleHouse3; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse3 "Air model" + extends SimpleHouse2; + + parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 + "Nominal mass flow rate for air loop"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 + "Convective heat transfer coefficient at the wall"; + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ + AWall) "Thermal resistance for convective heat transfer" annotation ( + Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={110,20}))); + IBPSA.Fluid.MixingVolumes.MixingVolume zon( + redeclare package Medium = MediumAir, + V=VZone, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" + annotation (Placement(transformation(extent={{160,50},{180,30}}))); +equation + connect(zon.heatPort, conRes.port_a) + annotation (Line(points={{160,40},{110,40},{110,30}}, color={191,0,0})); + connect(conRes.port_b, walCap.port) annotation (Line(points={{110,10},{110,1.77636e-15}, + {160,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. +The air will exchange heat with the wall. +This may be modelled using a thermal resistance representing +the convective heat resistance which is equal to Rconv=1/(h*A), +where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +The MixingVolume Medium parameter contains information about +the type of fluid and its properties that should be modelled by the MixingVolume. +Set its value to MediumAir, which is declared in the template, +by typing redeclare package Medium = MediumAir. +For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. +You will have to change this value once you add a ventilation system to the model (see + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). +Finally, set the energyDynamics of the MixingVolume, +which can be found in the Dynamics tab of the model parameter window, to FixedInitial. +

                  +

                  +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

                  +

                  Reference result

                  +

                  +The result with and without the air model is plotted in the figure below. +

                  +

                  +\"Wall +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" + "Simulate and plot")); +end SimpleHouse3; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 753cb7d1f9..6f63671e28 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,132 +1,132 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse4 "Heating model" - extends SimpleHouse3; - - parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 - "Nominal mass flow rate for water loop"; - parameter Boolean use_constantHeater=true - "To enable/disable the connection between the constant source and heater"; - - IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=333.15, - T_b_nominal=313.15, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=false, - Q_flow_nominal=QHea_flow_nominal) "Radiator" - annotation (Placement(transformation(extent={{110,-110},{130,-90}}))); - IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - dp_nominal=5000, - Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{60,-110},{80,-90}}))); - IBPSA.Fluid.Movers.FlowControlled_m_flow pum( - redeclare package Medium = MediumWater, - use_inputFilter=false, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - nominalValuesDefineDefaultPressureCurve=true, - inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" - annotation (Placement(transformation(extent={{110,-180},{90,-160}}))); - IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={10,-170}))); - Modelica.Blocks.Sources.Constant conHea(k=1) - annotation (Placement(transformation(extent={{80,-80},{60,-60}}))); -equation - connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-100},{110,-100}}, - color={0,127,255})); - connect(rad.port_b, pum.port_a) annotation (Line(points={{130,-100},{148,-100}, - {148,-170},{110,-170}}, color={0,127,255})); - connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-100},{49.75, - -100},{49.75,-170},{90,-170}}, color={0,127,255})); - connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{118,-92.8},{ - 118,140},{110,140}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{122,-92.8},{122, - -20},{130,-20},{130,1.77636e-15},{140,1.77636e-15}}, color={191,0,0})); - if use_constantHeater then - connect(conHea.y, heaWat.u) annotation (Line(points={{59,-70},{50,-70},{50, - -94},{58,-94}}, color={0,0,127})); - end if; - connect(bouWat.ports[1], pum.port_b) - annotation (Line(points={{20,-170},{90,-170}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C -and 40°C, and a room air and radiative temperature of 20°C. -The pump has a (nominal) mass flow rate of 0.1 kg/s. -Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -The radiator contains one port for convective heat transfer and one for radiative heat transfer. -Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, -the media for the models should be set to MediumWater. -

                  -

                  -The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. -Otherwise the absolute pressure in the system is undefined. -Pressure difference modelling may be disregarded in the heating circuit -since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. -

                  -

                  -Set the heater input to 1, meaning that it will produce 1 times its nominal power. -

                  -

                  Reference result

                  -

                  -The result of the air temperature is plotted in the figure below. -The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) -and the heater is not disabled when it becomes too warm. -

                  -

                  -\"Air -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" - "Simulate and plot")); -end SimpleHouse4; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean use_constantHeater=true + "To enable/disable the connection between the constant source and heater"; + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=QHea_flow_nominal) "Radiator" + annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); + IBPSA.Fluid.Movers.FlowControlled_m_flow pum( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + nominalValuesDefineDefaultPressureCurve=true, + inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" + annotation (Placement(transformation(extent={{160,-190},{140,-170}}))); + IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={20,-180}))); + Modelica.Blocks.Sources.Constant conHea(k=1) + annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, + color={0,127,255})); + connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, + {175,-180},{160,-180}}, color={0,127,255})); + connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, + {39.75,-180},{140,-180}}, color={0,127,255})); + connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ + 148,40},{160,40}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + if use_constantHeater then + end if; + connect(bouWat.ports[1], pum.port_b) + annotation (Line(points={{30,-180},{140,-180}},color={0,127,255})); + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, + {58,-124}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

                  +

                  +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

                  +

                  +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

                  +

                  Reference result

                  +

                  +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

                  +

                  +\"Air +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index bc6bef72b3..644391a5a0 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,85 +1,85 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse5 "Heating controller model" - extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); - - Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" - annotation (Placement(transformation(extent={{0,-150},{20,-130}}))); - Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" - annotation (Placement(transformation(extent={{0,-110},{20,-90}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-80,-110},{-60,-90}}))); - Modelica.Blocks.Logical.Not not1 - "Negation for enabling heating when temperature is low" - annotation (Placement(transformation(extent={{-40,-110},{-20,-90}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{90,150},{70,170}}))); -equation - connect(booInt.y, pum.stage) annotation (Line(points={{21,-140},{100,-140},{ - 100,-158}}, color={255,127,0})); - connect(booInt.u, not1.y) annotation (Line(points={{-2,-140},{-11.5,-140},{-11.5, - -100},{-19,-100}}, color={255,0,255})); - connect(booRea.y, heaWat.u) annotation (Line(points={{21,-100},{40.5,-100},{ - 40.5,-94},{58,-94}}, color={0,0,127})); - connect(not1.u,hysRad. y) annotation (Line(points={{-42,-100},{-59,-100}}, - color={255,0,255})); - connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,160},{-230,160}, - {-230,-100},{-82,-100}}, color={0,0,127})); - connect(senTemZonAir.port, zon.heatPort) - annotation (Line(points={{90,160},{110,160},{110,140}}, color={191,0,0})); - connect(not1.y, booRea.u) - annotation (Line(points={{-19,-100},{-2,-100}}, color={255,0,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. -We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). -A temperature sensor will measure the zone air temperature. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -The heater modulation level should be set to one when the heater is on and to zero otherwise. -

                  -

                  Reference result

                  -

                  -The figure below shows the air temperature when the controller is added. -

                  -

                  -\"Air -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" - "Simulate and plot")); -end SimpleHouse5; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, + massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); + + Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" + annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); + Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" + annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,160},{70,180}}))); +equation + connect(booInt.y, pum.stage) annotation (Line(points={{21,-150},{150,-150},{150, + -168}}, color={255,127,0})); + connect(booInt.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, + -110},{-19,-110}}, color={255,0,255})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, + {-210,-110},{-82,-110}}, color={0,0,127})); + connect(senTemZonAir.port, zon.heatPort) + annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); + connect(not1.y, booRea.u) + annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); + connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, + {58,-124}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +The heater modulation level should be set to one when the heater is on and to zero otherwise. +

                  +

                  Reference result

                  +

                  +The figure below shows the air temperature when the controller is added. +

                  +

                  +\"Air +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index db5249ee7a..6b10c9db42 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,141 +1,144 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse6 "Free cooling model" - extends SimpleHouse5( - zon(nPorts=2), - mAir_flow_nominal=0.1, - AWin=6); - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - - IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=dpAir_nominal) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={50,110}))); - IBPSA.Fluid.Movers.FlowControlled_dp fan( - redeclare package Medium = MediumAir, - show_T=true, - dp_nominal=dpAir_nominal, - use_inputFilter=false, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - nominalValuesDefineDefaultPressureCurve=true, - m_flow_nominal=mAir_flow_nominal) - "Constant head fan" annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - origin={-50,110}))); - Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" - annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); - IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=10, - dp2_nominal=10, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-80,104},{-110,136}}))); - IBPSA.Fluid.Sources.Boundary_pT - bouAir( - redeclare package Medium = MediumAir, - use_T_in=true, - nPorts=2) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-130,130}))); - Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) - "Hysteresis controller for damper" - annotation (Placement(transformation(extent={{-20,70},{0,90}}))); - Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" - annotation (Placement(transformation(extent={{20,70},{40,90}}))); -equation - connect(con_dp.y, fan.dp_in) - annotation (Line(points={{-69,80},{-50,80},{-50,98}}, color={0,0,127})); - connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-80,129.6},{ - 97,129.6},{97,130},{100,130}}, color={0,127,255})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-142,134},{ - -150,134},{-150,-10}},color={0,0,127})); - connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-80,110.4},{-69, - 110.4},{-69,110},{-60,110}}, color={0,127,255})); - connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{60,110},{100, - 110},{100,130}}, color={0,127,255})); - connect(booToRea1.y, vavDam.y) - annotation (Line(points={{41,80},{50,80},{50,98}}, color={0,0,127})); - connect(hysAir.y, booToRea1.u) - annotation (Line(points={{1,80},{18,80}}, color={255,0,255})); - connect(vavDam.port_a, fan.port_b) - annotation (Line(points={{40,110},{-40,110}}, color={0,127,255})); - connect(hysAir.u, hysRad.u) annotation (Line(points={{-22,80},{-30,80},{-30, - 160},{-230,160},{-230,-100},{-82,-100}}, color={0,0,127})); - connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-120,129}, - {-119,129},{-119,129.6},{-110,129.6}}, color={0,127,255})); - connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-120,131}, - {-120,110.4},{-110,110.4}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,200}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -For this last exercise, we first increase the window size -from 2 m2 to 6 m2. -

                  -

                  -We will add a ventilation model that allows to perform free cooling -using outside air when solar irradiation heats up the room too much. -The system consists of a fan, a damper, a controller with an air temperature setpoint -between 23°C and 25°C, -and a heat recovery unit with a constant effectiveness of 85%. -The damper and fan have a nominal pressure drop/raise of 200 Pa. -The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. -The nominal mass flow rate of the ventilation system is 0.1 kg/s. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -Connect the components such that they exchange mass (and therefore also energy) -with the MixingVolume representing the zone air. -Add a boundary_pT to draw air from the environment. -Enable its temperature input and connect it to the TDryBul variable in the weather data reader. -Also reconsider the nominal mass flow rate parameter value in the MixingVolume -given the flow rate information of the ventilation system. -

                  -

                  Reference result

                  -

                  -The figures below show the results. -

                  -

                  -\"Air -

                  -

                  -\"Ventilation -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" - "Simulate and plot")); -end SimpleHouse6; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5( + zon(nPorts=2), + mAir_flow_nominal=0.1, + AWin=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={110,130}))); + IBPSA.Fluid.Movers.FlowControlled_dp fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + nominalValuesDefineDefaultPressureCurve=true, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={0,130}))); + Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" + annotation (Placement(transformation(extent={{-60,90},{-40,110}}))); + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); + IBPSA.Fluid.Sources.Boundary_pT + bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-110,140}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{40,90},{60,110}}))); + Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" + annotation (Placement(transformation(extent={{80,90},{100,110}}))); +equation + connect(con_dp.y, fan.dp_in) + annotation (Line(points={{-39,100},{0,100},{0,118}}, color={0,0,127})); + connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, + 149.6},{169,50},{170,50}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, + 144},{-130,0}}, color={0,0,127})); + connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, + {142,50},{170,50}}, + color={0,127,255})); + connect(booToRea1.y, vavDam.y) + annotation (Line(points={{101,100},{110,100},{110,118}}, + color={0,0,127})); + connect(hysAir.y, booToRea1.u) + annotation (Line(points={{61,100},{78,100}}, + color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{38,100},{30,100},{30,170}, + {-210,170},{-210,-110},{-82,-110}}, color={0,0,127})); + connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ + -100,130.4},{-85,130.4}}, color={0,127,255})); + connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, + {-32,130.4},{-55,130.4}}, color={0,127,255})); + connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, + {-100,149.6},{-100,141}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

                  +

                  +We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +

                  +

                  Reference result

                  +

                  +The figures below show the results. +

                  +

                  +\"Air +

                  +

                  +\"Ventilation +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; From 11cb52499fd8ede035d4b92af9c9b32bd0d00944 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Mon, 18 Sep 2023 15:54:58 +0200 Subject: [PATCH 39/48] Make the connector between the constant and heater conditional again --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 6f63671e28..fa91f607a3 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -52,11 +52,11 @@ equation connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); if use_constantHeater then + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, + {58,-124}}, color={0,0,127})); end if; connect(bouWat.ports[1], pum.port_b) annotation (Line(points={{30,-180},{140,-180}},color={0,127,255})); - connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, - {58,-124}}, color={0,0,127})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, -220},{220,220}})), experiment(Tolerance=1e-6, StopTime=1e+06), From dbd18509340410d393baa7e44ecca68a7380be57 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Tue, 19 Sep 2023 19:31:18 -0700 Subject: [PATCH 40/48] Removed BOM and run dos2unix --- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 264 ++++++++-------- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 170 +++++------ .../Tutorial/SimpleHouse/SimpleHouse6.mo | 288 +++++++++--------- 3 files changed, 361 insertions(+), 361 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index fa91f607a3..c4fc28d751 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,132 +1,132 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse4 "Heating model" - extends SimpleHouse3; - - parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 - "Nominal mass flow rate for water loop"; - parameter Boolean use_constantHeater=true - "To enable/disable the connection between the constant source and heater"; - - IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=333.15, - T_b_nominal=313.15, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=false, - Q_flow_nominal=QHea_flow_nominal) "Radiator" - annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); - IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - dp_nominal=5000, - Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); - IBPSA.Fluid.Movers.FlowControlled_m_flow pum( - redeclare package Medium = MediumWater, - use_inputFilter=false, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - nominalValuesDefineDefaultPressureCurve=true, - inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" - annotation (Placement(transformation(extent={{160,-190},{140,-170}}))); - IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={20,-180}))); - Modelica.Blocks.Sources.Constant conHea(k=1) - annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); -equation - connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, - color={0,127,255})); - connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, - {175,-180},{160,-180}}, color={0,127,255})); - connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, - {39.75,-180},{140,-180}}, color={0,127,255})); - connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ - 148,40},{160,40}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, - 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); - if use_constantHeater then - connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, - {58,-124}}, color={0,0,127})); - end if; - connect(bouWat.ports[1], pum.port_b) - annotation (Line(points={{30,-180},{140,-180}},color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C -and 40°C, and a room air and radiative temperature of 20°C. -The pump has a (nominal) mass flow rate of 0.1 kg/s. -Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -The radiator contains one port for convective heat transfer and one for radiative heat transfer. -Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, -the media for the models should be set to MediumWater. -

                  -

                  -The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. -Otherwise the absolute pressure in the system is undefined. -Pressure difference modelling may be disregarded in the heating circuit -since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. -

                  -

                  -Set the heater input to 1, meaning that it will produce 1 times its nominal power. -

                  -

                  Reference result

                  -

                  -The result of the air temperature is plotted in the figure below. -The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) -and the heater is not disabled when it becomes too warm. -

                  -

                  -\"Air -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" - "Simulate and plot")); -end SimpleHouse4; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean use_constantHeater=true + "To enable/disable the connection between the constant source and heater"; + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=QHea_flow_nominal) "Radiator" + annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); + IBPSA.Fluid.Movers.FlowControlled_m_flow pum( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + nominalValuesDefineDefaultPressureCurve=true, + inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" + annotation (Placement(transformation(extent={{160,-190},{140,-170}}))); + IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={20,-180}))); + Modelica.Blocks.Sources.Constant conHea(k=1) + annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, + color={0,127,255})); + connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, + {175,-180},{160,-180}}, color={0,127,255})); + connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, + {39.75,-180},{140,-180}}, color={0,127,255})); + connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ + 148,40},{160,40}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + if use_constantHeater then + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, + {58,-124}}, color={0,0,127})); + end if; + connect(bouWat.ports[1], pum.port_b) + annotation (Line(points={{30,-180},{140,-180}},color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

                  +

                  +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

                  +

                  +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

                  +

                  Reference result

                  +

                  +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

                  +

                  +\"Air +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 644391a5a0..52a25ecc82 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,85 +1,85 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse5 "Heating controller model" - extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); - - Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" - annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); - Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" - annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); - Modelica.Blocks.Logical.Not not1 - "Negation for enabling heating when temperature is low" - annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{90,160},{70,180}}))); -equation - connect(booInt.y, pum.stage) annotation (Line(points={{21,-150},{150,-150},{150, - -168}}, color={255,127,0})); - connect(booInt.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, - -110},{-19,-110}}, color={255,0,255})); - connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, - color={255,0,255})); - connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, - {-210,-110},{-82,-110}}, color={0,0,127})); - connect(senTemZonAir.port, zon.heatPort) - annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); - connect(not1.y, booRea.u) - annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); - connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, - {58,-124}}, color={0,0,127})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. -We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). -A temperature sensor will measure the zone air temperature. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -The heater modulation level should be set to one when the heater is on and to zero otherwise. -

                  -

                  Reference result

                  -

                  -The figure below shows the air temperature when the controller is added. -

                  -

                  -\"Air -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" - "Simulate and plot")); -end SimpleHouse5; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, + massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); + + Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" + annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); + Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" + annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,160},{70,180}}))); +equation + connect(booInt.y, pum.stage) annotation (Line(points={{21,-150},{150,-150},{150, + -168}}, color={255,127,0})); + connect(booInt.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, + -110},{-19,-110}}, color={255,0,255})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, + {-210,-110},{-82,-110}}, color={0,0,127})); + connect(senTemZonAir.port, zon.heatPort) + annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); + connect(not1.y, booRea.u) + annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); + connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, + {58,-124}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +The heater modulation level should be set to one when the heater is on and to zero otherwise. +

                  +

                  Reference result

                  +

                  +The figure below shows the air temperature when the controller is added. +

                  +

                  +\"Air +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 6b10c9db42..125ca17b30 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,144 +1,144 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse6 "Free cooling model" - extends SimpleHouse5( - zon(nPorts=2), - mAir_flow_nominal=0.1, - AWin=6); - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - - IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=dpAir_nominal) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={110,130}))); - IBPSA.Fluid.Movers.FlowControlled_dp fan( - redeclare package Medium = MediumAir, - show_T=true, - dp_nominal=dpAir_nominal, - use_inputFilter=false, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - nominalValuesDefineDefaultPressureCurve=true, - m_flow_nominal=mAir_flow_nominal) - "Constant head fan" annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - origin={0,130}))); - Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" - annotation (Placement(transformation(extent={{-60,90},{-40,110}}))); - IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=10, - dp2_nominal=10, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); - IBPSA.Fluid.Sources.Boundary_pT - bouAir( - redeclare package Medium = MediumAir, - use_T_in=true, - nPorts=2) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-110,140}))); - Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) - "Hysteresis controller for damper" - annotation (Placement(transformation(extent={{40,90},{60,110}}))); - Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" - annotation (Placement(transformation(extent={{80,90},{100,110}}))); -equation - connect(con_dp.y, fan.dp_in) - annotation (Line(points={{-39,100},{0,100},{0,118}}, color={0,0,127})); - connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, - 149.6},{169,50},{170,50}}, color={0,127,255})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, - 144},{-130,0}}, color={0,0,127})); - connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, - {142,50},{170,50}}, - color={0,127,255})); - connect(booToRea1.y, vavDam.y) - annotation (Line(points={{101,100},{110,100},{110,118}}, - color={0,0,127})); - connect(hysAir.y, booToRea1.u) - annotation (Line(points={{61,100},{78,100}}, - color={255,0,255})); - connect(vavDam.port_a, fan.port_b) - annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); - connect(hysAir.u, hysRad.u) annotation (Line(points={{38,100},{30,100},{30,170}, - {-210,170},{-210,-110},{-82,-110}}, color={0,0,127})); - connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ - -100,130.4},{-85,130.4}}, color={0,127,255})); - connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, - {-32,130.4},{-55,130.4}}, color={0,127,255})); - connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, - {-100,149.6},{-100,141}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -For this last exercise, we first increase the window size -from 2 m2 to 6 m2. -

                  -

                  -We will add a ventilation model that allows to perform free cooling -using outside air when solar irradiation heats up the room too much. -The system consists of a fan, a damper, a controller with an air temperature setpoint -between 23°C and 25°C, -and a heat recovery unit with a constant effectiveness of 85%. -The damper and fan have a nominal pressure drop/raise of 200 Pa. -The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. -The nominal mass flow rate of the ventilation system is 0.1 kg/s. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -Connect the components such that they exchange mass (and therefore also energy) -with the MixingVolume representing the zone air. -Add a boundary_pT to draw air from the environment. -Enable its temperature input and connect it to the TDryBul variable in the weather data reader. -Also reconsider the nominal mass flow rate parameter value in the MixingVolume -given the flow rate information of the ventilation system. -

                  -

                  Reference result

                  -

                  -The figures below show the results. -

                  -

                  -\"Air -

                  -

                  -\"Ventilation -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" - "Simulate and plot")); -end SimpleHouse6; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5( + zon(nPorts=2), + mAir_flow_nominal=0.1, + AWin=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={110,130}))); + IBPSA.Fluid.Movers.FlowControlled_dp fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + nominalValuesDefineDefaultPressureCurve=true, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={0,130}))); + Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" + annotation (Placement(transformation(extent={{-60,90},{-40,110}}))); + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); + IBPSA.Fluid.Sources.Boundary_pT + bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-110,140}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{40,90},{60,110}}))); + Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" + annotation (Placement(transformation(extent={{80,90},{100,110}}))); +equation + connect(con_dp.y, fan.dp_in) + annotation (Line(points={{-39,100},{0,100},{0,118}}, color={0,0,127})); + connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, + 149.6},{169,50},{170,50}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, + 144},{-130,0}}, color={0,0,127})); + connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, + {142,50},{170,50}}, + color={0,127,255})); + connect(booToRea1.y, vavDam.y) + annotation (Line(points={{101,100},{110,100},{110,118}}, + color={0,0,127})); + connect(hysAir.y, booToRea1.u) + annotation (Line(points={{61,100},{78,100}}, + color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{38,100},{30,100},{30,170}, + {-210,170},{-210,-110},{-82,-110}}, color={0,0,127})); + connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ + -100,130.4},{-85,130.4}}, color={0,127,255})); + connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, + {-32,130.4},{-55,130.4}}, color={0,127,255})); + connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, + {-100,149.6},{-100,141}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

                  +

                  +We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +

                  +

                  Reference result

                  +

                  +The figures below show the results. +

                  +

                  +\"Air +

                  +

                  +\"Ventilation +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; From 10ff8bb112f241f3e82356004589debd925a0a3e Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Thu, 21 Sep 2023 10:55:59 +0200 Subject: [PATCH 41/48] Use preconfigured movers for circulation pump and fan and added control to shut off the fan if there is no ventilation needed --- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 267 ++++++++-------- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 170 +++++----- .../Tutorial/SimpleHouse/SimpleHouse6.mo | 293 +++++++++--------- 3 files changed, 369 insertions(+), 361 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index c4fc28d751..24782bc1c4 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,132 +1,135 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse4 "Heating model" - extends SimpleHouse3; - - parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 - "Nominal mass flow rate for water loop"; - parameter Boolean use_constantHeater=true - "To enable/disable the connection between the constant source and heater"; - - IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=333.15, - T_b_nominal=313.15, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=false, - Q_flow_nominal=QHea_flow_nominal) "Radiator" - annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); - IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - dp_nominal=5000, - Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); - IBPSA.Fluid.Movers.FlowControlled_m_flow pum( - redeclare package Medium = MediumWater, - use_inputFilter=false, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - nominalValuesDefineDefaultPressureCurve=true, - inputType=IBPSA.Fluid.Types.InputType.Constant) "Pump" - annotation (Placement(transformation(extent={{160,-190},{140,-170}}))); - IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={20,-180}))); - Modelica.Blocks.Sources.Constant conHea(k=1) - annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); -equation - connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, - color={0,127,255})); - connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, - {175,-180},{160,-180}}, color={0,127,255})); - connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, - {39.75,-180},{140,-180}}, color={0,127,255})); - connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ - 148,40},{160,40}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, - 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); - if use_constantHeater then - connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, - {58,-124}}, color={0,0,127})); - end if; - connect(bouWat.ports[1], pum.port_b) - annotation (Line(points={{30,-180},{140,-180}},color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C -and 40°C, and a room air and radiative temperature of 20°C. -The pump has a (nominal) mass flow rate of 0.1 kg/s. -Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -The radiator contains one port for convective heat transfer and one for radiative heat transfer. -Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, -the media for the models should be set to MediumWater. -

                  -

                  -The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. -Otherwise the absolute pressure in the system is undefined. -Pressure difference modelling may be disregarded in the heating circuit -since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. -

                  -

                  -Set the heater input to 1, meaning that it will produce 1 times its nominal power. -

                  -

                  Reference result

                  -

                  -The result of the air temperature is plotted in the figure below. -The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) -and the heater is not disabled when it becomes too warm. -

                  -

                  -\"Air -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" - "Simulate and plot")); -end SimpleHouse4; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean use_constantHeater=true + "To enable/disable the connection between the constant source and heater and circulation pump"; + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=QHea_flow_nominal) "Radiator" + annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); + Fluid.Movers.Preconfigured.FlowControlled_m_flow + pum( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false) "Pump" + annotation (Placement(transformation(extent={{110,-190},{90,-170}}))); + IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={20,-180}))); + Modelica.Blocks.Sources.Constant conHea(k=1) + annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); + Modelica.Blocks.Sources.Constant conPum(k=mWat_flow_nominal) + annotation (Placement(transformation(extent={{130,-160},{110,-140}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, + color={0,127,255})); + connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, + {175,-180},{110,-180}}, color={0,127,255})); + connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, + {39.75,-180},{90,-180}}, color={0,127,255})); + connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ + 148,40},{160,40}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + if use_constantHeater then + connect(conPum.y, pum.m_flow_in) annotation (Line(points={{109,-150},{100,-150}, + {100,-168}}, color={0,0,127})); + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, + {58,-124}}, color={0,0,127})); + end if; + connect(bouWat.ports[1], pum.port_b) + annotation (Line(points={{30,-180},{90,-180}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

                  +

                  +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

                  +

                  +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

                  +

                  Reference result

                  +

                  +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

                  +

                  +\"Air +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 52a25ecc82..2b51844c97 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,85 +1,85 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse5 "Heating controller model" - extends SimpleHouse4(pum(inputType=IBPSA.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false); - - Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer" - annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); - Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" - annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); - Modelica.Blocks.Logical.Not not1 - "Negation for enabling heating when temperature is low" - annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{90,160},{70,180}}))); -equation - connect(booInt.y, pum.stage) annotation (Line(points={{21,-150},{150,-150},{150, - -168}}, color={255,127,0})); - connect(booInt.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, - -110},{-19,-110}}, color={255,0,255})); - connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, - color={255,0,255})); - connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, - {-210,-110},{-82,-110}}, color={0,0,127})); - connect(senTemZonAir.port, zon.heatPort) - annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); - connect(not1.y, booRea.u) - annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); - connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, - {58,-124}}, color={0,0,127})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. -We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). -A temperature sensor will measure the zone air temperature. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -The heater modulation level should be set to one when the heater is on and to zero otherwise. -

                  -

                  Reference result

                  -

                  -The figure below shows the air temperature when the controller is added. -

                  -

                  -\"Air -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" - "Simulate and plot")); -end SimpleHouse5; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(final use_constantHeater=false); + + Modelica.Blocks.Math.BooleanToReal booRea1(realTrue=mWat_flow_nominal) + "Boolean to integer" + annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); + Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" + annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,160},{70,180}}))); +equation + connect(booRea1.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, + -110},{-19,-110}}, color={255,0,255})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, + {-210,-110},{-82,-110}}, color={0,0,127})); + connect(senTemZonAir.port, zon.heatPort) + annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); + connect(not1.y, booRea.u) + annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); + connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, + {58,-124}}, color={0,0,127})); + connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100,-150}, + {100,-168}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +The heater modulation level should be set to one when the heater is on and to zero otherwise. +

                  +

                  Reference result

                  +

                  +The figure below shows the air temperature when the controller is added. +

                  +

                  +\"Air +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 125ca17b30..9a323b25c2 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,144 +1,149 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse6 "Free cooling model" - extends SimpleHouse5( - zon(nPorts=2), - mAir_flow_nominal=0.1, - AWin=6); - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - - IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=dpAir_nominal) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={110,130}))); - IBPSA.Fluid.Movers.FlowControlled_dp fan( - redeclare package Medium = MediumAir, - show_T=true, - dp_nominal=dpAir_nominal, - use_inputFilter=false, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - nominalValuesDefineDefaultPressureCurve=true, - m_flow_nominal=mAir_flow_nominal) - "Constant head fan" annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - origin={0,130}))); - Modelica.Blocks.Sources.Constant con_dp(k=dpAir_nominal) "Pressure head" - annotation (Placement(transformation(extent={{-60,90},{-40,110}}))); - IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=10, - dp2_nominal=10, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); - IBPSA.Fluid.Sources.Boundary_pT - bouAir( - redeclare package Medium = MediumAir, - use_T_in=true, - nPorts=2) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-110,140}))); - Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) - "Hysteresis controller for damper" - annotation (Placement(transformation(extent={{40,90},{60,110}}))); - Modelica.Blocks.Math.BooleanToReal booToRea1 "Boolean to real" - annotation (Placement(transformation(extent={{80,90},{100,110}}))); -equation - connect(con_dp.y, fan.dp_in) - annotation (Line(points={{-39,100},{0,100},{0,118}}, color={0,0,127})); - connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, - 149.6},{169,50},{170,50}}, color={0,127,255})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, - 144},{-130,0}}, color={0,0,127})); - connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, - {142,50},{170,50}}, - color={0,127,255})); - connect(booToRea1.y, vavDam.y) - annotation (Line(points={{101,100},{110,100},{110,118}}, - color={0,0,127})); - connect(hysAir.y, booToRea1.u) - annotation (Line(points={{61,100},{78,100}}, - color={255,0,255})); - connect(vavDam.port_a, fan.port_b) - annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); - connect(hysAir.u, hysRad.u) annotation (Line(points={{38,100},{30,100},{30,170}, - {-210,170},{-210,-110},{-82,-110}}, color={0,0,127})); - connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ - -100,130.4},{-85,130.4}}, color={0,127,255})); - connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, - {-32,130.4},{-55,130.4}}, color={0,127,255})); - connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, - {-100,149.6},{-100,141}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                    -
                  • -September 4, 2023, by Jelger Jansen:
                    -First implementation. -
                  • -
                  -", info=" -

                  -For this last exercise, we first increase the window size -from 2 m2 to 6 m2. -

                  -

                  -We will add a ventilation model that allows to perform free cooling -using outside air when solar irradiation heats up the room too much. -The system consists of a fan, a damper, a controller with an air temperature setpoint -between 23°C and 25°C, -and a heat recovery unit with a constant effectiveness of 85%. -The damper and fan have a nominal pressure drop/raise of 200 Pa. -The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. -The nominal mass flow rate of the ventilation system is 0.1 kg/s. -

                  -

                  Required models

                  - -

                  Connection instructions

                  -

                  -Connect the components such that they exchange mass (and therefore also energy) -with the MixingVolume representing the zone air. -Add a boundary_pT to draw air from the environment. -Enable its temperature input and connect it to the TDryBul variable in the weather data reader. -Also reconsider the nominal mass flow rate parameter value in the MixingVolume -given the flow rate information of the ventilation system. -

                  -

                  Reference result

                  -

                  -The figures below show the results. -

                  -

                  -\"Air -

                  -

                  -\"Ventilation -

                  -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" - "Simulate and plot")); -end SimpleHouse6; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5( + zon(nPorts=2), + mAir_flow_nominal=0.1, + AWin=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={110,130}))); + Fluid.Movers.Preconfigured.FlowControlled_dp + fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={0,130}))); + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); + IBPSA.Fluid.Sources.Boundary_pT + bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-110,140}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={50,110}))); + Modelica.Blocks.Math.BooleanToReal booRea2 "Boolean to real" + annotation (Placement(transformation(extent={{80,80},{100,100}}))); + Modelica.Blocks.Math.BooleanToReal booRea3(realTrue=dpAir_nominal) + "Boolean to real" + annotation (Placement(transformation(extent={{30,80},{10,100}}))); +equation + connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, + 149.6},{169,50},{170,50}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, + 144},{-130,0}}, color={0,0,127})); + connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, + {142,50},{170,50}}, + color={0,127,255})); + connect(booRea2.y, vavDam.y) + annotation (Line(points={{101,90},{110,90},{110,118}}, color={0,0,127})); + connect(hysAir.y, booRea2.u) + annotation (Line(points={{50,99},{50,90},{78,90}}, color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); + connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ + -100,130.4},{-85,130.4}}, color={0,127,255})); + connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, + {-32,130.4},{-55,130.4}}, color={0,127,255})); + connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, + {-100,149.6},{-100,141}}, color={0,127,255})); + connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100, + -150},{100,-168}}, color={0,0,127})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{50,122},{50,170},{-210, + 170},{-210,-110},{-82,-110}}, color={0,0,127})); + connect(booRea3.y, fan.dp_in) + annotation (Line(points={{9,90},{0,90},{0,118}}, color={0,0,127})); + connect(booRea3.u, hysAir.y) + annotation (Line(points={{32,90},{50,90},{50,99}}, color={255,0,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                    +
                  • +September 4, 2023, by Jelger Jansen:
                    +First implementation. +
                  • +
                  +", info=" +

                  +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

                  +

                  +We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

                  +

                  Required models

                  + +

                  Connection instructions

                  +

                  +Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +

                  +

                  Reference result

                  +

                  +The figures below show the results. +

                  +

                  +\"Air +

                  +

                  +\"Ventilation +

                  +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; From e5c257ddbdfc235b07b59a0f2689a4839083c477 Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Thu, 21 Sep 2023 11:08:32 +0200 Subject: [PATCH 42/48] Update documentation section and put required models in alphabetical order --- .../Tutorial/SimpleHouse/SimpleHouse1.mo | 8 +++---- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 8 +++---- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 1 + .../Tutorial/SimpleHouse/SimpleHouse6.mo | 21 +++++++++++++++---- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 0f4e308dfc..25046dc6b9 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -52,13 +52,13 @@ The heat capacity value of a wall may be computed as C=A*d*cp*&rho

                  Required models

                  Connection instructions

                  diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 24782bc1c4..fa75d69080 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -83,14 +83,14 @@ the media for the models in the heating circuit should be set to MediumWater<

                  Required models

                  • - -IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 -
                  • -
                  • IBPSA.Fluid.HeatExchangers.HeaterCooler_u
                  • + +IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 +
                  • +
                  • IBPSA.Fluid.Movers.Preconfigured.FlowControlled_m_flow
                  • diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 2b51844c97..d4396ec1f5 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -69,6 +69,7 @@ Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor

                    Connection instructions

                    The heater modulation level should be set to one when the heater is on and to zero otherwise. +Furthermore, the pump should only circulate water when the heater is on.

                    Reference result

                    diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 9a323b25c2..0dee8fa294 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -109,16 +109,28 @@ The nominal mass flow rate of the ventilation system is 0.1 kg/s.

                    Required models

                    Connection instructions

                    @@ -129,6 +141,7 @@ Add a boundary_pT to draw air from the environment. Enable its temperature input and connect it to the TDryBul variable in the weather data reader. Also reconsider the nominal mass flow rate parameter value in the MixingVolume given the flow rate information of the ventilation system. +Finally, make sure that the fan is only active when the damper is open.

                    Reference result

                    From 6f6c83853b276c37941603a5b0054da6ad3ef1ff Mon Sep 17 00:00:00 2001 From: jelgerjansen Date: Thu, 21 Sep 2023 11:25:29 +0200 Subject: [PATCH 43/48] Remove BOM --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 2 +- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo | 2 +- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index fa75d69080..45d8dc258d 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,4 +1,4 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse4 "Heating model" extends SimpleHouse3; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index d4396ec1f5..3ffe0a743e 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,4 +1,4 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse5 "Heating controller model" extends SimpleHouse4(final use_constantHeater=false); diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 0dee8fa294..6effced329 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,4 +1,4 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse6 "Free cooling model" extends SimpleHouse5( zon(nPorts=2), From 0e318bea2b8b0714ccd4c4bff7ea3bac5b10326d Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Thu, 21 Sep 2023 17:01:36 -0700 Subject: [PATCH 44/48] Revised documentation --- .../Tutorial/SimpleHouse/SimpleHouse0.mo | 202 +++++------ .../Tutorial/SimpleHouse/SimpleHouse1.mo | 179 +++++----- .../Tutorial/SimpleHouse/SimpleHouse2.mo | 158 ++++----- .../Tutorial/SimpleHouse/SimpleHouse3.mo | 174 +++++----- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 273 +++++++-------- .../Tutorial/SimpleHouse/SimpleHouse5.mo | 172 +++++----- .../Tutorial/SimpleHouse/SimpleHouse6.mo | 323 +++++++++--------- 7 files changed, 743 insertions(+), 738 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo index 8950434730..28c3662126 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -1,100 +1,102 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse0 - "Start file for simple house example" - extends Modelica.Icons.Example; - package MediumAir = IBPSA.Media.Air "Medium model for air"; - package MediumWater = IBPSA.Media.Water "Medium model for water"; - parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; - parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; - parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; - parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; - parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; - IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= - ModelicaServices.ExternalReferences.loadResource( - "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) - "Weather data reader" - annotation (Placement(transformation(extent={{-180,-10},{-160,10}}))); - IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" - annotation (Placement(transformation(extent={{-140,-10},{-120,10}}), - iconTransformation(extent={{-152,-10},{-132,10}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut - "Exterior temperature boundary condition" - annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); -equation - connect(weaDat.weaBus, weaBus) annotation (Line( - points={{-160,0},{-130,0}}, - color={255,204,51}, - thickness=0.5)); - connect(TOut.T, weaBus.TDryBul) - annotation (Line(points={{-82,0},{-130,0}}, color={0,0,127})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}}), graphics={ - Rectangle( - extent={{-200,60},{-20,-60}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-200,-80},{200,-200}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{-200,200},{200,80}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Rectangle( - extent={{0,60},{200,-60}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Text( - extent={{57.25,40.25},{2.75,59.75}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Building"), - Text( - extent={{-137,-99},{-203,-81}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Heating"), - Text( - extent={{-102,39},{-198,61}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Weather inputs"), - Text( - extent={{-61,179},{-199,201}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Cooling and ventilation")}), - experiment(Tolerance=1E-6, StopTime=1e+06), - Documentation(revisions=" -

                      -
                    • -September 4, 2023, by Jelger Jansen:
                      -Replace IDEAS by IBPSA models and general revision/update of the model. -
                    • -
                    • -October 11, 2016, by Filip Jorissen:
                      -First implementation. -
                    • -
                    -", info=" -

                    -This model is used as the starting point for the SimpleHouse tutorial. -It contains a weather data reader and a PrescribedTemperature component -that allows the user to connect thermal components to the dry bulb temperature. -It was based on from the Modelica crash course organised by KU Leuven -(https://github.com/open-ideas/__CrashCourse__). -

                    -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse0.mos" - "Simulate and plot")); -end SimpleHouse0; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse0 + "Start file for simple house example" + extends Modelica.Icons.Example; + package MediumAir = IBPSA.Media.Air "Medium model for air"; + package MediumWater = IBPSA.Media.Water "Medium model for water"; + parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; + parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; + IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + "Weather data reader" + annotation (Placement(transformation(extent={{-180,-10},{-160,10}}))); + IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement(transformation(extent={{-140,-10},{-120,10}}), + iconTransformation(extent={{-152,-10},{-132,10}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut + "Exterior temperature boundary condition" + annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); +equation + connect(weaDat.weaBus, weaBus) annotation (Line( + points={{-160,0},{-130,0}}, + color={255,204,51}, + thickness=0.5)); + connect(TOut.T, weaBus.TDryBul) + annotation (Line(points={{-82,0},{-130,0}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}}), graphics={ + Rectangle( + extent={{-200,60},{-20,-60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-200,-80},{200,-200}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-200,200},{200,80}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{0,60},{200,-60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Text( + extent={{57.25,40.25},{2.75,59.75}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Building"), + Text( + extent={{-137,-99},{-203,-81}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Heating"), + Text( + extent={{-102,39},{-198,61}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Weather inputs"), + Text( + extent={{-61,179},{-199,201}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Cooling and ventilation")}), + experiment(Tolerance=1E-6, StopTime=1e+06), + Documentation(revisions=" +
                      +
                    • +September 4, 2023, by Jelger Jansen:
                      +Replace IDEAS by IBPSA models and general revision/update of the model. +
                    • +
                    • +October 11, 2016, by Filip Jorissen:
                      +First implementation. +
                    • +
                    +", info=" +

                    +This model is used as the starting point for the +IBPSA.Examples.Tutorial.SimpleHouse +tutorial. +It contains a weather data reader and a PrescribedTemperature component +that allows the user to connect thermal components to the dry bulb temperature. +It was based on from the Modelica crash course organised by KU Leuven +(https://github.com/open-ideas/__CrashCourse__). +

                    +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse0.mos" + "Simulate and plot")); +end SimpleHouse0; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo index 25046dc6b9..fecad2d2a3 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo @@ -1,89 +1,90 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse1 "Building wall model" - extends SimpleHouse0; - - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - C=AWall*dWall*cpWall*rhoWall, T(fixed=true)) - "Thermal mass of wall" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={170,0}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor walRes(R=dWall/AWall - /kWall) "Thermal resistor for wall: 25 cm of rockwool" - annotation (Placement(transformation(extent={{60,-10},{80,10}}))); -equation - connect(walRes.port_b, walCap.port) annotation (Line(points={{80,0},{100,0},{100, - 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); - connect(TOut.port, walRes.port_a) - annotation (Line(points={{-60,0},{60,0}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                      -
                    • -September 4, 2023, by Jelger Jansen:
                      -First implementation. -
                    • -
                    -", info=" -

                    -A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. -The house consists of a wall represented by a single heat capacitor and a thermal resistor. -The boundary temperature are already included in - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. -The wall has a surface area of Awall=100 m2, -a thickness of dwall=25 cm, -a thermal conductivity of kwall=0.04 W/(m K), -a density of ρwall=2000 kg/m3, -and a specific heat capacity of cp,wall= 1000 J/(kg K) -

                    -

                    -These parameters are already declared in the equation section of - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. -You can use this way of declaring parameters in the remainder of this exercise, but this is not required. -

                    -

                    -The conductive thermal resistance value of a wall may be computed as R=d/(A*k). -The heat capacity value of a wall may be computed as C=A*d*cp -

                    -

                    Required models

                    - -

                    Connection instructions

                    -

                    -Connect one side of the thermal resistor to the output of PrescribedTemperature -and the other side of the thermal resistor to the heat capacitor. -

                    -

                    Reference result

                    -

                    -If you correctly added the model of the heat capacitor, -connected it to the resistor and added the parameter values for C, -then you should be able to simulate the model. -To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. -You can now simulate the model by pressing the Simulate button. -

                    -

                    -You can plot individual variables values by clicking on their name in the variable browser on the left. -Now plot the wall capacitor temperature value T. -It should look like the figure below (1 Ms is around 12 days). -

                    -

                    -\"Wall -

                    -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" - "Simulate and plot")); -end SimpleHouse1; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse1 "Building wall model" + extends SimpleHouse0; + + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( + C=AWall*dWall*cpWall*rhoWall, + T(fixed=true)) + "Thermal mass of wall" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={170,0}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor walRes( + R=dWall/AWall/kWall) "Thermal resistor for wall: 25 cm of rockwool" + annotation (Placement(transformation(extent={{60,-10},{80,10}}))); +equation + connect(walRes.port_b, walCap.port) annotation (Line(points={{80,0},{100,0},{100, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + connect(TOut.port, walRes.port_a) + annotation (Line(points={{-60,0},{60,0}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                      +
                    • +September 4, 2023, by Jelger Jansen:
                      +First implementation. +
                    • +
                    +", info=" +

                    +A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. +The house consists of a wall represented by a single heat capacitor and a thermal resistor. +The boundary temperature are already included in + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +The wall has a surface area of Awall=100 m2, +a thickness of dwall=25 cm, +a thermal conductivity of kwall=0.04 W/(m K), +a density of ρwall=2000 kg/m3, +and a specific heat capacity of cp,wall= 1000 J/(kg K) +

                    +

                    +These parameters are already declared in the equation section of + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +You can use this way of declaring parameters in the remainder of this exercise, but this is not required. +

                    +

                    +The conductive thermal resistance value of a wall may be computed as R=d/(A*k). +The heat capacity value of a wall may be computed as C=A*d*cp +

                    +

                    Required models

                    + +

                    Connection instructions

                    +

                    +Connect one side of the thermal resistor to the output of PrescribedTemperature +and the other side of the thermal resistor to the heat capacitor. +

                    +

                    Reference result

                    +

                    +If you correctly added the model of the heat capacitor, +connected it to the resistor and added the parameter values for C, +then you should be able to simulate the model. +To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. +You can now simulate the model by pressing the Simulate button. +

                    +

                    +You can plot individual variables values by clicking on their name in the variable browser on the left. +Now plot the wall capacitor temperature value T. +It should look like the figure below (1 Ms is around 12 days). +

                    +

                    +\"Wall +

                    +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" + "Simulate and plot")); +end SimpleHouse1; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo index 9dd59a9f8a..a35f20d80e 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -1,79 +1,79 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse2 "Building window model" - extends SimpleHouse1; - - parameter Modelica.Units.SI.Area AWin=2 "Window area"; - - Modelica.Blocks.Math.Gain gaiWin(k=AWin) - "Gain for solar irradiance through the window" - annotation (Placement(transformation(extent={{20,-50},{40,-30}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win - "Very simple window model" - annotation (Placement(transformation(extent={{60,-50},{80,-30}}))); -equation - connect(gaiWin.y, win.Q_flow) - annotation (Line(points={{41,-40},{60,-40}}, color={0,0,127})); - connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{18,-40},{-130,-40}, - {-130,0}}, color={0,0,127}), Text( - string="%second", - index=1, - extent={{-6,3},{-6,3}}, - horizontalAlignment=TextAlignment.Right)); - connect(win.port, walCap.port) annotation (Line(points={{80,-40},{110,-40},{110, - 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                      -
                    • -September 4, 2023, by Jelger Jansen:
                      -First implementation. -
                    • -
                    -", info=" -

                    -The window has a surface area of 2 m2. -In this simple model we will therefore assume that -two times the outdoor solar irradiance is injected as heat onto the inside of the wall. -

                    -

                    Required models

                    - -

                    Connection instructions

                    -

                    -To be able to use the value of the outdoor solar irradiance -you will need to access the weather data reader. -To do this, make a connection to the weaBus. -In the dialog box select <New Variable> and here type HDirNor, -which is the direct solar irradiance on a surface of 1 m2, -perpendicular to the sun rays. -Set the gain factor k to 2, -in order to get the solar irradiance through the window of 2 m2. -

                    -

                    -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

                    -

                    Reference result

                    -

                    -The result with and without the window model is plotted in the figure below. -

                    -

                    -\"Wall -

                    -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" - "Simulate and plot")); -end SimpleHouse2; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse2 "Building window model" + extends SimpleHouse1; + + parameter Modelica.Units.SI.Area AWin=2 "Window area"; + + Modelica.Blocks.Math.Gain gaiWin(k=AWin) + "Gain for solar irradiance through the window" + annotation (Placement(transformation(extent={{20,-50},{40,-30}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win + "Very simple window model" + annotation (Placement(transformation(extent={{60,-50},{80,-30}}))); +equation + connect(gaiWin.y, win.Q_flow) + annotation (Line(points={{41,-40},{60,-40}}, color={0,0,127})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{18,-40},{-130,-40}, + {-130,0}}, color={0,0,127}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + connect(win.port, walCap.port) annotation (Line(points={{80,-40},{110,-40},{110, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                      +
                    • +September 4, 2023, by Jelger Jansen:
                      +First implementation. +
                    • +
                    +", info=" +

                    +The window has a surface area of 2 m2. +In this simple model we will therefore assume that +two times the outdoor solar irradiance is injected as heat onto the inside of the wall. +

                    +

                    Required models

                    + +

                    Connection instructions

                    +

                    +To be able to use the value of the outdoor solar irradiance +you will need to access the weather data reader. +To do this, make a connection to the weaBus. +In the dialog box select <New Variable> and here type HDirNor, +which is the direct solar irradiance on a surface of 1 m2, +perpendicular to the sun rays. +Set the gain factor k to 2, +in order to get the solar irradiance through the window of 2 m2. +

                    +

                    +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

                    +

                    Reference result

                    +

                    +The result with and without the window model is plotted in the figure below. +

                    +

                    +\"Wall +

                    +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" + "Simulate and plot")); +end SimpleHouse2; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 0446f28da8..59325b856b 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -1,87 +1,87 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse3 "Air model" - extends SimpleHouse2; - - parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; - parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 - "Nominal mass flow rate for air loop"; - parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 - "Convective heat transfer coefficient at the wall"; - - Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ - AWall) "Thermal resistance for convective heat transfer" annotation ( - Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=270, - origin={110,20}))); - IBPSA.Fluid.MixingVolumes.MixingVolume zon( - redeclare package Medium = MediumAir, - V=VZone, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" - annotation (Placement(transformation(extent={{160,50},{180,30}}))); -equation - connect(zon.heatPort, conRes.port_a) - annotation (Line(points={{160,40},{110,40},{110,30}}, color={191,0,0})); - connect(conRes.port_b, walCap.port) annotation (Line(points={{110,10},{110,1.77636e-15}, - {160,1.77636e-15}}, color={191,0,0})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                      -
                    • -September 4, 2023, by Jelger Jansen:
                      -First implementation. -
                    • -
                    -", info=" -

                    -To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. -The air will exchange heat with the wall. -This may be modelled using a thermal resistance representing -the convective heat resistance which is equal to Rconv=1/(h*A), -where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. -

                    -

                    Required models

                    - -

                    Connection instructions

                    -

                    -The MixingVolume Medium parameter contains information about -the type of fluid and its properties that should be modelled by the MixingVolume. -Set its value to MediumAir, which is declared in the template, -by typing redeclare package Medium = MediumAir. -For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. -You will have to change this value once you add a ventilation system to the model (see - -IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). -Finally, set the energyDynamics of the MixingVolume, -which can be found in the Dynamics tab of the model parameter window, to FixedInitial. -

                    -

                    -Make a connection with the PrescribedHeatFlow as well. -This block makes the connection between the heat flow from the gain, represented as a real value, -and a heat port that is compatible with the connectors of the thermal capacitance and resistance. -

                    -

                    Reference result

                    -

                    -The result with and without the air model is plotted in the figure below. -

                    -

                    -\"Wall -

                    -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" - "Simulate and plot")); -end SimpleHouse3; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse3 "Air model" + extends SimpleHouse2; + + parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 + "Nominal mass flow rate for air loop"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 + "Convective heat transfer coefficient at the wall"; + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ + AWall) "Thermal resistance for convective heat transfer" annotation ( + Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={110,20}))); + IBPSA.Fluid.MixingVolumes.MixingVolume zon( + redeclare package Medium = MediumAir, + V=VZone, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" + annotation (Placement(transformation(extent={{160,50},{180,30}}))); +equation + connect(zon.heatPort, conRes.port_a) + annotation (Line(points={{160,40},{110,40},{110,30}}, color={191,0,0})); + connect(conRes.port_b, walCap.port) annotation (Line(points={{110,10},{110,1.77636e-15}, + {160,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                      +
                    • +September 4, 2023, by Jelger Jansen:
                      +First implementation. +
                    • +
                    +", info=" +

                    +To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. +The air will exchange heat with the wall. +This may be modelled using a thermal resistance representing +the convective heat resistance which is equal to Rconv=1/(h*A), +where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. +

                    +

                    Required models

                    + +

                    Connection instructions

                    +

                    +The MixingVolume Medium parameter contains information about +the type of fluid and its properties that should be modelled by the MixingVolume. +Set its value to MediumAir, which is declared in the template, +by typing redeclare package Medium = MediumAir. +For the nominal mass flow rate you may assume a value of 1 kg/m3 for now. +You will have to change this value once you add a ventilation system to the model (see + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6). +Finally, set the energyDynamics of the MixingVolume, +which can be found in the Dynamics tab of the model parameter window, to FixedInitial. +

                    +

                    +Make a connection with the PrescribedHeatFlow as well. +This block makes the connection between the heat flow from the gain, represented as a real value, +and a heat port that is compatible with the connectors of the thermal capacitance and resistance. +

                    +

                    Reference result

                    +

                    +The result with and without the air model is plotted in the figure below. +

                    +

                    +\"Wall +

                    +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" + "Simulate and plot")); +end SimpleHouse3; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 45d8dc258d..1d8cf11704 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,135 +1,138 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse4 "Heating model" - extends SimpleHouse3; - - parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 - "Nominal mass flow rate for water loop"; - parameter Boolean use_constantHeater=true - "To enable/disable the connection between the constant source and heater and circulation pump"; - - IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=333.15, - T_b_nominal=313.15, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=false, - Q_flow_nominal=QHea_flow_nominal) "Radiator" - annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); - IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false, - dp_nominal=5000, - Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); - Fluid.Movers.Preconfigured.FlowControlled_m_flow - pum( - redeclare package Medium = MediumWater, - use_inputFilter=false, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=false) "Pump" - annotation (Placement(transformation(extent={{110,-190},{90,-170}}))); - IBPSA.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={20,-180}))); - Modelica.Blocks.Sources.Constant conHea(k=1) - annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); - Modelica.Blocks.Sources.Constant conPum(k=mWat_flow_nominal) - annotation (Placement(transformation(extent={{130,-160},{110,-140}}))); -equation - connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, - color={0,127,255})); - connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, - {175,-180},{110,-180}}, color={0,127,255})); - connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, - {39.75,-180},{90,-180}}, color={0,127,255})); - connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ - 148,40},{160,40}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, - 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); - if use_constantHeater then - connect(conPum.y, pum.m_flow_in) annotation (Line(points={{109,-150},{100,-150}, - {100,-168}}, color={0,0,127})); - connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, - {58,-124}}, color={0,0,127})); - end if; - connect(bouWat.ports[1], pum.port_b) - annotation (Line(points={{30,-180},{90,-180}}, color={0,127,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                      -
                    • -September 4, 2023, by Jelger Jansen:
                      -First implementation. -
                    • -
                    -", info=" -

                    -The wall temperature (and therefore the room temperature) is quite low. -In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. -The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C -and 40°C, and a room air and radiative temperature of 20°C. -The pump has a (nominal) mass flow rate of 0.1 kg/s. -Since the heating system uses water as a heat carrier fluid, -the media for the models in the heating circuit should be set to MediumWater. -

                    -

                    Required models

                    - -

                    Connection instructions

                    -

                    -The radiator contains one port for convective heat transfer and one for radiative heat transfer. -Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, -the media for the models should be set to MediumWater. -

                    -

                    -The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. -Otherwise the absolute pressure in the system is undefined. -Pressure difference modelling may be disregarded in the heating circuit -since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. -

                    -

                    -Set the heater input to 1, meaning that it will produce 1 times its nominal power. -

                    -

                    Reference result

                    -

                    -The result of the air temperature is plotted in the figure below. -The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) -and the heater is not disabled when it becomes too warm. -

                    -

                    -\"Air -

                    -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" - "Simulate and plot")); -end SimpleHouse4; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + parameter Boolean use_constantHeater=true + "To enable/disable the connection between the constant source and heater and circulation pump"; + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=QHea_flow_nominal) "Radiator" + annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); + + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); + + Fluid.Movers.Preconfigured.FlowControlled_m_flow pum( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false) "Pump" + annotation (Placement(transformation(extent={{110,-190},{90,-170}}))); + + IBPSA.Fluid.Sources.Boundary_pT bouWat( + redeclare package Medium = MediumWater, nPorts=1) + "Pressure bound for water circuit" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={20,-180}))); + Modelica.Blocks.Sources.Constant conHea(k=1) "Gain for heater" + annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); + Modelica.Blocks.Sources.Constant conPum(k=mWat_flow_nominal) "Gain for pump" + annotation (Placement(transformation(extent={{130,-160},{110,-140}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, + color={0,127,255})); + connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, + {175,-180},{110,-180}}, color={0,127,255})); + connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, + {39.75,-180},{90,-180}}, color={0,127,255})); + connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ + 148,40},{160,40}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + if use_constantHeater then + connect(conPum.y, pum.m_flow_in) annotation (Line(points={{109,-150},{100,-150}, + {100,-168}}, color={0,0,127})); + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, + {58,-124}}, color={0,0,127})); + end if; + connect(bouWat.ports[1], pum.port_b) + annotation (Line(points={{30,-180},{90,-180}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                      +
                    • +September 4, 2023, by Jelger Jansen:
                      +First implementation. +
                    • +
                    +", info=" +

                    +The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater. +

                    +

                    Required models

                    + +

                    Connection instructions

                    +

                    +The radiator contains one port for convective heat transfer and one for radiative heat transfer. +Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid, +the media for the models should be set to MediumWater. +

                    +

                    +The Boundary_pT model needs to be used to set an absolute pressure somewhere in the system. +Otherwise the absolute pressure in the system is undefined. +Pressure difference modelling may be disregarded in the heating circuit +since the chosen pump sets a fixed mass flow rate regardless of the pressure drop. +

                    +

                    +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

                    +

                    Reference result

                    +

                    +The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +

                    +

                    +\"Air +

                    +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo index 3ffe0a743e..108e59050b 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -1,86 +1,86 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse5 "Heating controller model" - extends SimpleHouse4(final use_constantHeater=false); - - Modelica.Blocks.Math.BooleanToReal booRea1(realTrue=mWat_flow_nominal) - "Boolean to integer" - annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); - Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" - annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); - Modelica.Blocks.Logical.Not not1 - "Negation for enabling heating when temperature is low" - annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{90,160},{70,180}}))); -equation - connect(booRea1.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, - -110},{-19,-110}}, color={255,0,255})); - connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, - color={255,0,255})); - connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, - {-210,-110},{-82,-110}}, color={0,0,127})); - connect(senTemZonAir.port, zon.heatPort) - annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); - connect(not1.y, booRea.u) - annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); - connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, - {58,-124}}, color={0,0,127})); - connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100,-150}, - {100,-168}}, color={0,0,127})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                      -
                    • -September 4, 2023, by Jelger Jansen:
                      -First implementation. -
                    • -
                    -", info=" -

                    -Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. -We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). -A temperature sensor will measure the zone air temperature. -

                    -

                    Required models

                    - -

                    Connection instructions

                    -

                    -The heater modulation level should be set to one when the heater is on and to zero otherwise. -Furthermore, the pump should only circulate water when the heater is on. -

                    -

                    Reference result

                    -

                    -The figure below shows the air temperature when the controller is added. -

                    -

                    -\"Air -

                    -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" - "Simulate and plot")); -end SimpleHouse5; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(final use_constantHeater=false); + + Modelica.Blocks.Math.BooleanToReal booRea1(realTrue=mWat_flow_nominal) + "Boolean to integer" + annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); + Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" + annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,160},{70,180}}))); +equation + connect(booRea1.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, + -110},{-19,-110}}, color={255,0,255})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, + {-210,-110},{-82,-110}}, color={0,0,127})); + connect(senTemZonAir.port, zon.heatPort) + annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); + connect(not1.y, booRea.u) + annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); + connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, + {58,-124}}, color={0,0,127})); + connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100,-150}, + {100,-168}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                      +
                    • +September 4, 2023, by Jelger Jansen:
                      +First implementation. +
                    • +
                    +", info=" +

                    +Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +

                    +

                    Required models

                    + +

                    Connection instructions

                    +

                    +The heater modulation level should be set to 1 when the heater is on and to 0 otherwise. +Furthermore, the pump should only circulate water when the heater is on. +

                    +

                    Reference result

                    +

                    +The figure below shows the air temperature after the controller is added. +

                    +

                    +\"Air +

                    +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo index 6effced329..aee5eb15c2 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -1,162 +1,161 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; -model SimpleHouse6 "Free cooling model" - extends SimpleHouse5( - zon(nPorts=2), - mAir_flow_nominal=0.1, - AWin=6); - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - - IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=dpAir_nominal) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={110,130}))); - Fluid.Movers.Preconfigured.FlowControlled_dp - fan( - redeclare package Medium = MediumAir, - show_T=true, - dp_nominal=dpAir_nominal, - use_inputFilter=false, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - m_flow_nominal=mAir_flow_nominal) - "Constant head fan" annotation (Placement(transformation( - extent={{-10,10},{10,-10}}, - origin={0,130}))); - IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=10, - dp2_nominal=10, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); - IBPSA.Fluid.Sources.Boundary_pT - bouAir( - redeclare package Medium = MediumAir, - use_T_in=true, - nPorts=2) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-110,140}))); - Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) - "Hysteresis controller for damper" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={50,110}))); - Modelica.Blocks.Math.BooleanToReal booRea2 "Boolean to real" - annotation (Placement(transformation(extent={{80,80},{100,100}}))); - Modelica.Blocks.Math.BooleanToReal booRea3(realTrue=dpAir_nominal) - "Boolean to real" - annotation (Placement(transformation(extent={{30,80},{10,100}}))); -equation - connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, - 149.6},{169,50},{170,50}}, color={0,127,255})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, - 144},{-130,0}}, color={0,0,127})); - connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, - {142,50},{170,50}}, - color={0,127,255})); - connect(booRea2.y, vavDam.y) - annotation (Line(points={{101,90},{110,90},{110,118}}, color={0,0,127})); - connect(hysAir.y, booRea2.u) - annotation (Line(points={{50,99},{50,90},{78,90}}, color={255,0,255})); - connect(vavDam.port_a, fan.port_b) - annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); - connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ - -100,130.4},{-85,130.4}}, color={0,127,255})); - connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, - {-32,130.4},{-55,130.4}}, color={0,127,255})); - connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, - {-100,149.6},{-100,141}}, color={0,127,255})); - connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100, - -150},{100,-168}}, color={0,0,127})); - connect(hysAir.u, hysRad.u) annotation (Line(points={{50,122},{50,170},{-210, - 170},{-210,-110},{-82,-110}}, color={0,0,127})); - connect(booRea3.y, fan.dp_in) - annotation (Line(points={{9,90},{0,90},{0,118}}, color={0,0,127})); - connect(booRea3.u, hysAir.y) - annotation (Line(points={{32,90},{50,90},{50,99}}, color={255,0,255})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, - -220},{220,220}})), - experiment(Tolerance=1e-6, StopTime=1e+06), - Documentation(revisions=" -
                      -
                    • -September 4, 2023, by Jelger Jansen:
                      -First implementation. -
                    • -
                    -", info=" -

                    -For this last exercise, we first increase the window size -from 2 m2 to 6 m2. -

                    -

                    -We will add a ventilation model that allows to perform free cooling -using outside air when solar irradiation heats up the room too much. -The system consists of a fan, a damper, a controller with an air temperature setpoint -between 23°C and 25°C, -and a heat recovery unit with a constant effectiveness of 85%. -The damper and fan have a nominal pressure drop/raise of 200 Pa. -The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. -The nominal mass flow rate of the ventilation system is 0.1 kg/s. -

                    -

                    Required models

                    - -

                    Connection instructions

                    -

                    -Connect the components such that they exchange mass (and therefore also energy) -with the MixingVolume representing the zone air. -Add a boundary_pT to draw air from the environment. -Enable its temperature input and connect it to the TDryBul variable in the weather data reader. -Also reconsider the nominal mass flow rate parameter value in the MixingVolume -given the flow rate information of the ventilation system. -Finally, make sure that the fan is only active when the damper is open. -

                    -

                    Reference result

                    -

                    -The figures below show the results. -

                    -

                    -\"Air -

                    -

                    -\"Ventilation -

                    -"), - __Dymola_Commands(file= - "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" - "Simulate and plot")); -end SimpleHouse6; +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5( + zon(nPorts=2), + mAir_flow_nominal=0.1, + AWin=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={110,130}))); + Fluid.Movers.Preconfigured.FlowControlled_dp fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={0,130}))); + + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); + IBPSA.Fluid.Sources.Boundary_pT bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-110,140}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={50,110}))); + Modelica.Blocks.Math.BooleanToReal booRea2 "Boolean to real" + annotation (Placement(transformation(extent={{80,80},{100,100}}))); + Modelica.Blocks.Math.BooleanToReal booRea3(realTrue=dpAir_nominal) + "Boolean to real" + annotation (Placement(transformation(extent={{30,80},{10,100}}))); +equation + connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, + 149.6},{169,50},{170,50}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, + 144},{-130,0}}, color={0,0,127})); + connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, + {142,50},{170,50}}, + color={0,127,255})); + connect(booRea2.y, vavDam.y) + annotation (Line(points={{101,90},{110,90},{110,118}}, color={0,0,127})); + connect(hysAir.y, booRea2.u) + annotation (Line(points={{50,99},{50,90},{78,90}}, color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); + connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ + -100,130.4},{-85,130.4}}, color={0,127,255})); + connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, + {-32,130.4},{-55,130.4}}, color={0,127,255})); + connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, + {-100,149.6},{-100,141}}, color={0,127,255})); + connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100, + -150},{100,-168}}, color={0,0,127})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{50,122},{50,170},{-210, + 170},{-210,-110},{-82,-110}}, color={0,0,127})); + connect(booRea3.y, fan.dp_in) + annotation (Line(points={{9,90},{0,90},{0,118}}, color={0,0,127})); + connect(booRea3.u, hysAir.y) + annotation (Line(points={{32,90},{50,90},{50,99}}, color={255,0,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" +
                      +
                    • +September 4, 2023, by Jelger Jansen:
                      +First implementation. +
                    • +
                    +", info=" +

                    +For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +

                    +

                    +We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +

                    +

                    Required models

                    + +

                    Connection instructions

                    +

                    +Connect the components such that they exchange mass (and therefore also energy) +with the MixingVolume representing the zone air. +Add a boundary_pT to draw air from the environment. +Enable its temperature input and connect it to the TDryBul variable in the weather data reader. +Also reconsider the nominal mass flow rate parameter value in the MixingVolume +given the flow rate information of the ventilation system. +Finally, make sure that the fan is only active when the damper is open. +

                    +

                    Reference result

                    +

                    +The figures below show the results. +

                    +

                    +\"Air +

                    +

                    +\"Ventilation +

                    +"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; From 1b5a7ccca86bd8d0f900fb53a465f1f8a4e48e4d Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Thu, 21 Sep 2023 17:07:20 -0700 Subject: [PATCH 45/48] Conditionally removed components, rather than connectors --- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 1d8cf11704..5559e1b8cb 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,4 +1,4 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse4 "Heating model" extends SimpleHouse3; @@ -36,13 +36,17 @@ model SimpleHouse4 "Heating model" annotation (Placement(transformation(extent={{110,-190},{90,-170}}))); IBPSA.Fluid.Sources.Boundary_pT bouWat( - redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( + redeclare package Medium = MediumWater, + nPorts=1) + "Pressure bound for water circuit" + annotation (Placement(transformation( extent={{-10,-10},{10,10}}, origin={20,-180}))); - Modelica.Blocks.Sources.Constant conHea(k=1) "Gain for heater" + Modelica.Blocks.Sources.Constant conHea(k=1) + if use_constantHeater "Gain for heater" annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); - Modelica.Blocks.Sources.Constant conPum(k=mWat_flow_nominal) "Gain for pump" + Modelica.Blocks.Sources.Constant conPum(k=mWat_flow_nominal) + if use_constantHeater "Gain for pump" annotation (Placement(transformation(extent={{130,-160},{110,-140}}))); equation connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, @@ -55,12 +59,10 @@ equation 148,40},{160,40}}, color={191,0,0})); connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); - if use_constantHeater then - connect(conPum.y, pum.m_flow_in) annotation (Line(points={{109,-150},{100,-150}, + connect(conPum.y, pum.m_flow_in) annotation (Line(points={{109,-150},{100,-150}, {100,-168}}, color={0,0,127})); - connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, {58,-124}}, color={0,0,127})); - end if; connect(bouWat.ports[1], pum.port_b) annotation (Line(points={{30,-180},{90,-180}}, color={0,127,255})); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, From 0c217583a110ec63de06b474f289fe1e0bfbee54 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Thu, 21 Sep 2023 17:10:04 -0700 Subject: [PATCH 46/48] Removed BOM --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index 5559e1b8cb..d6977522a0 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,4 +1,4 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse4 "Heating model" extends SimpleHouse3; From ada35495c7429c80272df3045bfe90fdd39f625d Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 22 Sep 2023 08:11:57 -0700 Subject: [PATCH 47/48] Added comments, updated reference results, changed parameter to constant --- .../Tutorial/SimpleHouse/SimpleHouse4.mo | 20 +++++++++++++++---- ...ples_Tutorial_SimpleHouse_SimpleHouse4.txt | 6 +++--- ...ples_Tutorial_SimpleHouse_SimpleHouse5.txt | 8 ++++---- ...ples_Tutorial_SimpleHouse_SimpleHouse6.txt | 12 +++++------ 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index d6977522a0..a1d6d542ab 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,13 +1,15 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse4 "Heating model" extends SimpleHouse3; + constant Boolean use_constantHeater=true + "To enable/disable the connection between the constant source and heater and circulation pump"; + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 "Nominal capacity of heating system"; parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 "Nominal mass flow rate for water loop"; - parameter Boolean use_constantHeater=true - "To enable/disable the connection between the constant source and heater and circulation pump"; + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( redeclare package Medium = MediumWater, @@ -121,7 +123,17 @@ Pressure difference modelling may be disregarded in the heating circuit since the chosen pump sets a fixed mass flow rate regardless of the pressure drop.

                    -Set the heater input to 1, meaning that it will produce 1 times its nominal power. +Set the heater input to 1, meaning that it will produce 1 times its nominal power. +

                    +

                    Implementation

                    +

                    +The pump and the heater need a control input, which we set here to a constant +of 1. +However, in the next version of this model, we want to connect an actual controller to these models. +We can therefore introduce a Boolean constant (or a Boolean parameter +would also work), and use this to conditionally remove the Modelica block +that outputs the control signal. When Modelica removes such a block, then all +connections to it will also be removed.

                    Reference result

                    diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt index d9fd9f1534..142a5fe719 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse4.txt @@ -1,7 +1,7 @@ -last-generated=2023-09-08 +last-generated=2023-09-22 statistics-initialization= { - "nonlinear": "5", + "nonlinear": "5, 1", "numerical Jacobians": "0" } statistics-simulation= @@ -12,5 +12,5 @@ statistics-simulation= "numerical Jacobians": "0" } time=[0e+00, 1e+06] -zon.T=[2.931499938964844e+02, 3.018652954101562e+02, 3.023765258789062e+02, 3.028914794921875e+02, 3.035993041992188e+02, 3.042365112304688e+02, 3.047744750976562e+02, 3.05290771484375e+02, 3.058043518066406e+02, 3.063145751953125e+02, 3.068218383789062e+02, 3.073329162597656e+02, 3.078472290039062e+02, 3.083641052246094e+02, 3.088750305175781e+02, 3.093839111328125e+02, 3.09893310546875e+02, 3.104012756347656e+02, 3.109044189453125e+02, 3.114033813476562e+02, 3.118929748535156e+02, 3.123785400390625e+02, 3.128649291992188e+02, 3.133509521484375e+02, 3.138353881835938e+02, 3.143179016113281e+02, 3.147996215820312e+02, 3.152798156738281e+02, 3.157587890625e+02, 3.162375793457031e+02, 3.167167358398438e+02, 3.171956787109375e+02, 3.176707153320312e+02, 3.181366271972656e+02, 3.185990600585938e+02, 3.190547790527344e+02, 3.195059204101562e+02, 3.199426879882812e+02, 3.204760131835938e+02, 3.212296752929688e+02, 3.219649047851562e+02, 3.224814147949219e+02, 3.229290466308594e+02, 3.233672485351562e+02, 3.237968139648438e+02, 3.242164001464844e+02, 3.2463623046875e+02, 3.252275695800781e+02, 3.257299194335938e+02, 3.261766662597656e+02, 3.265938110351562e+02, 3.269905395507812e+02, 3.273827819824219e+02, 3.277706298828125e+02, 3.281524353027344e+02, 3.285976257324219e+02, 3.293054809570312e+02, 3.300552368164062e+02, 3.306694946289062e+02, 3.310607299804688e+02, 3.314381103515625e+02, 3.318106689453125e+02, 3.321793823242188e+02, 3.325464172363281e+02, 3.330693054199219e+02, 3.33726806640625e+02, 3.344093933105469e+02, 3.349058532714844e+02, 3.353015441894531e+02, 3.356973266601562e+02, 3.360923461914062e+02, 3.364874877929688e+02, 3.36885986328125e+02, 3.373557434082031e+02, 3.378902282714844e+02, 3.384234008789062e+02, 3.388450622558594e+02, 3.392593994140625e+02, 3.396685180664062e+02, 3.400756225585938e+02, 3.404804382324219e+02, 3.409362487792969e+02, 3.416002807617188e+02, 3.423026733398438e+02, 3.428507385253906e+02, 3.432394714355469e+02, 3.436236572265625e+02, 3.440080871582031e+02, 3.443947143554688e+02, 3.447819519042969e+02, 3.451823425292969e+02, 3.457003173828125e+02, 3.46326171875e+02, 3.468087768554688e+02, 3.472050476074219e+02, 3.475966491699219e+02, 3.479892883300781e+02, 3.483822021484375e+02, 3.487869262695312e+02, 3.491904907226562e+02, 3.49581298828125e+02] +zon.T=[2.931499938964844e+02, 3.018660888671875e+02, 3.023771057128906e+02, 3.028826293945312e+02, 3.035923767089844e+02, 3.042319030761719e+02, 3.047737731933594e+02, 3.052908020019531e+02, 3.058059997558594e+02, 3.063184204101562e+02, 3.068250732421875e+02, 3.073344421386719e+02, 3.078466796875e+02, 3.083621520996094e+02, 3.088759460449219e+02, 3.09385009765625e+02, 3.098930053710938e+02, 3.104030151367188e+02, 3.109069213867188e+02, 3.114094543457031e+02, 3.1190380859375e+02, 3.123905334472656e+02, 3.128765563964844e+02, 3.1336376953125e+02, 3.138492126464844e+02, 3.143329772949219e+02, 3.148152770996094e+02, 3.152959594726562e+02, 3.157742309570312e+02, 3.162513427734375e+02, 3.167302856445312e+02, 3.172109985351562e+02, 3.176896362304688e+02, 3.181584777832031e+02, 3.186222534179688e+02, 3.190793762207031e+02, 3.195327758789062e+02, 3.199698791503906e+02, 3.204874877929688e+02, 3.212442321777344e+02, 3.219810485839844e+02, 3.224926147460938e+02, 3.229402160644531e+02, 3.233777465820312e+02, 3.238073120117188e+02, 3.242283325195312e+02, 3.246451416015625e+02, 3.252303466796875e+02, 3.257347106933594e+02, 3.261798095703125e+02, 3.265981140136719e+02, 3.269945068359375e+02, 3.273874816894531e+02, 3.277762756347656e+02, 3.28158935546875e+02, 3.286009216308594e+02, 3.293093872070312e+02, 3.300609130859375e+02, 3.306753845214844e+02, 3.310667724609375e+02, 3.314440307617188e+02, 3.318173217773438e+02, 3.321861267089844e+02, 3.325527038574219e+02, 3.33074951171875e+02, 3.337319030761719e+02, 3.34415771484375e+02, 3.349126892089844e+02, 3.353080139160156e+02, 3.35704833984375e+02, 3.361001892089844e+02, 3.364956359863281e+02, 3.368927307128906e+02, 3.373624572753906e+02, 3.378966674804688e+02, 3.384328002929688e+02, 3.388543701171875e+02, 3.392696228027344e+02, 3.396800537109375e+02, 3.400876770019531e+02, 3.404961853027344e+02, 3.409460144042969e+02, 3.416133422851562e+02, 3.423163146972656e+02, 3.428580932617188e+02, 3.432500305175781e+02, 3.436331176757812e+02, 3.440154113769531e+02, 3.444025573730469e+02, 3.447880554199219e+02, 3.4517919921875e+02, 3.456988525390625e+02, 3.4633203125e+02, 3.468067016601562e+02, 3.47203857421875e+02, 3.475979614257812e+02, 3.479879760742188e+02, 3.483829345703125e+02, 3.4878271484375e+02, 3.491936950683594e+02, 3.49584228515625e+02] heaWat.u=[1e+00, 1e+00] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt index 7f09d717c0..f5c54c97ce 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse5.txt @@ -1,16 +1,16 @@ -last-generated=2023-09-08 +last-generated=2023-09-22 statistics-initialization= { - "nonlinear": "5", + "nonlinear": "5, 1", "numerical Jacobians": "0" } statistics-simulation= { "linear": "0, 0, 0, 0, 0", - "nonlinear": "1", + "nonlinear": "1, 1", "number of continuous time states": "9", "numerical Jacobians": "0" } time=[0e+00, 1e+06] -zon.T=[2.931499938964844e+02, 2.945088500976562e+02, 2.959101867675781e+02, 2.966435546875e+02, 2.963061828613281e+02, 2.943134765625e+02, 2.955157165527344e+02, 2.947713317871094e+02, 2.949506225585938e+02, 2.954654846191406e+02, 2.949836730957031e+02, 2.943354187011719e+02, 2.95562255859375e+02, 2.943411865234375e+02, 2.964649658203125e+02, 2.953833618164062e+02, 2.944506530761719e+02, 2.941693420410156e+02, 2.967954406738281e+02, 2.956394958496094e+02, 2.947533264160156e+02, 2.943429870605469e+02, 2.941551513671875e+02, 2.967920837402344e+02, 2.954975280761719e+02, 2.946376953125e+02, 2.942773742675781e+02, 2.945584716796875e+02, 2.964990844726562e+02, 2.9513818359375e+02, 2.944798889160156e+02, 2.942196655273438e+02, 2.952792663574219e+02, 2.963535461425781e+02, 2.950684814453125e+02, 2.944270324707031e+02, 2.941518249511719e+02, 2.964158020019531e+02, 2.948146362304688e+02, 2.942771301269531e+02, 2.944650268554688e+02, 2.944434509277344e+02, 2.943599548339844e+02, 2.942665710449219e+02, 2.941667785644531e+02, 2.942500915527344e+02, 2.942366638183594e+02, 2.943132629394531e+02, 2.941784362792969e+02, 2.943945007324219e+02, 2.946878356933594e+02, 2.944981079101562e+02, 2.942091064453125e+02, 2.966917724609375e+02, 2.947072448730469e+02, 2.950520935058594e+02, 2.942230224609375e+02, 2.94413330078125e+02, 2.945167541503906e+02, 2.94404541015625e+02, 2.942772216796875e+02, 2.942956848144531e+02, 2.945955810546875e+02, 2.966785278320312e+02, 2.95890869140625e+02, 2.943241577148438e+02, 2.944898376464844e+02, 2.944913635253906e+02, 2.943954162597656e+02, 2.943005065917969e+02, 2.942054138183594e+02, 2.951721496582031e+02, 2.958705444335938e+02, 2.944257202148438e+02, 2.942926330566406e+02, 2.942910766601562e+02, 2.9422998046875e+02, 2.941651000976562e+02, 2.943297424316406e+02, 2.947159729003906e+02, 2.951884765625e+02, 2.956945190429688e+02, 2.9439013671875e+02, 2.946013793945312e+02, 2.946728820800781e+02, 2.94598388671875e+02, 2.945144958496094e+02, 2.944308471679688e+02, 2.943534240722656e+02, 2.942757568359375e+02, 2.942055969238281e+02, 2.942643432617188e+02, 2.944358215332031e+02, 2.9445458984375e+02, 2.943978271484375e+02, 2.943378601074219e+02, 2.942750549316406e+02, 2.942183227539062e+02, 2.94168212890625e+02, 2.954824829101562e+02, 2.941523742675781e+02] +zon.T=[2.931499938964844e+02, 2.945089721679688e+02, 2.959105529785156e+02, 2.966436462402344e+02, 2.963066101074219e+02, 2.943134460449219e+02, 2.95515625e+02, 2.947714538574219e+02, 2.9495068359375e+02, 2.954649353027344e+02, 2.949838562011719e+02, 2.943348693847656e+02, 2.955626525878906e+02, 2.9434130859375e+02, 2.96463623046875e+02, 2.953839721679688e+02, 2.944508972167969e+02, 2.941694641113281e+02, 2.967953186035156e+02, 2.956407165527344e+02, 2.947539672851562e+02, 2.943432922363281e+02, 2.941552734375e+02, 2.967925109863281e+02, 2.954992065429688e+02, 2.946384582519531e+02, 2.942777099609375e+02, 2.945531921386719e+02, 2.965014343261719e+02, 2.95139892578125e+02, 2.944806213378906e+02, 2.942200012207031e+02, 2.952698364257812e+02, 2.963566589355469e+02, 2.950704345703125e+02, 2.944278259277344e+02, 2.941521606445312e+02, 2.964190063476562e+02, 2.948162536621094e+02, 2.942771911621094e+02, 2.94465087890625e+02, 2.944435119628906e+02, 2.943599853515625e+02, 2.942666015625e+02, 2.941668395996094e+02, 2.942503051757812e+02, 2.942369689941406e+02, 2.943135070800781e+02, 2.94178466796875e+02, 2.943949584960938e+02, 2.946888427734375e+02, 2.944988403320312e+02, 2.9420947265625e+02, 2.966934814453125e+02, 2.947084655761719e+02, 2.950435180664062e+02, 2.942231140136719e+02, 2.944133911132812e+02, 2.945167236328125e+02, 2.944044799804688e+02, 2.942770080566406e+02, 2.943168640136719e+02, 2.946298828125e+02, 2.9666796875e+02, 2.958675842285156e+02, 2.9432373046875e+02, 2.944895935058594e+02, 2.944911499023438e+02, 2.943951721191406e+02, 2.943002624511719e+02, 2.942052001953125e+02, 2.951673278808594e+02, 2.95863525390625e+02, 2.944528503417969e+02, 2.942922058105469e+02, 2.942911682128906e+02, 2.942301025390625e+02, 2.941652221679688e+02, 2.943312683105469e+02, 2.947212219238281e+02, 2.951982727050781e+02, 2.957117614746094e+02, 2.943904418945312e+02, 2.946015014648438e+02, 2.946730346679688e+02, 2.945985717773438e+02, 2.945146789550781e+02, 2.944310302734375e+02, 2.943536071777344e+02, 2.9427587890625e+02, 2.942057189941406e+02, 2.942647094726562e+02, 2.944362487792969e+02, 2.944551086425781e+02, 2.943983154296875e+02, 2.9433837890625e+02, 2.942754821777344e+02, 2.942191162109375e+02, 2.941687622070312e+02, 2.955406494140625e+02, 2.941532897949219e+02] heaWat.u=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 1e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt index 84a855e6e1..938baee659 100644 --- a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Examples_Tutorial_SimpleHouse_SimpleHouse6.txt @@ -1,19 +1,19 @@ -last-generated=2023-09-08 +last-generated=2023-09-22 statistics-initialization= { - "nonlinear": "5, 1", + "nonlinear": "5, 1, 1, 1", "numerical Jacobians": "0" } statistics-simulation= { "linear": "0, 0, 0, 0, 0", - "nonlinear": "1, 0, 1", + "nonlinear": "1, 0, 1, 1, 1", "number of continuous time states": "11", "numerical Jacobians": "0" } time=[0e+00, 1e+06] -zon.T=[2.931499938964844e+02, 2.945050964355469e+02, 2.959047546386719e+02, 2.96646484375e+02, 2.943834838867188e+02, 2.942815856933594e+02, 2.942722473144531e+02, 2.942023620605469e+02, 2.9615576171875e+02, 2.945042724609375e+02, 2.941602172851562e+02, 2.941692199707031e+02, 2.941705627441406e+02, 2.941705932617188e+02, 2.941704406738281e+02, 2.941652526855469e+02, 2.941562194824219e+02, 2.941512756347656e+02, 2.944099426269531e+02, 2.951903076171875e+02, 2.966014404296875e+02, 2.966050109863281e+02, 2.957460021972656e+02, 2.950239562988281e+02, 2.945757141113281e+02, 2.943212280273438e+02, 2.941802368164062e+02, 2.960645446777344e+02, 2.962243957519531e+02, 2.950863647460938e+02, 2.945101013183594e+02, 2.942584533691406e+02, 2.941826782226562e+02, 2.967984619140625e+02, 2.956029663085938e+02, 2.946762084960938e+02, 2.942572631835938e+02, 2.9655712890625e+02, 2.942179870605469e+02, 2.950230712890625e+02, 2.957950439453125e+02, 2.958896789550781e+02, 2.958037719726562e+02, 2.957060852050781e+02, 2.956017150878906e+02, 2.954903564453125e+02, 2.953819580078125e+02, 2.957755432128906e+02, 2.959239501953125e+02, 2.958983764648438e+02, 2.958122863769531e+02, 2.956854858398438e+02, 2.955560913085938e+02, 2.954240417480469e+02, 2.9528759765625e+02, 2.95342041015625e+02, 2.961524658203125e+02, 2.970876770019531e+02, 2.97622314453125e+02, 2.975182495117188e+02, 2.973820190429688e+02, 2.972417297363281e+02, 2.970984191894531e+02, 2.969559326171875e+02, 2.972681274414062e+02, 2.979461669921875e+02, 2.965861511230469e+02, 2.966249084472656e+02, 2.964938659667969e+02, 2.963466186523438e+02, 2.961501159667969e+02, 2.980364990234375e+02, 2.979473571777344e+02, 2.980525207519531e+02, 2.969268188476562e+02, 2.971317443847656e+02, 2.969201354980469e+02, 2.968055725097656e+02, 2.965866394042969e+02, 2.964843139648438e+02, 2.962891540527344e+02, 2.97805908203125e+02, 2.971761474609375e+02, 2.978529968261719e+02, 2.979222412109375e+02, 2.9753515625e+02, 2.973719787597656e+02, 2.972562866210938e+02, 2.971741333007812e+02, 2.969613037109375e+02, 2.969106140136719e+02, 2.973577270507812e+02, 2.980824584960938e+02, 2.980605163574219e+02, 2.979991455078125e+02, 2.977561340332031e+02, 2.976838989257812e+02, 2.976190185546875e+02, 2.974039306640625e+02, 2.974400024414062e+02, 2.973416442871094e+02] +zon.T=[2.931499938964844e+02, 2.945089721679688e+02, 2.9591064453125e+02, 2.966475830078125e+02, 2.943829650878906e+02, 2.942815856933594e+02, 2.942722473144531e+02, 2.942023620605469e+02, 2.961566772460938e+02, 2.945024719238281e+02, 2.941602478027344e+02, 2.941692504882812e+02, 2.941706237792969e+02, 2.941706237792969e+02, 2.941705322265625e+02, 2.941653137207031e+02, 2.941563415527344e+02, 2.941509399414062e+02, 2.944056091308594e+02, 2.951830139160156e+02, 2.965977478027344e+02, 2.966069641113281e+02, 2.957481384277344e+02, 2.950252685546875e+02, 2.945764465332031e+02, 2.943215942382812e+02, 2.94180419921875e+02, 2.960561218261719e+02, 2.962270202636719e+02, 2.950879821777344e+02, 2.945108642578125e+02, 2.942588195800781e+02, 2.941806640625e+02, 2.967988891601562e+02, 2.956056823730469e+02, 2.946774291992188e+02, 2.942577514648438e+02, 2.965518188476562e+02, 2.942180786132812e+02, 2.950231323242188e+02, 2.957951049804688e+02, 2.958897399902344e+02, 2.958036499023438e+02, 2.957058715820312e+02, 2.956014709472656e+02, 2.954901428222656e+02, 2.953812255859375e+02, 2.95774658203125e+02, 2.959231262207031e+02, 2.958972473144531e+02, 2.958116455078125e+02, 2.956848754882812e+02, 2.955555419921875e+02, 2.954234924316406e+02, 2.952870178222656e+02, 2.953417663574219e+02, 2.961522521972656e+02, 2.970872802734375e+02, 2.976217346191406e+02, 2.975176391601562e+02, 2.973813781738281e+02, 2.972411193847656e+02, 2.970978088378906e+02, 2.969556884765625e+02, 2.972678833007812e+02, 2.979459533691406e+02, 2.965876770019531e+02, 2.9662646484375e+02, 2.964955444335938e+02, 2.96348388671875e+02, 2.961519775390625e+02, 2.980340576171875e+02, 2.97945556640625e+02, 2.980509948730469e+02, 2.969284973144531e+02, 2.971327514648438e+02, 2.969211120605469e+02, 2.968067932128906e+02, 2.965878601074219e+02, 2.964856262207031e+02, 2.962904663085938e+02, 2.978039855957031e+02, 2.971774597167969e+02, 2.978542175292969e+02, 2.979235534667969e+02, 2.975361633300781e+02, 2.973731079101562e+02, 2.97257568359375e+02, 2.971753845214844e+02, 2.969627380371094e+02, 2.969120483398438e+02, 2.973593139648438e+02, 2.980839538574219e+02, 2.980621032714844e+02, 2.980005798339844e+02, 2.977577819824219e+02, 2.976856079101562e+02, 2.976208190917969e+02, 2.974056701660156e+02, 2.974419250488281e+02, 2.973436279296875e+02] heaWat.u=[1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] vavDam.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00] -fan.sta_a.T=[2.609500122070312e+02, 2.619339904785156e+02, 2.625560607910156e+02, 2.634340515136719e+02, 2.68343994140625e+02, 2.720289611816406e+02, 2.720545959472656e+02, 2.713428955078125e+02, 2.719671630859375e+02, 2.692550048828125e+02, 2.701675109863281e+02, 2.723510437011719e+02, 2.733544006347656e+02, 2.748542175292969e+02, 2.725393981933594e+02, 2.727891845703125e+02, 2.745196228027344e+02, 2.731544494628906e+02, 2.731544799804688e+02, 2.722991333007812e+02, 2.698099365234375e+02, 2.689096374511719e+02, 2.703550109863281e+02, 2.703549194335938e+02, 2.703548583984375e+02, 2.703548278808594e+02, 2.703548278808594e+02, 2.703550720214844e+02, 2.698551635742188e+02, 2.706847229003906e+02, 2.716439208984375e+02, 2.725196838378906e+02, 2.705011901855469e+02, 2.680314636230469e+02, 2.676664733886719e+02, 2.660458374023438e+02, 2.64255615234375e+02, 2.581173400878906e+02, 2.604478149414062e+02, 2.657221984863281e+02, 2.69406005859375e+02, 2.682219848632812e+02, 2.657222900390625e+02, 2.637669982910156e+02, 2.618729248046875e+02, 2.592564392089844e+02, 2.581830444335938e+02, 2.604674377441406e+02, 2.616646728515625e+02, 2.608386535644531e+02, 2.561106262207031e+02, 2.546563415527344e+02, 2.54271484375e+02, 2.5302392578125e+02, 2.509575042724609e+02, 2.541974792480469e+02, 2.587733154296875e+02, 2.602138671875e+02, 2.569418334960938e+02, 2.549216613769531e+02, 2.536201782226562e+02, 2.520576171875e+02, 2.519818878173828e+02, 2.514576568603516e+02, 2.582303466796875e+02, 2.619276123046875e+02, 2.916773986816406e+02, 2.916036682128906e+02, 2.916499633789062e+02, 2.915554504394531e+02, 2.914026489257812e+02, 2.648560485839844e+02, 2.6535595703125e+02, 2.700713195800781e+02, 2.935654602050781e+02, 2.937233581542969e+02, 2.933609008789062e+02, 2.932672424316406e+02, 2.929061584472656e+02, 2.9293359375e+02, 2.925202331542969e+02, 2.720550537109375e+02, 2.93810791015625e+02, 2.944085388183594e+02, 2.939564208984375e+02, 2.931130676269531e+02, 2.929986877441406e+02, 2.930928344726562e+02, 2.931185607910156e+02, 2.927966613769531e+02, 2.930165100097656e+02, 2.939817199707031e+02, 2.949109191894531e+02, 2.94682861328125e+02, 2.947590026855469e+02, 2.942391662597656e+02, 2.944219665527344e+02, 2.943655395507812e+02, 2.939534912109375e+02, 2.942164916992188e+02, 2.942030029296875e+02] -fan.sta_b.T=[2.612852783203125e+02, 2.619520263671875e+02, 2.625741271972656e+02, 2.634520874023438e+02, 2.68362060546875e+02, 2.720469970703125e+02, 2.720726623535156e+02, 2.713609619140625e+02, 2.719852294921875e+02, 2.692730407714844e+02, 2.701855773925781e+02, 2.723690795898438e+02, 2.733724670410156e+02, 2.748722839355469e+02, 2.725574645996094e+02, 2.728072509765625e+02, 2.745376586914062e+02, 2.731724853515625e+02, 2.731725158691406e+02, 2.723171997070312e+02, 2.698280029296875e+02, 2.689277038574219e+02, 2.703730773925781e+02, 2.703729858398438e+02, 2.703729248046875e+02, 2.703728942871094e+02, 2.703728637695312e+02, 2.703731079101562e+02, 2.698731994628906e+02, 2.707027893066406e+02, 2.716619567871094e+02, 2.725377502441406e+02, 2.705192260742188e+02, 2.680495300292969e+02, 2.676845092773438e+02, 2.660639038085938e+02, 2.64273681640625e+02, 2.581353759765625e+02, 2.604658813476562e+02, 2.657402648925781e+02, 2.69424072265625e+02, 2.682400512695312e+02, 2.657403564453125e+02, 2.637850341796875e+02, 2.618909606933594e+02, 2.592745056152344e+02, 2.582011108398438e+02, 2.604854736328125e+02, 2.616827392578125e+02, 2.60856689453125e+02, 2.56128662109375e+02, 2.546744079589844e+02, 2.542895355224609e+02, 2.530419769287109e+02, 2.509755554199219e+02, 2.542155303955078e+02, 2.587913818359375e+02, 2.6023193359375e+02, 2.569598693847656e+02, 2.549397125244141e+02, 2.536382293701172e+02, 2.520756683349609e+02, 2.519999389648438e+02, 2.514757080078125e+02, 2.582484130859375e+02, 2.619456787109375e+02, 2.920126953125e+02, 2.9193896484375e+02, 2.919852600097656e+02, 2.918907470703125e+02, 2.917379150390625e+02, 2.648740844726562e+02, 2.653740234375e+02, 2.7008935546875e+02, 2.939007568359375e+02, 2.940586547851562e+02, 2.936961669921875e+02, 2.936025085449219e+02, 2.93241455078125e+02, 2.932688903808594e+02, 2.928554992675781e+02, 2.720731201171875e+02, 2.941460571289062e+02, 2.947438354492188e+02, 2.942916870117188e+02, 2.934483642578125e+02, 2.933339538574219e+02, 2.934281311035156e+02, 2.93453857421875e+02, 2.931319580078125e+02, 2.93351806640625e+02, 2.943170166015625e+02, 2.952462158203125e+02, 2.950181579589844e+02, 2.950942993164062e+02, 2.94574462890625e+02, 2.947572631835938e+02, 2.947008056640625e+02, 2.942887878417969e+02, 2.945517883300781e+02, 2.945382995605469e+02] +fan.sta_a.T=[2.931499938964844e+02, 2.945089721679688e+02, 2.9591064453125e+02, 2.966475830078125e+02, 2.943829650878906e+02, 2.942815856933594e+02, 2.942722473144531e+02, 2.942023620605469e+02, 2.961566772460938e+02, 2.945024719238281e+02, 2.941602478027344e+02, 2.941692504882812e+02, 2.941706237792969e+02, 2.941706237792969e+02, 2.941705322265625e+02, 2.941653137207031e+02, 2.941563415527344e+02, 2.941509399414062e+02, 2.944056091308594e+02, 2.951830139160156e+02, 2.965977478027344e+02, 2.966069641113281e+02, 2.957481384277344e+02, 2.950252685546875e+02, 2.945764465332031e+02, 2.943215942382812e+02, 2.94180419921875e+02, 2.960561218261719e+02, 2.962270202636719e+02, 2.950879821777344e+02, 2.945108642578125e+02, 2.942588195800781e+02, 2.941806640625e+02, 2.967988891601562e+02, 2.956056823730469e+02, 2.946774291992188e+02, 2.942577514648438e+02, 2.965518188476562e+02, 2.942180786132812e+02, 2.950231323242188e+02, 2.957951049804688e+02, 2.958897399902344e+02, 2.958036499023438e+02, 2.957058715820312e+02, 2.956014709472656e+02, 2.954901428222656e+02, 2.953812255859375e+02, 2.95774658203125e+02, 2.959231262207031e+02, 2.958972473144531e+02, 2.958116455078125e+02, 2.956848754882812e+02, 2.955555419921875e+02, 2.954234924316406e+02, 2.952870178222656e+02, 2.953417663574219e+02, 2.961522521972656e+02, 2.970872802734375e+02, 2.976217346191406e+02, 2.975176391601562e+02, 2.973813781738281e+02, 2.972411193847656e+02, 2.970978088378906e+02, 2.969556884765625e+02, 2.972678833007812e+02, 2.979459533691406e+02, 2.916786804199219e+02, 2.9160498046875e+02, 2.916513977050781e+02, 2.915569458007812e+02, 2.914042358398438e+02, 2.980340576171875e+02, 2.97945556640625e+02, 2.980509948730469e+02, 2.9356689453125e+02, 2.937242431640625e+02, 2.933616943359375e+02, 2.932682800292969e+02, 2.929071655273438e+02, 2.929347229003906e+02, 2.925213317871094e+02, 2.720499877929688e+02, 2.938119201660156e+02, 2.944095458984375e+02, 2.9395751953125e+02, 2.931139526367188e+02, 2.929996337890625e+02, 2.930939331054688e+02, 2.931196594238281e+02, 2.927979125976562e+02, 2.930177307128906e+02, 2.939830627441406e+02, 2.949122009277344e+02, 2.946842041015625e+02, 2.947602233886719e+02, 2.942405700683594e+02, 2.944234313964844e+02, 2.943670654296875e+02, 2.939549865722656e+02, 2.942181396484375e+02, 2.942047119140625e+02] +fan.sta_b.T=[2.609500122070312e+02, 2.619280090332031e+02, 2.625499877929688e+02, 2.634280090332031e+02, 2.683388977050781e+02, 2.720243530273438e+02, 2.720499877929688e+02, 2.713381958007812e+02, 2.719623107910156e+02, 2.6925e+02, 2.701626892089844e+02, 2.723464965820312e+02, 2.733500061035156e+02, 2.748500061035156e+02, 2.725348815917969e+02, 2.727846984863281e+02, 2.745153503417969e+02, 2.731499938964844e+02, 2.731499938964844e+02, 2.7229443359375e+02, 2.698047180175781e+02, 2.689043273925781e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.703500061035156e+02, 2.698500061035156e+02, 2.706798400878906e+02, 2.716392211914062e+02, 2.7251513671875e+02, 2.704963989257812e+02, 2.680260009765625e+02, 2.676611022949219e+02, 2.660404052734375e+02, 2.6425e+02, 2.58110595703125e+02, 2.604417114257812e+02, 2.657166748046875e+02, 2.6940087890625e+02, 2.682166748046875e+02, 2.657166748046875e+02, 2.637611083984375e+02, 2.618667907714844e+02, 2.5925e+02, 2.581764831542969e+02, 2.604611206054688e+02, 2.616584777832031e+02, 2.608323364257812e+02, 2.561037292480469e+02, 2.546492767333984e+02, 2.542643737792969e+02, 2.530166625976562e+02, 2.509499969482422e+02, 2.541903991699219e+02, 2.587667236328125e+02, 2.602073364257812e+02, 2.569347839355469e+02, 2.549143829345703e+02, 2.536127471923828e+02, 2.520500030517578e+02, 2.519742736816406e+02, 2.514499969482422e+02, 2.582235412597656e+02, 2.619212036132812e+02, 2.920182495117188e+02, 2.91944580078125e+02, 2.91990966796875e+02, 2.918965454101562e+02, 2.917438049316406e+02, 2.980340576171875e+02, 2.97945556640625e+02, 2.980509948730469e+02, 2.939064636230469e+02, 2.940638122558594e+02, 2.937012939453125e+02, 2.936078491210938e+02, 2.932467346191406e+02, 2.932742919921875e+02, 2.928609008789062e+02, 2.720499877929688e+02, 2.941514892578125e+02, 2.947491455078125e+02, 2.942970886230469e+02, 2.934535217285156e+02, 2.933392333984375e+02, 2.934335021972656e+02, 2.93459228515625e+02, 2.931374816894531e+02, 2.933572998046875e+02, 2.943226318359375e+02, 2.952517700195312e+02, 2.950237731933594e+02, 2.950998229980469e+02, 2.945801391601562e+02, 2.947630004882812e+02, 2.947066345214844e+02, 2.942945556640625e+02, 2.945577087402344e+02, 2.945442810058594e+02] From a50b2b525526c2e780e3f60a6a84deaa3e5efaa1 Mon Sep 17 00:00:00 2001 From: Michael Wetter Date: Fri, 22 Sep 2023 08:20:49 -0700 Subject: [PATCH 48/48] Removed BOM --- IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo index a1d6d542ab..335d544c15 100644 --- a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -1,4 +1,4 @@ -within IBPSA.Examples.Tutorial.SimpleHouse; +within IBPSA.Examples.Tutorial.SimpleHouse; model SimpleHouse4 "Heating model" extends SimpleHouse3;