Skip to content
Open
Show file tree
Hide file tree
Changes from 73 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
d666bf9
Merge branch 'master' of github.com:open-ideas/IDEAS
LoneMeertens Jan 12, 2026
35b6c1a
feat: add modified PV model in BaseClasses of PVT validation
LoneMeertens Jan 16, 2026
4ae0adf
refactor: read inputs from meaDat instead of sim
LoneMeertens Jan 16, 2026
29f7660
refactor: change naming conventions
LoneMeertens Jan 16, 2026
495fa0d
docs: add documentation to ElectricalPV validation model
LoneMeertens Jan 16, 2026
1180546
refactor: fix error in parameter propagation
LoneMeertens Jan 16, 2026
b2eed38
feat: add ElectricalPV model for PVT UN validation
LoneMeertens Jan 16, 2026
ee843fd
feat: add ElectricalPV model and output expr to Electrical validation…
LoneMeertens Jan 16, 2026
00c7b7c
refactor: add expr for P output ElectricalPV for UI PVT validation
LoneMeertens Jan 16, 2026
6d47bc9
refactor: change naming of parameters following convention.
LoneMeertens Jan 19, 2026
6f0e09c
feat: add new data files for validation where heat losses of c3, c4 a…
LoneMeertens Jan 19, 2026
fb3387a
feat: structure validation models to output simulation variables
LoneMeertens Jan 19, 2026
2e145d9
refactor: make additional BaseClasses folders to keep conventional st…
LoneMeertens Jan 19, 2026
216e174
factor: validation model for UN collector
LoneMeertens Jan 19, 2026
8264c3b
refactor: make sure Tcell is in deg Celcius
LoneMeertens Jan 20, 2026
4fc29f8
feat: include expression for Tcell
LoneMeertens Jan 20, 2026
4506332
feat: adding c7 and c8 to generic data sheet to switch from ISO 9806 …
LoneMeertens Feb 17, 2026
840e1c7
refactor: change genericQuasiDynamic to Generic since ISO 9806 2017 a…
LoneMeertens Feb 17, 2026
81bb14d
feat: update all data records to have 8 term format
LoneMeertens Feb 17, 2026
bb1bb14
refactor: heaLosStc in PVTCollector model to include a7 and a8 loss t…
LoneMeertens Feb 17, 2026
f14156e
refactor: rename PVTQuasiDynamicCollector to PVTCollector since new s…
LoneMeertens Feb 17, 2026
9c7f222
refactor: include a7 and a8 terms in heat loss calculation and modify…
LoneMeertens Feb 17, 2026
db34925
refactor: HeatLoss test example adapt wind speed amplitude to not bec…
LoneMeertens Feb 17, 2026
a275b9f
refactor: rename ISO9806QuasiDynamicHeatLoss to ISO9806HeatLoss since…
LoneMeertens Feb 17, 2026
5074916
refactor: adapt UAbsFluid calculation in ElectricalPVT by changing c1…
LoneMeertens Feb 17, 2026
72c9918
refactor: PVT_UI validation to include additional loss terms
LoneMeertens Feb 17, 2026
d24fa28
refactor: renaming PVT validation collector model and submodels (remo…
LoneMeertens Feb 17, 2026
7ee23f4
refactor: updating UN PVT validation model and submodels to use ISO98…
LoneMeertens Feb 17, 2026
7e80da3
refactor: modify coefficients for state-of-the-art model following Er…
LoneMeertens Feb 17, 2026
cb1d1c3
refactor: calculate Kd based on ISO Annex B.3 - B.5, also influences …
LoneMeertens Feb 17, 2026
e831d9d
refactor: error in eta0 conversion from 2013 to 2017 standard
LoneMeertens Feb 17, 2026
f67dcb4
refactor: correct for too low Kd and set number of segment to default
LoneMeertens Feb 17, 2026
916a7d8
refactor: change Kd to detailed annex B ISO 9806 2017 method
LoneMeertens Feb 17, 2026
55a8d56
docs: update user guide
LoneMeertens Mar 11, 2026
7c30f64
docs: update PVTCollector model documentation
LoneMeertens Mar 11, 2026
a11c2d9
docs: update Data package
LoneMeertens Mar 11, 2026
2ac3b8e
docs: full PVTCollectors package updated
LoneMeertens Mar 11, 2026
c08aa29
feat: add excel format conversion template in corresponding Resources…
LoneMeertens Mar 12, 2026
6a327a1
docs: update reference paper title
LoneMeertens Mar 12, 2026
87767c4
fix + docs: remove break to be compatible with OM, update docs to exp…
LoneMeertens Mar 12, 2026
4589aec
refactor: update UAbsFluid formulation, assuming electrical power ind…
LoneMeertens Mar 19, 2026
b4de0f2
fix: redo parameter removed
LoneMeertens Mar 19, 2026
f2de868
docs: update revision
LoneMeertens Mar 26, 2026
c07afa5
refactor: change gamma to beta to be consitent with paper
LoneMeertens Mar 26, 2026
afdd4ba
docs: update title journal paper in references
LoneMeertens Mar 26, 2026
4fae5d1
refactor: unit convetions
LoneMeertens Mar 26, 2026
5fdcf48
docs: update docs
LoneMeertens Mar 26, 2026
e7f4f77
docs: update docs
LoneMeertens Mar 26, 2026
be272d4
refactor: fix unit inconsistency
LoneMeertens Mar 26, 2026
c883f1b
docs: update docs
LoneMeertens Mar 26, 2026
a3f3cde
refactor: remove obsolute whitespaces
LoneMeertens Mar 26, 2026
d980770
docs: update revisions
LoneMeertens Mar 26, 2026
5d069e3
docs: update documentation strings
LoneMeertens Mar 26, 2026
a38aae9
refactor: rename variables following conventions
LoneMeertens Mar 26, 2026
30906ad
docs: update docs
LoneMeertens Mar 26, 2026
e16a5bd
refactor: adapting naming conventions
LoneMeertens Mar 26, 2026
8f10b82
docs: update comment strings
LoneMeertens Mar 26, 2026
7545bcf
docs: group documentation in main PVT_UI package
LoneMeertens Mar 26, 2026
1baaff9
docs: move docs to PVT_UI top level package and refer to paper for re…
LoneMeertens Mar 26, 2026
a95c38c
docs: update docs
LoneMeertens Mar 26, 2026
7bd5609
refactor: correct paths
LoneMeertens Mar 26, 2026
707a243
docs: updated docs and figure in user guide
LoneMeertens Mar 26, 2026
e65cee0
refactor: merge two ElectricalPV models in one common PV model
LoneMeertens Mar 26, 2026
f305f77
refactor: restructure ElectricalPV validation
LoneMeertens Mar 27, 2026
78f56b9
refactor: PVTCollectorValidation UI and UN extend from partial type
LoneMeertens Mar 27, 2026
e77732d
feat: extend all electrical validation from base model
LoneMeertens Mar 27, 2026
acc97a3
feat: extend all thermal validation model form one base model
LoneMeertens Mar 27, 2026
730298d
refactor: update conventions and documetation strings
LoneMeertens Mar 27, 2026
aab9ccc
docs: update revisions
LoneMeertens Mar 27, 2026
c9ba05b
refactor: update package order
LoneMeertens Mar 28, 2026
89e9963
test: update reference results unit test
LoneMeertens Mar 31, 2026
aa5a887
test: test Baseclasses Example only for PVTCollecters package unit test
LoneMeertens Apr 1, 2026
72ce344
test: generate new reference results
LoneMeertens Apr 5, 2026
a8d197e
refactor: remove obsolete parameter
LoneMeertens Apr 22, 2026
86141f9
refactor: remove obsolete whitespace
LoneMeertens Apr 22, 2026
08581c2
docs: update documentation
LoneMeertens Apr 22, 2026
cb82d58
refactor: remove absolete white space
LoneMeertens Apr 22, 2026
f1dcab8
docs: update documentation reference section
LoneMeertens Apr 22, 2026
10c78af
refactor: update paths to full path
LoneMeertens Apr 22, 2026
4474fd9
docs: update documentation
LoneMeertens Apr 22, 2026
7180b07
docs: update docs
LoneMeertens Apr 22, 2026
feaa0ea
docs: update docs
LoneMeertens Apr 22, 2026
3750b4c
docs: udpate docs
LoneMeertens Apr 22, 2026
bf8b257
docs: add description and revision history analog to thermal model
LoneMeertens Apr 22, 2026
99b3788
refactor: make PVT collector itself replaceable
LoneMeertens Apr 22, 2026
b8ef682
refactor: make data record replaceable
LoneMeertens Apr 22, 2026
9557e7b
refactor: make data record and pvt model replaceable
LoneMeertens Apr 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/github-actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,7 @@ jobs:
- name: Test IDEAS.Fluid.Movers
run: make test-dymola PACKAGE=\"IDEAS.Fluid.Movers\" INTERACTIVE=false
- name: Test IDEAS.Fluid.PVTCollectors
run: make test-dymola PACKAGE=\"IDEAS.Fluid.PVTCollectors.BaseClasses.Examples\" INTERACTIVE=false
&& make test-dymola PACKAGE=\"IDEAS.Fluid.PVTCollectors.Examples\" INTERACTIVE=false
run: make test-dymola PACKAGE=\"IDEAS.Fluid.PVTCollectors\" INTERACTIVE=false
- name: Test IDEAS.Fluid.Sensors
run: make test-dymola PACKAGE=\"IDEAS.Fluid.Sensors\" INTERACTIVE=false
- name: Test IDEAS.Fluid.SolarCollectors
Expand Down
46 changes: 29 additions & 17 deletions IDEAS/Fluid/PVTCollectors/BaseClasses/ElectricalPVT.mo
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
within IDEAS.Fluid.PVTCollectors.BaseClasses;
model ElectricalPVT
"Calculate the electrical power output of a PVT using the PVWatts v5 approach"
"Calculate the electrical power output of a PVT collector"
extends Modelica.Blocks.Icons.Block;
extends IDEAS.Fluid.SolarCollectors.BaseClasses.PartialParameters;

// Parameters
parameter Modelica.Units.SI.Irradiance HGloHorNom = 1000 "global horizontal irradiances";
parameter Modelica.Units.SI.Efficiency eleLosFac = 0.09 "PV loss factor";
parameter Modelica.Units.SI.Efficiency eleLosFac = 0.09 "Electrical system loss factor";
parameter Modelica.Units.SI.Temperature TpvtRef = 298.15 "Reference cell temperature";
parameter Real gamma "Temperature coefficient [1/K]";
parameter Real beta "Temperature coefficient [1/K]";
parameter Modelica.Units.SI.Power P_nominal "Nominal PV power";
parameter Modelica.Units.SI.Area A "PV area";
parameter Modelica.Units.SI.Efficiency eta0 "Zero-loss efficiency";
parameter Modelica.Units.SI.DimensionlessRatio tauAlpEff "Effective transmittance–absorptance product";
parameter Modelica.Units.SI.CoefficientOfHeatTransfer c1 "First-order heat loss coefficient";
parameter Modelica.Units.SI.CoefficientOfHeatTransfer a1 "First-order heat loss coefficient";
parameter Modelica.Units.SI.Efficiency etaEl "Electrical efficiency";

parameter Modelica.Units.SI.CoefficientOfHeatTransfer UAbsFluid =
((tauAlpEff - etaEl) * (c1 + abs(gamma)*HGloHorNom)) / ((tauAlpEff - etaEl) - eta0)
((tauAlpEff - etaEl) * a1) / ((tauAlpEff - etaEl) - eta0)
"Heat transfer coefficient between the fluid and the PV cells, calculated from datasheet parameters";

// Inputs
Modelica.Blocks.Interfaces.RealInput Tflu[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]
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}})));
Expand All @@ -34,7 +34,7 @@ model ElectricalPVT
annotation (Placement(transformation(extent={{-140,-80},{-100,-40}}),
iconTransformation(extent={{-140,-80},{-100,-40}})));

