modelPVTQuasiDynamicCollectorValidation
Validation model of a photovoltaic–thermal (PVT) collector using the ISO 9806:2013 quasi-dynamic thermal method with integrated electrical coupling
Extends from IDEAS.Fluid.SolarCollectors.BaseClasses.PartialSolarCollector (Partial model for solar collectors).
Information
Validation model of a photovoltaic–thermal (PVT) collector using the ISO 9806:2013 quasi-dynamic thermal method with integrated electrical coupling. Discretizes the collector into segments, computes heat loss and gain per ISO 9806, and calculates electrical output via the PVWatts-based submodel, relying solely on datasheet parameters.
Extends
Submodel References
- Electrical generation: IDEAS.Fluid.PVTCollectors.BaseClasses.ElectricalPVT
- Quasi-dynamic thermal losses: IDEAS.Fluid.PVTCollectors.BaseClasses.ISO9806QuasiDynamicHeatLoss
- Solar (thermal) heat gain: see IDEAS.Fluid.PVTCollectors.Validation.PVT_UN.BaseClasses.ISO9806SolarGainHGloTil
Implementation Notes
This model is designed for (unglazed) PVT collectors and discretizes the flow path into nSeg segments to capture temperature gradients.
It is compatible with dynamic simulations in which irradiance, ambient and fluid temperatures, and wind speed vary over time.
References
- Dobos, A. P. (2014). PVWatts Version 5 Manual. NREL/TP-6A20-62641
- ISO 9806:2013. Solar thermal collectors — Test methods. ISO.
- Meertens, L., Jansen, J., Helsen, L. (2025). Development and Experimental Validation of an Unglazed Photovoltaic-Thermal Collector Modelica Model that only needs Datasheet Parameters, submitted to the 16th International Modelica & FMI Conference, Lucerne, Switzerland, Sep 8–10, 2025.
Parameters
| Type | Name | Default | Description |
|---|---|---|---|
| Boolean | homotopyInitialization (from PartialSolarCollector) | true | = true, use homotopy method |
| Integer | nSeg (from PartialSolarCollector) | 3 | Number of segments used to discretize the collector model |
| Modelica.Units.SI.Angle | azi (from PartialSolarCollector) | Surface azimuth (0 for south-facing; -90 degree for east-facing; +90 degree for west facing | |
| Modelica.Units.SI.Angle | til (from PartialSolarCollector) | Surface tilt (0 for horizontally mounted collector) | |
| Real | rho (from PartialSolarCollector) | Ground reflectance | |
| Modelica.Units.SI.HeatCapacity | CTot (from PartialSolarCollector) | if per.CTyp == IDEAS.Fluid.SolarCollectors.Types.HeatCapacity.TotalCapacity then per.C elseif per.CTyp == IDEAS.Fluid.SolarCollectors.Types.HeatCapacity.DryCapacity then per.C + rho_default*per.V*cp_default else 385*per.mDry + rho_default*per.V*cp_default | Heat capacity of solar collector with fluid |
| IDEAS.Fluid.SolarCollectors.Data.GenericASHRAE93 | per (from PartialSolarCollector) | ||
| IDEAS.Fluid.PVTCollectors.Types.CollectorType | collectorType | per.colTyp | Type of collector used to select a proper default value for the effective transmittance-absorptance product (tauAlpEff) |
| Real | tauAlpEff | if collectorType == IDEAS.Fluid.PVTCollectors.Types.CollectorType.Uncovered then 0.901 else 0.84 | Effective transmittance–absorptance product |
| Dynamics › Conservation equations | |||
| Modelica.Fluid.Types.Dynamics | energyDynamics (from LumpedVolumeDeclarations) | Modelica.Fluid.Types.Dynamics.DynamicFreeInitial | Type of energy balance: dynamic (3 initialization options) or steady state |
| Modelica.Fluid.Types.Dynamics | substanceDynamics (from LumpedVolumeDeclarations) | energyDynamics | Type of independent mass fraction balance: dynamic (3 initialization options) or steady state |
| Modelica.Fluid.Types.Dynamics | traceDynamics (from LumpedVolumeDeclarations) | energyDynamics | Type of trace substance balance: dynamic (3 initialization options) or steady state |
| Advanced › Dynamics | |||
| Modelica.Fluid.Types.Dynamics | massDynamics (from LumpedVolumeDeclarations) | energyDynamics | Type of mass balance: dynamic (3 initialization options) or steady state, must be steady state if energyDynamics is steady state |
| Initialization | |||
| Medium.AbsolutePressure | p_start (from LumpedVolumeDeclarations) | Medium.p_default | Start value of pressure |
| Medium.Temperature | T_start (from LumpedVolumeDeclarations) | Medium.T_default | Start value of temperature |
| Medium.MassFraction[Medium.nX] | X_start (from LumpedVolumeDeclarations) | Medium.X_default | Start value of mass fractions m_i/m |
| Medium.ExtraProperty[Medium.nC] | C_start (from LumpedVolumeDeclarations) | fill(0, Medium.nC) | Start value of trace substances |
| Medium.ExtraProperty[Medium.nC] | C_nominal (from LumpedVolumeDeclarations) | fill(1E-2, Medium.nC) | Nominal value of trace substances. (Set to typical order of magnitude.) |
| Dynamics | |||
| Real | mSenFac (from LumpedVolumeDeclarations) | 1 | Factor for scaling the sensible thermal mass of the volume |
| Flow resistance | |||
| Boolean | computeFlowResistance (from TwoPortFlowResistanceParameters) | true | =true, compute flow resistance. Set to false to assume no friction |
| Boolean | from_dp (from TwoPortFlowResistanceParameters) | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
| Boolean | linearizeFlowResistance (from TwoPortFlowResistanceParameters) | false | = true, use linear relation between m_flow and dp for any flow rate |
| Real | deltaM (from TwoPortFlowResistanceParameters) | 0.1 | Fraction of nominal flow rate where flow transitions to laminar |
| Nominal condition | |||
| Modelica.Units.SI.PressureDifference | dp_nominal (from TwoPortFlowResistanceParameters) | Pressure difference | |
| Modelica.Units.SI.MassFlowRate | m_flow_nominal (from PartialTwoPortInterface) | Nominal mass flow rate | |
| Assumptions | |||
| Boolean | allowFlowReversal (from PartialTwoPort) | true | = false to simplify equations, assuming, but not enforcing, no flow reversal |
| Advanced | |||
| Modelica.Units.SI.MassFlowRate | m_flow_small (from PartialTwoPortInterface) | 1E-4*abs(m_flow_nominal) | Small mass flow rate for regularization of zero flow |
| Advanced › Diagnostics | |||
| Boolean | show_T (from PartialTwoPortInterface) | false | = true, if actual temperature at port is computed |
| Shading | |||
| Boolean | use_shaCoe_in (from PartialSolarCollector) | false | Enables an input connector for shaCoe |
| Real | shaCoe (from PartialSolarCollector) | 0 | Shading coefficient. 0.0: no shading, 1.0: full shading |
| Area declarations | |||
| IDEAS.Fluid.SolarCollectors.Types.NumberSelection | nColType (from PartialSolarCollector) | IDEAS.Fluid.SolarCollectors.Types.NumberSelection.Number | Selection of area specification format |
| Integer | nPanels (from PartialSolarCollector) | 0 | Desired number of panels in the simulation |
| Modelica.Units.SI.Area | totalArea (from PartialSolarCollector) | 0 | Total area of panels in the simulation |
| Configuration declarations | |||
| IDEAS.Fluid.SolarCollectors.Types.SystemConfiguration | sysConfig (from PartialSolarCollector) | IDEAS.Fluid.SolarCollectors.Types.SystemConfiguration.Series | Selection of system configuration |
| Integer | nPanelsPar (from PartialSolarCollector) | 0 | Number of array panels in parallel |
| Electrical parameters | |||
| Modelica.Units.SI.Efficiency | eleLosFac | 0.07 | Loss factor of the PV panel(s) |
Connectors
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Fluid.Interfaces.FluidPort_a | port_a (from PartialTwoPort) | Fluid connector a (positive design flow direction is from port_a to port_b) | |
| Modelica.Fluid.Interfaces.FluidPort_b | port_b (from PartialTwoPort) | Fluid connector b (positive design flow direction is from port_a to port_b) | |
| Modelica.Blocks.Interfaces.RealInput | shaCoe_in (from PartialSolarCollector) | Shading coefficient | |
| IDEAS.BoundaryConditions.WeatherData.Bus | weaBus (from PartialSolarCollector) | Weather data bus | |
| Modelica.Blocks.Interfaces.RealOutput | Pel | Total electrical power output [W] | |
| Modelica.Blocks.Interfaces.RealOutput | Qth | Total thermal power output [W] |
Components
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Units.SI.MassFlowRate | m_flow (from PartialTwoPortInterface) | port_a.m_flow | Mass flow rate from port_a to port_b (m_flow > 0 is design flow direction) |
| Modelica.Units.SI.PressureDifference | dp (from PartialTwoPortInterface) | port_a.p - port_b.p | Pressure difference between port_a and port_b |
| Medium.ThermodynamicState | sta_a (from PartialTwoPortInterface) | if allowFlowReversal then Medium.setState_phX(port_a.p, noEvent(actualStream(port_a.h_outflow)), noEvent(actualStream(port_a.Xi_outflow))) else Medium.setState_phX(port_a.p, noEvent(inStream(port_a.h_outflow)), noEvent(inStream(port_a.Xi_outflow))) | Medium properties in port_a |
| Medium.ThermodynamicState | sta_b (from PartialTwoPortInterface) | if allowFlowReversal then Medium.setState_phX(port_b.p, noEvent(actualStream(port_b.h_outflow)), noEvent(actualStream(port_b.Xi_outflow))) else Medium.setState_phX(port_b.p, noEvent(port_b.h_outflow), noEvent(port_b.Xi_outflow)) | Medium properties in port_b |
| IDEAS.BoundaryConditions.SolarIrradiation.DiffusePerez | HDifTilIso (from PartialSolarCollector) | Diffuse solar irradiation on a tilted surface | |
| IDEAS.BoundaryConditions.SolarIrradiation.DirectTiltedSurface | HDirTil (from PartialSolarCollector) | Direct solar irradiation on a tilted surface | |
| IDEAS.Fluid.Sensors.MassFlowRate | senMasFlo (from PartialSolarCollector) | Mass flow rate sensor | |
| IDEAS.Fluid.FixedResistances.PressureDrop | res (from PartialSolarCollector) | Flow resistance | |
| IDEAS.Fluid.MixingVolumes.MixingVolume[nSeg] | vol (from PartialSolarCollector) | Volume of fluid in one segment of the solar collector | |
| Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor[nSeg] | temSen (from PartialSolarCollector) | Temperature sensor | |
| Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow[nSeg] | QGai (from PartialSolarCollector) | Rate of solar heat gain | |
| Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow[nSeg] | QLos (from PartialSolarCollector) | Rate of heat loss | |
| Modelica.Units.SI.HeatFlux[nSeg] | qThSeg | Thermal power per segment | |
| Modelica.Blocks.Sources.CombiTimeTable | meaDat | ||
| IDEAS.Fluid.PVTCollectors.Validation.BaseClasses.ISO9806QuasiDynamicHeatLossValidation | heaLosStc | Calculates the heat lost to the surroundings using the ISO 9806:2013 quasi-dynamic standard calculations | |
| IDEAS.Fluid.PVTCollectors.Validation.BaseClasses.ISO9806SolarGainHGloTil | solGaiStc | Calculates the heat from the sun using the ISO 9806:2013 quasi-dynamic standard calculations | |
| IDEAS.Fluid.PVTCollectors.BaseClasses.ElectricalPVT | eleGen | Calculates the electrical power output of the PVT model | |
| Modelica.Blocks.Sources.RealExpression | Gglob | [W/m2] | |
| Modelica.Blocks.Sources.RealExpression | globIrrTil | [W/m2] | |
| Modelica.Blocks.Sources.RealExpression | winSpe | [W/m2] | |
| Modelica.Blocks.Sources.RealExpression | HHorIr | [W/m2] | |
| Modelica.Thermal.HeatTransfer.Celsius.ToKelvin | TFluKel | ||
| Modelica.Blocks.Sources.RealExpression | qThSegExp |
Revisions
-
July 7, 2025, by Lone Meertens:
First implementation PVT model. This is for #1436.