diff --git a/.gitattributes b/.gitattributes
index 605ab25eef..ef7fd0c800 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,6 +3,7 @@
# Explicitly declare text files we want to always be normalized and converted
# to native line endings on checkout.
*.mo text
+*.mos text
*.mop text
*.py text
*.txt text
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/EN12975HeatLoss_QuasiDynamic.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/EN12975HeatLoss_QuasiDynamic.mo
deleted file mode 100644
index fdebf069e5..0000000000
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/EN12975HeatLoss_QuasiDynamic.mo
+++ /dev/null
@@ -1,67 +0,0 @@
-within IDEAS.Fluid.PvtCollectors.BaseClasses;
-model EN12975HeatLoss_QuasiDynamic
- "Model to calculate the quasi-dynamic heat loss of a pvt/solar collector following the ISO 9806:2013 quasi-dynamic method"
- extends Modelica.Blocks.Icons.Block;
-
- replaceable package Medium = Modelica.Media.Interfaces.PartialMedium
- "Medium in the system";
- parameter Integer nSeg = 3 "Number of segments";
-
- parameter Real c1(final unit="W/(m2.K)", final min=0)
- "Linear heat loss coefficient";
- parameter Real c2(final unit="W/(m2.K2)", final min=0)
- "Quadratic heat loss coefficient";
- parameter Real c3(final unit="J/(m3.K)", final min=0)
- "Windspeed dependence of heat losses";
- parameter Real c4(final unit="", final min=0)
- "Sky temperature dependence of the heat-loss coefficient";
- parameter Real c6(final unit="s/m", final min=0)
- "Windspeed dependence of zero-loss efficiency";
- parameter Real A_c(final unit="m2", final min=0)
- "Collector gross area";
-
- Modelica.Blocks.Interfaces.RealOutput QLos_flow[nSeg]
- "Limited heat loss rate at current conditions"
- annotation (Placement(transformation(extent={{100,-10},{120,10}})));
-
- Modelica.Blocks.Interfaces.RealInput G
- "Global solar irradiance [W/m2]"
- annotation (Placement(transformation(extent={{-140,-34},{-100,6}})));
-
- Modelica.Blocks.Interfaces.RealInput TFlu[nSeg]
- "Temperature of the heat transfer fluid [K]"
- annotation (Placement(transformation(extent={{-140,-64},{-100,-24}})));
-
- Modelica.Blocks.Interfaces.RealInput windSpePlane
- "Wind speed normal to collector plane (m/s)"
- annotation (Placement(transformation(extent={{-140,-92},{-100,-52}})));
-
- IDEAS.BoundaryConditions.WeatherData.Bus WeaBus
- "Bus with weather data"
- annotation (Placement(transformation(extent={{-114,62},{-94,82}})));
-
- IDEAS.Fluid.PvtCollectors.BaseClasses.PartialEN12975HeatLoss_QuasiDynamic partialLoss(
- redeclare package Medium = IDEAS.Media.Water,
- nSeg=nSeg,
- c1=c1,
- c2=c2,
- c3=c3,
- c4=c4,
- c6=c6,
- A_c=A_c) annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
-
-equation
- connect(TFlu, partialLoss.TFlu);
- connect(G, partialLoss.G);
- connect(partialLoss.TEnv, WeaBus.TDryBul);
- connect(partialLoss.E_L, WeaBus.HHorIR);
- connect(partialLoss.u, windSpePlane);
- connect(partialLoss.QLos_flow, QLos_flow);
-
- annotation (
- Icon(coordinateSystem(preserveAspectRatio=false)),
- Diagram(coordinateSystem(preserveAspectRatio=false)),
- Documentation(info="
-
Model to calculate the quasi-dynamic heat loss of a pvt/solar collector following the ISO 9806:2013 quasi-dynamic method.
-"));
-end EN12975HeatLoss_QuasiDynamic;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/EN12975HeatLoss_SteadyState.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/EN12975HeatLoss_SteadyState.mo
deleted file mode 100644
index ff36bd8ce4..0000000000
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/EN12975HeatLoss_SteadyState.mo
+++ /dev/null
@@ -1,89 +0,0 @@
-within IDEAS.Fluid.PvtCollectors.BaseClasses;
-block EN12975HeatLoss_SteadyState
- "Calculate the steady-state heat loss of a solar collector per EN12975"
- extends IDEAS.Fluid.SolarCollectors.BaseClasses.PartialHeatLoss(
- QLos_internal = A_c/nSeg * {dT[i] * (c1 - c2 * dT[i]) for i in 1:nSeg});
-
- parameter Modelica.Units.SI.CoefficientOfHeatTransfer c1(final min=0)
- "c2 from ratings data";
-
- parameter Real c2(final unit = "W/(m2.K2)", final min=0)
- "c2 from ratings data";
-
-annotation (
-defaultComponentName="heaLos",
-Documentation(info="
-
-This component computes the heat loss from the solar thermal collector
-to the environment. It is designed anticipating ratings data collected in
-accordance with EN12975. A negative heat loss indicates that heat
-is being lost to the environment.
-
-
-This model calculates the heat loss to the ambient, for each
-segment i ∈ {1, ..., nseg}
-where nseg is the number of segments, as
-
-
-Qlos,i = Ac ⁄ nseg
-(Tenv-Tflu,i) (a1 - a2
- (Tenv-Tflu,i))
-
-
-where
-a1 > 0 is the heat loss coefficient
-from EN12975 ratings data,
-a2 ≥ 0 is the temperature dependence of heat loss
-from EN12975 ratings data,
-Ac is the collector area,
-Tenv is the environment temperature and
-Tflu,i is the fluid temperature in segment
-i ∈ {1, ..., nseg}.
-
-
-This model reduces the heat loss rate to 0 when the fluid temperature is within
-1 Kelvin of the minimum temperature of the medium model. The calculation is
-performed using the
-
-IDEAS.Utilities.Math.Functions.smoothHeaviside function.
-
-Implementation
-
-EN 12975 uses the arithmetic average temperature of the collector fluid inlet
-and outlet temperature to compute the heat loss (see Duffie and Beckmann, p. 293).
-However, unless the environment temperature that was present during the collector rating
-is known, which is not the case, one cannot compute
-a log mean temperature difference that would improve the UA calculation. Hence,
-this model is using the fluid temperature of each segment
-to compute the heat loss to the environment.
-If the arithmetic average temperature were used, then segments at the collector
-outlet could be cooled below the ambient temperature, which violates the 2nd law
-of Thermodynamics.
-
-
-References
-
-CEN 2006, European Standard 12975-1:2006, European Committee for Standardization
-
-", revisions="
-
--
-February 15, 2024, by Jelger Jansen:
-Refactor model.
-This is for
-Buildings, #3604.
-
--
-December 17, 2017, by Michael Wetter:
-Revised computation of heat loss.
-This is for
-
-issue 1100.
-
--
-Jan 16, 2012, by Peter Grant:
-First implementation
-
-
-"));
-end EN12975HeatLoss_SteadyState;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/ElectricalPVT.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/ElectricalPVT.mo
new file mode 100644
index 0000000000..04fa035031
--- /dev/null
+++ b/IDEAS/Fluid/PvtCollectors/BaseClasses/ElectricalPVT.mo
@@ -0,0 +1,216 @@
+within IDEAS.Fluid.PVTCollectors.BaseClasses;
+model ElectricalPVT "Visible block to compute electrical power output using PVWatts v5 approach"
+ extends Modelica.Blocks.Icons.Block;
+ extends SolarCollectors.BaseClasses.PartialParameters;
+ // Parameters
+ parameter Integer nSeg = 1 "Number of segments";
+ parameter Modelica.Units.SI.Irradiance HGloHorNom = 1000 "Nominal global irradiance";
+ parameter Modelica.Units.SI.Efficiency pLossFactor = 0.10 "PV loss factor";
+ parameter Modelica.Units.SI.Temperature TpvtRef = 298.15 "Reference cell temperature [K]";
+ parameter Real gamma "Temperature coefficient [1/K]";
+ parameter Real P_nominal "Nominal PV power [W]";
+ parameter Real A "PV area [m2]";
+ parameter Real eta0 "Zero-loss efficiency";
+ parameter Real tauAlphaEff "Effective transmittance–absorptance product";
+ parameter Real c1 "First-order heat loss coefficient";
+ parameter Real etaEl "Electrical efficiency";
+
+ final parameter Modelica.Units.SI.CoefficientOfHeatTransfer UAbsFluid =
+ ((tauAlphaEff - etaEl) * (c1 + abs(gamma)*HGloHorNom))
+ / ((tauAlphaEff - etaEl) - eta0)
+ "Heat transfer coefficient between the fluid and the PV cells, calculated from datasheet parameters";
+
+ // Inputs
+ Modelica.Blocks.Interfaces.RealInput Tm[nSeg]
+ "Fluid temperatures per segment [K]"
+ annotation (Placement(transformation(extent={{-140,40},{-100,80}}),
+ iconTransformation(extent={{-140,40},{-100,80}})));
+ Modelica.Blocks.Interfaces.RealInput qth[nSeg]
+ "Thermal power density per segment [W/m2]"
+ annotation (Placement(transformation(extent={{-140,-20},{-100,20}}),
+ iconTransformation(extent={{-140,-20},{-100,20}})));
+ Modelica.Blocks.Interfaces.RealInput HGloTil
+ "Global tilted irradiance [W/m2]"
+ annotation (Placement(transformation(extent={{-140,-80},{-100,-40}}),
+ iconTransformation(extent={{-140,-80},{-100,-40}})));
+
+ // Outputs
+ Modelica.Blocks.Interfaces.RealOutput pEl
+ "Total electrical power output [W/m2]"
+ annotation (Placement(transformation(extent={{100,40},{140,80}}),
+ iconTransformation(extent={{100,40},{140,80}})));
+ Modelica.Blocks.Interfaces.RealOutput temMod
+ "Average cell temperature [K]"
+ annotation (Placement(transformation(extent={{100,-20},{140,20}}),
+ iconTransformation(extent={{100,-20},{140,20}})));
+ Modelica.Blocks.Interfaces.RealOutput temMea
+ "Average fluid temperature [K]"
+ annotation (Placement(transformation(extent={{100,-80},{140,-40}}),
+ iconTransformation(extent={{100,-80},{140,-40}})));
+
+protected
+ Real temCell[nSeg];
+ Real temDiff[nSeg];
+ Real solarPowerInternal[nSeg];
+
+equation
+ for i in 1:nSeg loop
+ temCell[i] = Tm[i] + qth[i] / UAbsFluid;
+ temDiff[i] = temCell[i] - TpvtRef;
+ solarPowerInternal[i] = (A_c/nSeg) * (P_nominal/A) * (HGloTil/HGloHorNom) *
+ (1 + gamma * temDiff[i]) * (1 - pLossFactor);
+ end for;
+
+ pEl = sum(solarPowerInternal);
+ temMod = sum(temCell)/nSeg;
+ temMea = sum(Tm)/nSeg;
+
+annotation (
+ defaultComponentName="eleGen",
+ Documentation(info="
+
+This component computes the electrical power output of a photovoltaic-thermal (PVT) collector using the PVWatts v5 methodology (Dobos, 2014), adapted for PVT systems. It is part of a validated, open-source Modelica implementation that relies solely on manufacturer datasheet parameters, as described in Meertens et al. (2025).
+
+
+
+The model calculates the electrical output for each segment i ∈ {1, ..., nseg} as:
+
+
+
+Pel,i = (Ac / nseg) · (Pnom / A) · (Gtilt / Gnom) · (1 + γ · ΔTi) · (1 - pLossFactor)
+
+
+
+where:
+
+ - ΔTi = Tcell,i - Tref: temperature difference between PV cell and reference temperature
+ - Pnom: nominal PV power under STC [W]
+ - A: gross collector area [m²]
+ - Ac: effective collector area (equal to A if not otherwise specified)
+ - Gtilt: global irradiance on the tilted collector plane [W/m²]
+ - Gnom: nominal irradiance (typically 1000 W/m²)
+ - γ: temperature coefficient of power [%/K]
+ - pLossFactor: lumped system loss factor
+
+
+
+The PV cell temperature is estimated from the fluid temperature and thermal power density using:
+
+
+Tcell,i = Tm,i + qth,i / UAbsFluid
+
+
+ The internal heat transfer coefficient UAbsFluid is approximately calculated from datasheet parameters:
+
+
+
UAbsFluid =
+
+
+ |
+ (τ·α)eff – η0,el · (c1 + c3·u + b1,el)
+ |
+
+
+ |
+ (τ·α)eff – η0,el
+ – (1 – c6/η0,th·u) · η0,th
+ |
+
+
+
+
+ -
+ Here, (τ·α)eff = 0.901 for unglazed PVT collectors as reported in Lämmle (2018), and = 0.84 for covered collectors.
+
+ -
+ The electrical temperature‑dependence term is b1,el = |β| · Gnom, where β is the temperature coefficient of power (in % K−1) and Gnom = 1000 W m−2.
+
+ -
+ u is the in‑plane wind speed. In this approximation,
u = 0 is used to derive UAbsFluid—the internal heat transfer coefficient is only weakly dependent on external wind speed when the datasheet thermal parameters are accurate (Stegmann 2011).
+
+
+Electrical performance and losses
+
+The electrical submodel includes an overall system loss factor pLossFactor. NREL’s PVWatts reports a total electrical power loss of 14%, resulting from the following mechanisms:
+
+
+
+ | Electrical power loss mechanism |
+ Default value |
+
+
+ | Soiling |
+ 2 % |
+
+
+ | Shading |
+ 3 % |
+
+
+ | Mismatch |
+ 2 % |
+
+
+ | Wiring |
+ 2 % |
+
+
+ | Connections |
+ 0.5 % |
+
+
+ | Light‑induced degradation |
+ 1.5 % |
+
+
+ | Nameplate rating |
+ 1 % |
+
+
+ | Availability |
+ 3 % |
+
+
+ | Total |
+ 14 % |
+
+
+
+ For well-maintained, unshaded modules, experimental validation (Meertens et al., 2025)
+found that using pLossFactor = 9 % gives excellent agreement with
+measured electrical output. For PVT collectors with high positive tolerance on the
+electrical output, this system loss factor can even be reduced more.
+Users may adjust pLossFactor to account for site-specific soiling or shading effects.
+
+Implementation Notes
+
+This model is designed for (unglazed) PVT collectors and supports discretization into multiple segments to capture temperature gradients along the flow path. It is compatible with the thermal
+model based on ISO 9806:2013 and is suitable for dynamic simulations where irradiance and fluid temperatures vary over time.
+
+
+References
+
+ -
+ Dobos, A.P., PVWatts Version 5 Manual, NREL, 2014
+
+ -
+ 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.
+
+ -
+ ISO 9806:2013, Solar energy — Solar thermal collectors — Test methods
+
+
+",
+revisions="
+
+ -
+ July 7, 2025, by Lone Meertens:
+ First implementation PVT model; tracked in
+
+ IDEAS #1436
+ .
+
+
+"));
+
+end ElectricalPVT;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/EN12975HeatLoss_QD.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/EN12975HeatLoss_QD.mo
deleted file mode 100644
index 8c63fcb508..0000000000
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/EN12975HeatLoss_QD.mo
+++ /dev/null
@@ -1,79 +0,0 @@
-within IDEAS.Fluid.PvtCollectors.BaseClasses.Examples;
-model EN12975HeatLoss_QD "Example showing the use of EN12975HeatLoss_QuasiDynamic"
- extends Modelica.Icons.Example;
- parameter IDEAS.Fluid.PvtCollectors.Data.GenericQuasiDynamic per=
- IDEAS.Fluid.PvtCollectors.Data.Uncovered.UI_TRNSYSValidation()
- "Performance data" annotation (choicesAllMatching=true);
- Modelica.Blocks.Sources.Sine T1(
- amplitude=15,
- f=0.1,
- offset=273.15 + 10) "Temperature of the first segment"
- annotation (Placement(transformation(extent={{30,-90},{50,-70}})));
- Modelica.Blocks.Sources.Sine T2(
- f=0.1,
- amplitude=15,
- offset=273.15 + 15) "Temperature of the second segment"
- annotation (Placement(transformation(extent={{-10,-70},{10,-50}})));
- Modelica.Blocks.Sources.Sine T3(
- f=0.1,
- amplitude=15,
- offset=273.15 + 20) "Temperature of the third segment"
- annotation (Placement(transformation(extent={{-50,-50},{-30,-30}})));
- BaseClasses.EN12975HeatLoss_QuasiDynamic eN12975HeatLoss_QuasiDynamic(
- nSeg=3,
- redeclare package Medium = IDEAS.Media.Water,
- a1=per.a1,
- a2=per.a2,
- c3=per.c3,
- c4=per.c4,
- c6=per.c6,
- A_c=per.A) annotation (Placement(transformation(extent={{74,12},{94,32}})));
- BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam=
- Modelica.Utilities.Files.loadResource("modelica://IDEAS/Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.mos"))
- "Weather data input file"
- annotation (Placement(transformation(extent={{-84,70},{-64,90}})));
- Modelica.Blocks.Sources.RealExpression globIrrTil(y=600) "[W/m2]"
- annotation (Placement(transformation(extent={{-47.5,26},{-28.5,42}})));
-equation
- connect(weaDat.weaBus, eN12975HeatLoss_QuasiDynamic.WeaBus) annotation (Line(
- points={{-64,80},{68,80},{68,29.2},{73.6,29.2}},
- color={255,204,51},
- thickness=0.5));
- connect(eN12975HeatLoss_QuasiDynamic.G, globIrrTil.y) annotation (Line(points={{72,20.6},
- {-24,20.6},{-24,34},{-27.55,34}}, color={0,0,127}));
- connect(T3.y, eN12975HeatLoss_QuasiDynamic.TFlu[1]) annotation (Line(points={{-29,-40},
- {62,-40},{62,16.9333},{72,16.9333}}, color={0,
- 0,127}));
- connect(T2.y, eN12975HeatLoss_QuasiDynamic.TFlu[2]) annotation (Line(points={{11,-60},
- {62,-60},{62,17.6},{72,17.6}},
- color={0,0,127}));
- connect(T1.y, eN12975HeatLoss_QuasiDynamic.TFlu[3]) annotation (Line(points={{51,-80},
- {62,-80},{62,18.2667},{72,18.2667}},
- color={0,0,127}));
- annotation (
- Documentation(info="
-
-This examples demonstrates the implementation of
-
-IDEAS.Fluid.SolarCollectors.BaseClasses.EN12975HeatLoss.
-
-",
-revisions="
-
--
-February 15, 2024, by Jelger Jansen:
-Refactor model.
-This is for
-Buildings, #3604.
-
--
-Mar 27, 2013 by Peter Grant:
-First implementation.
-
-
- "),
- __Dymola_Commands(file=
- "modelica://IDEAS/Resources/Scripts/Dymola/Fluid/SolarCollectors/BaseClasses/Examples/EN12975HeatLoss.mos"
- "Simulate and plot"),
- experiment(Tolerance=1e-6, StopTime=100));
-end EN12975HeatLoss_QD;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/ISO9806HeatLoss.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/ISO9806HeatLoss.mo
new file mode 100644
index 0000000000..6a92ff5e3a
--- /dev/null
+++ b/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/ISO9806HeatLoss.mo
@@ -0,0 +1,122 @@
+within IDEAS.Fluid.PVTCollectors.BaseClasses.Examples;
+model ISO9806HeatLoss
+ "Example showing the use of ISO9806QuasiDynamicHeatLoss"
+ extends Modelica.Icons.Example;
+ parameter IDEAS.Fluid.PVTCollectors.Data.GenericQuasiDynamic per=
+ IDEAS.Fluid.PVTCollectors.Data.Uncovered.UI_Validation()
+ "Performance data" annotation (choicesAllMatching=true);
+ Modelica.Blocks.Sources.Sine T1(
+ amplitude=15,
+ f=0.1,
+ offset=273.15 + 10) "Temperature of the first segment"
+ annotation (Placement(transformation(extent={{-92,-22},{-72,-2}})));
+ Modelica.Blocks.Sources.Sine T2(
+ f=0.1,
+ amplitude=15,
+ offset=273.15 + 15) "Temperature of the second segment"
+ annotation (Placement(transformation(extent={{-68,-36},{-48,-16}})));
+ Modelica.Blocks.Sources.Sine T3(
+ f=0.1,
+ amplitude=15,
+ offset=273.15 + 20) "Temperature of the third segment"
+ annotation (Placement(transformation(extent={{-90,-52},{-70,-32}})));
+ ISO9806QuasiDynamicHeatLoss heaLosQuaDyn(
+ nSeg=3,
+ redeclare package Medium = IDEAS.Media.Water,
+ c1=per.c1,
+ c2=per.c2,
+ c3=per.c3,
+ c4=per.c4,
+ c6=per.c6,
+ A_c=per.A) annotation (Placement(transformation(extent={{18,-2},{38,18}})));
+
+ SolarCollectors.BaseClasses.EN12975HeatLoss heaLosSteSta(
+ A_c=per.A,
+ nSeg=3,
+ redeclare package Medium = IDEAS.Media.Water,
+ a1=per.c1,
+ a2=per.c2)
+ annotation (Placement(transformation(extent={{18,-68},{38,-48}})));
+ Modelica.Blocks.Sources.Sine TEnv(
+ f=0.01,
+ offset=273.15 + 10,
+ amplitude=15) "Temperature of the surrounding environment"
+ annotation (Placement(transformation(extent={{-80,24},{-60,44}})));
+ Modelica.Blocks.Sources.Sine winSpePla(
+ f=1/(24*3600),
+ phase=0,
+ offset=3,
+ amplitude=5) "wind speed in the collector plane"
+ annotation (Placement(transformation(extent={{60,58},{80,78}})));
+ Modelica.Blocks.Sources.RealExpression HHorIR(y=400) "long wave irradiance"
+ annotation (Placement(transformation(extent={{-1.5,58},{17.5,74}})));
+ Modelica.Blocks.Interfaces.RealOutput QLos_flow_QuaDyn[3]
+ "Limited heat loss rate at current conditions"
+ annotation (Placement(transformation(extent={{60,-2},{80,18}})));
+ Modelica.Blocks.Interfaces.RealOutput QLos_flow_SteSta[3]
+ "Limited heat loss rate at current conditions"
+ annotation (Placement(transformation(extent={{62,-68},{82,-48}})));
+ Modelica.Blocks.Sources.RealExpression HGloTil(y=800) "long wave irradiance"
+ annotation (Placement(transformation(extent={{26.5,58},{45.5,74}})));
+equation
+ connect(winSpePla.y, heaLosQuaDyn.winSpePla);
+ connect(HHorIR.y, heaLosQuaDyn.HHorIR);
+ connect(HGloTil.y, heaLosQuaDyn.HGloTil);
+ connect(T3.y, heaLosQuaDyn.TFlu[3]) annotation (Line(points={{-69,-42},{-44,-42},
+ {-44,2},{-20,2},{-20,2.66667},{16,2.66667}},
+ color={0,0,127}));
+ connect(T2.y, heaLosQuaDyn.TFlu[2]) annotation (Line(points={{-47,-26},{-44,-26},
+ {-44,2},{16,2}}, color={0,0,127}));
+ connect(TEnv.y, heaLosQuaDyn.TEnv) annotation (Line(points={{-59,34},{8,34},{8,
+ 14},{16,14}}, color={0,0,127}));
+ connect(heaLosSteSta.TEnv, TEnv.y) annotation (Line(points={{16,-52},{8,-52},{
+ 8,34},{-59,34}}, color={0,0,127}));
+ connect(T1.y, heaLosSteSta.TFlu[1]) annotation (Line(points={{-71,-12},{-68,
+ -12},{-68,2},{-44,2},{-44,-64.6667},{16,-64.6667}},
+ color={0,0,127}));
+ connect(T2.y, heaLosSteSta.TFlu[2]) annotation (Line(points={{-47,-26},{-44,-26},
+ {-44,-64},{16,-64}}, color={0,0,127}));
+ connect(T3.y, heaLosSteSta.TFlu[3]) annotation (Line(points={{-69,-42},{-44,
+ -42},{-44,-63.3333},{16,-63.3333}},
+ color={0,0,127}));
+ connect(T1.y, heaLosQuaDyn.TFlu[1]) annotation (Line(points={{-71,-12},{-68,-12},
+ {-68,1.33333},{16,1.33333}}, color={0,0,127}));
+ connect(heaLosQuaDyn.QLos_flow, QLos_flow_QuaDyn)
+ annotation (Line(points={{39,8},{70,8}}, color={0,0,127}));
+ connect(heaLosSteSta.QLos_flow, QLos_flow_SteSta)
+ annotation (Line(points={{39,-58},{72,-58}}, color={0,0,127}));
+ annotation (
+ Documentation(info="
+
+This example demonstrates the implementation of
+
+IDEAS.Fluid.PVTCollectors.BaseClasses.ISO9806QuasiDynamicHeatLoss,
+which calculates the quasi-dynamic heat loss of a PVT or solar thermal collector
+according to the ISO 9806:2013 standard.
+
+
+
+In addition to showcasing the ISO 9806-based model, this example also compares its behavior
+to the steady-state heat loss model
+
+IDEAS.Fluid.SolarCollectors.BaseClasses.EN12975HeatLoss,
+which is based on the now-superseded EN 12975 standard.
+
+
+
+This comparison highlights the differences between the steady-state and quasi-dynamic
+approaches, particularly in how they account for environmental factors such as wind speed
+and long-wave irradiance.
+
+",
+revisions="
+
+-
+July 2, 2025, by Lone Meertens:
+First implementation of ISO 9806 quasi-dynamic heat loss example.
+This is for
+IDEAS, #1436.
+
+
+"), experiment(Tolerance=1e-6, StopTime=100));
+end ISO9806HeatLoss;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.mo
index 42319f94c8..1d672686e4 100644
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.mo
+++ b/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.mo
@@ -1,4 +1,4 @@
-within IDEAS.Fluid.PvtCollectors.BaseClasses;
+within IDEAS.Fluid.PVTCollectors.BaseClasses;
package Examples
"Collection of models that illustrate model use and test models"
extends Modelica.Icons.ExamplesPackage;
@@ -6,8 +6,19 @@ extends Modelica.Icons.ExamplesPackage;
annotation (preferredView="info", Documentation(info="
This package contains examples for the use of models that can be found in
-
+
IDEAS.Fluid.PvtCollectors.BaseClasses.
+",
+revisions="
+
+ -
+ July 7, 2025, by Lone Meertens:
+ First implementation PVT model; tracked in
+
+ IDEAS #1436
+ .
+
+
"));
end Examples;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.order b/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.order
index cd85418950..8a06bfc919 100644
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.order
+++ b/IDEAS/Fluid/PvtCollectors/BaseClasses/Examples/package.order
@@ -1 +1 @@
-EN12975HeatLoss_QD
+ISO9806HeatLoss
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/ISO9806QuasiDynamicHeatLoss.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/ISO9806QuasiDynamicHeatLoss.mo
new file mode 100644
index 0000000000..26b9d1e5bb
--- /dev/null
+++ b/IDEAS/Fluid/PvtCollectors/BaseClasses/ISO9806QuasiDynamicHeatLoss.mo
@@ -0,0 +1,115 @@
+within IDEAS.Fluid.PVTCollectors.BaseClasses;
+model ISO9806QuasiDynamicHeatLoss
+ "Calculate the heat loss of a PVT/solar collector per ISO9806:2013"
+
+ extends IDEAS.Fluid.SolarCollectors.BaseClasses.EN12975HeatLoss(
+ // Override the internal heat-loss expression to include c3, c4 and c6 terms
+ QLos_internal=A_c/nSeg*{dT[i]*(c1 - c2*dT[i] + c3*winSpePla) + c4*(HHorIR
+ - sigma*TEnv^4) - c6*winSpePla*HGloTil for i in 1:nSeg},
+ // Map original a1, a2 to renamed c1, c2
+ a1=c1,
+ a2=c2);
+
+ // —— Renamed EN12975 coefficients ——
+ parameter Modelica.Units.SI.CoefficientOfHeatTransfer c1(final min=0)
+ "Linear heat loss coefficient (alias for a1)";
+ parameter Real c2(final unit="W/(m2.K2)", final min=0)
+ "Quadratic heat loss coefficient (alias for a2)";
+
+ // —— Additional quasi-dynamic coefficients ——
+ parameter Modelica.Units.SI.SpecificHeatCapacity c3(final min=0)
+ "Wind-speed dependence of heat loss";
+ parameter Modelica.Units.SI.DimensionlessRatio c4(final min=0)
+ "Sky long-wave irradiance dependence";
+ parameter Real c6(final unit="s/m", final min=0)
+ "Windspeed dependence of thermal zero-loss efficiency";
+
+ // —— Physical constant ——
+ parameter Real sigma = 5.67e-8
+ "Stefan–Boltzmann constant [W/m².K⁴]";
+
+ // Quasi-dynamic inputs
+ Modelica.Blocks.Interfaces.RealInput winSpePla(
+ quantity="Windspeed",
+ unit="m/s",
+ displayUnit="m/s")
+ "Wind speed normal to collector plane";
+ Modelica.Blocks.Interfaces.RealInput HGloTil(
+ quantity="Global solar irradiance",
+ unit="W/m2",
+ displayUnit="W/m2")
+ "Global irradiance on tilted plane";
+ Modelica.Blocks.Interfaces.RealInput HHorIR(
+ quantity="Long-wave solar irradiance",
+ unit="W/m2",
+ displayUnit="W/m2") "Long-wave (sky) irradiance [W/m2]" annotation (
+ Placement(transformation(
+ extent={{-20,-20},{20,20}},
+ rotation=0,
+ origin={-120,0}), iconTransformation(extent={{-140,-20},{-100,20}})));
+
+annotation (
+defaultComponentName="heaLosStc",
+Documentation(info="
+
+This component computes the quasi-dynamic heat loss from a solar thermal or PVT collector
+to the environment, following the methodology described in the international standard
+ISO 9806:2013. It extends the original EN12975HeatLoss model for code reuse,
+but implements the more comprehensive quasi-dynamic formulation.
+
+
+
+The heat loss is calculated for each segment i ∈ {1, ..., nseg} as:
+
+
+
+Qlos,i = Ac / nseg · [ΔTi · (c1 - c2 · ΔTi + c3 · u) + c4 · (EL - σ · Tenv4) - c6 · u · G]
+
+
+
+where:
+
+ - ΔTi = Tenv - Tflu,i: temperature difference between environment and fluid in segment i
+ - c1: linear heat loss coefficient (alias for
a1)
+ - c2: quadratic heat loss coefficient (alias for
a2)
+ - c3: wind-speed dependence of heat loss
+ - c4: sky long-wave irradiance dependence
+ - c6: windspeed dependence of thermal zero-loss efficiency
+ - u: wind speed normal to the collector plane
+ - EL: long-wave irradiance from the sky
+ - G: global solar irradiance on the tilted collector plane
+ - σ: Stefan–Boltzmann constant (5.67×10⁻⁸ W/m²·K⁴)
+
+
+
+
+This model provides a more accurate representation of collector heat loss under dynamic environmental conditions,
+as required by ISO 9806:2013. It is suitable for use in simulations where wind speed, sky radiation, and irradiance
+vary over time.
+
+
+Implementation Notes
+
+The model inherits from IDEAS.Fluid.SolarCollectors.BaseClasses.EN12975HeatLoss for structural consistency and reuse of base functionality,
+but the naming and equations have been updated to reflect the ISO 9806 standard. Parameters a1 and a2
+are internally mapped to c1 and c2 for clarity.
+
+
+References
+
+ISO 9806:2013, Solar energy — Solar thermal collectors — Test methods
+Duffie, J.A., and Beckman, W.A., Solar Engineering of Thermal Processes, 4th ed., Wiley, 2013
+
+",
+revisions="
+
+ -
+ July 7, 2025, by Lone Meertens:
+ First implementation PVT model; tracked in
+
+ IDEAS #1436
+ .
+
+
+"));
+end ISO9806QuasiDynamicHeatLoss;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/PartialEN12975HeatLoss_QuasiDynamic.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/PartialEN12975HeatLoss_QuasiDynamic.mo
deleted file mode 100644
index 2b16f07e5a..0000000000
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/PartialEN12975HeatLoss_QuasiDynamic.mo
+++ /dev/null
@@ -1,55 +0,0 @@
-within IDEAS.Fluid.PvtCollectors.BaseClasses;
-block PartialEN12975HeatLoss_QuasiDynamic
- "Model to calculate the quasi-dynamic heat loss of a pvt/solar collector following the ISO 9806:2013 quasi-dynamic method"
- extends IDEAS.Fluid.PvtCollectors.BaseClasses.EN12975HeatLoss_SteadyState(
- QLos_internal=A_c/nSeg*{dT[i] * (c1 - c2 * dT[i] + c3*u) + c4*(E_L - sigma*TEnv^4) -
- c6*u*G for i in 1:nSeg});
-
-// Constants
- parameter Real c3(final unit = "J/(m3.K)", final min=0) "a3 from ratings data";
- parameter Real c4(final unit = "", final min=0) "c4 from ratings data";
- parameter Real c6(final unit = "J/(m3.K)", final min=0) "c6 from ratings data";
- parameter Real sigma = 5.67e-8 "Stefan-Boltzmann constant [W/m²K^4]";
-
- // Inputs
- Modelica.Blocks.Interfaces.RealInput u(
- quantity="Windspeed",
- unit="m/s",
- displayUnit="m/s") "windspeed of surrounding air"
- annotation (Placement(transformation(extent={{-142,0},{-100,42}}),
- iconTransformation(extent={{-142,0},{-100,42}})));
- Modelica.Blocks.Interfaces.RealInput E_L(
- quantity="long-wave solar irradiance",
- unit="W/m2",
- displayUnit="W/m2") "Long-wave solar irradiance [W/m2]" annotation (Placement(
- transformation(extent={{-21,-21},{21,21}},
- rotation=0,
- origin={-121,-99}), iconTransformation(
- extent={{-142,-120},{-100,-78}})));
-
- Modelica.Blocks.Interfaces.RealInput G(
- quantity="Global solar irradiance",
- unit="W/m2",
- displayUnit="W/m2") "global solar irradiance [W/m2]" annotation (Placement(
- transformation(extent={{-21,-21},{21,21}},
- rotation=0,
- origin={-121,-21}), iconTransformation(
- extent={{-140,-42},{-98,0}})));
-
- // Internal variables to be visible in simulation results
- Real c1_c2_term(unit="W");
- Real c3_term(unit="W");
- Real c4_term(unit="W");
- Real c6_term(unit="W");
-
- // Equations for terms
-equation
- c1_c2_term = sum(A_c/nSeg*{dT[i]*(c1 - c2*dT[i]) for i in 1:nSeg});
- c3_term = sum(A_c/nSeg*{dT[i]*(c3*u) for i in 1:nSeg});
- c4_term = sum(A_c/nSeg*{c4*(E_L - sigma*TEnv^4) for i in 1:nSeg});
- c6_term = sum(A_c/nSeg*{(-1)* c6*u*G for i in 1:nSeg});
-
- annotation (Documentation(info="
-Model to calculate the quasi-dynamic heat loss of a pvt/solar collector following the ISO 9806:2013 quasi-dynamic method.
-"));
-end PartialEN12975HeatLoss_QuasiDynamic;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/PartialPvtCollector.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/PartialPvtCollector.mo
deleted file mode 100644
index f3007f069a..0000000000
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/PartialPvtCollector.mo
+++ /dev/null
@@ -1,88 +0,0 @@
-within IDEAS.Fluid.PvtCollectors.BaseClasses;
-model PartialPvtCollector
- "Extended partial solar (thermal) collector with discretized PV electrical calculations"
- extends IDEAS.Fluid.SolarCollectors.BaseClasses.PartialSolarCollector(
- redeclare IDEAS.Fluid.PvtCollectors.Data.GenericQuasiDynamic per);
-
- // ===== Parameters =====
- final parameter Modelica.Units.SI.Irradiance Gstc = 1000
- "Irradiance at Standard Conditions (W/m2)";
- parameter Modelica.Units.SI.Efficiency pLossFactor = 0.10
- "Loss factor of the PV panel(s)" annotation(Dialog(group="Electrical parameters"));
- constant Modelica.Units.SI.Temperature _T_ref = 25 + 273
- "Reference cell temperature (K)";
- parameter IDEAS.Fluid.PvtCollectors.Types.CollectorType collectorType =
- IDEAS.Fluid.PvtCollectors.Types.CollectorType.Uncovered
- "Type of collector (used to select (tau*alpha)_eff)";
- parameter Real tauAlphaEff =
- if collectorType == IDEAS.Fluid.PvtCollectors.Types.CollectorType.Uncovered then 0.901 else 0.84
- "Effective transmittance–absorptance product";
- output Modelica.Units.SI.CoefficientOfHeatTransfer UAbsFluidCalc =
- ((tauAlphaEff - per.eta0El) * (per.c1 + abs(per.gamma)*Gstc))
- / ((tauAlphaEff - per.eta0El) - per.eta0)
- "Heat transfer coefficient calculated from datasheet parameters";
-
- // ===== Variables =====
-
- Real Tm[nSeg] "Mean fluid temperature for each segment";
- Real temCell[nSeg] "Cell temperature for each segment (K)";
- Real temDiff[nSeg] "Temperature difference of the cell relative to reference (K)";
- Real G "Global irradiance on the panel (W/m2)";
- Real qth[nSeg] "Thermal power density per segment [W/m2]";
- Real temMod "Average cell temperature";
- Real temMea "Average fluid temperature";
-
-
- // ===== Real Output Connectors =====
- Modelica.Blocks.Interfaces.RealOutput pel
- "Electrical power generated by the photovoltaic installation"
- annotation(Placement(transformation(extent={{100,70},{120,90}}),
- iconTransformation(extent={{100,70},{120,90}})));
- Modelica.Blocks.Interfaces.RealOutput qTh
- "Total thermal power generated by the PVT installation"
- annotation(Placement(transformation(extent={{100,-90},{120,-70}})));
-
- Modelica.Blocks.Interfaces.RealOutput solarPowerInternal[nSeg]
- "Electrical power produced by each discretized PV segment (W)";
- Modelica.Blocks.Math.Add gGlob "Total irradiation on tilted surface"
- annotation (Placement(transformation(
- extent={{10,-10},{-10,10}},
- rotation=90,
- origin={24,78})));
-equation
- // Directly calculate global irradiance from measurement data
- G =gGlob.y;
-
- // Calculate PV electrical performance for each segment
- for i in 1:nSeg loop
- // Retrieve the mean fluid temperature from the sensor array (provided by the base model)
- Tm[i] = temSen[i].T;
- // Compute the local thermal power density (W/m2)
- qth[i] = (QGai[i].Q_flow + QLos[i].Q_flow) / (ATot_internal/nSeg);
- // Estimate the cell temperature using fluid temperature and thermal flux
- temCell[i] = Tm[i] + qth[i] / UAbsFluidCalc;
- // Determine the temperature difference relative to the reference temperature
- temDiff[i] = temCell[i] - _T_ref;
- // Calculate electrical power output per segment using the PV performance equation
- solarPowerInternal[i] = (ATot_internal/nSeg) * (per.Pstc/per.A) * (G/Gstc) *
- (1 + per.gamma*temDiff[i]) * (1 - pLossFactor);
-
- end for;
-
- // Assign the sum of the segment electrical outputs to the output connector pel
- pel = sum(solarPowerInternal);
-
- // Calculate the total thermal power by multiplying the thermal density with the segment area and summing up
- qTh = (ATot_internal/nSeg) * sum(qth);
-
- // Calculate the average cell temperature, defined as module temperature
- temMod = sum(temCell)/nSeg;
-
- // Calculate the average fluid temperature, defined as module temperature
- temMea = sum(Tm)/nSeg;
-
- connect(gGlob.u1, HDirTil.H) annotation (Line(points={{18,90},{-54,90},{-54,50},
- {-59,50}}, color={0,0,127}));
- connect(gGlob.u2, HDifTilIso.H) annotation (Line(points={{30,90},{30,98},{-54,
- 98},{-54,92},{-56,92},{-56,80},{-59,80}}, color={0,0,127}));
-end PartialPvtCollector;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/package.mo b/IDEAS/Fluid/PvtCollectors/BaseClasses/package.mo
index 3cc60117f7..c3fedd44ca 100644
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/package.mo
+++ b/IDEAS/Fluid/PvtCollectors/BaseClasses/package.mo
@@ -1,11 +1,22 @@
-within IDEAS.Fluid.PvtCollectors;
+within IDEAS.Fluid.PVTCollectors;
package BaseClasses "Package with base classes for IDEAS.Fluid.PvtCollectors"
extends Modelica.Icons.BasesPackage;
annotation (preferredView="info", Documentation(info="
This package contains base classes that are used to construct the models in
- IDEAS.Fluid.PvtCollectors.
+ IDEAS.Fluid.PvtCollectors.
+",
+revisions="
+
+ -
+ July 7, 2025, by Lone Meertens:
+ First implementation PVT model; tracked in
+
+ IDEAS #1436
+ .
+
+
"));
end BaseClasses;
diff --git a/IDEAS/Fluid/PvtCollectors/BaseClasses/package.order b/IDEAS/Fluid/PvtCollectors/BaseClasses/package.order
index e070c65ccb..841c049367 100644
--- a/IDEAS/Fluid/PvtCollectors/BaseClasses/package.order
+++ b/IDEAS/Fluid/PvtCollectors/BaseClasses/package.order
@@ -1,5 +1,3 @@
-EN12975HeatLoss_QuasiDynamic
+ElectricalPVT
+ISO9806QuasiDynamicHeatLoss
Examples
-PartialEN12975HeatLoss_QuasiDynamic
-PartialPvtCollector
-EN12975HeatLoss_SteadyState
diff --git a/IDEAS/Fluid/PvtCollectors/Data/Concentrating/U_TRNSYSValidation.mo b/IDEAS/Fluid/PvtCollectors/Data/Concentrating/U_TRNSYSValidation.mo
deleted file mode 100644
index 8a64659b57..0000000000
--- a/IDEAS/Fluid/PvtCollectors/Data/Concentrating/U_TRNSYSValidation.mo
+++ /dev/null
@@ -1,56 +0,0 @@
-within IDEAS.Fluid.PvtCollectors.Data.Concentrating;
-record U_TRNSYSValidation =
- IDEAS.Fluid.PvtCollectors.Data.GenericQuasiDynamic(
- final A = 1.66,
- final CTyp = IDEAS.Fluid.SolarCollectors.Types.HeatCapacity.TotalCapacity,
- final C = 42200 * 1.66,
- final V = 5 / 1000,
- final mDry = 28,
- final mperA_flow_nominal = 0.03,
- final dp_nominal = 60000,
- final incAngDat = Modelica.Units.Conversions.from_deg({0,10,20,30,40,50,60,70,90}),
- final incAngModDat = {1,1,1,0.99,0.99,0.98,0.96,0.92,0.00},
- final IAMDiff = 1,
- final eta0 = 0.475,
- final c1 = 7.411,
- final c2 = 0.0,
- final c3 = 1.7,
- final c4 = 0.437,
- final c6 = 0.003) "SRCC-validated performance parameters for an uncovered (unglazed) flat-plate PVT collector, Solar Keymark Certificate 011-7S2782P"
-annotation(
- defaultComponentPrefixes = "parameter",
- defaultComponentName = "datWiscPvt",
- Documentation(info = "
-
-This record contains performance parameters for an uncovered (WISC) flat-plate PVT collector,
-tested under ISO 9806:2013 quasi-dynamic conditions (Solar Keymark Certificate No. 011-7S2782P). Thermal performance parameters are given for the PV module operating
-at maximum power point (MPP mode). Data retrieved from the Solar Keymark database on certified PVT products.
-
-Certificate
-
- - Solar Keymark Certificate No. 011-7S2782P
-
-References
-
- -
- Solar Keymark Certificate 011-7S2782P, SRCC database.
-
- -
- ISO 9806:2013. Solar thermal collectors — Test methods.
-
- -
- IEA SHC Task 60 (2018). PVT Systems: Application of PVT Collectors and New Solutions in HVAC Systems.
- iea-shc.org/task60.
-
-
-",
- revisions = "
-
- -
- June 12, 2025, by Lone Meertens:
- Added SRCC-validated data record for uncovered (WISC) flat-plate PVT collector.
- Solar Keymark Certificate No. 011-7S2782P.
- Thermal parameters correspond to MPP operation mode.
-
-
-"));
diff --git a/IDEAS/Fluid/PvtCollectors/Data/Concentrating/package.order b/IDEAS/Fluid/PvtCollectors/Data/Concentrating/package.order
deleted file mode 100644
index 57beaba965..0000000000
--- a/IDEAS/Fluid/PvtCollectors/Data/Concentrating/package.order
+++ /dev/null
@@ -1 +0,0 @@
-U_TRNSYSValidation
diff --git a/IDEAS/Fluid/PvtCollectors/Data/Covered/CI_Jonas2018_ParamSet.mo b/IDEAS/Fluid/PvtCollectors/Data/Covered/CI_Jonas2018_ParamSet.mo
new file mode 100644
index 0000000000..fd05c0cf7b
--- /dev/null
+++ b/IDEAS/Fluid/PvtCollectors/Data/Covered/CI_Jonas2018_ParamSet.mo
@@ -0,0 +1,55 @@
+within IDEAS.Fluid.PVTCollectors.Data.Covered;
+record CI_Jonas2018_ParamSet
+ =
+ IDEAS.Fluid.PVTCollectors.Data.GenericQuasiDynamic(
+ final A=1.79,
+ final CTyp=IDEAS.Fluid.SolarCollectors.Types.HeatCapacity.TotalCapacity,
+ final C=16631*1.79,
+ final V=5/1000,
+ final mDry=26,
+ final mperA_flow_nominal=0.03,
+ final dp_nominal=60000,
+ final incAngDat=Modelica.Units.Conversions.from_deg({0,10,20,30,40,50,60,70,90}),
+ final incAngModDat={1,1,0.99,0.98,0.97,0.95,0.92,0.88,0.00},
+ final IAMDiff=0.94,
+ final eta0=0.573,
+ final c1=5.008,
+ final c2=0.059,
+ final c3=0.011,
+ final c4=0.039,
+ final c6=0.003,
+ final P_nominal=280,
+ final gamma=-0.00370,
+ final etaEl=0.1390)
+ "Parameter set for a covered, insulated PVT collector based on Jonas et al. (2018)"
+annotation(
+ defaultComponentPrefixes = "parameter",
+ defaultComponentName = "datPVTCol",
+ Documentation(info = "
+
+This record contains thermal and electrical parameters for a covered and insulated PVT collector, based on experimental identification results from Jonas et al. (2018).
+These parameters were used in the validation of a TRNSYS PVT collector model under ISO 9806:2013 quasi-dynamic conditions.
+
+
+This record can be used as a generic representation of a covered, insulated PVT collector.
+However, if you know the brand and model of the PVT collector you plan to simulate or install,
+it is recommended to use the actual datasheet parameters in a custom IDEAS.Fluid.PVTCollectors.Data.GenericQuasiDynamic record.
+
+Reference
+
+ -
+ Jonas, D., Theis, D., Frey, G. (2018). Implementation and Experimental Validation of a Photovoltaic-Thermal (PVT) Collector Model in TRNSYS. EuroSun 2018. DOI: 10.18086/eurosun2018.02.16
+
+
+",
+revisions="
+
+ -
+ July 7, 2025, by Lone Meertens:
+ First implementation PVT model; tracked in
+
+ IDEAS #1436
+ .
+
+
+"));
diff --git a/IDEAS/Fluid/PvtCollectors/Data/Covered/CN_Jonas2018_ParamSet.mo b/IDEAS/Fluid/PvtCollectors/Data/Covered/CN_Jonas2018_ParamSet.mo
new file mode 100644
index 0000000000..0255f99245
--- /dev/null
+++ b/IDEAS/Fluid/PvtCollectors/Data/Covered/CN_Jonas2018_ParamSet.mo
@@ -0,0 +1,56 @@
+within IDEAS.Fluid.PVTCollectors.Data.Covered;
+record CN_Jonas2018_ParamSet
+ =
+ IDEAS.Fluid.PVTCollectors.Data.GenericQuasiDynamic(
+ final A=1.79,
+ final CTyp=IDEAS.Fluid.SolarCollectors.Types.HeatCapacity.TotalCapacity,
+ final C=16075*1.79,
+ final V=5/1000,
+ final mDry=24,
+ final mperA_flow_nominal=0.03,
+ final dp_nominal=60000,
+ final incAngDat=Modelica.Units.Conversions.from_deg({0,10,20,30,40,50,60,70,90}),
+ final incAngModDat={1,1,0.99,0.98,0.97,0.95,0.92,0.88,0.00},
+ final IAMDiff=0.93,
+ final eta0=0.596,
+ final c1=6.583,
+ final c2=0.021,
+ final c3=0.000,
+ final c4=0.066,
+ final c6=0.009,
+ final P_nominal=280,
+ final gamma=-0.00370,
+ final etaEl=0.1406)
+ "Parameter set for a covered, non-insulated PVT collector based on Jonas et al. (2018)"
+annotation(
+ defaultComponentPrefixes = "parameter",
+ defaultComponentName = "datPVTCol",
+ Documentation(info = "
+
+This record contains thermal and electrical parameters for a covered PVT collector without rear insulation,
+based on experimental identification results from Jonas et al. (2018).
+These parameters were used in the validation of a TRNSYS PVT collector model under ISO 9806:2013 quasi-dynamic conditions.
+
+
+This record can be used as a generic representation of a covered, non-insulated PVT collector.
+However, if you know the brand and model of the PVT collector you plan to simulate or install,
+it is recommended to use the actual datasheet parameters in a custom IDEAS.Fluid.PVTCollectors.Data.GenericQuasiDynamic record.
+
+Reference
+
+ -
+ Jonas, D., Theis, D., Frey, G. (2018). Implementation and Experimental Validation of a Photovoltaic-Thermal (PVT) Collector Model in TRNSYS. EuroSun 2018. DOI: 10.18086/eurosun2018.02.16
+
+
+",
+revisions="
+
+ -
+ July 7, 2025, by Lone Meertens:
+ First implementation PVT model; tracked in
+
+ IDEAS #1436
+ .
+
+
+"));
diff --git a/IDEAS/Fluid/PvtCollectors/Data/Covered/package.mo b/IDEAS/Fluid/PvtCollectors/Data/Covered/package.mo
index c703fd9668..5448d583ee 100644
--- a/IDEAS/Fluid/PvtCollectors/Data/Covered/package.mo
+++ b/IDEAS/Fluid/PvtCollectors/Data/Covered/package.mo
@@ -1,4 +1,4 @@
-within IDEAS.Fluid.PvtCollectors.Data;
+within IDEAS.Fluid.PVTCollectors.Data;
package Covered "Performance data for covered PVT collectors"
extends Modelica.Icons.MaterialPropertiesPackage;
@@ -18,6 +18,17 @@ ISO 9806:2013 quasi-dynamic testing, with parameters sourced from
Solar Keymark Certificate. Thermal performance parameters
apply to the PV module in maximum power point (MPP) operation mode.
+