// Outputs (user-facing)
// Outputs
Modelica.Blocks.Interfaces.RealOutput Pel
"Total electrical power output [W]"
annotation (Placement(transformation(extent={{100,40},{140,80}}),
Expand All @@ -58,10 +58,10 @@ protected

equation
for i in 1:nSeg loop
TCel[i] = Tflu[i] +Qth[i] / UAbsFluid;
TCel[i] = Tflu[i] + qth[i] / UAbsFluid;
TDif[i] = TCel[i] - TpvtRef;
Pel_int[i] = (A_c/nSeg) * (P_nominal/A) * (HGloTil/HGloHorNom) *
(1 + gamma * TDif[i]) * (1 - eleLosFac);
(1 + beta * TDif[i]) * (1 - eleLosFac);
Comment thread
LoneMeertens marked this conversation as resolved.
Outdated
end for;

Pel = sum(Pel_int);
Expand All @@ -75,14 +75,14 @@ annotation (
Documentation(info="<html>
<p>
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).
It is part of a validated, open-source Modelica implementation that relies solely on manufacturer datasheet parameters, as described in Meertens et al. (2026).
</p>
<p>
The model calculates the electrical output for each segment <i>i ∈ {1, ..., n<sub>seg</sub>}</i> as:
</p>
<p align=\"center\" style=\"font-style:italic;\">
P<sub>el,i</sub> = (A<sub>c</sub> / n<sub>seg</sub>) &#183 (P<sub>nom</sub> / A)
&#183 (G<sub>tilt</sub> / G<sub>nom</sub>) &#183 (1 + &gamma; &#183 &Delta;T<sub>i</sub>) &#183 (1 - eleLosFac)
&#183 (G<sub>tilt</sub> / G<sub>nom</sub>) &#183 (1 + &beta; &#183 &Delta;T<sub>i</sub>) &#183 (1 - eleLosFac)
</p>
<p>
where:
Expand All @@ -106,7 +106,7 @@ where:
<i>G<sub>nom</sub></i>: nominal irradiance (typically 1000 W/m²)
</li>
<li>
<i>&gamma;</i>: temperature coefficient of power [%/K]
<i>&beta;</i>: temperature coefficient of power [%/K]
</li>
<li>
<i>eleLosFac</i>: lumped system loss factor
Expand Down Expand Up @@ -172,7 +172,7 @@ PVWatts reports a total electrical power loss of 14%, resulting from the followi
</tr>
</table>
<p>
For well-maintained, unshaded modules, experimental validation (Meertens et al., 2025)
For well-maintained, unshaded modules, experimental validation (Meertens et al., 2026)
found that using <code>eleLosFac = 9%</code> gives excellent agreement with
measured electrical output. For PVT collectors with a high positive tolerance on the
electrical output, this system loss factor can even be lower.
Expand All @@ -182,7 +182,7 @@ Users may adjust <code>eleLosFac</code> to account for site-specific soiling or
<h4>Implementation Notes</h4>
<p>
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.
It is compatible with the thermal model based on ISO 9806:2017 and is suitable for dynamic simulations where irradiance and fluid temperatures vary over time.
</p>

<h4>References</h4>
Expand All @@ -191,15 +191,27 @@ It is compatible with the thermal model based on ISO 9806:2013 and is suitable f
Dobos, A. P. (2014). <i><a href='https://docs.nrel.gov/docs/fy14osti/62641.pdf'>PVWatts Version 5 Manual</a></i>. NREL/TP-6A20-62641
</li>
<li>
Meertens, L., Jansen, J., Helsen, L. (2025).
<i>Development and Experimental Validation of an Unglazed Photovoltaic-Thermal Collector Modelica Model that only needs Datasheet Parameters</i>,
submitted to the 16th International Modelica & FMI Conference, Lucerne, Switzerland, Sep 8–10, 2025.
Comment thread
LoneMeertens marked this conversation as resolved.
Meertens, L.; Jansen, J.; Helsen, L. (2026).
<i>Development and Experimental Validation of an Open-Source
Photovoltaic‑Thermal Collector Modelica Model that Only Needs
Datasheet Parameters</i>. Submitted to
Mathematical and Computer Modelling of Dynamical Systems,
Special Issue on Modelica, FMI, and Open Standards.
</li>
</ul>
</html>",
revisions="<html>
<ul>
<li>
March 11, 2026, by Lone Meertens:<br/>
Revised the internal thermal–electrical coupling by introducing a new
formulation for the heat-transfer coefficient between the fluid and the PV cells.
The approach was updated to assume that the electrical power output is independent
of ambient temperature and therefore does not contribute to the linear thermal
loss slope. Details of the derivation can be found in Meertens et al., 2026.
This is for <a href=\"https://github.com/open-ideas/IDEAS/issues/1473\">#1473</a>.
Comment thread
LoneMeertens marked this conversation as resolved.
</li>
<li>
July 7, 2025, by Lone Meertens:<br/>
First implementation PVT model.
This is for <a href=\"https://github.com/open-ideas/IDEAS/issues/1436\">#1436</a>.
Expand Down
37 changes: 19 additions & 18 deletions IDEAS/Fluid/PVTCollectors/BaseClasses/Examples/ISO9806HeatLoss.mo
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
within IDEAS.Fluid.PVTCollectors.BaseClasses.Examples;
model ISO9806HeatLoss
"Example showing the use of ISO9806QuasiDynamicHeatLoss"
model ISO9806HeatLoss "Example showing the use of ISO9806HeatLoss"
extends Modelica.Icons.Example;
replaceable package Medium = IDEAS.Media.Water "Medium in the system";

parameter IDEAS.Fluid.PVTCollectors.Data.GenericQuasiDynamic per=
parameter IDEAS.Fluid.PVTCollectors.Data.Generic per=
IDEAS.Fluid.PVTCollectors.Data.Uncovered.UI_Validation()
"Performance data" annotation (choicesAllMatching=true);
Modelica.Blocks.Sources.Sine T1(
Expand All @@ -22,22 +21,24 @@ model ISO9806HeatLoss
amplitude=15,
offset=273.15 + 20) "Temperature of the third segment"
annotation (Placement(transformation(extent={{-90,-52},{-70,-32}})));
ISO9806QuasiDynamicHeatLoss heaLosQuaDyn(
IDEAS.Fluid.PVTCollectors.BaseClasses.ISO9806HeatLoss heaLosQuaDyn(
nSeg=3,
redeclare package Medium = Medium,
c1=per.c1,
c2=per.c2,
c3=per.c3,
c4=per.c4,
c6=per.c6,
a1=per.a1,
a2=per.a2,
a3=per.a3,
a4=per.a4,
a6=per.a6,
a7=per.a7,
a8=per.a8,
A_c=per.A) annotation (Placement(transformation(extent={{18,-2},{38,18}})));

IDEAS.Fluid.SolarCollectors.BaseClasses.EN12975HeatLoss heaLosSteSta(
A_c=per.A,
nSeg=3,
redeclare package Medium = Medium,
a1=per.c1,
a2=per.c2)
a1=per.a1,
a2=per.a2)
annotation (Placement(transformation(extent={{18,-68},{38,-48}})));
Modelica.Blocks.Sources.Sine TEnv(
f=0.01,
Expand All @@ -48,18 +49,18 @@ model ISO9806HeatLoss
f=1/(24*3600),
phase=0,
offset=3,
amplitude=5) "wind speed in the collector plane"
amplitude=2) "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.Sources.RealExpression HGloTil(y=800) "Global irradiance on the tilted surface"
annotation (Placement(transformation(extent={{26.5,58},{45.5,74}})));
Modelica.Blocks.Interfaces.RealOutput QLos_flow_QuaDyn[3]
"Heat loss rate at current conditions"
annotation (Placement(transformation(extent={{60,-2},{80,18}})));
Modelica.Blocks.Interfaces.RealOutput QLos_flow_SteSta[3]
"Heat loss rate at current conditions"
annotation (Placement(transformation(extent={{62,-68},{82,-48}})));
Modelica.Blocks.Sources.RealExpression HGloTil(y=800) "Global irradiance on the tilted surface"
annotation (Placement(transformation(extent={{26.5,58},{45.5,74}})));
equation
connect(winSpePla.y, heaLosQuaDyn.winSpePla);
connect(HHorIR.y, heaLosQuaDyn.HHorIR);
Expand Down Expand Up @@ -91,13 +92,13 @@ equation
Documentation(info="<html>
<p>
This example demonstrates the implementation of
<a href=\"modelica://IDEAS.Fluid.PVTCollectors.BaseClasses.ISO9806QuasiDynamicHeatLoss\">
<a href=\"modelica://IDEAS.Fluid.PVTCollectors.BaseClasses.ISO9806HeatLoss\">
IDEAS.Fluid.PVTCollectors.BaseClasses.ISO9806QuasiDynamicHeatLoss</a>,
which calculates the quasi-dynamic heat loss of a PVT or solar thermal collector
according to the ISO 9806:2013 standard.
according to the ISO 9806:2017 standard.
</p>
<p>
In addition to showcasing the ISO 9806-based model, this example also compares its behavior
In addition to showcasing the ISO 9806:2017-based model, this example also compares its behavior
to the steady-state heat loss model
<a href=\"modelica://IDEAS.Fluid.SolarCollectors.BaseClasses.EN12975HeatLoss\">
IDEAS.Fluid.SolarCollectors.BaseClasses.EN12975HeatLoss</a>,
Expand All @@ -117,7 +118,7 @@ First implementation of ISO 9806 quasi-dynamic heat loss example.
This is for <a href=\"https://github.com/open-ideas/IDEAS/issues/1436\">1436</a>.
</li>
</ul>
</html>"),
</html>"),
__Dymola_Commands(file="modelica://IDEAS/Resources/Scripts/Dymola/Fluid/PVTCollectors/BaseClasses/Examples/ISO9806HeatLoss.mos"
"Simulate and plot"),
experiment(
Expand Down
Loading
Loading