From d0cfa19e42fd38b0fa275df522be83fff3ed4e89 Mon Sep 17 00:00:00 2001
From: Michael Wetter
-This example model demonstrates a complete system simulation for
+This example model demonstrates a complete system simulation for
steam district heating systems. The central plant features a single boiler.
-For the distribution network, pressure losses on the condensate return
+For the distribution network, pressure losses on the condensate return
pipes are included, while the steam pipes are assumed to be lossless.
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022.
+“A Fast and Accurate Modeling Approach for Water and Steam
+Thermodynamics with Practical Applications in District Heating System Simulation,”
+Energy, 254(A), pp. 124227.
+10.1016/j.energy.2022.124227
+
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022.
+“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.”
+Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of
+Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022.
+10.1109/OSMSES54027.2022.9769121
+
-This model represents a condensation process of water with
+This model represents a condensation process of water with
liquid and vapor phases in equilibrium and at a saturated state.
Further information regarding the model formulation and assumptions
-are in the base class
+are in the base class
Buildings.Experimental.DHC.BaseClasses.Steam.PartialSaturatedControlVolume.
-
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022.
+“A Fast and Accurate Modeling Approach for Water and Steam
+Thermodynamics with Practical Applications in District Heating System Simulation,”
+Energy, 254(A), pp. 124227.
+10.1016/j.energy.2022.124227
+
-Hinkelman, Kathryn, Saranya Anbarasu, Michael Wetter,
-Antoine Gautier, and Wangda Zuo. 2022. “A Fast and Accurate Modeling
-Approach for Water and Steam Thermodynamics with Practical
-Applications in District Heating System Simulation.” Preprint. February 24.
-doi:10.13140/RG.2.2.20710.29762.
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022.
+“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.”
+Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of
+Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022.
+10.1109/OSMSES54027.2022.9769121
-The steam trap ensures that only liquid condensate leaves
+The steam trap ensures that only liquid condensate leaves
the component, while any flashed steam is returned to a liquid
-state before discharge. The model assumes a steady state isenthalpic
-thermodynamic process that transforms water from an upstream
-high pressure state to atmospheric pressure, followed by an
-isobaric condensation process as flashed steam vapor is returned to
-a liquid state. This implementation is consistent with
+state before discharge. The model assumes a steady state isenthalpic
+thermodynamic process that transforms water from an upstream
+high pressure state to atmospheric pressure, followed by an
+isobaric condensation process as flashed steam vapor is returned to
+a liquid state. This implementation is consistent with
physical valves that vent to the atmosphere.
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022.
+“A Fast and Accurate Modeling Approach for Water and Steam
+Thermodynamics with Practical Applications in District Heating System Simulation,”
+Energy, 254(A), pp. 124227.
+10.1016/j.energy.2022.124227
+
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022.
+“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.”
+Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of
+Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022.
+10.1109/OSMSES54027.2022.9769121
+
-This is the model of self-acting control valve that automatically adjusts
-the diameter of valve orifice to reduce the unregulated inlet pressure to a
-constant, reduced outlet pressure.
+This is the model of self-acting control valve that automatically adjusts
+the diameter of valve orifice to reduce the unregulated inlet pressure to a
+constant, reduced outlet pressure.
-To simplify the complex relationships of the valve opening (
-The model maintains
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022.
+“A Fast and Accurate Modeling Approach for Water and Steam
+Thermodynamics with Practical Applications in District Heating System Simulation,”
+Energy, 254(A), pp. 124227.
+10.1016/j.energy.2022.124227
+
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022.
+“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.”
+Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of
+Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022.
+10.1109/OSMSES54027.2022.9769121
+
-This model is intended for existing steam district heating systems
-where the heating load at the energy transfer station (ETS) is
-availble as a time series data input. Thus, the building-side piping and equipement
+This model is intended for existing steam district heating systems
+where the heating load at the energy transfer station (ETS) is
+availble as a time series data input. Thus, the building-side piping and equipement
is not included in this model, as depicted below.
-.
+.
-With the time series input, this model is configured such that the control
-volume (representing the steam side of the heat exchanger) has steady state
-energy and mass balances. The steam trap also has steady state balances by
-design. Meanwhile, the condensate return pump allows either dynamic or steady
-state balances. The mass flow rate at the pump is prescribed ideally such that
-the heat flow rate input from the time series is rejected at the control volume
-based on the physical laws.
+With the time series input, this model is configured such that the control
+volume (representing the steam side of the heat exchanger) has steady state
+energy and mass balances. The steam trap also has steady state balances by
+design. Meanwhile, the condensate return pump allows either dynamic or steady
+state balances. The mass flow rate at the pump is prescribed ideally such that
+the heat flow rate input from the time series is rejected at the control volume
+based on the physical laws.
+
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022.
+“A Fast and Accurate Modeling Approach for Water and Steam
+Thermodynamics with Practical Applications in District Heating System Simulation,”
+Energy, 254(A), pp. 124227.
+10.1016/j.energy.2022.124227
+
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022.
+“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.”
+Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of
+Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022.
+10.1109/OSMSES54027.2022.9769121
-This network connection model contains one pipe declaration
-for the condensate pipe, featuring a fixed hydraulic resistance.
-This model is intended for steam heating systems that utilize
-a split-medium approach with two separate medium declarations
-between liquid and vapor states.
+This network connection model contains one pipe declaration
+for the condensate pipe, featuring a fixed hydraulic resistance.
+This model is intended for steam heating systems that utilize
+a split-medium approach with two separate medium declarations
+between liquid and vapor states.
-In this model, it is assumed that there are no mass losses in
-the network connection. Further, heat transfer with the external
+In this model, it is assumed that there are no mass losses in
+the network connection. Further, heat transfer with the external
environment and transport delays are also not included.
-Hinkelman, Kathryn, Saranya Anbarasu, Michael Wetter,
-Antoine Gautier, and Wangda Zuo. 2022. “A Fast and Accurate Modeling
-Approach for Water and Steam Thermodynamics with Practical
-Applications in District Heating System Simulation.” Preprint. February 24.
-doi:10.13140/RG.2.2.20710.29762.
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022.
+“A Fast and Accurate Modeling Approach for Water and Steam
+Thermodynamics with Practical Applications in District Heating System Simulation,”
+Energy, 254(A), pp. 124227.
+10.1016/j.energy.2022.124227
+
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022.
+“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.”
+Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of
+Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022.
+10.1109/OSMSES54027.2022.9769121
-This is a model of a distribution network for steam heating systems.
-The model utilizes a split-medium approach with two separate medium
-declarations between liquid (condensate return) and vapor (steam
+This is a model of a distribution network for steam heating systems.
+The model utilizes a split-medium approach with two separate medium
+declarations between liquid (condensate return) and vapor (steam
supply) states. The piping network features:
-Hinkelman, Kathryn, Saranya Anbarasu, Michael Wetter,
-Antoine Gautier, and Wangda Zuo. 2022. “A Fast and Accurate Modeling
-Approach for Water and Steam Thermodynamics with Practical
-Applications in District Heating System Simulation.” Preprint. February 24.
-doi:10.13140/RG.2.2.20710.29762.
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022.
+“A Fast and Accurate Modeling Approach for Water and Steam
+Thermodynamics with Practical Applications in District Heating System Simulation,”
+Energy, 254(A), pp. 124227.
+10.1016/j.energy.2022.124227
+
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022.
+“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.”
+Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of
+Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022.
+10.1109/OSMSES54027.2022.9769121
-This model represents a steam boiler that discharges saturated
+This model represents a steam boiler that discharges saturated
steam and has an efficiency curve defined by a polynomial.
-The efficiency in this model represents the fuel-to-water
+The efficiency in this model represents the fuel-to-water
efficiency (e.g., thermal efficiency).
-This model is similar to the
-
-Buildings.Fluid.Boilers.BoilerPolynomial for the efficiency
+This model is similar to the
+
+Buildings.Fluid.Boilers.BoilerPolynomial for the efficiency
and fuel mass flow rate computation with the following exceptions:
", info="
+Added publication references.
+
First implementation.
References
+
", info="
+Added publication references.
+
First implementation.
Reference
+References
+References
+
+Added publication references.
+
First implementation.
Implementation
y_actual
),
-mass flow rate (m_flow
), and change in pressure (dp
)
-for compressible medium (such as steam), this model is implemented using an ideal source
+To simplify the complex relationships of the valve opening (y_actual
),
+mass flow rate (m_flow
), and change in pressure (dp
)
+for compressible medium (such as steam), this model is implemented using an ideal source
-Buildings.Fluid.Movers.BaseClasses.IdealSource, that allows the pressure drop
-to be prescribed independently of mass flow rate.
+Buildings.Fluid.Movers.BaseClasses.IdealSource, that allows the pressure drop
+to be prescribed independently of mass flow rate.
dp
based on the user specified downstream pressure
-value (pb_nominal
), except for instances where the upstream pressure
-falls below pb_nominal
. In these instances, the valve exibits no
-pressure drop (dpSet = 0
) and asserts a warning.
-This model assumes that dp
across the valve is independent of
+The model maintains dp
based on the user specified downstream pressure
+value (pb_nominal
), except for instances where the upstream pressure
+falls below pb_nominal
. In these instances, the valve exibits no
+pressure drop (dpSet = 0
) and asserts a warning.
+This model assumes that dp
across the valve is independent of
m_flow
. This generally leads to a simplier set of equations.
References
+
+Added publication references.
+
First implementation.
Implementation
References
+
@@ -258,27 +258,38 @@ alt=\"Boiler polynomial steam with blocks in green conditionally removed if stea
+Added publication references.
+
Removed massDynamics
.
This is for
diff --git a/Buildings/Experimental/DHC/Networks/Steam/ConnectionCondensatePipe.mo b/Buildings/Experimental/DHC/Networks/Steam/ConnectionCondensatePipe.mo
index 550ef1c27b0..f1bc94cfd9c 100644
--- a/Buildings/Experimental/DHC/Networks/Steam/ConnectionCondensatePipe.mo
+++ b/Buildings/Experimental/DHC/Networks/Steam/ConnectionCondensatePipe.mo
@@ -43,28 +43,39 @@ equation
defaultComponentName="con",
Documentation(info="
Reference
+References
+Updated publication references.
+
First implementation.
-Reference
+References
+Updated publication references.
+
First implementation.
port_a
in liquid state and exits
+Water enters port_a
in liquid state and exits
port_b
in vapor state.
-
-In order to improve the numerical efficiency, this model follows +In order to improve the numerical efficiency, this model follows the split-medium approach using the Buildings.Experimental.DHC.BaseClasses.Steam.PartialTwoPortTwoMedium interface model. -The saturated mixing volume for an evaporation process +The saturated mixing volume for an evaporation process -Buildings.Experimental.DHC.Plants.Steam.BaseClasses.ControlVolumeEvaporation -represents the phase change process of water from liquid +Buildings.Experimental.DHC.Plants.Steam.BaseClasses.ControlVolumeEvaporation +represents the phase change process of water from liquid to vapor at equilibrium.
-+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022. +“A Fast and Accurate Modeling Approach for Water and Steam +Thermodynamics with Practical Applications in District Heating System Simulation,” +Energy, 254(A), pp. 124227. +10.1016/j.energy.2022.124227 +
-Hinkelman, Kathryn, Saranya Anbarasu, Michael Wetter, -Antoine Gautier, and Wangda Zuo. 2022. “A Fast and Accurate Modeling -Approach for Water and Steam Thermodynamics with Practical -Applications in District Heating System Simulation.” Preprint. February 24. -doi:10.13140/RG.2.2.20710.29762. +Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022. +“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.” +Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of +Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022. +10.1109/OSMSES54027.2022.9769121
", revisions="-This model represents an evaporation process of water with +This model represents an evaporation process of water with liquid and vapor phases in equilibrium and at a saturated state. Further information regarding the model formulation and assumptions -are in the base class +are in the base class Buildings.Experimental.DHC.BaseClasses.Steam.PartialSaturatedControlVolume. -
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022. +“A Fast and Accurate Modeling Approach for Water and Steam +Thermodynamics with Practical Applications in District Heating System Simulation,” +Energy, 254(A), pp. 124227. +10.1016/j.energy.2022.124227 +
-Hinkelman, Kathryn, Saranya Anbarasu, Michael Wetter, -Antoine Gautier, and Wangda Zuo. 2022. “A Fast and Accurate Modeling -Approach for Water and Steam Thermodynamics with Practical -Applications in District Heating System Simulation.” Preprint. February 24. -doi:10.13140/RG.2.2.20710.29762. +Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022. +“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.” +Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of +Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022. +10.1109/OSMSES54027.2022.9769121
")); end ControlVolumeEvaporation; diff --git a/Buildings/Experimental/DHC/Plants/Steam/SingleBoiler.mo b/Buildings/Experimental/DHC/Plants/Steam/SingleBoiler.mo index 00ad806c914..85c445ecead 100644 --- a/Buildings/Experimental/DHC/Plants/Steam/SingleBoiler.mo +++ b/Buildings/Experimental/DHC/Plants/Steam/SingleBoiler.mo @@ -1,5 +1,5 @@ within Buildings.Experimental.DHC.Plants.Steam; -model SingleBoiler "A generic steam plant with a single boiler that discharges +model SingleBoiler "A generic steam plant with a single boiler that discharges saturated steam" extends Buildings.Experimental.DHC.Plants.BaseClasses.PartialPlant( final typ=Buildings.Experimental.DHC.Types.DistrictSystemType.HeatingGeneration1, @@ -276,17 +276,36 @@ equation Diagram(coordinateSystem(preserveAspectRatio=false)), Documentation(info="-This is a generic steam plant model that can be used in -district heating system simulations. The model contains a -feedwater tank, feedwater pump, check valve, and a boiler. -The boiler is designed to discharge saturated steam vapor. -For controls, the feedwater pump maintains the water volume -setpoint in the drum boiler, while the boiler control -maintains the discharge pressure setpoint. +This is a generic steam plant model that can be used in +district heating system simulations. The model contains a +feedwater tank, feedwater pump, check valve, and a boiler. +The boiler is designed to discharge saturated steam vapor. +For controls, the feedwater pump maintains the water volume +setpoint in the drum boiler, while the boiler control +maintains the discharge pressure setpoint. +
++Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022. +“A Fast and Accurate Modeling Approach for Water and Steam +Thermodynamics with Practical Applications in District Heating System Simulation,” +Energy, 254(A), pp. 124227. +10.1016/j.energy.2022.124227 +
++Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022. +“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.” +Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of +Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022. +10.1109/OSMSES54027.2022.9769121
", revisions="allowFlowReversal
, and set start pressure
of boiler to be equal to start pressure of feed water tank. Otherwise, backflow
From fc8505485177b193136defa9faf28b22899ffeec Mon Sep 17 00:00:00 2001
From: Antoine Gautier This package contains templates for air handlers and fans.
diff --git a/Buildings/Templates/Components/Coils/WaterBasedCooling.mo b/Buildings/Templates/Components/Coils/WaterBasedCooling.mo index b590090b630..1fabe144ee6 100644 --- a/Buildings/Templates/Components/Coils/WaterBasedCooling.mo +++ b/Buildings/Templates/Components/Coils/WaterBasedCooling.mo @@ -57,7 +57,7 @@ model WaterBasedCooling "Chilled water coil" final show_T=show_T) "Heat exchanger" annotation ( - __ctrl_flow(enable=false), + __ctrlFlow(enable=false), Placement(transformation(extent={{10,4},{-10,-16}}))); Buildings.Fluid.FixedResistances.Junction jun( diff --git a/Buildings/Templates/Components/Coils/WaterBasedHeating.mo b/Buildings/Templates/Components/Coils/WaterBasedHeating.mo index 51a482d21bd..3c9402eff27 100644 --- a/Buildings/Templates/Components/Coils/WaterBasedHeating.mo +++ b/Buildings/Templates/Components/Coils/WaterBasedHeating.mo @@ -55,7 +55,7 @@ model WaterBasedHeating "Hot water coil" final allowFlowReversal2=allowFlowReversalAir, final show_T=show_T) "Heat exchanger" - annotation (__ctrl_flow(enable=false), + annotation (__ctrlFlow(enable=false), Placement(transformation(extent={{10,4},{-10,-16}}))); Buildings.Templates.Components.Routing.PassThroughFluid pas( diff --git a/Buildings/Templates/Components/Interfaces/PartialCoil.mo b/Buildings/Templates/Components/Interfaces/PartialCoil.mo index 04bc99e62ef..973757dd00c 100644 --- a/Buildings/Templates/Components/Interfaces/PartialCoil.mo +++ b/Buildings/Templates/Components/Interfaces/PartialCoil.mo @@ -4,11 +4,11 @@ partial model PartialCoil "Interface class for coil" redeclare final package Medium=MediumAir, final m_flow_nominal=mAir_flow_nominal, final allowFlowReversal=allowFlowReversalAir) - annotation(__ctrl_flow(enable=false)); + annotation(__ctrlFlow(enable=false)); replaceable package MediumAir=Buildings.Media.Air "Air medium" - annotation(__ctrl_flow(enable=false)); + annotation(__ctrlFlow(enable=false)); /* The following definition is needed only for Dymola that does not allow port_aSou and port_bSou to be instantiated without redeclaring their medium @@ -17,7 +17,7 @@ partial model PartialCoil "Interface class for coil" replaceable package MediumSou=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Source-side medium" - annotation(Dialog(enable=false), __ctrl_flow(enable=false)); + annotation(Dialog(enable=false), __ctrlFlow(enable=false)); parameter Buildings.Templates.Components.Types.Coil typ "Equipment type" @@ -43,7 +43,7 @@ partial model PartialCoil "Interface class for coil" "Design and operating parameters" annotation ( Placement(transformation(extent={{70,70},{90,90}})), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); final parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal( final min=0) = dat.mAir_flow_nominal @@ -63,7 +63,7 @@ partial model PartialCoil "Interface class for coil" typ==Buildings.Templates.Components.Types.Coil.ElectricHeating or typ==Buildings.Templates.Components.Types.Coil.EvaporatorMultiStage or typ==Buildings.Templates.Components.Types.Coil.EvaporatorVariableSpeed)), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state" @@ -71,19 +71,19 @@ partial model PartialCoil "Interface class for coil" enable=typ==Buildings.Templates.Components.Types.Coil.ElectricHeating or typ==Buildings.Templates.Components.Types.Coil.EvaporatorMultiStage or typ==Buildings.Templates.Components.Types.Coil.EvaporatorVariableSpeed), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Boolean allowFlowReversalAir=true "= true to allow flow reversal, false restricts to design direction - Air side" annotation (Dialog(tab="Assumptions"), Evaluate=true, - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Boolean allowFlowReversalLiq=true "= true to allow flow reversal, false restricts to design direction - CHW and HW side" annotation (Dialog(tab="Assumptions", enable=typ==Buildings.Templates.Components.Types.Coil.WaterBasedCooling or typ==Buildings.Templates.Components.Types.Coil.WaterBasedHeating), Evaluate=true, - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); Modelica.Fluid.Interfaces.FluidPort_a port_aSou( redeclare final package Medium = MediumSou, diff --git a/Buildings/Templates/Components/Interfaces/PartialDamper.mo b/Buildings/Templates/Components/Interfaces/PartialDamper.mo index 0400ba1cd73..0e642ddf567 100644 --- a/Buildings/Templates/Components/Interfaces/PartialDamper.mo +++ b/Buildings/Templates/Components/Interfaces/PartialDamper.mo @@ -2,7 +2,7 @@ within Buildings.Templates.Components.Interfaces; partial model PartialDamper "Interface class for damper" extends Buildings.Fluid.Interfaces.PartialTwoPortInterface( final m_flow_nominal=dat.m_flow_nominal) - annotation(__ctrl_flow(enable=false)); + annotation(__ctrlFlow(enable=false)); parameter Buildings.Templates.Components.Types.Damper typ "Equipment type" diff --git a/Buildings/Templates/Components/Interfaces/PartialFan.mo b/Buildings/Templates/Components/Interfaces/PartialFan.mo index b5c8580aef5..878eef3b696 100644 --- a/Buildings/Templates/Components/Interfaces/PartialFan.mo +++ b/Buildings/Templates/Components/Interfaces/PartialFan.mo @@ -2,7 +2,7 @@ within Buildings.Templates.Components.Interfaces; partial model PartialFan "Interface class for fan" extends Buildings.Fluid.Interfaces.PartialTwoPortInterface( final m_flow_nominal=dat.m_flow_nominal) - annotation(__ctrl_flow(enable=false)); + annotation(__ctrlFlow(enable=false)); parameter Buildings.Templates.Components.Types.Fan typ "Equipment type" @@ -19,14 +19,14 @@ partial model PartialFan "Interface class for fan" group="Nominal condition", enable=typ<>Buildings.Templates.Components.Types.Fan.None and energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state" annotation(Evaluate=true, Dialog(tab = "Dynamics", group="Conservation equations", enable=typ<>Buildings.Templates.Components.Types.Fan.None), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Buildings.Templates.Components.Types.FanSingle typSin= Buildings.Templates.Components.Types.FanSingle.Housed @@ -44,7 +44,7 @@ partial model PartialFan "Interface class for fan" final nFan=nFan) "Design and operating parameters" annotation(Placement(transformation(extent={{70,70},{90,90}})), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Integer nFan( final min=0, diff --git a/Buildings/Templates/Components/Interfaces/PartialSensor.mo b/Buildings/Templates/Components/Interfaces/PartialSensor.mo index 24dd22ed63b..a714f4d78a3 100644 --- a/Buildings/Templates/Components/Interfaces/PartialSensor.mo +++ b/Buildings/Templates/Components/Interfaces/PartialSensor.mo @@ -1,7 +1,7 @@ within Buildings.Templates.Components.Interfaces; partial model PartialSensor "Interface class for sensor" extends Buildings.Fluid.Interfaces.PartialTwoPortInterface - annotation(__ctrl_flow(enable=false)); + annotation(__ctrlFlow(enable=false)); parameter Boolean have_sen=true "Set to true for sensor, false for direct pass through" diff --git a/Buildings/Templates/Components/Interfaces/PartialValve.mo b/Buildings/Templates/Components/Interfaces/PartialValve.mo index 7c25a2cbba5..689bfe40ad1 100644 --- a/Buildings/Templates/Components/Interfaces/PartialValve.mo +++ b/Buildings/Templates/Components/Interfaces/PartialValve.mo @@ -2,7 +2,7 @@ within Buildings.Templates.Components.Interfaces; partial model PartialValve "Interface class for valve" extends Buildings.Fluid.Interfaces.PartialTwoPortInterface( final m_flow_nominal=dat.m_flow_nominal) - annotation(__ctrl_flow(enable=false)); + annotation(__ctrlFlow(enable=false)); parameter Buildings.Templates.Components.Types.Valve typ "Equipment type" @@ -11,7 +11,7 @@ partial model PartialValve "Interface class for valve" parameter Buildings.Templates.Components.Data.Valve dat(final typ=typ) "Design and operating parameters" annotation (Placement(transformation(extent={{70,70},{90,90}})), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); final parameter Modelica.Units.SI.PressureDifference dpValve_nominal= dat.dpValve_nominal @@ -25,20 +25,24 @@ partial model PartialValve "Interface class for valve" parameter Boolean use_inputFilter=true "= true, if opening is filtered with a 2nd order CriticalDamping filter" - annotation(Dialog(tab="Dynamics", group="Filtered opening", + annotation(__ctrlFlow(enable=false), + Dialog(tab="Dynamics", group="Filtered opening", enable=typ<>Buildings.Templates.Components.Types.Valve.None)); parameter Modelica.Units.SI.Time riseTime=120 "Rise time of the filter (time to reach 99.6 % of an opening step)" - annotation (Dialog( + annotation (__ctrlFlow(enable=false), + Dialog( tab="Dynamics", group="Filtered opening", enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Valve.None)); parameter Modelica.Blocks.Types.Init init=Modelica.Blocks.Types.Init.InitialOutput "Type of initialization (no init/steady state/initial state/initial output)" - annotation(Dialog(tab="Dynamics", group="Filtered opening", + annotation(__ctrlFlow(enable=false), + Dialog(tab="Dynamics", group="Filtered opening", enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Valve.None)); parameter Real y_start=1 "Initial position of actuator" - annotation(Dialog(tab="Dynamics", group="Filtered opening", + annotation(__ctrlFlow(enable=false), + Dialog(tab="Dynamics", group="Filtered opening", enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Valve.None)); parameter Modelica.Units.SI.Time tau=10 @@ -47,14 +51,14 @@ partial model PartialValve "Interface class for valve" enable=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState and ( typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating or typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition)), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state" annotation(Evaluate=true, Dialog(tab = "Dynamics", group="Conservation equations", enable=typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating or typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Integer text_rotation = 0 "Text rotation angle in icon layer" diff --git a/Buildings/Templates/Components/Valves/ThreeWayModulating.mo b/Buildings/Templates/Components/Valves/ThreeWayModulating.mo index c5e591ed284..3eb83021bce 100644 --- a/Buildings/Templates/Components/Valves/ThreeWayModulating.mo +++ b/Buildings/Templates/Components/Valves/ThreeWayModulating.mo @@ -26,7 +26,7 @@ model ThreeWayModulating "Three-way modulating valve" else Modelica.Fluid.Types.PortFlowDirection.Entering) "Valve" annotation ( - __ctrl_flow(enable=false), + __ctrlFlow(enable=false), choicesAllMatching=true, Placement( transformation( diff --git a/Buildings/Templates/Components/Valves/ThreeWayTwoPosition.mo b/Buildings/Templates/Components/Valves/ThreeWayTwoPosition.mo index 101c77b6a97..6af16726743 100644 --- a/Buildings/Templates/Components/Valves/ThreeWayTwoPosition.mo +++ b/Buildings/Templates/Components/Valves/ThreeWayTwoPosition.mo @@ -26,7 +26,7 @@ model ThreeWayTwoPosition "Three-way two-position valve" else Modelica.Fluid.Types.PortFlowDirection.Entering) "Valve" annotation ( - __ctrl_flow(enable=false), + __ctrlFlow(enable=false), choicesAllMatching=true, Placement( transformation( diff --git a/Buildings/Templates/Components/Valves/TwoWayModulating.mo b/Buildings/Templates/Components/Valves/TwoWayModulating.mo index 62fa1924cd9..33b96f01b6a 100644 --- a/Buildings/Templates/Components/Valves/TwoWayModulating.mo +++ b/Buildings/Templates/Components/Valves/TwoWayModulating.mo @@ -17,7 +17,7 @@ model TwoWayModulating "Two-way modulating valve" final show_T=show_T) "Valve" annotation ( - __ctrl_flow(enable=false), + __ctrlFlow(enable=false), choicesAllMatching=true, Placement( transformation( diff --git a/Buildings/Templates/Components/Valves/TwoWayTwoPosition.mo b/Buildings/Templates/Components/Valves/TwoWayTwoPosition.mo index d904826558b..8594b79facb 100644 --- a/Buildings/Templates/Components/Valves/TwoWayTwoPosition.mo +++ b/Buildings/Templates/Components/Valves/TwoWayTwoPosition.mo @@ -19,7 +19,7 @@ model TwoWayTwoPosition "Two-way two-position valve" final show_T=show_T) "Valve (butterfly valve characteristic)" annotation ( - __ctrl_flow(enable=false), + __ctrlFlow(enable=false), choicesAllMatching=true, Placement( transformation( diff --git a/Buildings/Templates/ZoneEquipment/Interfaces/PartialAirTerminal.mo b/Buildings/Templates/ZoneEquipment/Interfaces/PartialAirTerminal.mo index 5fc4b7fc3fb..8672869b62d 100644 --- a/Buildings/Templates/ZoneEquipment/Interfaces/PartialAirTerminal.mo +++ b/Buildings/Templates/ZoneEquipment/Interfaces/PartialAirTerminal.mo @@ -5,11 +5,11 @@ partial model PartialAirTerminal replaceable package MediumAir=Buildings.Media.Air constrainedby Modelica.Media.Interfaces.PartialMedium "Air medium" - annotation(__ctrl_flow(enable=false)); + annotation(__ctrlFlow(enable=false)); replaceable package MediumHeaWat=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "HHW medium" - annotation(Dialog(enable=have_souHeaWat), __ctrl_flow(enable=false)); + annotation(Dialog(enable=have_souHeaWat), __ctrlFlow(enable=false)); parameter Buildings.Templates.ZoneEquipment.Types.Configuration typ "Type of system" @@ -20,7 +20,8 @@ partial model PartialAirTerminal final typ=typ, final have_souChiWat=have_souChiWat, final have_souHeaWat=have_souHeaWat) - "Configuration parameters"; + "Configuration parameters" + annotation(__ctrlFlow(enable=false)); final parameter String id=dat.id "System tag" @@ -62,20 +63,20 @@ partial model PartialAirTerminal Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state" annotation(Evaluate=true, Dialog(tab = "Dynamics", group="Conservation equations"), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); final parameter Boolean allowFlowReversalAir=true "= true to allow flow reversal, false restricts to design direction - Air side" annotation (Dialog(tab="Assumptions"), Evaluate=true, - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Boolean allowFlowReversalLiq=true "= true to allow flow reversal, false restricts to design direction - CHW and HW side" annotation (Dialog(tab="Assumptions", enable=have_souChiWat or have_souHeaWat), Evaluate=true, - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); parameter Boolean show_T = false "= true, if actual temperature at ports of subcomponents is computed" annotation(Dialog(tab="Advanced",group="Diagnostics"), - __ctrl_flow(enable=false)); + __ctrlFlow(enable=false)); Modelica.Fluid.Interfaces.FluidPort_a port_Sup( redeclare final package Medium = MediumAir, diff --git a/Buildings/Templates/ZoneEquipment/VAVBoxCoolingOnly.mo b/Buildings/Templates/ZoneEquipment/VAVBoxCoolingOnly.mo index b1a6c0ea3bb..3fd8d1afbf5 100644 --- a/Buildings/Templates/ZoneEquipment/VAVBoxCoolingOnly.mo +++ b/Buildings/Templates/ZoneEquipment/VAVBoxCoolingOnly.mo @@ -8,6 +8,7 @@ model VAVBoxCoolingOnly "VAV terminal unit cooling only" "Guideline 36 controller for VAV terminal unit cooling only"); annotation ( + __ctrlFlow_template, defaultComponentName="VAVBox", Documentation(info="This package contains templates for zone equipment (HVAC terminal units).
From 43a3d56d2234c15a06e7287dd8f8587af1412ee1 Mon Sep 17 00:00:00 2001 From: Michael Wetter
-This model is used as the starting point for the SimpleHouse
tutorial.
+This model is used as the starting point for the
+Buildings.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
diff --git a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo
index 08cc3c22dc1..2c91ecc7d57 100644
--- a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo
+++ b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse1.mo
@@ -3,13 +3,14 @@ model SimpleHouse1 "Building wall model"
extends SimpleHouse0;
Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap(
- C=AWall*dWall*cpWall*rhoWall, T(fixed=true))
+ 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"
+ 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,
@@ -52,13 +53,13 @@ The heat capacity value of a wall may be computed as C=A*d*cp*&rho
Required models
Connection instructions
diff --git a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo
index 1b19fc1226a..a33420a6d8f 100644
--- a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo
+++ b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo
@@ -53,10 +53,10 @@ 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 <New Variable> 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,
+Set the gain factor k
to 2,
in order to get the solar irradiance through the window of 2 m2.
diff --git a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo index 1f1b0287cc8..f4d181b7669 100644 --- a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo +++ b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -56,16 +56,16 @@ Modelica.Thermal.HeatTransfer.Components.ThermalResistor
-The MixingVolume
Medium parameter contains information about
+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.
+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
Buildings.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.
+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
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 media for the models should be set to
The PrescribedHeatFlow
as well.
diff --git a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo
index 873d58c7d07..6d547e7f17f 100644
--- a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo
+++ b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo
@@ -7,7 +7,7 @@ model SimpleHouse4 "Heating model"
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";
+ "To enable/disable the connection between the constant source and heater and circulation pump";
Buildings.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad(
redeclare package Medium = MediumWater,
@@ -15,8 +15,9 @@ model SimpleHouse4 "Heating model"
T_b_nominal=313.15,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
allowFlowReversal=false,
- Q_flow_nominal=QHea_flow_nominal) "Radiator"
+ Q_flow_nominal=QHea_flow_nominal) "Radiator"
annotation (Placement(transformation(extent={{140,-140},{160,-120}})));
+
Buildings.Fluid.HeatExchangers.HeaterCooler_u heaWat(
redeclare package Medium = MediumWater,
m_flow_nominal=mWat_flow_nominal,
@@ -25,38 +26,45 @@ model SimpleHouse4 "Heating model"
dp_nominal=5000,
Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit"
annotation (Placement(transformation(extent={{60,-140},{80,-120}})));
- Buildings.Fluid.Movers.FlowControlled_m_flow pum(
+
+ 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,
- nominalValuesDefineDefaultPressureCurve=true,
- inputType=Buildings.Fluid.Types.InputType.Constant) "Pump"
- annotation (Placement(transformation(extent={{160,-190},{140,-170}})));
- Buildings.Fluid.Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1)
- "Pressure bound for water circuit" annotation (Placement(transformation(
+ allowFlowReversal=false) "Pump"
+ annotation (Placement(transformation(extent={{110,-190},{90,-170}})));
+
+ Buildings.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)
+ if use_constantHeater "Gain for heater"
annotation (Placement(transformation(extent={{80,-110},{60,-90}})));
+ 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}},
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}));
+ {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},{140,-180}}, color={0,127,255}));
+ {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(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124},
+ 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},{140,-180}},color={0,127,255}));
+ 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),
@@ -80,16 +88,16 @@ the media for the models in the heating circuit should be set to MediumWater<
Required models
MediumWater
.
Boundary_pT
model needs to be used to set an absolute pressure somewhere in the system.
diff --git a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo
index cf90827e6e5..86e10905d90 100644
--- a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo
+++ b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo
@@ -1,9 +1,9 @@
within Buildings.Examples.Tutorial.SimpleHouse;
model SimpleHouse5 "Heating controller model"
- extends SimpleHouse4(pum(inputType=Buildings.Fluid.Types.InputType.Stages,
- massFlowRates=mWat_flow_nominal*{1}), final use_constantHeater=false);
+ extends SimpleHouse4(final use_constantHeater=false);
- Modelica.Blocks.Math.BooleanToInteger booInt "Boolean to integer"
+ 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}})));
@@ -17,9 +17,7 @@ model SimpleHouse5 "Heating controller model"
"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,
+ 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}));
@@ -31,6 +29,8 @@ equation
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),
@@ -68,11 +68,12 @@ 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. +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.
-The figure below shows the air temperature when the controller is added. +The figure below shows the air temperature after the controller is added.
0.1 kg/s.
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.
+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.
diff --git a/Buildings/Fluid/Interfaces/PartialEightPortInterface.mo b/Buildings/Fluid/Interfaces/PartialEightPortInterface.mo index 2fc0af7b7fb..ca891fdd0cc 100644 --- a/Buildings/Fluid/Interfaces/PartialEightPortInterface.mo +++ b/Buildings/Fluid/Interfaces/PartialEightPortInterface.mo @@ -1,6 +1,6 @@ within Buildings.Fluid.Interfaces; partial model PartialEightPortInterface - "Partial model transporting fluid between eight ports without storing mass or energy" + "Partial model with eight ports and declaration of quantities that are used by many models" extends Buildings.Fluid.Interfaces.EightPort; parameter Modelica.Units.SI.MassFlowRate m1_flow_nominal(min=0) "Nominal mass flow rate" annotation (Dialog(group="Nominal condition")); @@ -163,7 +163,8 @@ protected preferredView="info", Documentation(info="
-This component defines the interface for models that transport four fluid streams between eight ports. +This component defines the interface for models with eight fluid ports +and four fluid streams. It is similar to Buildings.Fluid.Interfaces.PartialTwoPortInterface, but it has eight ports instead of two.
@@ -173,6 +174,12 @@ mass transfer and pressure drop equations. ", revisions="
allowFlowReversal==false
, removed noEvent()
declaration
for sta_a
and for sta_b
because the variable is either
diff --git a/Buildings/Fluid/Interfaces/PartialFourPortInterface.mo b/Buildings/Fluid/Interfaces/PartialFourPortInterface.mo
index 3e1ca5133c2..e3a6a08a10b 100644
--- a/Buildings/Fluid/Interfaces/PartialFourPortInterface.mo
+++ b/Buildings/Fluid/Interfaces/PartialFourPortInterface.mo
@@ -1,6 +1,6 @@
within Buildings.Fluid.Interfaces;
partial model PartialFourPortInterface
- "Partial model transporting fluid between two ports without storing mass or energy"
+ "Partial model with four ports and declaration of quantities that are used by many models"
extends Buildings.Fluid.Interfaces.PartialFourPort;
parameter Modelica.Units.SI.MassFlowRate m1_flow_nominal(min=0)
"Nominal mass flow rate" annotation (Dialog(group="Nominal condition"));
@@ -90,8 +90,8 @@ protected
preferredView="info",
Documentation(info="
-This component defines the interface for models that -transport two fluid streams between four ports. +This component defines the interface for models with four fluid ports +and two fluid streams. It is similar to Buildings.Fluid.Interfaces.PartialTwoPortInterface, @@ -104,6 +104,12 @@ mass transfer and pressure drop equations. ", revisions="
allowFlowReversal==false
, removed noEvent()
declaration
for sta_a
and for sta_b
because the variable is either
diff --git a/Buildings/Fluid/Interfaces/PartialTwoPortInterface.mo b/Buildings/Fluid/Interfaces/PartialTwoPortInterface.mo
index 40e1cb168a2..5c4ebc1a788 100644
--- a/Buildings/Fluid/Interfaces/PartialTwoPortInterface.mo
+++ b/Buildings/Fluid/Interfaces/PartialTwoPortInterface.mo
@@ -1,6 +1,6 @@
within Buildings.Fluid.Interfaces;
partial model PartialTwoPortInterface
- "Partial model transporting fluid between two ports without storing mass or energy"
+ "Partial model with two ports and declaration of quantities that are used by many models"
extends Buildings.Fluid.Interfaces.PartialTwoPort(
port_a(p(start=Medium.p_default)),
port_b(p(start=Medium.p_default)));
@@ -58,8 +58,8 @@ protected
preferredView="info",
Documentation(info="
-This component defines the interface for models that -transports a fluid between two ports. It is similar to +This component defines the interface for models with two fluid ports. +It is similar to Modelica.Fluid.Interfaces.PartialTwoPortTransport, but it does not include the species balance @@ -71,6 +71,13 @@ include the species balance Thus, it can be used as a base class for a heat and mass transfer component
+The partial model extends
+
+Buildings.Fluid.Interfaces.PartialTwoPort
+and adds quantities that are used by many models such as
+m_flow_nominal
, m_flow
and dp
.
+
The model is used by other models in this package that add heat transfer, mass transfer and pressure drop equations. See for example @@ -79,6 +86,12 @@ Buildings.Fluid.Interfaces.StaticTwoPortHeatMassExchanger. ", revisions="
allowFlowReversal==false
, replaced actualStream()
with inStream()
for sta_a
and
diff --git a/Buildings/Fluid/SolarCollectors/Validation/ExtremeAmbientConditions.mo b/Buildings/Fluid/SolarCollectors/Validation/ExtremeAmbientConditions.mo
index b970c68d073..ec334bcfd06 100644
--- a/Buildings/Fluid/SolarCollectors/Validation/ExtremeAmbientConditions.mo
+++ b/Buildings/Fluid/SolarCollectors/Validation/ExtremeAmbientConditions.mo
@@ -56,12 +56,12 @@ model ExtremeAmbientConditions
offset=273.15 + 40,
height=-100,
duration=10*3600) "Ambient temperature"
- annotation (Placement(transformation(extent={{-80,70},{-60,90}})));
+ annotation (Placement(transformation(extent={{-80,90},{-60,110}})));
Modelica.Blocks.Sources.Ramp HSol(
duration=12*3600,
height=1000,
startTime=10*3600) "Solar irradiation"
- annotation (Placement(transformation(extent={{-80,40},{-60,60}})));
+ annotation (Placement(transformation(extent={{-80,60},{-60,80}})));
Sources.MassFlowSource_T sou2(
redeclare package Medium = Medium,
@@ -76,13 +76,16 @@ model ExtremeAmbientConditions
transformation(extent={{-10,-10},{10,10}}),iconTransformation(extent={{-154,
16},{-134,36}})));
Modelica.Blocks.Sources.Constant const(k=0) "Constant that outputs zero"
- annotation (Placement(transformation(extent={{-80,2},{-60,22}})));
+ annotation (Placement(transformation(extent={{-80,20},{-60,40}})));
Modelica.Blocks.Sources.Constant solTim(k=12*3600) "Solar time"
- annotation (Placement(transformation(extent={{-80,-30},{-60,-10}})));
+ annotation (Placement(transformation(extent={{-80,-50},{-60,-30}})));
Modelica.Blocks.Sources.Constant lat(k=0.656593) "Location latitude"
- annotation (Placement(transformation(extent={{-80,-60},{-60,-40}})));
+ annotation (Placement(transformation(extent={{-80,-80},{-60,-60}})));
Modelica.Blocks.Sources.Constant alt(k=2) "Location altitude"
- annotation (Placement(transformation(extent={{-80,-90},{-60,-70}})));
+ annotation (Placement(transformation(extent={{-80,-110},{-60,-90}})));
+ Modelica.Blocks.Sources.Constant const1(k=0)
+ "Constant that outputs zero"
+ annotation (Placement(transformation(extent={{-80,-20},{-60,0}})));
equation
connect(sou.ports[1], solAsh.port_a)
annotation (Line(points={{1.77636e-15,-40},{20,-40}}, color={0,127,255}));
@@ -101,40 +104,38 @@ equation
textString="%first",
index=-1,
extent={{-6,3},{-6,3}}));
- connect(TAmb.y, weaBus.TDryBul) annotation (Line(points={{-59,80},{-59,80},{0,
- 80},{0,0}}, color={0,0,127}), Text(
+ connect(TAmb.y, weaBus.TDryBul) annotation (Line(points={{-59,100},{0,100},{0,
+ 50},{0.05,50},{0.05,0.05}},
+ color={0,0,127}), Text(
textString="%second",
index=1,
extent={{6,3},{6,3}}));
- connect(HSol.y, weaBus.HDifHor) annotation (Line(points={{-59,50},{-28,50},{
- -28,0},{0,0}},
+ connect(HSol.y, weaBus.HDifHor) annotation (Line(points={{-59,70},{-28,70},{-28,
+ 0.05},{0.05,0.05}},
color={0,0,127}), Text(
textString="%second",
index=1,
extent={{6,3},{6,3}}));
- connect(HSol.y, weaBus.HGloHor) annotation (Line(points={{-59,50},{-28,50},{
- -28,0},{0,0}},
+ connect(HSol.y, weaBus.HGloHor) annotation (Line(points={{-59,70},{-28,70},{-28,
+ 0.05},{0.05,0.05}},
color={0,0,127}), Text(
textString="%second",
index=1,
extent={{6,3},{6,3}}));
- connect(const.y, weaBus.solZen) annotation (Line(points={{-59,12},{-28,12},{-28,
- 0},{0,0}}, color={0,0,127}), Text(
- textString="%second",
- index=1,
- extent={{6,3},{6,3}}));
- connect(const.y, weaBus.cloTim) annotation (Line(points={{-59,12},{-28,12},{-28,
- 0},{0,0}}, color={0,0,127}), Text(
+ connect(const.y, weaBus.solZen) annotation (Line(points={{-59,30},{-28,30},{-28,
+ 0.05},{0.05,0.05}},
+ color={0,0,127}), Text(
textString="%second",
index=1,
extent={{6,3},{6,3}}));
- connect(solTim.y, weaBus.solTim) annotation (Line(points={{-59,-20},{-28,-20},
- {-28,0},{0,0}}, color={0,0,127}), Text(
+ connect(solTim.y, weaBus.solTim) annotation (Line(points={{-59,-40},{-28,-40},
+ {-28,0.05},{0.05,0.05}},
+ color={0,0,127}), Text(
textString="%second",
index=1,
extent={{6,3},{6,3}}));
- connect(HSol.y, weaBus.HDirNor) annotation (Line(points={{-59,50},{-28,50},{
- -28,0},{0,0}},
+ connect(HSol.y, weaBus.HDirNor) annotation (Line(points={{-59,70},{-28,70},{-28,
+ 0.05},{0.05,0.05}},
color={0,0,127}), Text(
textString="%second",
index=1,
@@ -146,14 +147,22 @@ equation
textString="%second",
index=1,
extent={{6,3},{6,3}}));
- connect(lat.y, weaBus.lat) annotation (Line(points={{-59,-50},{-28,-50},{-28,
- 0},{0,0}}, color={0,0,127}), Text(
+ connect(lat.y, weaBus.lat) annotation (Line(points={{-59,-70},{-28,-70},{-28,0.05},
+ {0.05,0.05}},
+ color={0,0,127}), Text(
+ string="%second",
+ index=1,
+ extent={{6,3},{6,3}},
+ horizontalAlignment=TextAlignment.Left));
+ connect(alt.y, weaBus.alt) annotation (Line(points={{-59,-100},{-28,-100},{-28,
+ 0.05},{0.05,0.05}},
+ color={0,0,127}), Text(
string="%second",
index=1,
extent={{6,3},{6,3}},
horizontalAlignment=TextAlignment.Left));
- connect(alt.y, weaBus.alt) annotation (Line(points={{-59,-80},{-28,-80},{-28,
- 0},{0,0}}, color={0,0,127}), Text(
+ connect(const1.y, weaBus.cloTim) annotation (Line(points={{-59,-10},{-28,-10},
+ {-28,0.05},{0.05,0.05}}, color={0,0,127}), Text(
string="%second",
index=1,
extent={{6,3},{6,3}},
@@ -188,6 +197,10 @@ to set the two bounds for the water temperature.
revisions="
connect
statement with wrong quantity.
+lat
.conDam.yMin
from 0.1 to 0.25.W/m2
and W
.
+hysAir
so that
+uLow < uHigh
.
+This is
+for IBPSA, #429.
+
+This model contains a simple model of a house
+with a heating system, ventilation, and weather boundary conditions.
+It serves as a demonstration case of how the Buildings
library can be used.
+
+A step-by-step tutorial on how to build up this model can be found in + +Buildings.Examples.Tutorial.SimpleHouse. +There are however some minor differences between this model and the models in the tutorial: +
+weaBus
.
-In the dialog box select <New Variable> and here type HDirNor
,
+In the dialog box, select 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,
diff --git a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo
index 6d547e7f17f..25222373c98 100644
--- a/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo
+++ b/Buildings/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo
@@ -2,12 +2,14 @@ within Buildings.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";
+
Buildings.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. +
+
+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.
diff --git a/Buildings/Examples/package.order b/Buildings/Examples/package.order index 9a791ee5b35..0868ef46ece 100644 --- a/Buildings/Examples/package.order +++ b/Buildings/Examples/package.order @@ -1,4 +1,5 @@ Tutorial +SimpleHouse ChillerPlant DualFanDualDuct HydronicHeating diff --git a/Buildings/Fluid/Examples/SimpleHouse.mo b/Buildings/Fluid/Examples/SimpleHouse.mo deleted file mode 100644 index 8c187d6fc92..00000000000 --- a/Buildings/Fluid/Examples/SimpleHouse.mo +++ /dev/null @@ -1,349 +0,0 @@ -within Buildings.Fluid.Examples; -model SimpleHouse - "Illustrative example of a simple heating, ventilation and room model" - extends Modelica.Icons.Example; - - package MediumAir = Buildings.Media.Air; - package MediumWater = Buildings.Media.Water; - - parameter Modelica.Units.SI.Area A_wall=100 "Wall area"; - parameter Modelica.Units.SI.Area A_win=5 "Window area"; - parameter Real g_win(min=0, max=1, unit="1") = 0.3 "Solar heat gain coefficient of window"; - parameter Modelica.Units.SI.Volume V_zone=A_wall*3 "Wall area"; - parameter Modelica.Units.SI.HeatFlowRate QHea_nominal=700 - "Nominal capacity of heating system"; - parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=QHea_nominal/10/ - 4200 "Nominal mass flow rate for water loop"; - parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=V_zone*2*1.2/3600 - "Nominal mass flow rate for air loop"; - - parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 - "Pressure drop at nominal mass flow rate for air loop"; - parameter Boolean allowFlowReversal=false - "= false because flow will not reverse in these circuits"; - - Modelica.Thermal.HeatTransfer.Components.HeatCapacitor walCap( - T(fixed=true), - C=10*A_wall*0.05*1000*1000) - "Thermal mass of walls" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={142,-8}))); - MixingVolumes.MixingVolume zone( - redeclare package Medium = MediumAir, - V=V_zone, - nPorts=2, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - m_flow_nominal=mAir_flow_nominal, - massDynamics=Modelica.Fluid.Types.Dynamics.DynamicFreeInitial) - "Very based zone air model" - annotation (Placement(transformation(extent={{102,140},{82,160}}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor convRes(R=1/2/A_wall) - "Thermal resistance for convective heat transfer with h=2" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=270, - origin={132,22}))); - HeatExchangers.Radiators.RadiatorEN442_2 rad( - redeclare package Medium = MediumWater, - T_a_nominal=273.15 + 50, - T_b_nominal=273.15 + 40, - energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, - allowFlowReversal=allowFlowReversal, - Q_flow_nominal=QHea_nominal) "Radiator" - annotation (Placement(transformation(extent={{104,-116},{124,-96}}))); - - Sources.Boundary_pT bouAir(redeclare package Medium = MediumAir, nPorts=2, - use_T_in=true) "Air boundary with constant temperature" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-112,140}))); - Sources.Boundary_pT bouWat(redeclare package Medium = MediumWater, nPorts=1) - "Pressure bound for water circuit" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - origin={-8,-170}))); - BoundaryConditions.WeatherData.ReaderTMY3 weaDat( - filNam=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) - "Weather data reader" - annotation (Placement(transformation(extent={{-200,-18},{-180,2}}))); - BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" - annotation (Placement(transformation(extent={{-162,-18},{-142,2}}))); - Modelica.Thermal.HeatTransfer.Components.ThermalResistor wallRes(R=0.25/ - A_wall/0.04) "Thermal resistor for wall: 25 cm of rockwool" - annotation (Placement(transformation(extent={{66,-10},{86,10}}))); - Buildings.HeatTransfer.Sources.PrescribedTemperature Tout - "Exterior temperature boundary condition" - annotation (Placement(transformation(extent={{-20,-10},{0,10}}))); - HeatExchangers.HeaterCooler_u heaWat( - redeclare package Medium = MediumWater, - m_flow_nominal=mWat_flow_nominal, - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=allowFlowReversal, - dp_nominal=5000, - Q_flow_nominal=QHea_nominal) "Heater for water circuit" - annotation (Placement(transformation(extent={{44,-116},{64,-96}}))); - - 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=allowFlowReversal, - nominalValuesDefineDefaultPressureCurve=true, - inputType=Buildings.Fluid.Types.InputType.Stages, - massFlowRates=mWat_flow_nominal*{1}) "Pump" - annotation (Placement(transformation(extent={{80,-180},{60,-160}}))); - Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir - "Zone air temperature sensor" - annotation (Placement(transformation(extent={{80,170},{60,190}}))); - Actuators.Dampers.Exponential vavDam( - redeclare package Medium = MediumAir, - from_dp=true, - m_flow_nominal=mAir_flow_nominal, - dpDamper_nominal=10, - dpFixed_nominal=dpAir_nominal - 10) - "Damper" annotation (Placement(transformation(extent={{-10,10},{10, - -10}}, origin={72,120}))); - - 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={-22,120}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow window - "Very simple window model" - annotation (Placement(transformation(extent={{-20,-36},{0,-16}}))); - HeatExchangers.ConstantEffectiveness hexRec( - redeclare package Medium1 = MediumAir, - redeclare package Medium2 = MediumAir, - dp1_nominal=0, - dp2_nominal=0, - m1_flow_nominal=mAir_flow_nominal, - m2_flow_nominal=mAir_flow_nominal, - eps=0.85) "Heat exchanger for heat recuperation" - annotation (Placement(transformation(extent={{-54,114},{-84,146}}))); - Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 20, uHigh=273.15 + 22) - "Hysteresis controller for radiator" - annotation (Placement(transformation(extent={{-74,-110},{-54,-90}}))); - Modelica.Blocks.Math.BooleanToReal booleanToReal1 "Boolean to real" - annotation (Placement(transformation(extent={{-16,-110},{4,-90}}))); - Modelica.Blocks.Logical.Not not1 - "negation for enabling heating when temperatur is low" - annotation (Placement(transformation(extent={{-46,-110},{-26,-90}}))); - Modelica.Blocks.Sources.Constant const_dp(k=dpAir_nominal) "Pressure head" - annotation (Placement(transformation(extent={{-52,150},{-32,170}}))); - - Modelica.Blocks.Math.Gain gaiWin(k=A_win*g_win) - "Gain for window solar transmittance and area as HGloHor is in W/m2" - annotation (Placement(transformation(extent={{-60,-36},{-40,-16}}))); - Modelica.Blocks.Math.BooleanToInteger booleanToInt "Boolean to integer" - annotation (Placement(transformation(extent={{-16,-144},{4,-124}}))); - Controls.Continuous.LimPID conDam( - controllerType=Modelica.Blocks.Types.SimpleController.P, - yMin=0.25) "Controller for damper" - annotation (Placement(transformation(extent={{-20,80},{0,100}}))); - Modelica.Blocks.Sources.Constant TSetRoo(k=273.15 + 24) - "Room temperature set point for air system" - annotation (Placement(transformation(extent={{-60,60},{-40,80}}))); - HeatExchangers.SensibleCooler_T cooAir( - energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, - allowFlowReversal=allowFlowReversal, - m_flow_nominal=mAir_flow_nominal, - dp_nominal=0, - redeclare package Medium = MediumAir) "Cooling for supply air" - annotation (Placement(transformation(extent={{30,110},{50,130}}))); - Modelica.Blocks.Sources.Constant TSupAirCoo(k=273.15 + 20) - "Cooling setpoint for supply air" - annotation (Placement(transformation(extent={{-12,150},{8,170}}))); -equation - connect(convRes.port_b, walCap.port) - annotation (Line(points={{132,12},{132,12},{132,-8}}, color={191,0,0})); - connect(convRes.port_a, zone.heatPort) annotation (Line(points={{132,32},{132, - 150},{102,150}}, color={191,0,0})); - connect(weaDat.weaBus, weaBus) annotation (Line( - points={{-180,-8},{-180,-8},{-152,-8}}, - color={255,204,51}, - thickness=0.5)); - connect(wallRes.port_b, walCap.port) annotation (Line(points={{86,0},{132,0},{ - 132,-6},{132,-8}}, color={191,0,0})); - connect(Tout.T, weaBus.TDryBul) - annotation (Line(points={{-22,0},{-152,0},{-152,-8}}, color={0,0,127})); - connect(Tout.port, wallRes.port_a) - annotation (Line(points={{0,0},{0,0},{66,0}}, color={191,0,0})); - connect(heaWat.port_b, rad.port_a) annotation (Line(points={{64,-106},{84,-106}, - {104,-106}}, color={0,127,255})); - connect(bouWat.ports[1], heaWat.port_a) annotation (Line(points={{2,-170},{40, - -170},{40,-106},{44,-106}}, color={0,127,255})); - connect(rad.port_b, pump.port_a) annotation (Line(points={{124,-106},{130,-106}, - {130,-170},{80,-170}}, color={0,127,255})); - connect(senTemZonAir.port, zone.heatPort) annotation (Line(points={{80,180},{80, - 180},{112,180},{112,150},{102,150}}, - color={191,0,0})); - connect(window.port, walCap.port) annotation (Line(points={{0,-26},{132,-26},{ - 132,-12},{132,-8}}, - color={191,0,0})); - connect(bouAir.ports[1], hexRec.port_b1) annotation (Line(points={{-102,142},{ - -102,139.6},{-84,139.6}}, - color={0,127,255})); - connect(hexRec.port_a1, zone.ports[1]) annotation (Line(points={{-54,139.6},{85, - 139.6},{85,140},{94,140}}, color={0,127,255})); - connect(rad.heatPortCon, zone.heatPort) annotation (Line(points={{112,-98.8},{ - 112,-98.8},{112,48},{112,150},{102,150}}, color={191,0,0})); - connect(rad.heatPortRad, walCap.port) annotation (Line(points={{116,-98.8},{116, - -98.8},{116,-70},{116,-26},{132,-26},{132,-8}}, - color={191,0,0})); - connect(not1.y, booleanToReal1.u) annotation (Line(points={{-25,-100},{-22,-100}, - {-18,-100}}, color={255,0,255})); - connect(not1.u, hysRad.y) annotation (Line(points={{-48,-100},{-52,-100},{-53, - -100}}, color={255,0,255})); - connect(booleanToReal1.y, heaWat.u) annotation (Line(points={{5,-100},{16,-100}, - {26,-100},{42,-100}}, color={0,0,127})); - connect(heaWat.port_a, pump.port_b) annotation (Line(points={{44,-106},{40,-106}, - {40,-112},{40,-170},{60,-170}}, color={0,127,255})); - connect(const_dp.y, fan.dp_in) annotation (Line(points={{-31,160},{-22,160},{ - -22,132},{-22,132}}, color={0,0,127})); - connect(gaiWin.y, window.Q_flow) annotation (Line(points={{-39,-26},{-34,-26}, - {-30,-26},{-20,-26}}, color={0,0,127})); - connect(gaiWin.u, weaBus.HGloHor) annotation (Line(points={{-62,-26},{-90,-26}, - {-152,-26},{-152,-8}}, color={0,0,127})); - connect(booleanToInt.u, not1.y) annotation (Line(points={{-18,-134},{-22,-134}, - {-22,-100},{-25,-100}}, color={255,0,255})); - connect(booleanToInt.y, pump.stage) annotation (Line(points={{5,-134},{32,-134}, - {70,-134},{70,-158}}, color={255,127,0})); - connect(bouAir.ports[2], hexRec.port_a2) annotation (Line(points={{-102,138},{ - -102,142},{-90,142},{-90,120.4},{-84,120.4}}, color={0,127,255})); - connect(hexRec.port_b2, fan.port_a) annotation (Line(points={{-54,120.4},{-44, - 120.4},{-44,120},{-32,120}}, color={0,127,255})); - connect(vavDam.port_b, zone.ports[2]) - annotation (Line(points={{82,120},{90,120},{90,140}}, color={0,127,255})); - connect(senTemZonAir.T, hysRad.u) annotation (Line(points={{60,180},{60,180},{ - -132,180},{-132,-100},{-76,-100}}, color={0,0,127})); - connect(senTemZonAir.T,conDam. u_s) annotation (Line(points={{60,180},{60,180}, - {-132,180},{-132,90},{-62,90},{-22,90}}, - color={0,0,127})); - connect(conDam.y, vavDam.y) annotation (Line(points={{1,90},{26,90},{72,90},{72, - 108}},color={0,0,127})); - connect(TSetRoo.y,conDam. u_m) annotation (Line(points={{-39,70},{-40,70},{-36, - 70},{-40,70},{-10,70},{-10,78}}, - color={0,0,127})); - connect(fan.port_b, cooAir.port_a) - annotation (Line(points={{-12,120},{30,120}}, color={0,127,255})); - connect(cooAir.port_b, vavDam.port_a) - annotation (Line(points={{50,120},{50,120},{62,120}}, color={0,127,255})); - connect(TSupAirCoo.y, cooAir.TSet) annotation (Line(points={{9,160},{20,160},{ - 20,128},{28,128}}, color={0,0,127})); - connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-124,144},{ - -152,144},{-152,-8}}, color={0,0,127})); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-240, - -220},{200,220}}), graphics={ - Rectangle( - extent={{-222,200},{180,50}}, - 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,40},{20,-48}}, - fillColor={238,238,238}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None), - Text( - extent={{-78,182},{-212,198}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Cooling and ventilation"), - Rectangle( - extent={{40,40},{180,-46}}, - 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={{-154,20},{-212,38}}, - textColor={0,0,127}, - fillColor={255,213,170}, - fillPattern=FillPattern.Solid, - textString="Weather")}), - experiment(Tolerance=1e-06, StopTime=3.1536e+07), - Documentation(revisions=" -
conDam.yMin
from 0.1 to 0.25.W/m2
and W
.
-hysAir
so that
-uLow < uHigh
.
-This is
-for #429.
-
-This model contains a simple model of a house
-with a heating system, ventilation and weather boundary conditions.
-It serves as a demonstration case of how the Buildings
library can be used.
-
This partial class implements the same functionality as
-
-Buildings.Fluid.Interfaces.StaticTwoPortHeatMassExchanger,
+
+Buildings.Fluid.Interfaces.PartialTwoPortInterface,
except that port_a
and port_b
are placed at the top and bottom
of the component.
+Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022. +“A Fast and Accurate Modeling Approach for Water and Steam +Thermodynamics with Practical Applications in District Heating System Simulation,” +Energy, 254(A), pp. 124227. +10.1016/j.energy.2022.124227 +
++Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022. +“Towards Open-Source Modelica Models For Steam-Based District Heating Systems.” +Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of +Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022. +10.1109/OSMSES54027.2022.9769121 +
", revisions="pHat
and THat
-from absolute to Modelica.Units.SI.PressureDifference
and
-Modelica.Units.SI.TemperatureDifference
to prevent min/max
-assertion erros during initilization.
+Changed the variable type definition of pHat
and THat
+from absolute to Modelica.Units.SI.PressureDifference
and
+Modelica.Units.SI.TemperatureDifference
to prevent min/max
+assertion errors during initilization.
rho_pT
, created and used new function extending
Modelica.Media.Water.IF97_Utilities.BaseIF97.Basic.g2
with an
-annotation smoothOrder=2
. This is to specifcally pass on the
-smoothOrder=2
annotion placed on rho_pT
to
+annotation smoothOrder=2
. This is to specifically pass on the
+smoothOrder=2
annotion placed on rho_pT
to
the g2
function.
p
indicates a higher chance of generating true
.
", revisions="
localSeed
.y
.
", revisions="
localSeed
.
This function generates a random binary variable with a continuous inputs
-x
from a Weibull Distribution relation.
+x
from a Weibull distribution relation.
The probability of being 1 is calculated from the input x
from a
-Weibull Distribution relation with three predefined parameters u
+Weibull distribution relation with three predefined parameters u
(threshold, the output would be 0 if x
is bigger than u
),
L
(normalization faction) and k
(shape factor).
Then a random generator generates the output, which should be a binary variable.
diff --git a/Buildings/Occupants/BaseClasses/weibull1DON.mo b/Buildings/Occupants/BaseClasses/weibull1DON.mo
index 00e69d3c049..4fd5a94cedc 100644
--- a/Buildings/Occupants/BaseClasses/weibull1DON.mo
+++ b/Buildings/Occupants/BaseClasses/weibull1DON.mo
@@ -1,5 +1,7 @@
within Buildings.Occupants.BaseClasses;
-function weibull1DON "Mapping a continuous input to a binary output through a Weibull Distribution Relation"
+function weibull1DON "Mapping a continuous input to a binary output through a Weibull distribution relation"
+ extends Modelica.Icons.Function;
+
input Real x "Continous variable";
input Real u=1.0 "Parameter defining the Weibull distribution threshold";
input Real L=1.0 "Parameter defining the Weibull distribution normalization factor";
@@ -16,11 +18,11 @@ annotation (
Documentation(info="
This function generates a random binary variable with a continuous inputs
-x
from a Weibull Distribution relation.
+x
from a Weibull distribution relation.
The probability of being 1 is calculated from the input x
from a
-Weibull Distribution relation with three predefined parameters u
+Weibull distribution relation with three predefined parameters u
(threshold, the output would be 0 if x
is less than u
),
L
(normalization faction) and k
(shape factor). Then
a random generator generates the output, which should be a binary variable.
diff --git a/Buildings/Occupants/BaseClasses/weibullVariableGeneration.mo b/Buildings/Occupants/BaseClasses/weibullVariableGeneration.mo
index 135a8c88a7a..f765a5f1abb 100644
--- a/Buildings/Occupants/BaseClasses/weibullVariableGeneration.mo
+++ b/Buildings/Occupants/BaseClasses/weibullVariableGeneration.mo
@@ -1,11 +1,13 @@
within Buildings.Occupants.BaseClasses;
function weibullVariableGeneration "Random variable generator from the Weibull distribution"
+ extends Modelica.Icons.Function;
+
input Real lambda "Parameter defining the Weibull distribution scale factor";
input Real k "Parameter defining the Weibull distribution shape factor";
input Integer globalSeed "Seed for the random number generator";
output Real y "Random variable generated from Weibull Distribution";
protected
- Integer localSeed;
+ Integer localSeed = 0 "Local seed";
Integer state[Modelica.Math.Random.Generators.Xorshift1024star.nState];
Real r "Generated random numberin the range 0 < random ≤ 1";
algorithm
@@ -14,21 +16,26 @@ algorithm
y := lambda*(Modelica.Math.log((1 - r)^(-1)))^(1/k);
annotation (Documentation(info="
-This function generates a random variable, from a Weibull distribution with the
-inputs of lambda
and k
. The random variable might be
+This function generates a random variable, from a Weibull distribution with the
+inputs of lambda
and k
. The random variable might be
the duration of a specific event, for instance the time to keep the HVAC on.
-The inputs lambda
and k
defines the probability density
-function. lambda
is similar to the mean value of exponential
-distribution, and k
defines the shape. A value of k
= 1
-means the Weibull distribution reduces to an exponential distribution. Genrally
-speaking, higher lambda
and higher k
indicate a higher
+The inputs lambda
and k
defines the probability density
+function. lambda
is similar to the mean value of exponential
+distribution, and k
defines the shape. A value of k
= 1
+means the Weibull distribution reduces to an exponential distribution. Genrally
+speaking, higher lambda
and higher k
indicate a higher
chance to generate a higher output.
localSeed
.+This model represents a configuration with an air economizer and +minimum OA control with a separate minimum OA damper and airflow measurement. +
+"), Icon(graphics={ + Line( + points={{0,140},{0,0}}, + color={28,108,200}, + thickness=1), + Line( + points={{-180,0},{180,0}}, + color={28,108,200}, + thickness=1), + Line( + points={{-180,60},{0,60}}, + color={28,108,200}, + thickness=1)})); +end PartialOutdoorSectionDedicatedDampers; diff --git a/Buildings/Templates/AirHandlersFans/Components/Interfaces/package.order b/Buildings/Templates/AirHandlersFans/Components/Interfaces/package.order index cd9ee37903c..2478be5d22b 100644 --- a/Buildings/Templates/AirHandlersFans/Components/Interfaces/package.order +++ b/Buildings/Templates/AirHandlersFans/Components/Interfaces/package.order @@ -3,4 +3,5 @@ PartialControllerVAVMultizone PartialHeatRecovery PartialOutdoorReliefReturnSection PartialOutdoorSection +PartialOutdoorSectionDedicatedDampers PartialReliefReturnSection diff --git a/Buildings/Templates/AirHandlersFans/Components/OutdoorReliefReturnSection/MixedAirWithDamper.mo b/Buildings/Templates/AirHandlersFans/Components/OutdoorReliefReturnSection/MixedAirWithDamper.mo index 37f58c08f48..1d1d25e420e 100644 --- a/Buildings/Templates/AirHandlersFans/Components/OutdoorReliefReturnSection/MixedAirWithDamper.mo +++ b/Buildings/Templates/AirHandlersFans/Components/OutdoorReliefReturnSection/MixedAirWithDamper.mo @@ -59,8 +59,9 @@ model MixedAirWithDamper "Mixed air system with return air damper" Dialog(group="Configuration"), Placement(transformation(extent={{-18,66},{18,94}}))); - Buildings.Templates.Components.Dampers.Modulating damRet( + Buildings.Templates.Components.Actuators.Damper damRet( redeclare final package Medium = MediumAir, + final typ=Buildings.Templates.Components.Types.Damper.Modulating, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, final dat=dat.damRet, diff --git a/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersAirflow.mo b/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersAirflow.mo index 99d22dad14e..0a068753214 100644 --- a/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersAirflow.mo +++ b/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersAirflow.mo @@ -1,96 +1,13 @@ within Buildings.Templates.AirHandlersFans.Components.OutdoorSection; model DedicatedDampersAirflow "Separate dampers for ventilation and economizer, with airflow measurement station" - extends - Buildings.Templates.AirHandlersFans.Components.Interfaces.PartialOutdoorSection( - final typ=Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.DedicatedDampersAirflow, - final typDamOut=damOut.typ, - final typDamOutMin=damOutMin.typ); + extends Buildings.Templates.AirHandlersFans.Components.Interfaces.PartialOutdoorSectionDedicatedDampers( + final typ=Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.DedicatedDampersAirflow); - Buildings.Templates.Components.Dampers.Modulating damOut( - redeclare final package Medium = MediumAir, - use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, - final allowFlowReversal=allowFlowReversal, - final dat=dat.damOut) - "Economizer outdoor air damper" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=0, - origin={0,0}))); - Buildings.Templates.Components.Dampers.Modulating damOutMin( - redeclare final package Medium = MediumAir, - use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, - final allowFlowReversal=allowFlowReversal, - final dat=dat.damOutMin) - "Minimum outdoor air damper" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=0, - origin={0,60}))); - - Buildings.Templates.Components.Sensors.Temperature TOut( - redeclare final package Medium = MediumAir, - final allowFlowReversal=allowFlowReversal, - final have_sen=true, - final m_flow_nominal=mOutMin_flow_nominal) - "Outdoor air temperature sensor" - annotation (Placement(transformation(extent={{70,50},{90,70}}))); - Buildings.Templates.Components.Sensors.VolumeFlowRate VOutMin_flow( - redeclare final package Medium = MediumAir, - final allowFlowReversal=allowFlowReversal, - final have_sen=true, - final m_flow_nominal=mOutMin_flow_nominal, - final typ=Buildings.Templates.Components.Types.SensorVolumeFlowRate.AFMS) - "Minimum outdoor air volume flow rate sensor" - annotation (Placement(transformation(extent={{110,50},{130,70}}))); - Buildings.Templates.Components.Sensors.SpecificEnthalpy hAirOut( - redeclare final package Medium = MediumAir, - final allowFlowReversal=allowFlowReversal, - final have_sen= - typCtlEco==Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedEnthalpyWithFixedDryBulb or - typCtlEco==Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialEnthalpyWithFixedDryBulb, - final m_flow_nominal=mOutMin_flow_nominal) - "Outdoor air enthalpy sensor" - annotation (Placement(transformation(extent={{30,50},{50,70}}))); -equation - /* Control point connection - start */ - connect(damOut.bus, bus.damOut); - connect(damOutMin.bus, bus.damOutMin); - connect(TOut.y, bus.TOut); - connect(hAirOut.y, bus.hAirOut); - connect(VOutMin_flow.y, bus.VOutMin_flow); - /* Control point connection - end */ - connect(damOut.port_b, port_b) - annotation (Line(points={{10,0},{180,0}}, color={0,127,255})); - connect(TOut.port_b, VOutMin_flow.port_a) - annotation (Line(points={{90,60},{110,60}},color={0,127,255})); - connect(VOutMin_flow.port_b, port_b) annotation (Line(points={{130,60},{160, - 60},{160,0},{180,0}}, - color={0,127,255})); - connect(damOutMin.port_b, hAirOut.port_a) - annotation (Line(points={{10,60},{30,60}}, color={0,127,255})); - connect(hAirOut.port_b, TOut.port_a) - annotation (Line(points={{50,60},{70,60}}, color={0,127,255})); - connect(port_a, damOut.port_a) - annotation (Line(points={{-180,0},{-10,0}}, color={0,127,255})); - connect(damOutMin.port_a, damOut.port_a) annotation (Line(points={{-10,60},{ - -20,60},{-20,0},{-10,0}}, color={0,127,255})); annotation (Documentation(info="This model represents a configuration with an air economizer and minimum OA control with a separate minimum OA damper and airflow measurement.
-"), Icon(graphics={ - Line( - points={{0,140},{0,0}}, - color={28,108,200}, - thickness=1), - Line( - points={{-180,0},{180,0}}, - color={28,108,200}, - thickness=1), - Line( - points={{-180,60},{0,60}}, - color={28,108,200}, - thickness=1)})); +")); end DedicatedDampersAirflow; diff --git a/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersPressure.mo b/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersPressure.mo index 997a78c66e5..b27acc779c8 100644 --- a/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersPressure.mo +++ b/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/DedicatedDampersPressure.mo @@ -1,98 +1,14 @@ within Buildings.Templates.AirHandlersFans.Components.OutdoorSection; model DedicatedDampersPressure "Separate dampers for ventilation and economizer, with differential pressure sensor" - extends - Buildings.Templates.AirHandlersFans.Components.Interfaces.PartialOutdoorSection( - final typ=Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.DedicatedDampersPressure, - final typDamOut=damOut.typ, - final typDamOutMin=damOutMin.typ); + extends Buildings.Templates.AirHandlersFans.Components.Interfaces.PartialOutdoorSectionDedicatedDampers( + final typ=Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.DedicatedDampersPressure); - Buildings.Templates.Components.Dampers.Modulating damOut( - redeclare final package Medium = MediumAir, - use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, - final allowFlowReversal=allowFlowReversal, - final dat=dat.damOut) - "Economizer outdoor air damper" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=0, - origin={0,0}))); - Buildings.Templates.Components.Dampers.TwoPosition damOutMin( - redeclare final package Medium = MediumAir, - use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, - final allowFlowReversal=allowFlowReversal, - final dat=dat.damOutMin) - "Minimum outdoor air damper" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=0, - origin={0,60}))); - - Buildings.Templates.Components.Sensors.Temperature TOut( - redeclare final package Medium = MediumAir, - final allowFlowReversal=allowFlowReversal, - final have_sen=true, - final m_flow_nominal=mOutMin_flow_nominal) - "Outdoor air temperature sensor" - annotation (Placement(transformation(extent={{70,50},{90,70}}))); - Buildings.Templates.Components.Sensors.DifferentialPressure dpAirOutMin( - redeclare final package Medium = MediumAir, - final have_sen=true) - "Minimum outdoor air damper differential pressure sensor" - annotation (Placement(transformation(extent={{-10,90},{10,110}}))); - Buildings.Templates.Components.Sensors.SpecificEnthalpy hAirOut( - redeclare final package Medium = MediumAir, - final allowFlowReversal=allowFlowReversal, - final have_sen= - typCtlEco==Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedEnthalpyWithFixedDryBulb or - typCtlEco==Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialEnthalpyWithFixedDryBulb, - final m_flow_nominal=mOutMin_flow_nominal) - "Outdoor air enthalpy sensor" - annotation (Placement(transformation(extent={{30,50},{50,70}}))); -equation - /* Control point connection - start */ - connect(damOut.bus, bus.damOut); - connect(damOutMin.bus, bus.damOutMin); - connect(TOut.y, bus.TOut); - connect(hAirOut.y, bus.hAirOut); - connect(dpAirOutMin.y, bus.dpAirOutMin); - /* Control point connection - end */ - connect(TOut.port_b, port_b) annotation (Line(points={{90,60},{160,60},{160,0}, - {180,0}}, color={0,127,255})); - connect(damOut.port_b, port_b) - annotation (Line(points={{10,0},{180,0}}, color={0,127,255})); - - connect(damOutMin.port_a, dpAirOutMin.port_a) annotation (Line(points={{-10,60}, - {-20,60},{-20,100},{-10,100}}, - color={0,127,255})); - connect(damOutMin.port_b, dpAirOutMin.port_b) annotation (Line(points={{10,60},{ - 20,60},{20,100},{10,100}}, - color={0,127,255})); - connect(damOutMin.port_b, hAirOut.port_a) - annotation (Line(points={{10,60},{30,60}}, color={0,127,255})); - connect(hAirOut.port_b, TOut.port_a) - annotation (Line(points={{50,60},{70,60}}, color={0,127,255})); - connect(port_a, damOut.port_a) - annotation (Line(points={{-180,0},{-10,0}}, color={0,127,255})); - connect(damOut.port_a, damOutMin.port_a) annotation (Line(points={{-10,0},{ - -20,0},{-20,60},{-10,60}}, color={0,127,255})); annotation (Documentation(info="This model represents a configuration with an air economizer and minimum OA control with a separate minimum OA damper and differential pressure control.
-"), Icon(graphics={ - Line( - points={{0,140},{0,0}}, - color={28,108,200}, - thickness=1), - Line( - points={{-180,0},{180,0}}, - color={28,108,200}, - thickness=1), - Line( - points={{-180,60},{0,60}}, - color={28,108,200}, - thickness=1)})); +")); end DedicatedDampersPressure; diff --git a/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/SingleDamper.mo b/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/SingleDamper.mo index 655ae764472..92a34673a7e 100644 --- a/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/SingleDamper.mo +++ b/Buildings/Templates/AirHandlersFans/Components/OutdoorSection/SingleDamper.mo @@ -3,12 +3,11 @@ model SingleDamper "Single damper for ventilation and economizer, with airflow measurement station" extends Buildings.Templates.AirHandlersFans.Components.Interfaces.PartialOutdoorSection( - final typ=Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.SingleDamper, - final typDamOut=damOut.typ, - final typDamOutMin=Buildings.Templates.Components.Types.Damper.None); + final typ=Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.SingleDamper); - Buildings.Templates.Components.Dampers.Modulating damOut( + Buildings.Templates.Components.Actuators.Damper damOut( redeclare final package Medium = MediumAir, + final typ=typDamOut, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, final dat=dat.damOut) diff --git a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/NoReturn.mo b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/NoReturn.mo index 758bf00210f..ba2f1a2a876 100644 --- a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/NoReturn.mo +++ b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/NoReturn.mo @@ -7,8 +7,9 @@ model NoReturn "No return branch" final typFanRel=Buildings.Templates.Components.Types.Fan.None, final typFanRet=fanRet.typ); - Buildings.Templates.Components.Dampers.TwoPosition damRel( + Buildings.Templates.Components.Actuators.Damper damRel( redeclare final package Medium = MediumAir, + final typ=Buildings.Templates.Components.Types.Damper.TwoPosition, final dat=dat.damRel, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, diff --git a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefDamper.mo b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefDamper.mo index d58972dd50d..5b53dc870ac 100644 --- a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefDamper.mo +++ b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefDamper.mo @@ -7,8 +7,9 @@ model ReliefDamper "Modulating relief damper without fan" final typFanRel=Buildings.Templates.Components.Types.Fan.None, final typFanRet=Buildings.Templates.Components.Types.Fan.None); - Buildings.Templates.Components.Dampers.Modulating damRel( + Buildings.Templates.Components.Actuators.Damper damRel( redeclare final package Medium = MediumAir, + final typ=Buildings.Templates.Components.Types.Damper.Modulating, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, final dat=dat.damRel, diff --git a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefFan.mo b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefFan.mo index db8259aa454..c14d4628f5c 100644 --- a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefFan.mo +++ b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReliefFan.mo @@ -7,8 +7,9 @@ model ReliefFan "Relief fan with two-position relief damper" final typFanRel=fanRel.typ, final typFanRet=Buildings.Templates.Components.Types.Fan.None); - Buildings.Templates.Components.Dampers.TwoPosition damRel( + Buildings.Templates.Components.Actuators.Damper damRel( redeclare final package Medium = MediumAir, + final typ=Buildings.Templates.Components.Types.Damper.TwoPosition, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, final dat=dat.damRel, diff --git a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReturnFan.mo b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReturnFan.mo index b5fd39c4616..d1bf7ea7473 100644 --- a/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReturnFan.mo +++ b/Buildings/Templates/AirHandlersFans/Components/ReliefReturnSection/ReturnFan.mo @@ -7,8 +7,9 @@ model ReturnFan "Return fan with modulating relief damper" final typFanRel=Buildings.Templates.Components.Types.Fan.None, final typFanRet=fanRet.typ); - Buildings.Templates.Components.Dampers.Modulating damRel( + Buildings.Templates.Components.Actuators.Damper damRel( redeclare final package Medium = MediumAir, + final typ=Buildings.Templates.Components.Types.Damper.Modulating, final dat=dat.damRel, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, diff --git a/Buildings/Templates/AirHandlersFans/VAVMultiZone.mo b/Buildings/Templates/AirHandlersFans/VAVMultiZone.mo index fe0174232a4..d6f861bfe77 100644 --- a/Buildings/Templates/AirHandlersFans/VAVMultiZone.mo +++ b/Buildings/Templates/AirHandlersFans/VAVMultiZone.mo @@ -218,7 +218,7 @@ model VAVMultiZone "Multiple-zone VAV" inner replaceable Buildings.Templates.Components.Coils.WaterBasedHeating coiHeaPre( redeclare final package MediumHeaWat=MediumHeaWat, - redeclare final Buildings.Templates.Components.Valves.TwoWayModulating val) + final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) constrainedby Buildings.Templates.Components.Interfaces.PartialCoil( final dat=dat.coiHeaPre, redeclare final package MediumAir=MediumAir, @@ -235,7 +235,7 @@ model VAVMultiZone "Multiple-zone VAV" choice( redeclare replaceable Buildings.Templates.Components.Coils.WaterBasedHeating coiHeaPre( redeclare final package MediumHeaWat=MediumHeaWat, - redeclare final Buildings.Templates.Components.Valves.TwoWayModulating val) + final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) "Hot water coil with two-way valve"), choice( redeclare replaceable Buildings.Templates.Components.Coils.ElectricHeating coiHeaPre @@ -246,7 +246,7 @@ model VAVMultiZone "Multiple-zone VAV" inner replaceable Buildings.Templates.Components.Coils.WaterBasedCooling coiCoo( redeclare final package MediumChiWat=MediumChiWat, - redeclare final Buildings.Templates.Components.Valves.TwoWayModulating val) + final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) constrainedby Buildings.Templates.Components.Interfaces.PartialCoil( final dat=dat.coiCoo, redeclare final package MediumAir=MediumAir, @@ -261,7 +261,7 @@ model VAVMultiZone "Multiple-zone VAV" "No coil"), choice(redeclare replaceable Buildings.Templates.Components.Coils.WaterBasedCooling coiCoo( redeclare final package MediumChiWat=MediumChiWat, - redeclare final Buildings.Templates.Components.Valves.TwoWayModulating val) + final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) "Chilled water coil with two-way valve")), Dialog(group="Configuration"), Placement(transformation(extent={{70,-210},{90,-190}}))); diff --git a/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZCoilWaterHeating3WVReheat.mo b/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZCoilWaterHeating3WVReheat.mo index 80bd0c205aa..01bfb75e648 100644 --- a/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZCoilWaterHeating3WVReheat.mo +++ b/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZCoilWaterHeating3WVReheat.mo @@ -1,13 +1,14 @@ within Buildings.Templates.AirHandlersFans.Validation.UserProject.AirHandlersFans; model VAVMZCoilWaterHeating3WVReheat "Configuration of multiple-zone VAV" extends Buildings.Templates.AirHandlersFans.VAVMultiZone( + redeclare replaceable + Buildings.Templates.Components.Coils.WaterBasedHeating coiHeaReh(typVal= + Buildings.Templates.Components.Types.Valve.ThreeWayModulating, + redeclare final package MediumHeaWat = MediumHeaWat) "Hot water coil", + redeclare replaceable Buildings.Templates.Components.Coils.None coiHeaPre + "No coil", redeclare replaceable Buildings.Templates.AirHandlersFans.Components.Controls.OpenLoop ctl "Open loop controller", - redeclare replaceable Buildings.Templates.Components.Coils.None coiHeaPre, - redeclare replaceable - Buildings.Templates.Components.Coils.WaterBasedHeating coiHeaReh( - redeclare final package MediumHeaWat = MediumHeaWat, - redeclare Buildings.Templates.Components.Valves.ThreeWayModulating val), nZon=2); annotation ( defaultComponentName="ahu", Documentation(info=" diff --git a/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Airflow.mo b/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Airflow.mo index 638bfaab6ea..4aaff3e3cc7 100644 --- a/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Airflow.mo +++ b/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Airflow.mo @@ -2,17 +2,6 @@ within Buildings.Templates.AirHandlersFans.Validation.UserProject.AirHandlersFan model VAVMZControlG36Airflow "Configuration of multiple-zone VAV" extends Buildings.Templates.AirHandlersFans.VAVMultiZone( nZon=2, - redeclare replaceable - Buildings.Templates.Components.Coils.WaterBasedHeating coiHeaPre( - redeclare final package MediumHeaWat = MediumHeaWat, - redeclare replaceable - Buildings.Templates.Components.Valves.TwoWayModulating val), - redeclare replaceable - Buildings.Templates.Components.Coils.WaterBasedCooling coiCoo( - redeclare final package MediumChiWat = MediumChiWat, - redeclare replaceable - Buildings.Templates.Components.Valves.TwoWayModulating val) - "Chilled water coil", redeclare replaceable Buildings.Templates.AirHandlersFans.Components.Controls.G36VAVMultiZone ctl( typCtlFanRet=Buildings.Templates.AirHandlersFans.Types.ControlFanReturn.AirflowMeasured, idZon={"Box_1","Box_1"}, diff --git a/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Pressure.mo b/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Pressure.mo index 8adaf035461..e298e6374f3 100644 --- a/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Pressure.mo +++ b/Buildings/Templates/AirHandlersFans/Validation/UserProject/AirHandlersFans/VAVMZControlG36Pressure.mo @@ -2,17 +2,6 @@ within Buildings.Templates.AirHandlersFans.Validation.UserProject.AirHandlersFan model VAVMZControlG36Pressure "Configuration of multiple-zone VAV" extends Buildings.Templates.AirHandlersFans.VAVMultiZone( nZon=2, - redeclare replaceable - Buildings.Templates.Components.Coils.WaterBasedHeating coiHeaPre( - redeclare final package MediumHeaWat = MediumHeaWat, - redeclare replaceable - Buildings.Templates.Components.Valves.TwoWayModulating val), - redeclare replaceable - Buildings.Templates.Components.Coils.WaterBasedCooling coiCoo( - redeclare final package MediumChiWat = MediumChiWat, - redeclare replaceable - Buildings.Templates.Components.Valves.TwoWayModulating val) - "Chilled water coil", redeclare replaceable Buildings.Templates.AirHandlersFans.Components.Controls.G36VAVMultiZone ctl( typCtlFanRet=Buildings.Templates.AirHandlersFans.Types.ControlFanReturn.BuildingPressure, idZon={"Box_1","Box_1"}, diff --git a/Buildings/Templates/Components/Actuators/Damper.mo b/Buildings/Templates/Components/Actuators/Damper.mo new file mode 100644 index 00000000000..307b55d142c --- /dev/null +++ b/Buildings/Templates/Components/Actuators/Damper.mo @@ -0,0 +1,286 @@ +within Buildings.Templates.Components.Actuators; +model Damper "Multiple-configuration damper" + extends Buildings.Fluid.Interfaces.PartialTwoPortInterface( + final m_flow_nominal=dat.m_flow_nominal) + annotation(__ctrlFlow(enable=false)); + + parameter Buildings.Templates.Components.Types.Damper typ + "Equipment type" + annotation (Evaluate=true, Dialog(group="Configuration")); + + parameter Buildings.Templates.Components.Data.Damper dat(final typ=typ) + "Design and operating parameters" + annotation ( + __ctrlFlow(enable=false), + Dialog(enable=typ<>Buildings.Templates.Components.Types.Damper.None), + Placement(transformation(extent={{70,70},{90,90}}))); + + final parameter Modelica.Units.SI.PressureDifference dp_nominal= + dat.dp_nominal + "Damper pressure drop"; + + parameter Boolean use_inputFilter=true + "= true, if opening is filtered with a 2nd order CriticalDamping filter" + annotation(Dialog(tab="Dynamics", group="Filtered opening", + enable=typ<>Buildings.Templates.Components.Types.Damper.None)); + parameter Modelica.Units.SI.Time riseTime=120 + "Rise time of the filter (time to reach 99.6 % of an opening step)" + annotation (Dialog( + tab="Dynamics", + group="Filtered opening", + enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Damper.None)); + parameter Modelica.Blocks.Types.Init init=Modelica.Blocks.Types.Init.InitialOutput + "Type of initialization (no init/steady state/initial state/initial output)" + annotation(Dialog(tab="Dynamics", group="Filtered opening", + enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Damper.None)); + parameter Real y_start=1 "Initial position of actuator" + annotation(Dialog(tab="Dynamics", group="Filtered opening", + enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Damper.None)); + + parameter Buildings.Templates.Components.Types.DamperBlades typBla= + if typ==Buildings.Templates.Components.Types.Damper.TwoPosition then + Buildings.Templates.Components.Types.DamperBlades.Opposed + elseif typ==Buildings.Templates.Components.Types.Damper.PressureIndependent then + Buildings.Templates.Components.Types.DamperBlades.VAV + else Buildings.Templates.Components.Types.DamperBlades.Parallel + "Type of blades" + annotation(Dialog(tab="Graphics", enable=false)); + parameter Integer text_rotation = 0 + "Text rotation angle in icon layer" + annotation(Dialog(tab="Graphics", enable=false)); + parameter Boolean text_flip = false + "True to flip text horizontally in icon layer" + annotation(Dialog(tab="Graphics", enable=false)); + + Buildings.Templates.Components.Interfaces.Bus bus + if typ <> Buildings.Templates.Components.Types.Damper.None + "Control bus" + annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=0, + origin={0,100}), + iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={0,100}))); + + Buildings.Fluid.Actuators.Dampers.Exponential exp( + redeclare final package Medium = Medium, + final m_flow_nominal=m_flow_nominal, + final dpDamper_nominal=dp_nominal, + final dpFixed_nominal=dat.dpFixed_nominal, + final use_inputFilter=use_inputFilter, + final riseTime=riseTime, + final init=init, + final y_start=y_start, + final allowFlowReversal=allowFlowReversal, + final show_T=show_T) + if typ==Buildings.Templates.Components.Types.Damper.Modulating or + typ==Buildings.Templates.Components.Types.Damper.TwoPosition + "Damper with exponential characteristic" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); + Buildings.Fluid.Actuators.Dampers.PressureIndependent ind( + redeclare final package Medium = Medium, + final m_flow_nominal=m_flow_nominal, + final dpDamper_nominal=dp_nominal, + final dpFixed_nominal=dat.dpFixed_nominal, + final use_inputFilter=use_inputFilter, + final riseTime=riseTime, + final init=init, + final y_start=y_start, + final allowFlowReversal=allowFlowReversal, + final show_T=show_T) + if typ==Buildings.Templates.Components.Types.Damper.PressureIndependent + "Pressure independent damper" + annotation (Placement(transformation(extent={{50,-10},{70,10}}))); + Buildings.Templates.Components.Routing.PassThroughFluid non( + redeclare final package Medium = Medium) + if typ==Buildings.Templates.Components.Types.Damper.None + "No damper" + annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); + Buildings.Controls.OBC.CDL.Conversions.BooleanToReal y1(final realTrue=1, + final realFalse=0) + if typ == Buildings.Templates.Components.Types.Damper.TwoPosition + "Two-position signal" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=-90, + origin={-80,40}))); + Modelica.Blocks.Routing.RealPassThrough y if typ == Buildings.Templates.Components.Types.Damper.Modulating + or typ == Buildings.Templates.Components.Types.Damper.PressureIndependent + "Modulating signal" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=-90, + origin={-40,40}))); + Controls.OBC.CDL.Reals.LessThreshold y0_actual(t=0.01, h=0.5E-2) + if typ == Buildings.Templates.Components.Types.Damper.TwoPosition + "Closed end switch status" annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=-90, + origin={40,40}))); + Controls.OBC.CDL.Reals.GreaterThreshold y1_actual(t=0.99, h=0.5E-2) + if typ == Buildings.Templates.Components.Types.Damper.TwoPosition + "Open end switch status" annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=-90, + origin={80,40}))); + Modelica.Blocks.Routing.RealPassThrough y_actual if typ == Buildings.Templates.Components.Types.Damper.Modulating + or typ == Buildings.Templates.Components.Types.Damper.PressureIndependent + "Position feedback" annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=-90, + origin={0,40}))); +equation + /* Control point connection - start */ + connect(y1.y, exp.y); + connect(y.y, exp.y); + connect(y_actual.u, exp.y_actual); + connect(y0_actual.u, exp.y_actual); + connect(y1_actual.u, exp.y_actual); + connect(y1.y, ind.y); + connect(y.y, ind.y); + connect(y_actual.u, ind.y_actual); + connect(y0_actual.u, ind.y_actual); + connect(y1_actual.u, ind.y_actual); + /* Control point connection - stop */ + connect(port_a, non.port_a) + annotation (Line(points={{-100,0},{-80,0}}, color={0,127,255})); + connect(non.port_b, port_b) + annotation (Line(points={{-60,0},{100,0}}, color={0,127,255})); + connect(port_a,exp. port_a) + annotation (Line(points={{-100,0},{-10,0}}, color={0,127,255})); + connect(exp.port_b, port_b) + annotation (Line(points={{10,0},{100,0}}, color={0,127,255})); + connect(port_a, ind.port_a) + annotation (Line(points={{-100,0},{50,0}}, color={0,127,255})); + connect(ind.port_b, port_b) + annotation (Line(points={{70,0},{100,0}}, color={0,127,255})); + connect(bus.y1, y1.u) annotation (Line( + points={{0,100},{0,60},{-80,60},{-80,52}}, + color={255,204,51}, + thickness=0.5)); + connect(bus.y, y.u) annotation (Line( + points={{0,100},{0,60},{-40,60},{-40,52}}, + color={255,204,51}, + thickness=0.5)); + connect(bus.y_actual, y_actual.y) annotation (Line( + points={{0,100},{0,51}}, + color={255,204,51}, + thickness=0.5)); + connect(bus.y0_actual, y0_actual.y) annotation (Line( + points={{0,100},{0,60},{40,60},{40,52}}, + color={255,204,51}, + thickness=0.5)); + connect(bus.y1_actual, y1_actual.y) annotation (Line( + points={{0,100},{0,60},{80,60},{80,52}}, + color={255,204,51}, + thickness=0.5)); + annotation ( + Icon( + graphics={ + Bitmap( + visible=typ==Buildings.Templates.Components.Types.Damper.TwoPosition, + extent=if text_flip then {{40,-240},{-40,-160}} else {{-40,-240},{40,-160}}, + rotation=text_rotation, + fileName="modelica://Buildings/Resources/Images/Templates/Components/Actuators/TwoPosition.svg"), + Bitmap( + visible=typ==Buildings.Templates.Components.Types.Damper.Modulating or + typ==Buildings.Templates.Components.Types.Damper.PressureIndependent, + extent=if text_flip then {{40,-240},{-40,-160}} else {{-40,-240},{40,-160}}, + rotation=text_rotation, + fileName="modelica://Buildings/Resources/Images/Templates/Components/Actuators/Modulating.svg"), + Bitmap( + extent={{-130,-160},{130,100}}, + visible=typ<>Buildings.Templates.Components.Types.Damper.None and + typBla==Buildings.Templates.Components.Types.DamperBlades.Opposed, + fileName="modelica://Buildings/Resources/Images/Templates/Components/Dampers/BladesOpposed.svg"), + Bitmap( + extent={{-130,-160},{130,100}}, + visible=typ<>Buildings.Templates.Components.Types.Damper.None and + typBla==Buildings.Templates.Components.Types.DamperBlades.Parallel, + fileName="modelica://Buildings/Resources/Images/Templates/Components/Dampers/BladesParallel.svg"), + Bitmap( + extent={{-130,-160},{130,100}}, + visible=typ<>Buildings.Templates.Components.Types.Damper.None and + typBla==Buildings.Templates.Components.Types.DamperBlades.VAV, + fileName="modelica://Buildings/Resources/Images/Templates/Components/Dampers/BladesVAV.svg")}, + coordinateSystem(preserveAspectRatio=false, + extent={{-100,-100},{100,100}})), + Diagram( + coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}})), + Documentation(info=" ++This is a container model that can be used to represent a variety of dampers. +The supported damper types are described in the enumeration + +Buildings.Templates.Components.Types.Damper. +
++The following input and output points are available. +
++For modulating dampers: +
+y
(real).y = 0
corresponds to fully closed.
+y = 1
corresponds to fully open.
+y_actual
(real) is returned.y_actual = 0
corresponds to fully closed.
+y_actual = 1
corresponds to fully open.
++For pressure-independent dampers: +
+y
(real).y = 0
corresponds to zero airflow.
+y = 1
corresponds to the maximum airflow.
+y_actual
(real) is returned.y_actual = 0
corresponds to fully closed.
+y_actual = 1
corresponds to fully open.
++For two-position dampers: +
+y1
.y1 = 0
corresponds to fully closed.
+y1 = 1
corresponds to fully open.
+y1_actual
and
+closed end switch status y0_actual
(Booleans)
+are returned.y1_actual = false
corresponds to fully closed.
+y1_actual = true
corresponds to fully open.
+And the opposite for y0_actual
.
++The design operating point is specified with an instance of + +Buildings.Templates.Components.Data.Damper. +
+", revisions=" ++This is a container model that can be used to represent a variety of valves, +with a variety of characteristics. +The supported types of valve are described in the enumeration + +Buildings.Templates.Components.Types.Valve. +The supported flow characteristics are described in the enumeration + +Buildings.Templates.Components.Types.ValveCharacteristicTwoWay +for two-way valves, and in the enumeration + +Buildings.Templates.Components.Types.ValveCharacteristicThreeWay +for three-way valves. +
++The following input and output points are available. +
++For modulating valves: +
+y
(real).y = 0
corresponds to fully closed (fully open bypass for three-way valves).
+y = 1
corresponds to fully open (fully closed bypass for three-way valves).
+y_actual
(real) is returned.y_actual = 0
corresponds to fully closed.
+y_actual = 1
corresponds to fully open.
++For two-position valves: +
+y1
.y1 = false
corresponds to fully closed (fully open bypass for three-way valves).
+y1 = true
corresponds to fully open (fully closed bypass for three-way valves).
+y1_actual
and
+closed end switch status y0_actual
(Booleans)
+are returned.y1_actual = false
corresponds to fully closed.
+y1_actual = true
corresponds to fully open.
+And the opposite for y0_actual
.
++The design operating point is specified with an instance of + +Buildings.Templates.Components.Data.Valve. +
++The default characteristic is equal percentage (resp. equal percentage +and linear) for modulating two-way valves (resp. modulating three-way valves). +The default characteristic is linear for two-position actuators. +
+
+For three-way valves, the default setting for the ratio of
+the Kvs coefficient between the bypass branch and the
+direct branch is fraK=1.0
, see
+
+Buildings.Fluid.HydronicConfigurations.UsersGuide.ControlValves
+for the rationale.
+
+This package contains models for dampers and valves. +
+")); +end Actuators; diff --git a/Buildings/Templates/Components/Actuators/package.order b/Buildings/Templates/Components/Actuators/package.order new file mode 100644 index 00000000000..7409ab0bdd4 --- /dev/null +++ b/Buildings/Templates/Components/Actuators/package.order @@ -0,0 +1,2 @@ +Damper +Valve diff --git a/Buildings/Templates/Components/Coils/WaterBasedCooling.mo b/Buildings/Templates/Components/Coils/WaterBasedCooling.mo index 1fabe144ee6..756797dc6f5 100644 --- a/Buildings/Templates/Components/Coils/WaterBasedCooling.mo +++ b/Buildings/Templates/Components/Coils/WaterBasedCooling.mo @@ -2,7 +2,7 @@ within Buildings.Templates.Components.Coils; model WaterBasedCooling "Chilled water coil" extends Buildings.Templates.Components.Interfaces.PartialCoil( final typ=Buildings.Templates.Components.Types.Coil.WaterBasedCooling, - final typVal=val.typ, + typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating, redeclare final package MediumSou = MediumChiWat); replaceable package MediumChiWat=Buildings.Media.Water @@ -18,21 +18,16 @@ model WaterBasedCooling "Chilled water coil" dat.dpValve_nominal "Nominal pressure drop across fully open valve"; - replaceable Buildings.Templates.Components.Valves.TwoWayModulating val constrainedby - Buildings.Templates.Components.Interfaces.PartialValve( - redeclare final package Medium = MediumChiWat, - final energyDynamics=energyDynamics, - use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, - final allowFlowReversal=allowFlowReversalLiq, - final show_T=show_T, - final dat=datVal) + Buildings.Templates.Components.Actuators.Valve val( + redeclare final package Medium = MediumChiWat, + final typ=typVal, + final energyDynamics=energyDynamics, + use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, + final allowFlowReversal=allowFlowReversalLiq, + final show_T=show_T, + final dat=datVal) "Valve" annotation ( - choices( - choice(redeclare replaceable Buildings.Templates.Components.Valves.ThreeWayModulating val - "Three-way modulating valve"), - choice(redeclare replaceable Buildings.Templates.Components.Valves.TwoWayModulating val - "Two-way modulating valve")), Placement(transformation(extent={{-10,10},{10,-10}}, rotation=-90, origin={-40,-60}))); diff --git a/Buildings/Templates/Components/Coils/WaterBasedHeating.mo b/Buildings/Templates/Components/Coils/WaterBasedHeating.mo index 3c9402eff27..ac51d53ee97 100644 --- a/Buildings/Templates/Components/Coils/WaterBasedHeating.mo +++ b/Buildings/Templates/Components/Coils/WaterBasedHeating.mo @@ -2,7 +2,7 @@ within Buildings.Templates.Components.Coils; model WaterBasedHeating "Hot water coil" extends Buildings.Templates.Components.Interfaces.PartialCoil( final typ=Buildings.Templates.Components.Types.Coil.WaterBasedHeating, - final typVal=val.typ, + typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating, redeclare final package MediumSou = MediumHeaWat); replaceable package MediumHeaWat=Buildings.Media.Water @@ -18,24 +18,17 @@ model WaterBasedHeating "Hot water coil" dat.dpValve_nominal "Nominal pressure drop across fully open valve"; - replaceable Buildings.Templates.Components.Valves.TwoWayModulating val constrainedby - Buildings.Templates.Components.Interfaces.PartialValve( - redeclare final package Medium = MediumHeaWat, - final energyDynamics=energyDynamics, - use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, - final allowFlowReversal=allowFlowReversalLiq, - final show_T=show_T, - final dat=datVal) + Buildings.Templates.Components.Actuators.Valve val( + final typ=typVal, + redeclare final package Medium = MediumHeaWat, + final energyDynamics=energyDynamics, + use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, + final allowFlowReversal=allowFlowReversalLiq, + final show_T=show_T, + final dat=datVal) "Valve" - annotation ( - choices( - choice(redeclare replaceable Buildings.Templates.Components.Valves.ThreeWayModulating val - "Three-way modulating valve"), - choice(redeclare replaceable Buildings.Templates.Components.Valves.TwoWayModulating val - "Two-way modulating valve")), - Placement(transformation(extent={{-10,10},{10,-10}}, - rotation=-90, - origin={-40,-60}))); + annotation (Placement( + transformation(extent={{-10,10},{10,-10}},rotation=-90,origin={-40,-60}))); replaceable Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hex( configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow, diff --git a/Buildings/Templates/Components/Dampers/Modulating.mo b/Buildings/Templates/Components/Dampers/Modulating.mo deleted file mode 100644 index fcd9854cd17..00000000000 --- a/Buildings/Templates/Components/Dampers/Modulating.mo +++ /dev/null @@ -1,53 +0,0 @@ -within Buildings.Templates.Components.Dampers; -model Modulating "Modulating damper" - extends Buildings.Templates.Components.Interfaces.PartialDamper( - final typ=Buildings.Templates.Components.Types.Damper.Modulating, - typBla=Buildings.Templates.Components.Types.DamperBlades.Parallel); - - Buildings.Fluid.Actuators.Dampers.Exponential dam( - redeclare final package Medium = Medium, - final m_flow_nominal=m_flow_nominal, - final dpDamper_nominal=dp_nominal, - final dpFixed_nominal=dat.dpFixed_nominal, - final use_inputFilter=use_inputFilter, - final riseTime=riseTime, - final init=init, - final y_start=y_start, - final allowFlowReversal=allowFlowReversal, - final show_T=show_T) - "Exponential damper" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); -equation - connect(port_a, dam.port_a) annotation (Line(points={{-100,0},{-56,0},{-56,0}, - {-10,0}}, color={0,127,255})); - connect(dam.port_b, port_b) - annotation (Line(points={{10,0},{100,0}}, color={0,127,255})); - connect(dam.y_actual, bus.y_actual) annotation (Line(points={{5,7},{40,7},{40, - 96},{0,96},{0,100}}, color={0,0,127})); - connect(bus.y, dam.y) annotation (Line( - points={{0,100},{0,12}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-3,6},{-3,6}}, - horizontalAlignment=TextAlignment.Right)); - annotation (Documentation(info=" --This is a model for a modulating damper. -
-y
(real).y = 0
corresponds to fully closed.
-y = 1
corresponds to fully open.
-y_actual
(real) is returned.y_actual = 0
corresponds to fully closed.
-y_actual = 1
corresponds to fully open.
--This is a direct fluid pass-through model to represent -a configuration with no damper. -
-")); -end None; diff --git a/Buildings/Templates/Components/Dampers/PressureIndependent.mo b/Buildings/Templates/Components/Dampers/PressureIndependent.mo deleted file mode 100644 index e41684b515a..00000000000 --- a/Buildings/Templates/Components/Dampers/PressureIndependent.mo +++ /dev/null @@ -1,54 +0,0 @@ -within Buildings.Templates.Components.Dampers; -model PressureIndependent "Pressure independent damper" - extends Buildings.Templates.Components.Interfaces.PartialDamper( - final typ=Buildings.Templates.Components.Types.Damper.PressureIndependent, - final typBla=Buildings.Templates.Components.Types.DamperBlades.VAV); - - Buildings.Fluid.Actuators.Dampers.PressureIndependent dam( - redeclare final package Medium = Medium, - final m_flow_nominal=m_flow_nominal, - final dpDamper_nominal=dp_nominal, - final dpFixed_nominal=dat.dpFixed_nominal, - final use_inputFilter=use_inputFilter, - final riseTime=riseTime, - final init=init, - final y_start=y_start, - final allowFlowReversal=allowFlowReversal, - final show_T=show_T) - "Pressure independent damper" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); -equation - connect(dam.port_b, port_b) - annotation (Line(points={{10,0},{100,0}}, color={0,127,255})); - connect(dam.y_actual, bus.y_actual) - annotation (Line(points={{5,7},{40,7},{40,96},{0,96},{0,100}}, - color={0,0,127})); - connect(port_a, dam.port_a) - annotation (Line(points={{-100,0},{-10,0}}, color={0,127,255})); - connect(bus.y, dam.y) annotation (Line( - points={{0,100},{0,12}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-3,6},{-3,6}}, - horizontalAlignment=TextAlignment.Right)); - annotation (Documentation(info=" --This is a model for a pressure independent damper. -
-y
(real).y = 0
corresponds to zero airflow.
-y = 1
corresponds to the maximum airflow.
-y_actual
(real) is returned.y_actual = 0
corresponds to fully closed.
-y_actual = 1
corresponds to fully open.
--This is a model for a two-position damper. -
-y1
.y1 = 0
corresponds to fully closed.
-y1 = 1
corresponds to fully open.
-y1_actual
and
-closed end switch status y0_actual
(Booleans)
-are returned.y1_actual = false
corresponds to fully closed.
-y1_actual = true
corresponds to fully open.
-And the opposite for y0_actual
.
--This package contains models for dampers. -
-")); -end Dampers; diff --git a/Buildings/Templates/Components/Dampers/package.order b/Buildings/Templates/Components/Dampers/package.order deleted file mode 100644 index 8548dedfa36..00000000000 --- a/Buildings/Templates/Components/Dampers/package.order +++ /dev/null @@ -1,4 +0,0 @@ -Modulating -None -PressureIndependent -TwoPosition diff --git a/Buildings/Templates/Components/Data/Coil.mo b/Buildings/Templates/Components/Data/Coil.mo index 805ef2eda79..bfb0e77d730 100644 --- a/Buildings/Templates/Components/Data/Coil.mo +++ b/Buildings/Templates/Components/Data/Coil.mo @@ -125,7 +125,7 @@ the maximum value from the performance data record. typ==Buildings.Templates.Components.Types.Coil.EvaporatorVariableSpeed)); annotation (Documentation(info="-This record provides the set of sizing and operating parameters for +This record provides the set of sizing parameters for the classes within Buildings.Templates.Components.Coils. diff --git a/Buildings/Templates/Components/Data/Damper.mo b/Buildings/Templates/Components/Data/Damper.mo index 6f89ad08e79..5e20cd44588 100644 --- a/Buildings/Templates/Components/Data/Damper.mo +++ b/Buildings/Templates/Components/Data/Damper.mo @@ -31,10 +31,10 @@ record Damper "Record for damper model" Dialog(group="Mechanical", enable=false)); annotation (Documentation(info="
-This record provides the set of sizing and operating parameters for -the classes within - -Buildings.Templates.Components.Dampers. +This record provides the set of sizing parameters for +the class + +Buildings.Templates.Components.Actuators.Damper.
")); end Damper; diff --git a/Buildings/Templates/Components/Data/Fan.mo b/Buildings/Templates/Components/Data/Fan.mo index 0222046de79..7b3fc69e65e 100644 --- a/Buildings/Templates/Components/Data/Fan.mo +++ b/Buildings/Templates/Components/Data/Fan.mo @@ -39,7 +39,7 @@ record Fan "Record for fan model" Placement(transformation(extent={{-90,-88},{-70,-68}}))); annotation (Documentation(info="-This record provides the set of sizing and operating parameters for +This record provides the set of sizing parameters for the classes within Buildings.Templates.Components.Fans. diff --git a/Buildings/Templates/Components/Data/Valve.mo b/Buildings/Templates/Components/Data/Valve.mo index 24c7c4ae01a..30344da1004 100644 --- a/Buildings/Templates/Components/Data/Valve.mo +++ b/Buildings/Templates/Components/Data/Valve.mo @@ -35,10 +35,10 @@ record Valve "Record for valve model" annotation (Documentation(info="
-This record provides the set of sizing and operating parameters for -the classes within - -Buildings.Templates.Components.Valves. +This record provides the set of sizing parameters for +the class + +Buildings.Templates.Components.Actuators.Valve.
")); end Valve; diff --git a/Buildings/Templates/Components/Interfaces/PartialCoil.mo b/Buildings/Templates/Components/Interfaces/PartialCoil.mo index 973757dd00c..76207e86a1f 100644 --- a/Buildings/Templates/Components/Interfaces/PartialCoil.mo +++ b/Buildings/Templates/Components/Interfaces/PartialCoil.mo @@ -24,7 +24,12 @@ partial model PartialCoil "Interface class for coil" annotation (Evaluate=true, Dialog(group="Configuration")); parameter Buildings.Templates.Components.Types.Valve typVal "Type of valve" - annotation (Dialog(group="Configuration")); + annotation (Evaluate=true, Dialog(group="Configuration"), + choices( + choice=Buildings.Templates.Components.Types.Valve.ThreeWayModulating + "Three-way modulating valve", + choice=Buildings.Templates.Components.Types.Valve.TwoWayModulating + "Two-way modulating valve")); final parameter Boolean have_sou= typ==Buildings.Templates.Components.Types.Coil.WaterBasedHeating or typ==Buildings.Templates.Components.Types.Coil.WaterBasedCooling diff --git a/Buildings/Templates/Components/Interfaces/PartialDamper.mo b/Buildings/Templates/Components/Interfaces/PartialDamper.mo deleted file mode 100644 index 0e642ddf567..00000000000 --- a/Buildings/Templates/Components/Interfaces/PartialDamper.mo +++ /dev/null @@ -1,102 +0,0 @@ -within Buildings.Templates.Components.Interfaces; -partial model PartialDamper "Interface class for damper" - extends Buildings.Fluid.Interfaces.PartialTwoPortInterface( - final m_flow_nominal=dat.m_flow_nominal) - annotation(__ctrlFlow(enable=false)); - - parameter Buildings.Templates.Components.Types.Damper typ - "Equipment type" - annotation (Evaluate=true, Dialog(group="Configuration")); - - parameter Buildings.Templates.Components.Data.Damper dat(final typ=typ) - "Design and operating parameters" - annotation (Placement(transformation(extent={{70,70},{90,90}}))); - - final parameter Modelica.Units.SI.PressureDifference dp_nominal= - dat.dp_nominal - "Damper pressure drop"; - - parameter Boolean use_inputFilter=true - "= true, if opening is filtered with a 2nd order CriticalDamping filter" - annotation(Dialog(tab="Dynamics", group="Filtered opening", - enabel=typ<>Buildings.Templates.Components.Types.Damper.None)); - parameter Modelica.Units.SI.Time riseTime=120 - "Rise time of the filter (time to reach 99.6 % of an opening step)" - annotation (Dialog( - tab="Dynamics", - group="Filtered opening", - enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Damper.None)); - parameter Modelica.Blocks.Types.Init init=Modelica.Blocks.Types.Init.InitialOutput - "Type of initialization (no init/steady state/initial state/initial output)" - annotation(Dialog(tab="Dynamics", group="Filtered opening", - enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Damper.None)); - parameter Real y_start=1 "Initial position of actuator" - annotation(Dialog(tab="Dynamics", group="Filtered opening", - enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Damper.None)); - - parameter Buildings.Templates.Components.Types.DamperBlades typBla= - Buildings.Templates.Components.Types.DamperBlades.Parallel - "Type of blades" - annotation(Dialog(tab="Graphics", enable=false)); - parameter Integer text_rotation = 0 - "Text rotation angle in icon layer" - annotation(Dialog(tab="Graphics", enable=false)); - parameter Boolean text_flip = false - "True to flip text horizontally in icon layer" - annotation(Dialog(tab="Graphics", enable=false)); - - Buildings.Templates.Components.Interfaces.Bus bus - if typ <> Buildings.Templates.Components.Types.Damper.None - and typ <> Buildings.Templates.Components.Types.Damper.Barometric and typ - <> Buildings.Templates.Components.Types.Damper.NoPath - "Control bus" - annotation (Placement( - transformation( - extent={{-20,-20},{20,20}}, - rotation=0, - origin={0,100}), - iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=0, - origin={0,100}))); - - annotation ( - Icon( - graphics={ - Bitmap( - visible=typ==Buildings.Templates.Components.Types.Damper.TwoPosition, - extent=if text_flip then {{40,-240},{-40,-160}} else {{-40,-240},{40,-160}}, - rotation=text_rotation, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Actuators/TwoPosition.svg"), - Bitmap( - visible=typ==Buildings.Templates.Components.Types.Damper.Modulating or - typ==Buildings.Templates.Components.Types.Damper.PressureIndependent, - extent=if text_flip then {{40,-240},{-40,-160}} else {{-40,-240},{40,-160}}, - rotation=text_rotation, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Actuators/Modulating.svg"), - Bitmap( - extent={{-130,-160},{130,100}}, - visible=typ<>Buildings.Templates.Components.Types.Damper.None and - typBla==Buildings.Templates.Components.Types.DamperBlades.Opposed, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Dampers/BladesOpposed.svg"), - Bitmap( - extent={{-130,-160},{130,100}}, - visible=typ<>Buildings.Templates.Components.Types.Damper.None and - typBla==Buildings.Templates.Components.Types.DamperBlades.Parallel, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Dampers/BladesParallel.svg"), - Bitmap( - extent={{-130,-160},{130,100}}, - visible=typ<>Buildings.Templates.Components.Types.Damper.None and - typBla==Buildings.Templates.Components.Types.DamperBlades.VAV, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Dampers/BladesVAV.svg")}, - coordinateSystem(preserveAspectRatio=false, - extent={{-100,-100},{100,100}})), - Diagram( - coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}})), - Documentation(info=" --This partial class provides a standard interface for damper models. -
-")); - -end PartialDamper; diff --git a/Buildings/Templates/Components/Interfaces/PartialValve.mo b/Buildings/Templates/Components/Interfaces/PartialValve.mo deleted file mode 100644 index 689bfe40ad1..00000000000 --- a/Buildings/Templates/Components/Interfaces/PartialValve.mo +++ /dev/null @@ -1,138 +0,0 @@ -within Buildings.Templates.Components.Interfaces; -partial model PartialValve "Interface class for valve" - extends Buildings.Fluid.Interfaces.PartialTwoPortInterface( - final m_flow_nominal=dat.m_flow_nominal) - annotation(__ctrlFlow(enable=false)); - - parameter Buildings.Templates.Components.Types.Valve typ - "Equipment type" - annotation (Evaluate=true, Dialog(group="Configuration")); - - parameter Buildings.Templates.Components.Data.Valve dat(final typ=typ) - "Design and operating parameters" - annotation (Placement(transformation(extent={{70,70},{90,90}})), - __ctrlFlow(enable=false)); - - final parameter Modelica.Units.SI.PressureDifference dpValve_nominal= - dat.dpValve_nominal - "Nominal pressure drop of fully open valve"; - final parameter Modelica.Units.SI.PressureDifference dpFixed_nominal= - dat.dpFixed_nominal - "Nominal pressure drop of pipes and other equipment in flow leg"; - final parameter Modelica.Units.SI.PressureDifference dpFixedByp_nominal= - dat.dpFixedByp_nominal - "Nominal pressure drop in the bypass line"; - - parameter Boolean use_inputFilter=true - "= true, if opening is filtered with a 2nd order CriticalDamping filter" - annotation(__ctrlFlow(enable=false), - Dialog(tab="Dynamics", group="Filtered opening", - enable=typ<>Buildings.Templates.Components.Types.Valve.None)); - parameter Modelica.Units.SI.Time riseTime=120 - "Rise time of the filter (time to reach 99.6 % of an opening step)" - annotation (__ctrlFlow(enable=false), - Dialog( - tab="Dynamics", - group="Filtered opening", - enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Valve.None)); - parameter Modelica.Blocks.Types.Init init=Modelica.Blocks.Types.Init.InitialOutput - "Type of initialization (no init/steady state/initial state/initial output)" - annotation(__ctrlFlow(enable=false), - Dialog(tab="Dynamics", group="Filtered opening", - enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Valve.None)); - parameter Real y_start=1 "Initial position of actuator" - annotation(__ctrlFlow(enable=false), - Dialog(tab="Dynamics", group="Filtered opening", - enable=use_inputFilter and typ<>Buildings.Templates.Components.Types.Valve.None)); - - parameter Modelica.Units.SI.Time tau=10 - "Time constant at nominal flow" - annotation (Dialog(tab="Dynamics", group="Nominal condition", - enable=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState and ( - typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating or - typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition)), - __ctrlFlow(enable=false)); - parameter Modelica.Fluid.Types.Dynamics energyDynamics= - Modelica.Fluid.Types.Dynamics.DynamicFreeInitial - "Type of energy balance: dynamic (3 initialization options) or steady state" - annotation(Evaluate=true, Dialog(tab = "Dynamics", group="Conservation equations", - enable=typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating or - typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition), - __ctrlFlow(enable=false)); - - parameter Integer text_rotation = 0 - "Text rotation angle in icon layer" - annotation(Dialog(tab="Graphics", enable=false)); - parameter Boolean text_flip = false - "True to flip text horizontally in icon layer" - annotation(Dialog(tab="Graphics", enable=false)); - - Modelica.Fluid.Interfaces.FluidPort_a portByp_a( - redeclare final package Medium = Medium, - p(start=Medium.p_default), - m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), - h_outflow(start=Medium.h_default, nominal=Medium.h_default)) - if typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition or - typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating - "Fluid connector with bypass line" - annotation (Placement(transformation(extent={{-10,-110},{10,-90}}))); - Buildings.Templates.Components.Interfaces.Bus bus - if typ<>Buildings.Templates.Components.Types.Valve.None - "Control bus" - annotation (Placement( - transformation( - extent={{-20,-20},{20,20}}, - rotation=0, - origin={0,100}), iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=0, - origin={0,100}))); - annotation ( - Icon(graphics={ - Line( - points={{-100,0},{-40,0}}, - color={0,0,0}, - thickness=5), - Line( - points={{40,0},{100,0}}, - color={0,0,0}, - thickness=5), - Line( - visible=typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition or - typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating, - points={{0,-100},{0,-40}}, - color={0,0,0}, - thickness=5), - Bitmap( - visible=typ==Buildings.Templates.Components.Types.Valve.TwoWayModulating or - typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating, - extent=if text_flip then {{40,60},{-40,140}} else {{-40,60},{40,140}}, - rotation=text_rotation, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Actuators/Modulating.svg"), - Bitmap( - visible=typ==Buildings.Templates.Components.Types.Valve.TwoWayTwoPosition or - typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition, - extent=if text_flip then {{40,60},{-40,140}} else {{-40,60},{40,140}}, - rotation=text_rotation, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Actuators/TwoPosition.svg"), - Bitmap( - visible=typ==Buildings.Templates.Components.Types.Valve.TwoWayTwoPosition or - typ==Buildings.Templates.Components.Types.Valve.TwoWayModulating, - extent={{-100,-100},{100,100}}, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Valves/TwoWay.svg", - rotation=-90), - Bitmap( - visible=typ==Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition or - typ==Buildings.Templates.Components.Types.Valve.ThreeWayModulating, - extent={{-100,-100},{100,100}}, - fileName="modelica://Buildings/Resources/Images/Templates/Components/Valves/ThreeWay.svg", - rotation=-90), - Line( - visible=typ<>Buildings.Templates.Components.Types.Valve.None, - points={{0,60},{0,0}}, color={0,0,0})}), - Documentation(info=" --This partial class provides a standard interface for valve models. -
-")); -end PartialValve; diff --git a/Buildings/Templates/Components/Interfaces/package.order b/Buildings/Templates/Components/Interfaces/package.order index 9c481d0f47a..7fc811573cd 100644 --- a/Buildings/Templates/Components/Interfaces/package.order +++ b/Buildings/Templates/Components/Interfaces/package.order @@ -1,6 +1,4 @@ Bus PartialCoil -PartialDamper PartialFan PartialSensor -PartialValve diff --git a/Buildings/Templates/Components/Types.mo b/Buildings/Templates/Components/Types.mo index a864929df7a..abcc68c0f20 100644 --- a/Buildings/Templates/Components/Types.mo +++ b/Buildings/Templates/Components/Types.mo @@ -32,10 +32,6 @@ package Types "Package with type definitions" "Dry cooler") "Enumeration to configure the condenser water cooling equipment"; type Damper = enumeration( - NoPath - "No fluid path", - Barometric - "Barometric damper", Modulating "Modulating damper", None @@ -115,10 +111,6 @@ package Types "Package with type definitions" type Valve = enumeration( None "No valve", - PumpedCoilThreeWay - "Pumped coil with three-way valve", - PumpedCoilTwoWay - "Pumped coil with two-way valve", ThreeWayModulating "Three-way modulating valve", ThreeWayTwoPosition @@ -128,6 +120,58 @@ package Types "Package with type definitions" TwoWayTwoPosition "Two-way two-position valve") "Enumeration to configure the valve"; + type ValveCharacteristicTwoWay = enumeration( + EqualPercentage + "Equal percentage", + Linear + "Linear", + PressureIndependent + "Pressure independent (mass flow rate only dependent of input signal)", + Table + "Table-specified") + "Enumeration to specify the characteristic of two-way valves" + annotation ( + Documentation(info=" ++Enumeration that defines the characteristic of two-way valves. +
+Enumeration | +Description |
---|---|
EqualPercentage | +Equal percentage |
Linear | +Linear |
PressureIndependent | +Pressure independent (mass flow rate only dependent of input signal) |
Table | +Table-specified |
+Enumeration that defines the characteristic of three-way valves. +
+Enumeration | +Description |
---|---|
EqualPercentageLinear | +Equal percentage (direct) and linear (bypass) |
Linear | +Linear (both direct and bypass) |
Table | +Table-specified (both direct and bypass) |
This package contains type definitions. diff --git a/Buildings/Templates/Components/Validation/Coils.mo b/Buildings/Templates/Components/Validation/Coils.mo index 02dcb409345..8459e3f48e1 100644 --- a/Buildings/Templates/Components/Validation/Coils.mo +++ b/Buildings/Templates/Components/Validation/Coils.mo @@ -50,14 +50,13 @@ model Coils "Validation model for coil components" TAirEnt_nominal=308.15, wAirEnt_nominal=0.017), final energyDynamics=energyDynamics, - redeclare replaceable - Buildings.Templates.Components.Valves.TwoWayModulating val(y_start=0) - "Two-way modulating valve") "Water-based cooling coil" + val(y_start=0)) "Water-based cooling coil" annotation (Placement(transformation(extent={{10,110},{30,130}}))); Interfaces.Bus bus "Control bus" - annotation (Placement(transformation(extent={{-20,120},{20, - 160}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,120},{20,160}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Controls.OBC.CDL.Reals.Sources.Ramp y(height=1, duration=10) "Coil/valve control signal" annotation (Placement(transformation(extent={{-90,150},{-70,170}}))); @@ -75,13 +74,13 @@ model Coils "Validation model for coil components" TWatEnt_nominal=323.15, TAirEnt_nominal=263.15), final energyDynamics=energyDynamics, - redeclare replaceable - Buildings.Templates.Components.Valves.TwoWayModulating val(y_start=0) - "Two-way modulating valve") "Water-based heating" + val(y_start=0)) "Water-based heating" annotation (Placement(transformation(extent={{10,30},{30,50}}))); Interfaces.Bus bus1 "Control bus" - annotation (Placement(transformation(extent={{-20,40},{20,80}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,40},{20,80}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Fluid.Sources.Boundary_pT bouAirEntHea( redeclare final package Medium = MediumAir, p=bouAirLvg.p + coiHea.dat.dpAir_nominal, @@ -104,19 +103,25 @@ model Coils "Validation model for coil components" final energyDynamics=energyDynamics) "Electric heating" annotation (Placement(transformation(extent={{10,-50},{30,-30}}))); Interfaces.Bus bus2 "Control bus" - annotation (Placement(transformation(extent={{-20,-40},{20,0}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,-40},{20,0}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Buildings.Templates.Components.Coils.EvaporatorVariableSpeed coiEva( redeclare final package MediumAir = MediumAir, dat(dpAir_nominal=200), final energyDynamics=energyDynamics) "Variable speed evaporator coil" annotation (Placement(transformation(extent={{10,-110},{30,-90}}))); - BoundaryConditions.WeatherData.Bus - weaBus "Weather data bus" annotation (Placement(transformation(extent={{-50, - -110},{-10,-70}}), iconTransformation(extent={{190,-10},{210,10}}))); + BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement( + iconVisible=false, + transformation(extent={{-50,-110},{-10,-70}}), + iconTransformation(extent={{190,-10},{210,10}}))); Interfaces.Bus bus3 "Control bus" - annotation (Placement(transformation(extent={{-20,-100},{20,-60}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,-100},{20,-60}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Controls.OBC.CDL.Reals.Sources.Constant TOut(k=coiEva.dat.datCoi.sta[1].nomVal.TConIn_nominal) "Outdoor temperature" annotation (Placement(transformation(extent={{-130,-110},{-110,-90}}))); @@ -161,8 +166,10 @@ model Coils "Validation model for coil components" period=200) "Coil/valve control signal" annotation (Placement(transformation(extent={{-80,-190},{-60,-170}}))); Interfaces.Bus bus4 "Control bus" - annotation (Placement(transformation(extent={{-20,-160},{20,-120}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,-160},{20,-120}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Fluid.FixedResistances.PressureDrop res( redeclare final package Medium = MediumAir, final m_flow_nominal=coiCoo.dat.mAir_flow_nominal, diff --git a/Buildings/Templates/Components/Validation/Dampers.mo b/Buildings/Templates/Components/Validation/Dampers.mo index 35c50bce851..b2c3c4cff86 100644 --- a/Buildings/Templates/Components/Validation/Dampers.mo +++ b/Buildings/Templates/Components/Validation/Dampers.mo @@ -12,24 +12,30 @@ model Dampers "Validation model for damper components" nPorts=4) "Boundary conditions for entering air" annotation (Placement(transformation(extent={{-90,50},{-70,70}}))); Fluid.Sources.Boundary_pT bouAirLvg( - redeclare final package Medium =MediumAir, nPorts=4) "Boundary conditions for leaving air" + redeclare final package Medium =MediumAir, nPorts=4) + "Boundary conditions for leaving air" annotation (Placement(transformation(extent={{110,50},{90,70}}))); - Buildings.Templates.Components.Dampers.Modulating mod( + Buildings.Templates.Components.Actuators.Damper mod( + final typ=Buildings.Templates.Components.Types.Damper.Modulating, y_start=0, redeclare final package Medium = MediumAir, dat(m_flow_nominal=1, - dp_nominal=50)) "Modulating damper" + dp_nominal=50)) + "Modulating damper" annotation (Placement(transformation(extent={{10,50},{30,70}}))); Interfaces.Bus bus "Control bus" - annotation (Placement(transformation(extent={{-20,60},{20,100}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,60},{20,100}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Controls.OBC.CDL.Reals.Sources.Ramp y(height=1, duration=10) "Damper control signal" annotation (Placement(transformation(extent={{-90,90},{-70,110}}))); - Buildings.Templates.Components.Dampers.PressureIndependent pre( + Buildings.Templates.Components.Actuators.Damper pre( + final typ=Buildings.Templates.Components.Types.Damper.PressureIndependent, y_start=0, redeclare final package Medium = MediumAir, dat(m_flow_nominal=1, dp_nominal=50)) @@ -37,29 +43,36 @@ model Dampers "Validation model for damper components" annotation (Placement(transformation(extent={{10,-10},{30,10}}))); Interfaces.Bus bus1 "Control bus" - annotation (Placement(transformation(extent={{-20,0},{20,40}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); - Buildings.Templates.Components.Dampers.TwoPosition two( + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,0},{20,40}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); + Buildings.Templates.Components.Actuators.Damper two( + final typ=Buildings.Templates.Components.Types.Damper.TwoPosition, y_start=0, redeclare final package Medium = MediumAir, dat(m_flow_nominal=1, dp_nominal=50)) "Two-position damper" annotation (Placement(transformation(extent={{10,-70},{30,-50}}))); Interfaces.Bus bus2 "Control bus" - annotation (Placement(transformation(extent={{-20,-60},{20,-20}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,-60},{20,-20}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Controls.OBC.CDL.Logical.Sources.TimeTable y1( table=[0,0; 1,1], timeScale=10, period=200) "Damper control signal" annotation (Placement(transformation(extent={{-90,-30},{-70,-10}}))); - Buildings.Templates.Components.Dampers.None non( - redeclare final package Medium = MediumAir) "No damper" + Buildings.Templates.Components.Actuators.Damper non( + final typ=Buildings.Templates.Components.Types.Damper.None, + redeclare final package Medium = MediumAir) + "No damper" annotation (Placement(transformation(extent={{10,-110},{30,-90}}))); Fluid.FixedResistances.PressureDrop res( redeclare final package Medium = MediumAir, - final m_flow_nominal=mod.dat.m_flow_nominal, - final dp_nominal=mod.dat.dp_nominal) "Flow resistance" + final m_flow_nominal=mod.m_flow_nominal, + final dp_nominal=mod.dp_nominal) "Flow resistance" annotation (Placement(transformation(extent={{-30,-110},{-10,-90}}))); equation connect(bouAirEnt.ports[1], mod.port_a) @@ -108,11 +121,11 @@ annotation ( experiment(Tolerance=1e-6, StopTime=200), Diagram(coordinateSystem(extent={{-140,-140},{140,140}})), Documentation(info=" -
-This model validates the models within - -Buildings.Templates.Components.Dampers -by exposing them to a fixed pressure difference +
+This model validates the various configurations of the model + +Buildings.Templates.Components.Actuators.Damper +by exposing this model to a fixed pressure difference and a control signal varying from 0 to 1.
")); diff --git a/Buildings/Templates/Components/Validation/Fans.mo b/Buildings/Templates/Components/Validation/Fans.mo index 9ffbbe33d96..2a802eaaad1 100644 --- a/Buildings/Templates/Components/Validation/Fans.mo +++ b/Buildings/Templates/Components/Validation/Fans.mo @@ -33,8 +33,10 @@ model Fans "Validation model for fans components" "Fan control signal" annotation (Placement(transformation(extent={{-80,110},{-60,130}}))); Interfaces.Bus bus "Control bus" - annotation (Placement(transformation(extent={{-40,100},{0,140}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-40,100},{0,140}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Controls.OBC.CDL.Logical.Sources.TimeTable y1( table=[0,0; 1,1], timeScale=10, @@ -47,8 +49,10 @@ model Fans "Validation model for fans components" dat(m_flow_nominal=1, dp_nominal=1000)) "Variable speed fan" annotation (Placement(transformation(extent={{-10,-90},{10,-70}}))); Interfaces.Bus bus1 "Control bus" - annotation (Placement(transformation(extent={{-40,0},{0,40}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-40,0},{0,40}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Buildings.Templates.Components.Fans.SingleConstant cst( redeclare final package Medium=MediumAir, have_senFlo=true, @@ -68,8 +72,11 @@ model Fans "Validation model for fans components" "Ducts and coils equivalent flow resistance" annotation (Placement(transformation(extent={{40,-90},{60,-70}}))); Interfaces.Bus bus2 - "Control bus" annotation (Placement(transformation(extent={{-40,-80},{0,-40}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + "Control bus" + annotation (Placement( + iconVisible=false, + transformation(extent={{-40,-80},{0,-40}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Buildings.Templates.Components.Fans.None non( redeclare final package Medium = MediumAir) "No fan" diff --git a/Buildings/Templates/Components/Validation/Valves.mo b/Buildings/Templates/Components/Validation/Valves.mo index 30d805f4dc2..508b7ea71f5 100644 --- a/Buildings/Templates/Components/Validation/Valves.mo +++ b/Buildings/Templates/Components/Validation/Valves.mo @@ -14,124 +14,154 @@ model Valves "Validation model for valve components" Fluid.Sources.Boundary_pT bouLiqEnt( redeclare final package Medium = MediumLiq, p=bouLiqLvg.p + modThr.dat.dpValve_nominal + modThr.dat.dpFixed_nominal, - nPorts=6) "Boundary conditions for entering liquid" + nPorts=7) "Boundary conditions for entering liquid" annotation (Placement(transformation(extent={{-90,70},{-70,90}}))); Fluid.Sources.Boundary_pT bouLiqLvg( - redeclare final package Medium =MediumLiq, nPorts=4) + redeclare final package Medium =MediumLiq, nPorts=5) "Boundary conditions for leaving liquid" annotation (Placement(transformation(extent={{110,70},{90,90}}))); - Buildings.Templates.Components.Valves.ThreeWayModulating modThr( + Actuators.Valve modThr( redeclare final package Medium = MediumLiq, + typ=Buildings.Templates.Components.Types.Valve.ThreeWayModulating, final energyDynamics=energyDynamics, dat( m_flow_nominal=1, dpValve_nominal=5000, dpFixed_nominal=5000)) "Three-way modulating valve" - annotation (Placement(transformation(extent={{10,70},{30,90}}))); + annotation (Placement(transformation(extent={{10,90},{30,110}}))); Interfaces.Bus bus "Control bus" - annotation (Placement(transformation(extent={{-20,80},{20,120}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,100},{20,140}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Controls.OBC.CDL.Reals.Sources.Ramp y(height=1, duration=10) "Damper control signal" annotation (Placement(transformation(extent={{-90,110},{-70,130}}))); - Buildings.Templates.Components.Valves.ThreeWayTwoPosition twoThr( + Actuators.Valve twoThr( redeclare final package Medium = MediumLiq, + typ=Buildings.Templates.Components.Types.Valve.ThreeWayTwoPosition, final energyDynamics=energyDynamics, dat( m_flow_nominal=1, dpValve_nominal=5000, dpFixed_nominal=5000)) "Three-way two position valve" - annotation (Placement(transformation(extent={{10,-50},{30,-30}}))); + annotation (Placement(transformation(extent={{10,-30},{30,-10}}))); Interfaces.Bus bus1 "Control bus" - annotation (Placement(transformation(extent={{-20,-40},{20,0}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,-20},{20,20}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); - Buildings.Templates.Components.Valves.TwoWayModulating modTwo( + Actuators.Valve modTwo( redeclare final package Medium = MediumLiq, + typ=Buildings.Templates.Components.Types.Valve.TwoWayModulating, final energyDynamics=energyDynamics, dat( m_flow_nominal=1, dpValve_nominal=5000, dpFixed_nominal=5000)) "Two-way modulating valve" - annotation (Placement(transformation(extent={{10,10},{30,30}}))); + annotation (Placement(transformation(extent={{10,30},{30,50}}))); Interfaces.Bus bus2 "Control bus" - annotation (Placement(transformation(extent={{-20,20},{20,60}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,40},{20,80}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); Controls.OBC.CDL.Logical.Sources.TimeTable y1( table=[0,0; 1,1], timeScale=10, period=200) "Damper control signal" annotation (Placement(transformation(extent={{-90,-10},{-70,10}}))); - Buildings.Templates.Components.Valves.TwoWayTwoPosition twoTwo( + Actuators.Valve twoTwo( redeclare final package Medium = MediumLiq, + typ=Buildings.Templates.Components.Types.Valve.TwoWayTwoPosition, final energyDynamics=energyDynamics, dat( m_flow_nominal=1, dpValve_nominal=5000, dpFixed_nominal=5000)) "Two-way two-position valve" - annotation (Placement(transformation(extent={{10,-110},{30,-90}}))); + annotation (Placement(transformation(extent={{10,-90},{30,-70}}))); Interfaces.Bus bus3 "Control bus" - annotation (Placement(transformation(extent={{-20,-100},{20,-60}}), - iconTransformation(extent={{-250,-32},{-210,8}}))); + annotation (Placement( + iconVisible=false, + transformation(extent={{-20,-80},{20,-40}}), + iconTransformation(extent={{-250,-32},{-210,8}}))); + Actuators.Valve non( + redeclare final package Medium = MediumLiq, + typ=Buildings.Templates.Components.Types.Valve.None) + "No valve" + annotation (Placement(transformation(extent={{10,-130},{30,-110}}))); + Fluid.FixedResistances.PressureDrop res( + redeclare final package Medium = MediumLiq, + final m_flow_nominal=modTwo.m_flow_nominal, + final dp_nominal=modTwo.dpValve_nominal + modTwo.dpFixed_nominal) + "Flow resistance" + annotation (Placement(transformation(extent={{-30,-130},{-10,-110}}))); equation connect(bouLiqEnt.ports[1], modThr.port_a) - annotation (Line(points={{-70,78.3333},{-30,78.3333},{-30,80},{10,80}}, + annotation (Line(points={{-70,78.2857},{-40,78.2857},{-40,100},{10,100}}, color={0,127,255})); connect(modThr.port_b,bouLiqLvg. ports[1]) - annotation (Line(points={{30,80},{60,80},{60,78.5},{90,78.5}}, + annotation (Line(points={{30,100},{60,100},{60,78.4},{90,78.4}}, color={0,127,255})); - connect(y.y, bus.y) annotation (Line(points={{-68,120},{0,120},{0,100}}, + connect(y.y, bus.y) annotation (Line(points={{-68,120},{0,120}}, color={0,0,127})); connect(bus, modThr.bus) annotation (Line( - points={{0,100},{20,100},{20,90}}, + points={{0,120},{20,120},{20,110}}, color={255,204,51}, thickness=0.5)); connect(bouLiqEnt.ports[3], twoThr.port_a) annotation (Line(points={{-70, - 79.6667},{-32,79.6667},{-32,-40},{10,-40}}, + 79.4286},{-40,79.4286},{-40,-20},{10,-20}}, color={0,127,255})); - connect(twoThr.port_b, bouLiqLvg.ports[2]) annotation (Line(points={{30,-40}, - {60,-40},{60,79.5},{90,79.5}}, + connect(twoThr.port_b, bouLiqLvg.ports[2]) annotation (Line(points={{30,-20},{ + 60,-20},{60,79.2},{90,79.2}}, color={0,127,255})); connect(bus1, twoThr.bus) annotation (Line( - points={{0,-20},{20,-20},{20,-30}}, + points={{0,0},{20,0},{20,-10}}, color={255,204,51}, thickness=0.5)); - connect(bouLiqEnt.ports[2], modTwo.port_a) annotation (Line(points={{-70,79}, - {-30,79},{-30,20},{10,20}}, color={0,127,255})); - connect(modTwo.port_b, bouLiqLvg.ports[3]) annotation (Line(points={{30,20},{ - 60,20},{60,80.5},{90,80.5}}, - color={0,127,255})); + connect(bouLiqEnt.ports[2], modTwo.port_a) annotation (Line(points={{-70, + 78.8571},{-40,78.8571},{-40,40},{10,40}}, + color={0,127,255})); + connect(modTwo.port_b, bouLiqLvg.ports[3]) annotation (Line(points={{30,40},{60, + 40},{60,80},{90,80}}, color={0,127,255})); connect(bus2, modTwo.bus) annotation (Line( - points={{0,40},{20,40},{20,30}}, + points={{0,60},{20,60},{20,50}}, color={255,204,51}, thickness=0.5)); connect(y.y, bus2.y) - annotation (Line(points={{-68,120},{0,120},{0,40}}, + annotation (Line(points={{-68,120},{0,120},{0,60}}, color={0,0,127})); connect(y1.y[1], bus1.y1) - annotation (Line(points={{-68,0},{0,0},{0,-20}}, color={255,0,255})); + annotation (Line(points={{-68,0},{0,0}}, color={255,0,255})); connect(bus3, twoTwo.bus) annotation (Line( - points={{0,-80},{20,-80},{20,-90}}, + points={{0,-60},{20,-60},{20,-70}}, color={255,204,51}, thickness=0.5)); connect(y1.y[1],bus3. y1) - annotation (Line(points={{-68,0},{0,0},{0,-80}}, color={255,0,255})); - connect(bouLiqEnt.ports[4], twoTwo.port_a) annotation (Line(points={{-70, - 80.3333},{-40,80.3333},{-40,-100},{10,-100},{10,-100}}, - color={0,127,255})); - connect(twoTwo.port_b, bouLiqLvg.ports[4]) annotation (Line(points={{30,-100}, - {80,-100},{80,81.5},{90,81.5}}, color={0,127,255})); + annotation (Line(points={{-68,0},{-20,0},{-20,-60},{0,-60}}, + color={255,0,255})); + connect(bouLiqEnt.ports[4], twoTwo.port_a) annotation (Line(points={{-70,80},{ + -40,80},{-40,-80},{10,-80}}, color={0,127,255})); + connect(twoTwo.port_b, bouLiqLvg.ports[4]) annotation (Line(points={{30,-80},{ + 60,-80},{60,80.8},{90,80.8}}, color={0,127,255})); connect(bouLiqEnt.ports[5], modThr.portByp_a) annotation (Line(points={{-70, - 81},{-36,81},{-36,60},{20,60},{20,70}}, color={0,127,255})); + 80.5714},{-36,80.5714},{-36,80},{20,80},{20,90}}, + color={0,127,255})); connect(bouLiqEnt.ports[6], twoThr.portByp_a) annotation (Line(points={{-70, - 81.6667},{-38,81.6667},{-38,-60},{20,-60},{20,-50}}, color={0,127,255})); + 81.1429},{-40,81.1429},{-40,-40},{20,-40},{20,-30}}, color={0,127,255})); + connect(non.port_b, bouLiqLvg.ports[5]) annotation (Line(points={{30,-120},{60, + -120},{60,81.6},{90,81.6}}, color={0,127,255})); + connect(bouLiqEnt.ports[7], res.port_a) annotation (Line(points={{-70,81.7143}, + {-70,80},{-40,80},{-40,-120},{-30,-120}}, color={0,127,255})); + connect(res.port_b, non.port_a) + annotation (Line(points={{-10,-120},{10,-120}}, color={0,127,255})); annotation ( __Dymola_Commands( file="modelica://Buildings/Resources/Scripts/Dymola/Templates/Components/Validation/Valves.mos" @@ -139,11 +169,11 @@ annotation ( experiment(Tolerance=1e-6, StopTime=200), Diagram(coordinateSystem(extent={{-140,-140},{140,140}})), Documentation(info=" --This model validates the models within - -Buildings.Templates.Components.Valves -by exposing them to a fixed pressure difference +
+This model validates the various configurations of the model + +Buildings.Templates.Components.Actuators.Valve +by exposing this model to a fixed pressure difference and a control signal varying from 0 to 1.
")); diff --git a/Buildings/Templates/Components/Valves/None.mo b/Buildings/Templates/Components/Valves/None.mo deleted file mode 100644 index 1c0915145ec..00000000000 --- a/Buildings/Templates/Components/Valves/None.mo +++ /dev/null @@ -1,17 +0,0 @@ -within Buildings.Templates.Components.Valves; -model None "No valve" - extends Buildings.Templates.Components.Interfaces.PartialValve( - final typ=Buildings.Templates.Components.Types.Valve.None); - -equation - connect(port_a, port_b) - annotation (Line(points={{-100,0},{100,0},{100,0}}, color={0,127,255})); - annotation ( - defaultComponentName="val", - Documentation(info=" --This is a direct fluid pass-through model to represent -a configuration with no valve. -
-")); -end None; diff --git a/Buildings/Templates/Components/Valves/ThreeWayModulating.mo b/Buildings/Templates/Components/Valves/ThreeWayModulating.mo deleted file mode 100644 index 3eb83021bce..00000000000 --- a/Buildings/Templates/Components/Valves/ThreeWayModulating.mo +++ /dev/null @@ -1,76 +0,0 @@ -within Buildings.Templates.Components.Valves; -model ThreeWayModulating "Three-way modulating valve" - extends Buildings.Templates.Components.Interfaces.PartialValve( - final typ=Buildings.Templates.Components.Types.Valve.ThreeWayModulating); - - replaceable Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear val - constrainedby Buildings.Fluid.Actuators.BaseClasses.PartialThreeWayValve( - redeclare final package Medium=Medium, - final m_flow_nominal=m_flow_nominal, - final dpValve_nominal=dpValve_nominal, - final dpFixed_nominal={dpFixed_nominal, dpFixedByp_nominal}, - final energyDynamics=energyDynamics, - final tau=tau, - final use_inputFilter=use_inputFilter, - final riseTime=riseTime, - final init=init, - final y_start=y_start, - final portFlowDirection_1=if allowFlowReversal then - Modelica.Fluid.Types.PortFlowDirection.Bidirectional - else Modelica.Fluid.Types.PortFlowDirection.Entering, - final portFlowDirection_2=if allowFlowReversal then - Modelica.Fluid.Types.PortFlowDirection.Bidirectional - else Modelica.Fluid.Types.PortFlowDirection.Leaving, - final portFlowDirection_3=if allowFlowReversal then - Modelica.Fluid.Types.PortFlowDirection.Bidirectional - else Modelica.Fluid.Types.PortFlowDirection.Entering) - "Valve" - annotation ( - __ctrlFlow(enable=false), - choicesAllMatching=true, - Placement( - transformation( - extent={{-10,-10},{10,10}}, - rotation=0))); -equation - connect(port_a, val.port_1) - annotation (Line(points={{-100,0},{-10,0}}, color={0,127,255})); - connect(val.port_2, port_b) - annotation (Line(points={{10,0},{100,0}}, color={0,127,255})); - connect(val.port_3, portByp_a) - annotation (Line(points={{0,-10},{0,-100}}, color={0,127,255})); - connect(bus.y, val.y) annotation (Line( - points={{0,100},{0,12}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-3,6},{-3,6}}, - horizontalAlignment=TextAlignment.Right)); - connect(val.y_actual, bus.y_actual) annotation (Line(points={{5,7},{40,7},{40, - 96},{0,96},{0,100}}, color={0,0,127}), Text( - string="%second", - index=1, - extent={{6,3},{6,3}}, - horizontalAlignment=TextAlignment.Left)); - annotation ( - defaultComponentName="val", - Documentation(info=" --This is a model for a three-way modulating valve. -
-y
(real).y = 0
corresponds to full bypass.
-y = 1
corresponds to zero bypass.
-y_actual
(real) is returned.y_actual = 0
corresponds to full bypass.
-y_actual = 1
corresponds to zero bypass.
--This is a model for a three-way two-position (directional) valve. -
-y1
.y1 = false
corresponds to full bypass.
-y1 = true
corresponds to zero bypass.
-y1_actual
and
-closed end switch status y0_actual
(Booleans)
-are returned.y1_actual = false
corresponds to full bypass.
-y1_actual = true
corresponds to zero bypass.
-And the opposite for y0_actual
.
--This is a model for a two-way modulating valve. -
-y
(real).y = 0
corresponds to fully closed.
-y = 1
corresponds to fully open.
-y_actual
(real) is returned.y_actual = 0
corresponds to fully closed.
-y_actual = 1
corresponds to fully open.
--This is a model for a two-way two-position (isolation) valve. -
-y1
.y1 = false
corresponds to fully closed.
-y1 = true
corresponds to fully open.
-y1_actual
and
-closed end switch status y0_actual
(Booleans)
-are returned.y1_actual = false
corresponds to fully closed.
-y1_actual = true
corresponds to fully open.
-And the opposite for y0_actual
.
--This package contains models for valves. -
-")); -end Valves; diff --git a/Buildings/Templates/Components/Valves/package.order b/Buildings/Templates/Components/Valves/package.order deleted file mode 100644 index 286524eef49..00000000000 --- a/Buildings/Templates/Components/Valves/package.order +++ /dev/null @@ -1,5 +0,0 @@ -None -ThreeWayModulating -ThreeWayTwoPosition -TwoWayModulating -TwoWayTwoPosition diff --git a/Buildings/Templates/Components/package.order b/Buildings/Templates/Components/package.order index fc2da254c48..c1596591a60 100644 --- a/Buildings/Templates/Components/package.order +++ b/Buildings/Templates/Components/package.order @@ -1,9 +1,8 @@ +Actuators Coils -Dampers Fans Routing Sensors -Valves Data Types Validation diff --git a/Buildings/Templates/ZoneEquipment/Components/Interfaces/PartialControllerVAVBox.mo b/Buildings/Templates/ZoneEquipment/Components/Interfaces/PartialControllerVAVBox.mo index 6e6a7319868..8519d29240d 100644 --- a/Buildings/Templates/ZoneEquipment/Components/Interfaces/PartialControllerVAVBox.mo +++ b/Buildings/Templates/ZoneEquipment/Components/Interfaces/PartialControllerVAVBox.mo @@ -15,9 +15,6 @@ partial block PartialControllerVAVBox datAll.stdVen "Ventilation standard"; - outer replaceable Buildings.Templates.Components.Dampers.Modulating damVAV - "VAV damper"; - outer replaceable Buildings.Templates.Components.Coils.None coiHea "Heating coil"; diff --git a/Buildings/Templates/ZoneEquipment/Interfaces/VAVBox.mo b/Buildings/Templates/ZoneEquipment/Interfaces/VAVBox.mo index 2a3e26d9ec3..1d8980c7d1f 100644 --- a/Buildings/Templates/ZoneEquipment/Interfaces/VAVBox.mo +++ b/Buildings/Templates/ZoneEquipment/Interfaces/VAVBox.mo @@ -17,8 +17,8 @@ model VAVBox "Interface class for VAV terminal unit" final QHeaWat_flow_nominal=if coiHea.have_sou then dat.coiHea.Q_flow_nominal else 0); inner replaceable Buildings.Templates.Components.Coils.WaterBasedHeating coiHea( - redeclare final package MediumHeaWat = MediumHeaWat, - redeclare final Buildings.Templates.Components.Valves.TwoWayModulating val) + redeclare final package MediumHeaWat=MediumHeaWat, + final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) constrainedby Buildings.Templates.Components.Interfaces.PartialCoil( redeclare final package MediumAir = MediumAir, final dat=datCoiHea, @@ -31,20 +31,21 @@ model VAVBox "Interface class for VAV terminal unit" choices( choice(redeclare replaceable Buildings.Templates.Components.Coils.WaterBasedHeating coiHea( redeclare final package MediumHeaWat = MediumHeaWat, - redeclare final Buildings.Templates.Components.Valves.TwoWayModulating val) + final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) "Hot water coil with two-way valve"), choice(redeclare replaceable Buildings.Templates.Components.Coils.ElectricHeating coiHea "Modulating electric heating coil")), Dialog(group="Configuration"), Placement(transformation(extent={{-10,-210},{10,-190}}))); - inner replaceable Buildings.Templates.Components.Dampers.Modulating damVAV - constrainedby Buildings.Templates.Components.Interfaces.PartialDamper( + Buildings.Templates.Components.Actuators.Damper damVAV( redeclare final package Medium = MediumAir, + final typ=Buildings.Templates.Components.Types.Damper.Modulating, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversalAir, final show_T=show_T, - final dat=datDamVAV) + final dat=datDamVAV, + typBla=Buildings.Templates.Components.Types.DamperBlades.VAV) "VAV damper" annotation (Dialog(group="Configuration"), Placement( diff --git a/Buildings/package.mo b/Buildings/package.mo index fe23b6bdc2d..4198da46beb 100644 --- a/Buildings/package.mo +++ b/Buildings/package.mo @@ -305,6 +305,16 @@ have been improved in a This is for #3500. +Buildings.Templates.Components.Actuators
+ that cover all equipment types, and allow the flow characteristic to be specified
+ with one parameter.+This data record contains the heat transfer properties of rock. +
+", +revisions=" ++This record is a template for the records in + +Buildings.Fluid.Geothermal.Aquifer.SingleWell. +
+", +revisions=" ++This package contains data records for heat properties of aquifers + +Buildings.Fluid.Geothermal.Aquifer. +
+")); +end Data; diff --git a/Buildings/Fluid/Geothermal/Aquifer/Data/package.order b/Buildings/Fluid/Geothermal/Aquifer/Data/package.order new file mode 100644 index 00000000000..a4b770a71be --- /dev/null +++ b/Buildings/Fluid/Geothermal/Aquifer/Data/package.order @@ -0,0 +1,2 @@ +Rock +Template diff --git a/Buildings/Fluid/Geothermal/Aquifer/Examples/CoolingOffice.mo b/Buildings/Fluid/Geothermal/Aquifer/Examples/CoolingOffice.mo new file mode 100644 index 00000000000..5cc5dc4112a --- /dev/null +++ b/Buildings/Fluid/Geothermal/Aquifer/Examples/CoolingOffice.mo @@ -0,0 +1,77 @@ +within Buildings.Fluid.Geothermal.Aquifer.Examples; +model CoolingOffice + extends Modelica.Icons.Example; + package Medium = Buildings.Media.Water "Medium model"; + + parameter Modelica.Units.SI.HeatFlowRate QCoo_flow_nominal=30000 + "Cooling power"; + parameter Modelica.Units.SI.TemperatureDifference deltaT=4 "Temperature difference at heat exchanger"; + parameter Modelica.Units.SI.SpecificHeatCapacity cpWat=4186 "Heat capacity of water"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal= + QCoo_flow_nominal/(deltaT*cpWat) "Nominal water mass flow rate"; + + HeatExchangers.HeaterCooler_u hea( + redeclare package Medium = Medium, + m_flow_nominal=mWat_flow_nominal, + dp_nominal=100, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + Q_flow_nominal=QCoo_flow_nominal) "Heat exchanger" + annotation (Placement(transformation(extent={{-10,54},{10,74}}))); + Modelica.Blocks.Sources.Constant uPum(k=1) "Pump control signal" + annotation (Placement(transformation(extent={{-60,-20},{-40,0}}))); + Modelica.Blocks.Sources.Constant uHea(k=1) "Heat load control signal" + annotation (Placement(transformation(extent={{-60,60},{-40,80}}))); + MultiWell aquWel( + redeclare package Medium = Medium, + nVol=80, + h=20, + d=1000, + length=40, + TCol_start=285.15, + THot_start=285.15, + aquDat=Buildings.Fluid.Geothermal.Aquifer.Data.Rock(), + m_flow_nominal=mWat_flow_nominal, + dpExt_nominal=5000) + "Acquifer well" + annotation (Placement(transformation(extent={{-10,-20},{10,0}}))); + Sources.Boundary_pT bou( + redeclare package Medium = Medium, + nPorts=1) "Pressure boundary condition" annotation (Placement(transformation(extent={{-80,20},{-60,40}}))); +equation + connect(uHea.y, hea.u) + annotation (Line(points={{-39,70},{-12,70}}, color={0,0,127})); + connect(aquWel.port_Hot, hea.port_b) annotation (Line(points={{6,0},{6,30},{20, + 30},{20,64},{10,64}}, color={0,127,255})); + connect(aquWel.port_Col, hea.port_a) annotation (Line(points={{-6,0},{-6,0},{-6, + 30},{-20,30},{-20,64},{-10,64}}, color={0,127,255})); + connect(bou.ports[1], hea.port_a) annotation (Line(points={{-60,30},{-20,30}, + {-20,64},{-10,64}}, color={0,127,255})); + connect(uPum.y, aquWel.u) + annotation (Line(points={{-39,-10},{-26,-10},{-26,-10},{-12,-10}}, + color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=7776000,Tolerance=1e-6), + __Dymola_Commands(file= + "modelica://Buildings/Resources/Scripts/Dymola/Fluid/Geothermal/Aquifer/Examples/CoolingOffice.mos" + "Simulate and plot"), + Documentation(info=" ++This example shows the application of the model +Buildings.Fluid.Geothermal.Aquifer.SingleWell. +
++The system consists of two wells, a warm well and a cold well. Water is extracted from the cold well at 12C and +after passing through a heat exchanger it is injected in the warm well at 16C. This may represent the operation of an +aquifer thermal energy storage system that cools an office building with a constant load of 30 kW. +
+ +", revisions=" ++This package contains example models for the classes in + +Buildings.Fluid.Geothermal.Aquifer. +
+")); +end Examples; diff --git a/Buildings/Fluid/Geothermal/Aquifer/Examples/package.order b/Buildings/Fluid/Geothermal/Aquifer/Examples/package.order new file mode 100644 index 00000000000..36b8a6c3c79 --- /dev/null +++ b/Buildings/Fluid/Geothermal/Aquifer/Examples/package.order @@ -0,0 +1 @@ +CoolingOffice diff --git a/Buildings/Fluid/Geothermal/Aquifer/MultiWell.mo b/Buildings/Fluid/Geothermal/Aquifer/MultiWell.mo new file mode 100644 index 00000000000..ebcb2cf16c6 --- /dev/null +++ b/Buildings/Fluid/Geothermal/Aquifer/MultiWell.mo @@ -0,0 +1,540 @@ +within Buildings.Fluid.Geothermal.Aquifer; +model MultiWell "Model of a single well for aquifer thermal energy storage" + replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium in the component" annotation (choices( + choice(redeclare package Medium = Buildings.Media.Water "Water"))); + parameter Integer nVol(min=1)=10 "Number of control volumes used in discretization" annotation ( + Dialog(group="Subsurface")); + parameter Modelica.Units.SI.Height h "Aquifer thickness"; + parameter Modelica.Units.SI.Length d "Distance between wells"; + parameter Modelica.Units.SI.Height length + "Length of one well, used to compute pressure drop"; + parameter Real nPai=1 "Number of paired wells"; + parameter Modelica.Units.SI.Radius rWB=0.1 "Wellbore radius" annotation ( + Dialog(group="Subsurface")); + parameter Modelica.Units.SI.Radius rMax=d/2 "Domain radius" annotation ( + Dialog(group="Subsurface")); + parameter Real griFac(min=1) = 1.15 "Grid factor for spacing" annotation ( + Dialog(group="Subsurface")); + parameter Modelica.Units.SI.Temperature TCol_start=283.15 + "Initial temperature of cold well" annotation ( + Dialog(group="Subsurface")); + parameter Modelica.Units.SI.Temperature THot_start=TCol_start + "Initial temperature of warm well" annotation ( + Dialog(group="Subsurface")); + parameter Modelica.Units.SI.Temperature TGroCol=285.15 + "Undisturbed ground temperature (cold well)" annotation ( + Dialog(group="Properties of ground")); + parameter Modelica.Units.SI.Temperature TGroHot=TGroCol + "Undisturbed ground temperature (warm well)" annotation ( + Dialog(group="Properties of ground")); + parameter Buildings.Fluid.Geothermal.Aquifer.Data.Template aquDat + "Aquifer thermal properties" annotation (choicesAllMatching=true); + parameter Modelica.Units.SI.MassFlowRate m_flow_nominal "Nominal mass flow rate" annotation ( + Dialog(group="Hydraulic circuit")); + parameter Modelica.Units.SI.PressureDifference dpAquifer_nominal(displayUnit= "Pa")= + m_flow_nominal/nPai*Modelica.Constants.g_n/2/Modelica.Constants.pi/h/aquDat.K*log(d/rWB) + "Pressure drop at nominal mass flow rate in the aquifer" annotation ( + Dialog(group="Hydraulic circuit")); + final parameter Modelica.Units.SI.PressureDifference dpWell_nominal( + displayUnit="Pa") = 2*resWelCol.dp_nominal + "Pressure drop at nominal mass flow rate in the well" + annotation (Dialog(group="Hydraulic circuit")); + parameter Modelica.Units.SI.PressureDifference dpExt_nominal(displayUnit="Pa") + "Pressure drop at nominal mass flow rate in the above-surface system (used to size the head of the well pump)" annotation ( + Dialog(group="Hydraulic circuit")); + + final parameter Modelica.Units.SI.Radius rVol[nVol]( + each final fixed=false) + "Radius to the center of the i-th domain"; + + Modelica.Blocks.Interfaces.RealInput u( + final min=-1, + final max=1, + final unit="1") + "Pump control input (-1: extract from hot well, +1: extract from cold well, 0: off)" + annotation (Placement(transformation(extent={{-220,-20},{-180,20}}), + iconTransformation(extent={{-140,-20},{-100,20}}))); + Modelica.Blocks.Interfaces.RealOutput PTot( + final unit="W") + "Total power consumed by all circulation pumps in the wells" + annotation (Placement(transformation(extent={{180,30},{200,50}}), + iconTransformation(extent={{100,40},{120,60}}))); + + Modelica.Fluid.Interfaces.FluidPort_a port_Col( + redeclare final package Medium = Medium) "Fluid connector" annotation (Placement(transformation(extent={{-130, + 130},{-110,150}}), iconTransformation(extent={{-70,90},{-50,110}}))); + + Modelica.Fluid.Interfaces.FluidPort_a port_Hot( + redeclare final package Medium = Medium) "Fluid connector" annotation (Placement(transformation(extent={{110,130}, + {130,150}}), iconTransformation(extent={{50,90},{70,110}}))); + + Modelica.Units.SI.Temperature TAquHot[nVol] = heaCapHot.T + "Temperatures of the hot aquifer"; + Modelica.Units.SI.Temperature TAquCol[nVol] = heaCapCol.T + "Temperatures of the cold aquifer"; + + Movers.Preconfigured.SpeedControlled_y pumCol( + redeclare final package Medium = Medium, + final m_flow_nominal=m_flow_nominal/nPai, + final dp_nominal=resAqu.dpMea_nominal + 2* resWelCol.dp_nominal + dpExt_nominal) + "Pump to extract from cold well" annotation (Placement( + transformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={-120,0}))); + Movers.Preconfigured.SpeedControlled_y pumHot( + redeclare final package Medium = Medium, + final m_flow_nominal=pumCol.m_flow_nominal, + final dp_nominal=pumCol.dp_nominal) "Pump to extract from hot well" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={120,0}))); + + FixedResistances.PressureDrop resWelCol( + redeclare final package Medium = Medium, + m_flow_nominal=m_flow_nominal/nPai, + final from_dp=false, + dp_nominal= + Modelica.Fluid.Pipes.BaseClasses.WallFriction.Detailed.pressureLoss_m_flow( + m_flow=m_flow_nominal/nPai, + rho_a=rhoWat, + rho_b=rhoWat, + mu_a=mu, + mu_b=mu, + length=length, + diameter=rWB, + roughness=2.5e-5)) "Pressure drop in the cold well" annotation ( + Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=-90, + origin={-120,70}))); + + // The resistances on the hot side are set to be the negative of the cold + // side, as they have the same geometry and flow rate. + // This reduces the size of the nonlinear system of equations, + // and leads to fewer equations in the model. + Movers.BaseClasses.IdealSource resWelHot( + redeclare final package Medium = Medium, + final allowFlowReversal=true, + final control_m_flow=false, + final control_dp=true, + final m_flow_small=1E-4*abs(m_flow_nominal)) + "Pressure drop in the warm well" annotation (Placement( + transformation( + extent={{10,10},{-10,-10}}, + rotation=-90, + origin={120,70}))); + + BaseClasses.MassFlowRateMultiplier mulCol( + redeclare final package Medium = Medium, + k=nPai) + "Mass flow multiplier for the cold well" + annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + rotation=90, + origin={-120,110}))); + BaseClasses.MassFlowRateMultiplier mulHot( + redeclare final package Medium = Medium, + k=nPai) + "Mass flow multiplier for the warm well" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={120,110}))); + + Modelica.Blocks.Math.Add addPum( + final k1=1, + final k2=1) + "Sum of pump electrical power" + annotation (Placement(transformation(extent={{40,30},{60,50}}))); + + Sensors.RelativePressure dpWelCol( + redeclare package Medium = Medium) + "Pressure drop of cold well" annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=90, + origin={-100,70}))); + + Airflow.Multizone.Point_m_flow resAqu( + redeclare final package Medium = Medium, + m=1, + final dpMea_nominal=dpAquifer_nominal, + final mMea_flow_nominal=m_flow_nominal/nPai) + "Pressure drop in the cold and warm side of the aquifer" annotation ( + Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=0, + origin={0,-70}))); +protected + parameter Modelica.Units.SI.Radius r[nVol + 1](each fixed=false) + "Radius to the boundary of the i-th domain"; + parameter Modelica.Units.SI.HeatCapacity C[nVol](each fixed=false) + "Heat capacity of segment"; + parameter Modelica.Units.SI.Volume VWat[nVol](each fixed=false) + "Volumes of water"; + parameter Modelica.Units.SI.ThermalResistance R[nVol](each fixed=false) + "Thermal resistances between nodes"; + parameter Real cAqu(fixed=false) + "Heat capacity normalized with volume for aquifer"; + parameter Real kVol(fixed=false) + "Heat conductivity normalized with volume"; + parameter Modelica.Units.SI.DynamicViscosity mu=Medium.dynamicViscosity(Medium.setState_pTX( + Medium.p_default, + Medium.T_default, + Medium.X_default)) "Water dynamic viscosity"; + parameter Modelica.Units.SI.SpecificHeatCapacity cpWat=Medium.specificHeatCapacityCp(Medium.setState_pTX( + Medium.p_default, + Medium.T_default, + Medium.X_default)) "Water specific heat capacity"; + parameter Modelica.Units.SI.Density rhoWat=Medium.density(Medium.setState_pTX( + Medium.p_default, + Medium.T_default, + Medium.X_default)) "Water density"; + parameter Modelica.Units.SI.ThermalConductivity kWat=Medium.thermalConductivity(Medium.setState_pTX( + Medium.p_default, + Medium.T_default, + Medium.X_default)) "Water thermal conductivity"; + + Buildings.Fluid.MixingVolumes.MixingVolume volCol[nVol]( + redeclare final package Medium = Medium, + each final T_start=TCol_start, + each final m_flow_nominal=m_flow_nominal, + final V=VWat, + each nPorts=2) + "Array of fluid volumes representing the fluid flow in the cold side of the aquifer" + annotation (Placement(transformation(extent={{-60,-80},{-40,-100}}))); + + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor heaCapCol[nVol](C=C, + each T(start=TCol_start, fixed=true)) + "Array of thermal capacitor in the cold side of the aquifer" + annotation (Placement(transformation(extent={{-60,-128},{-40,-108}}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor theResCol[nVol](R=R) + "Array of thermal resistances in the cold side of the aquifer" + annotation (Placement(transformation(extent={{-80,-140},{-100,-120}}))); + + MixingVolumes.MixingVolume volHot[nVol]( + redeclare final package Medium = Medium, + each T_start=THot_start, + each m_flow_nominal=m_flow_nominal, + V=VWat, + each nPorts=2) + "Array of fluid volumes representing the fluid flow in the warm side of the aquifer" + annotation (Placement(transformation(extent={{50,-80},{30,-100}}))); + Modelica.Thermal.HeatTransfer.Components.HeatCapacitor heaCapHot[nVol](C=C, + each T(start=THot_start, fixed=true)) + "Array of thermal capacitor in the warm side of the aquifer" + annotation (Placement(transformation(extent={{50,-128},{30,-108}}))); + Modelica.Thermal.HeatTransfer.Components.ThermalResistor theResHot[nVol](R=R) + "Array of thermal resistances in the warm side of the aquifer" + annotation (Placement(transformation(extent={{80,-140},{100,-120}}))); + + Buildings.HeatTransfer.Sources.FixedTemperature groTemCol( + final T=TGroCol) + "Boundary condition ground temperature in the cold side of the aquifer" + annotation (Placement(transformation(extent={{-140,-140},{-120,-120}}))); + Buildings.HeatTransfer.Sources.FixedTemperature groTemHot( + final T=TGroHot) + "Boundary condition ground temperature in the warm side of the aquifer" + annotation (Placement(transformation(extent={{140,-140},{120,-120}}))); + + Modelica.Blocks.Nonlinear.Limiter limCol(final uMax=1, final uMin=0) "Limiter for pump signal" + annotation (Placement(transformation(extent={{-160,-10},{-140,10}}))); + Modelica.Blocks.Math.Gain gaiCon(final k=-1) "Inversion of control signal" + annotation (Placement(transformation(extent={{40,-10},{60,10}}))); + Modelica.Blocks.Nonlinear.Limiter limHot(final uMax=1, final uMin=0) "Limiter for pump signal" + annotation (Placement(transformation(extent={{80,-10},{100,10}}))); + + Modelica.Blocks.Math.Gain gaiPum(final k=nPai) "Gain used to scale the pump electrical power" + annotation (Placement(transformation(extent={{80,30},{100,50}}))); +initial equation + assert(rWB < rMax, "In " + getInstanceName() + ": Require rWB < rMax"); + assert(0 < rWB, "In " + getInstanceName() + ": Require 0 < rWB"); + assert(rMax <= d/2, "In " + getInstanceName() + ": Require rMax <= d/2"); + + cAqu=aquDat.dSoi*aquDat.cSoi*(1-aquDat.phi); + kVol=kWat*aquDat.phi+aquDat.kSoi*(1-aquDat.phi); + + r[1] = rWB; + for i in 2:nVol+1 loop + r[i]= r[i-1] + (rMax - rWB) * (1-griFac)/(1-griFac^(nVol)) * griFac^(i-2); + end for; + for i in 1:nVol loop + rVol[i] = (r[i]+r[i+1])/2; + end for; + for i in 1:nVol loop + C[i] = cAqu*h*3.14*(r[i+1]^2-r[i]^2); + end for; + for i in 1:nVol loop + VWat[i] = aquDat.phi*h*3.14*(r[i+1]^2-r[i]^2); + end for; + + R[nVol]=Modelica.Math.log(rMax/rVol[nVol])/(2*Modelica.Constants.pi*kVol*h); + for i in 1:nVol-1 loop + R[i] = Modelica.Math.log(rVol[i+1]/rVol[i])/(2*Modelica.Constants.pi*kVol*h); + end for; + +equation + if nVol > 1 then + for i in 1:(nVol - 1) loop + connect(volCol[i].ports[2], volCol[i + 1].ports[1]); + end for; + end if; + connect(resAqu.port_b, volCol[nVol].ports[2]) annotation (Line(points={{-10,-70}, + {-49,-70},{-49,-80}}, color={0,127,255})); + connect(resAqu.port_a, volHot[nVol].ports[2]) + annotation (Line(points={{10,-70},{39,-70},{39,-80}},color={0,127,255})); + connect(pumCol.port_a, volCol[1].ports[1]) annotation (Line(points={{-120,-10}, + {-120,-70},{-51,-70},{-51,-80}}, color={0,127,255})); + connect(pumHot.port_a, volHot[1].ports[1]) annotation (Line(points={{120,-10}, + {120,-70},{41,-70},{41,-80}}, color={0,127,255})); + + if nVol > 1 then + for i in 1:(nVol - 1) loop + connect(volHot[i].ports[2], volHot[i + 1].ports[1]); + end for; + end if; + + if nVol > 1 then + for i in 1:(nVol - 1) loop + connect(heaCapCol[i + 1].port, theResCol[i].port_b); + end for; + end if; + + if nVol > 1 then + for i in 1:(nVol - 1) loop + connect(heaCapHot[i + 1].port, theResHot[i].port_b); + end for; + end if; + + connect(groTemCol.port, theResCol[nVol].port_b) + annotation (Line(points={{-120,-130},{-100,-130}}, + color={191,0,0})); + + connect(volCol.heatPort, heaCapCol.port) annotation (Line(points={{-60,-90},{-70, + -90},{-70,-130},{-50,-130},{-50,-128}}, + color={191,0,0})); + connect(theResCol.port_a, volCol.heatPort) annotation (Line(points={{-80,-130}, + {-70,-130},{-70,-90},{-60,-90}}, + color={191,0,0})); + connect(groTemHot.port, theResHot[nVol].port_b) + annotation (Line(points={{120,-130},{100,-130}}, + color={191,0,0})); + connect(volHot.heatPort, heaCapHot.port) annotation (Line(points={{50,-90},{60, + -90},{60,-130},{40,-130},{40,-128}}, + color={191,0,0})); + connect(theResHot.port_a, volHot.heatPort) annotation (Line(points={{80,-130}, + {60,-130},{60,-90},{50,-90}}, + color={191,0,0})); + connect(pumCol.port_b, resWelCol.port_a) + annotation (Line(points={{-120,10},{-120,60}}, + color={0,127,255})); + connect(resWelHot.port_a, pumHot.port_b) + annotation (Line(points={{120,60},{120,10}}, + color={0,127,255})); + connect(limCol.y, pumCol.y) annotation (Line(points={{-139,0},{-138,0},{-138,6.66134e-16}, + {-132,6.66134e-16}}, color={0,0,127})); + connect(gaiCon.y, limHot.u) annotation (Line(points={{61,0},{78,0}}, color={0,0,127})); + connect(limHot.y, pumHot.y) annotation (Line(points={{101,0},{100,0},{100,6.66134e-16}, + {108,6.66134e-16}}, color={0,0,127})); + connect(gaiCon.u, u) annotation (Line(points={{38,0},{0,0},{0,20},{-170,20},{-170, + 0},{-200,0}}, color={0,0,127})); + connect(limCol.u, u) annotation (Line(points={{-162,0},{-200,0}}, color={0,0,127})); + connect(resWelCol.port_b, mulCol.port_a) + annotation (Line(points={{-120,80},{-120,100}}, + color={0,127,255})); + connect(mulCol.port_b, port_Col) annotation (Line(points={{-120,120},{-120,140}}, color={0,127,255})); + connect(mulHot.port_b, port_Hot) annotation (Line(points={{120,120},{120,140}}, color={0,127,255})); + connect(resWelHot.port_b, mulHot.port_a) + annotation (Line(points={{120,80},{120,100}}, + color={0,127,255})); + connect(pumCol.P, addPum.u1) + annotation (Line(points={{-129,11},{-129,46},{38,46}}, color={0,0,127})); + connect(addPum.y, gaiPum.u) annotation (Line(points={{61,40},{78,40}}, color={0,0,127})); + connect(pumHot.P, addPum.u2) annotation (Line(points={{111,11},{111,20},{20,20}, + {20,34},{38,34}}, color={0,0,127})); + connect(gaiPum.y, PTot) annotation (Line(points={{101,40},{190,40}}, color={0,0,127})); + connect(dpWelCol.port_a, resWelCol.port_b) annotation (Line(points={{-100,80}, + {-100,90},{-120,90},{-120,80}}, + color={0,127,255})); + connect(dpWelCol.port_b, resWelCol.port_a) annotation (Line(points={{-100,60}, + {-100,52},{-120,52},{-120,60}}, + color={0,127,255})); + connect(dpWelCol.p_rel, resWelHot.dp_in) annotation (Line(points={{-91,70},{ + 100,70},{100,76},{112,76}}, color={0,0,127})); + + annotation (Icon(coordinateSystem(preserveAspectRatio=false, + extent={{-100,-100}, + {100,100}}), + graphics={ + Rectangle( + extent={{-20,100},{20,-2}}, + fillColor={175,175,175}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}), + Ellipse( + extent={{20,2},{-20,-6}}, + lineColor={0,0,0}, + fillColor={175,175,175}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{-100,100},{100,-100}}, + lineColor={0,0,0}, + fillColor={211,168,137}, + fillPattern=FillPattern.Forward), + Rectangle( + extent={{-100,20},{100,-48}}, + fillColor={241,241,0}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}), + Rectangle( + extent={{-100,100},{100,82}}, + lineColor={0,0,0}, + fillColor={0,140,72}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{-84,100},{-36,-14}}, + fillColor={85,170,255}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}), + Ellipse( + extent={{-36,-6},{-84,-22}}, + lineColor={0,0,0}, + fillColor={28,108,200}, + fillPattern=FillPattern.Solid), + Text( + extent={{-147,-108},{153,-148}}, + textColor={0,0,255}, + textString="%name"), + Rectangle( + extent={{36,100},{84,-14}}, + fillColor={238,22,26}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}), + Ellipse( + extent={{84,-6},{36,-22}}, + lineColor={0,0,0}, + fillColor={182,12,18}, + fillPattern=FillPattern.Solid), + Text( + extent={{-140,46},{-110,22}}, + textColor={0,0,127}, + textString="uPum"), + Text( + extent={{106,84},{136,60}}, + textColor={0,0,127}, + textString="PTot"), + Text( + extent={{-52,144},{-172,94}}, + textColor={0,0,100}, + textString=DynamicSelect("", String(pumCol.heatPort.T-273.15, format=".1f"))), + Text( + extent={{170,144},{50,94}}, + textColor={0,0,100}, + textString=DynamicSelect("", String(pumHot.heatPort.T-273.15, format=".1f")))}), + Diagram( + coordinateSystem(preserveAspectRatio=false, extent={{-180,-160},{180,140}})), + defaultComponentName="aquWel", + Documentation(info=" ++This model simulates aquifer thermal energy storage, using one or multiple pairs of cold and hot wells. +
++To calculate aquifer temperature at different locations over time, the model applies +physical principles of water flow and heat transfer phenomena. The model is based on +the partial differential equation (PDE) for 1D conductive-convective transient +radial heat transport in porous media +
++ρ c (∂ T(r,t) ⁄ ∂t) = +k (∂² T(r,t) ⁄ ∂r²) - ρw cw u(∂ T(r,t) ⁄ ∂t), +
++where +ρ +is the mass density, +c +is the specific heat capacity per unit mass, +T +is the temperature at location r and time t, +u is water velocity and +k is the heat conductivity. The subscript w indicates water. +The first term on the right hand side of the equation describes the effect of conduction, while +the second term describes the fluid flow. +
++The pressure losses in the aquifer are calculated using the Darcy's law +
+Δp = ṁ g ⁄ (2 π K h ln(rMax ⁄ rWB)), +
++where ṁ is the water mass flow rate, g is the gravitational acceleration, +K is the hydraulic conductivity, h is the thickness of the aquifer, +rMax is the domain radius and rWB is the well radius. +The pressure losses in the wells are calculated using + +Modelica.Fluid.Pipes.BaseClasses.WallFriction.Detailed.pressureLoss_m_flow. +
++To discretize the conductive-convective equation, the domain is divided into a series +of thermal capacitances and thermal resistances along the radial direction. The +implementation uses an array of + +Modelica.Thermal.HeatTransfer.Components.HeatCapacitor +and +Modelica.Thermal.HeatTransfer.Components.ThermalResistor. +Fluid flow was modelled by adding a series of fluid volumes, which are connected +to the thermal capacitances via heat ports. The fluid stream was developed using +the model Buildings.Fluid.MixingVolumes.MixingVolume. +The geometric representation of the model is illustrated in the figure below. +
++ +
+
+By default, the component consists of a single pair of wells: one cold well and one warm well.
+The number of paired wells can be increased by modifing the parameters nPai
.
+The effect is a proportional increase of thermal capacity, and the mass flow rate at port_a
+and port_b
is equally distributed to the pairs of well, thus
+all pairs have the same mass flow rates and temperatures, and the quantities
+at the fluid ports is for all well combined, as is the electricity consumption PTot
+for the well pumps.
+
+To ensure conservation of energy, the wells are connected via fluid ports.
+To avoid thermal interferences, make sure that the aquifer domain radius
+rMax
is large enough for your specific use case.
+
+Circulation pumps are included in the model and they can be controlled by acting on the input connector.
+The input must vary between [1, -1].
+A positive value will circulate water
+clockwise (from port_Hot
to port_Col
, thus
+extraction from the cold well and injection into the warm well).
+A negative value will circulate water anticlockwise.
+
+The temperature values in the warm and cold aquifers can be accessed using
+TAquHot
and TAquCol
.
+These temperatures correspond to the temperatures of each thermal capacitance
+in the discretized domain. The location of the thermal capacitance is expressed by rVol
.
+
+The model computes the flow resistance of the cold well and the cold acquifer. +Because of symmetry, the warm side has the same flow resistances. +To reduce the number of equations in the model, the flow resistance of the warm +side is set to the same flow resistance as on the cold side, but with the +sign reversed. +
+", revisions=" ++Example that verifies the scalability of +Buildings.Fluid.Geothermal.Aquifer.MultiWell +when multiple wells are used. +
+", revisions=" ++This validation case simulates an idealized operation of an aquifer thermal storage system. Results +are compared with simulations from a test suite developed by Mindel et al. (2021). +This test suite comprises a set of cases to assess the thermo-hydraulic modelling capabilities of various geothermal simulators. +
++The comparison was carried out with respect to the test case called TC2 - well-test comparison. +The main goal of TC2 is to compare aquifer temperatures under a typical operation of an ATES system +consisting of injection, falloff, drawdown, and build-up. The injection phase represents the charging period, +while the drawdown phase represents the discharge period. +Intermediate phases of falloff and build-up represent periods of storage or inactivity. +The overall operational period is one year, and the sequence of the different phases is the following: +
++ +
++Julian E. Mindel, Peter Alt-Epping, Antoine Armandine Les Landes, Stijn Beernink, Daniel T. Birdsell, +Martin Bloemendal, Virginie Hamm, Simon Lopez, Charles Maragna, Carsten M. Nielsen, Sebastia Olivella, +Marc Perreaux, Maarten W. Saaltink, Martin O. Saar, Daniela Van den Heuvel, Ruben Vidal, Thomas Driesner, +Benchmark study of simulators for thermo-hydraulic modelling of low enthalpy geothermal processes, +Geothermics, +Volume 96, +2021, +102130, +ISSN 0375-6505, +https://doi.org/10.1016/j.geothermics.2021.102130. +
+", revisions=" ++This package contains validation models for the classes in + +Buildings.Fluid.Geothermal.Aquifer. +
+")); +end Validation; diff --git a/Buildings/Fluid/Geothermal/Aquifer/Validation/package.order b/Buildings/Fluid/Geothermal/Aquifer/Validation/package.order new file mode 100644 index 00000000000..7413e308d55 --- /dev/null +++ b/Buildings/Fluid/Geothermal/Aquifer/Validation/package.order @@ -0,0 +1,2 @@ +NumberWells +SimulationTest diff --git a/Buildings/Fluid/Geothermal/Aquifer/package.mo b/Buildings/Fluid/Geothermal/Aquifer/package.mo new file mode 100644 index 00000000000..735795a14f7 --- /dev/null +++ b/Buildings/Fluid/Geothermal/Aquifer/package.mo @@ -0,0 +1,33 @@ +within Buildings.Fluid.Geothermal; +package Aquifer "Package with aquifer thermal energy storage models" + extends Modelica.Icons.Package; + +annotation (preferredView="info", Documentation(info=" ++Package with models for aquifer thermal energy storage. +
+"), + Icon(graphics={ + Rectangle( + extent={{-54,66},{-40,-16}}, + fillColor={95,95,95}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}, + pattern=LinePattern.None), + Ellipse( + extent={{-86,-14},{-4,-58}}, + fillColor={95,95,95}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{4,-14},{86,-58}}, + fillColor={95,95,95}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{36,66},{50,-16}}, + fillColor={95,95,95}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}, + pattern=LinePattern.None)})); +end Aquifer; diff --git a/Buildings/Fluid/Geothermal/Aquifer/package.order b/Buildings/Fluid/Geothermal/Aquifer/package.order new file mode 100644 index 00000000000..810a2126522 --- /dev/null +++ b/Buildings/Fluid/Geothermal/Aquifer/package.order @@ -0,0 +1,4 @@ +MultiWell +Data +Examples +Validation diff --git a/Buildings/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Analytic_20Years.mo b/Buildings/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Analytic_20Years.mo index d2ac859b84e..e26508828f4 100644 --- a/Buildings/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Analytic_20Years.mo +++ b/Buildings/Fluid/Geothermal/Borefields/BaseClasses/HeatTransfer/Validation/Analytic_20Years.mo @@ -105,9 +105,9 @@ Buildings.Fluid.Geothermal.Borefields.BaseClasses.HeatTransfer.ThermalResponseFa-Pinel, P. 2003. Amélioration, validation et implantation d’un algorithme de calcul +Pinel, P. 2003. Amélioration, validation et implantation d’un algorithme de calcul pour évaluer le transfert thermique dans les puits verticaux de systèmes de pompes à chaleur géothermiques, -M.A.Sc. Thesis, École Polytechnique de Montréal. +M.A.Sc. Thesis, École Polytechnique de Montréal.
", revisions="c
z?P$L~-HNjENS5<4h>ma4RJ-7NaraTQ0F~;WuCSE|#WVuEJ(bc6wPRB*FhMu&xs$R8
z@#hC$KKl%OxeJbEtAx$04CW!$=suQv2bGrSm(fKA C@^l>wn4{5 xk
zH(x}1eRy0kRob!8l1@(e2m4eu-}!=18VDS$AD($7RuO0sj;!Pwxb;v{g~@PM62
z;`!y&ca3Xz`abJSK1oFlBM7*Rs0YL!6P>lZ|gLxF`~2Rh7!e{J(N0
zRnp>V&ok_jP4&Cz`r~Xf6!Nxj3KgYkNu9_=%D>cO1)|r8zosGzxqX3;gX~P&2MA_C
zJ&2_|>LvhkPuLs`y9M4XdFV{Puvd!XTnS6rPg#hQp8aqQ;WnnLG^}FUyC2TfZKHv<
zUo~RSJ-p)p`|0y_u;i3W_@BlsZFaso*PXkToHsApsK@{_ *S%^6Z&DeN&?DiS__
zkDDW;S6#NpE>@2I@eoWj3r=S5CwZd&DAUl8oIM5q4*HAY-n(u;
)md#IUY3n{`%}lMt|Y;KGe5s)Dos-^!d^FlEQSI&m3y
zZiK`=8Hyui`P1C!
AOo$XBJQHIPNF
zp(~Hz28ZKrF%40}Xqxzfe3e=`8F>0j#y%GNlOlT&i~b40*V~z9Sa|hu>;#>|Vag|q
zwkzx#8Y=Ah@GH3`LrzPXv;Z&DA^n$n*Sl`UbIJR!O@haS7p$~k&UOlJIey4F;?Mh7
zGd)p9lsXper7HL$$6D+*-u_Jhpy0uQms!uAqYF=AB>Kkn&1P4Ny9r@3Lz955Xsr{}
z&iPLX=xsu9UI$w_uASg=4Hq5+ptJ9-Z~J-ef7I~~V#U?}h^$_44O3I|y@Tcr1mF|}
zm!j)Zui%bUN>X~9?*JONpx`MJ@YHDtz!`(IZJXJ!1`o|{^Q)>=MC0Rs(<5Eo%WH1|
zz}Hd`aqUyhDugGEA4Ff**!Njk7e&maR>da-Yjj>;j577@mpTE9Lf}$cwQNx5if?e0
z+plceXyAQ~K}1B*lYz(cdE5$>`2@BH%|+J_KZn(dx!~U-)`bTF?ch5`IFy?~(k^Qc
z{Zi4fOVW-G26%!p>u$sTVb-`AH#aAC>>63-p@ciR5JPmA=kN5(+YaC6C=ZEMUut4^
zaBj=3a=Bn0$*0{2;90OB#F_VG>b#wcdN~)xVA^8p_TS0+d^TYepe~JUkEf1+vI$F!
z>VDLG=OvG-pCUTvsyfNl3$yAx!)e!r5US)3piUg>TbN?tRA&?4wj2|`#X{0S08C+a
zFylS!=a3The_{xm5@x3a7zP*yMU%cx+WBceZ4##Q7@2fb_i@m2yx@^d%IlGiE~)vU
z7X6^DLcD+IG@@z37u&f?mO6c?<npPXZ{c6-p27e)o~KX
z5;