Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
115 commits
Select commit Hold shift + click to select a range
66c9f98
fix: restore missing line in .gitattributes
LoneMeertens Jul 1, 2025
d255416
refactor: rename EN12975HeatLoss_QuasiDynamic.mo to EN12975QuasiDynam…
LoneMeertens Jul 1, 2025
21d8dda
chore: fix typo in comment in EN12975QuasiDynamicHeatLoss.mo
LoneMeertens Jul 1, 2025
8c668c0
refactor: replace Real parameters with Modelica.Units.SI types in EN1…
LoneMeertens Jul 1, 2025
7a394cb
docs: update parameter name from "Collector gross area" to "Collector…
LoneMeertens Jul 1, 2025
6ecf2b0
style: rename connector from WeaBus to weaBus in EN12975QuasiDynamicH…
LoneMeertens Jul 1, 2025
a1843c9
style: rename variables in EN12975QuasiDynamicHeatLoss.mo to match na…
LoneMeertens Jul 1, 2025
1fea72f
feat: add defaultComponentName to EN12975QuasiDynamicHeatLoss.mo
LoneMeertens Jul 1, 2025
324732a
refactor: rename model EN12975QuasiDynamicHeatLoss in Examples to fol…
LoneMeertens Jul 1, 2025
d3af258
Revert "refactor: rename model EN12975QuasiDynamicHeatLoss in Example…
LoneMeertens Jul 1, 2025
1cff398
refactor: rename model to EN12975HeatLoss
LoneMeertens Jul 1, 2025
7f4aad4
refactor: rename component to heaLosQuaDyn in EN12975HeatLoss.mo for …
LoneMeertens Jul 1, 2025
e4e71f0
fix: resolve error with final and unit annotations on parameters in E…
LoneMeertens Jul 1, 2025
34633b0
style: remove redundant whitespace in EN12975HeatLoss.mo
LoneMeertens Jul 1, 2025
5bae08f
style: remove redundant whitespace in EN12975HeatLoss.mo
LoneMeertens Jul 1, 2025
5d1c885
refactor: rename Gstc to HGloHorNom in PartialPvtCollector and remove…
LoneMeertens Jul 1, 2025
2c9aa55
docs: update documentation for parameter HGloHorNom in PartialPvtColl…
LoneMeertens Jul 1, 2025
83d7af8
style: unify unit brackets to [ ] in PartialPvtCollector model
LoneMeertens Jul 1, 2025
df35dd5
docs: clarify description of Modelica.Units.SI.Irradiance parameter H…
LoneMeertens Jul 1, 2025
9a7a49f
refactor: rename _T_ref to TpvtRef in PartialPvtCollector
LoneMeertens Jul 1, 2025
2cc4283
fix: correct error in °C to K conversion in PartialPvtCollector
LoneMeertens Jul 1, 2025
e1414f2
refactor: replace Real with Modelica.Units.SI.DimensionlessRatio for …
LoneMeertens Jul 1, 2025
f4fdab9
refactor: make UAbsFluidCalc a final parameter and remove output modi…
LoneMeertens Jul 1, 2025
396487e
docs: update documentation for UAbsFluidCalc in PartialPvtCollector
LoneMeertens Jul 1, 2025
03b1e8e
refactor: rename Modelica.Blocks.Interfaces.RealOutput pel to pEl in …
LoneMeertens Jul 1, 2025
6b74eb5
docs: add units to pEl and qTh outputs in PartialPvtCollector
LoneMeertens Jul 1, 2025
bac9993
refactor: change solarPowerInternal from RealOutput to Real and updat…
LoneMeertens Jul 1, 2025
9202b33
refactor: rename gGlob to HGloTil to match weaBus naming convention i…
LoneMeertens Jul 1, 2025
1a5ff6b
refactor: replace Real with Modelica.SIunits types in GenericQuasiDyn…
LoneMeertens Jul 1, 2025
03585e4
refactor: rename parameter Pstc to P_nominal and update documentation
LoneMeertens Jul 1, 2025
96e88b7
refactor: replace Real with Modelica.Units.SI types in GenericQuasiDy…
LoneMeertens Jul 1, 2025
c05ec27
refactor: rename eta0El to etaEl for clarity and consistency
LoneMeertens Jul 1, 2025
68045bf
chore: remove IDEAS.Fluid.PvtCollectors.Data.Concentrating package
LoneMeertens Jul 1, 2025
28c3099
chore: remove IDEAS.Fluid.PvtCollectors.Data.WISC package
LoneMeertens Jul 1, 2025
0042d13
refactor: update path to IDEAS.Fluid.PvtCollectors.QuasiDynamicPvtCol…
LoneMeertens Jul 1, 2025
839f739
refactor: update paths to QuasiDynamicPvtCollector and Data.Uncoverd.…
LoneMeertens Jul 1, 2025
2c241a3
style: remove redundant whitespaces in UI_TRNSYSValidation
LoneMeertens Jul 1, 2025
ef60f1a
style: remove redundant whitespaces in IDEAS.Fluid.PvtCollector
LoneMeertens Jul 1, 2025
87b6553
refactor: update path in Wisc of pvtCol
LoneMeertens Jul 1, 2025
db16150
refactor: make winSpeTil a final parameter in PvtCollectors
LoneMeertens Jul 1, 2025
e220928
refactor: rename QuasiDynamicPvtCollector to PVT
LoneMeertens Jul 1, 2025
df384e3
refactor: make heaLos and solGai final parameters in PVTQuasiDynamicC…
LoneMeertens Jul 1, 2025
ed2d1e0
refactor: change winSpeTil type from Real to Modelica.Units.SI.Velocity
LoneMeertens Jul 1, 2025
ed3c214
docs: update package description in Types
LoneMeertens Jul 1, 2025
6715a27
docs: update documentation in UsersGuide
LoneMeertens Jul 1, 2025
07bce22
refactor: add BaseClasses to Validation for shared models; move and r…
LoneMeertens Jul 2, 2025
08a155a
refactor: extend EN12975QuasiDynamicHeatLossValidation from SolarColl…
LoneMeertens Jul 2, 2025
4c0404c
refactor: rename eta0El and Pstc parameters; rename PartialPvtCollect…
LoneMeertens Jul 2, 2025
095533f
style: remove whitespace
LoneMeertens Jul 2, 2025
e5fbf1c
refactor: extend quasi-dynamic heat loss block from SolarCollectorSte…
LoneMeertens Jul 2, 2025
2c9ca7d
refactor: replace HGloTil math Add block with equation in PartialPvtC…
LoneMeertens Jul 2, 2025
cefc702
refactor: remove thermal heat loss terms from main model; retained on…
LoneMeertens Jul 2, 2025
ff0e6f2
refactor: rename HGloHor to HGloTil to reflect global irradiance on t…
LoneMeertens Jul 2, 2025
4bd2d86
remove PartialQuasiDynamicHeatLoss and and restructure EN12975QuasiD…
LoneMeertens Jul 2, 2025
4eb96e9
refactor: add E_L and winSpePla as input connectors in EN12975QuasiDy…
LoneMeertens Jul 2, 2025
d529a86
style: update icon in EN12975QuasiDynamicHeatLossValidation
LoneMeertens Jul 2, 2025
8100971
refactor: rename variables to match weaBus naming conventions
LoneMeertens Jul 2, 2025
f1868cb
refactor: remove winSpePla input connector from EN12975QuasiDynamicHe…
LoneMeertens Jul 2, 2025
8c0346f
refactor: rename all EN12975 models to ISO9806 to reflect 2013 revisi…
LoneMeertens Jul 2, 2025
c5e832b
refactor: rename all occurrences of 'Pvt' to 'PVT' to reflect standar…
LoneMeertens Jul 2, 2025
e3868d5
style: unify "heat loss" naming in GenericQuasiDynamic for consistency
LoneMeertens Jul 2, 2025
addc4bd
docs: add heat loss equation to ISO9806QuasiDynamicHeatLoss documenta…
LoneMeertens Jul 2, 2025
6658895
refactor: correct variable names to follow naming convention
LoneMeertens Jul 2, 2025
3146ff5
feat: add ISO9806HeatLoss example comparing steady state and quasi-dy…
LoneMeertens Jul 2, 2025
237f215
docs: add revision history to ISO9806QuasiDynamicHeatLoss documentation
LoneMeertens Jul 2, 2025
bd0cbc6
docs: add documentation and revision history to PartialPVTCollector
LoneMeertens Jul 3, 2025
433d356
refactor: rearrange models and packages according to Modelica Buildin…
LoneMeertens Jul 3, 2025
8574d6c
refactor: rename validation data records for clarity and consistency
LoneMeertens Jul 3, 2025
046e134
feat: add one generic data record per PVT collector type
LoneMeertens Jul 3, 2025
088de47
docs: add details to WISC example for improved clarity and usage
LoneMeertens Jul 3, 2025
c5b4494
refactor: rename EN standard references to ISO to reflect updated sta…
LoneMeertens Jul 3, 2025
280710a
style: reorder models alphabetically for consistency
LoneMeertens Jul 3, 2025
6ac2552
feat: add separate ElectricalPVT block for visual integration in PVT …
LoneMeertens Jul 3, 2025
9e3ee08
fix: restore annotations for heat loss connection
LoneMeertens Jul 3, 2025
2528150
feat: extend ElectricalPVT block with input and output connectors
LoneMeertens Jul 3, 2025
3aa3eb7
feat: implement working PVT model extending PartialSolarCollector wit…
LoneMeertens Jul 7, 2025
6e3f5ec
refactor: clean up PVT model and assign Real output variables
LoneMeertens Jul 7, 2025
b5f8812
fix: remove duplicate default parameter definition in PVT model
LoneMeertens Jul 7, 2025
69a499d
refactor: replace internal variables with output connectors in PVT mo…
LoneMeertens Jul 7, 2025
386df7b
feat: add ElectricalPVT block to PartialPVT1 model analogous to Gener…
LoneMeertens Jul 7, 2025
bc2ad2e
fix: correct errors in UN_validation datasheet
LoneMeertens Jul 7, 2025
9b557c3
feat: add ElectricalPVT block to PartialPVT2 model analogous to Gener…
LoneMeertens Jul 7, 2025
ae06dd9
fix: correct error in UN_validation datasheet
LoneMeertens Jul 7, 2025
12bddc9
refactor: remove unused PartialPVTCollector model; replaced by PVT mo…
LoneMeertens Jul 7, 2025
fa0a50e
refactor: rename STC heat loss and gain block to avoid confusion with…
LoneMeertens Jul 7, 2025
3f6050b
docs: update documentation across models and packages
LoneMeertens Jul 7, 2025
3feef8e
docs: add reference for solar thermal heat gain
LoneMeertens Jul 7, 2025
ea79d64
docs: modify table layout for improved readability
LoneMeertens Jul 7, 2025
97da51d
docs: update documentation across models and packages
LoneMeertens Jul 7, 2025
3a23d73
docs: update documentation across models and packages
LoneMeertens Jul 7, 2025
603fc74
docs: add revision history to all models and packages
LoneMeertens Jul 7, 2025
b3c4325
docs: update documentation for SimInfoManager and WeatherReader
LoneMeertens Jul 7, 2025
0fcf680
docs: add revision history to all models and packages
LoneMeertens Jul 7, 2025
f3caf33
docs: update documentation
LoneMeertens Jul 7, 2025
ff305b8
docs: update documentation
LoneMeertens Jul 7, 2025
29104f6
refactor: restructure PVT1.PVTQuasiDynamicCollectorValidation to exte…
LoneMeertens Jul 7, 2025
d78e13c
refactor: restructure PVT2.PVTQuasiDynamicCollectorValidation to exte…
LoneMeertens Jul 7, 2025
1640252
docs: update documentation
LoneMeertens Jul 7, 2025
b1af928
style: use full component paths in models for clarity and consistency
LoneMeertens Jul 7, 2025
78dc98f
feat: extend ISO9806QuasiDynamicHeatLossValidation from ISO9806QuasiD…
LoneMeertens Jul 7, 2025
630898f
docs: update documentation
LoneMeertens Jul 8, 2025
0705abf
refactor: restructure models and packages to follow naming and organi…
LoneMeertens Jul 8, 2025
563dc69
refactor: adapt UAbsFluid expression in validation files after moving…
LoneMeertens Jul 9, 2025
66a6a4e
feat: add pLossFactor parameter to validation models for compatibilit…
LoneMeertens Jul 9, 2025
18733ec
feat: add pLossFactor parameter to remaining validation models for .m…
LoneMeertens Jul 9, 2025
65a2772
fix: correct typo in model path
LoneMeertens Jul 9, 2025
652035e
Revert specific files from commit c5e832b1e
LoneMeertens Jul 9, 2025
8989e21
Revert specific files from commit c5e832b1e
LoneMeertens Jul 9, 2025
cb3c8a8
fix: correct indexing of meaPel to use appropriate column from meaDat
LoneMeertens Jul 10, 2025
2a7d6bf
fix: correct type name from TAmbKel to TFluKel
LoneMeertens Aug 1, 2025
9398f4c
docs: clarify system loss factor and reference results
LoneMeertens Aug 1, 2025
ef7f932
docs(data): update description for data records to reflect literature…
LoneMeertens Aug 8, 2025
7646d1a
docs: corrected plossfactor description to align with examples
LoneMeertens Aug 8, 2025
2275e5a
refactor: rename PVT1 to PVT_UI and PVT2 to PVT_UN across models and …
LoneMeertens Aug 8, 2025
0b781e8
docs: link new naming conventions clearly to PVT1 and PVT2 of paper
LoneMeertens Aug 8, 2025
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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

This file was deleted.

This file was deleted.

216 changes: 216 additions & 0 deletions IDEAS/Fluid/PvtCollectors/BaseClasses/ElectricalPVT.mo
Original file line number Diff line number Diff line change
@@ -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="<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).
</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>) · (P<sub>nom</sub> / A) · (G<sub>tilt</sub> / G<sub>nom</sub>) · (1 + γ · ΔT<sub>i</sub>) · (1 - pLossFactor)
</p>

<p>
where:
<ul>
<li><i>ΔT<sub>i</sub></i> = T<sub>cell,i</sub> - T<sub>ref</sub>: temperature difference between PV cell and reference temperature</li>
<li><i>P<sub>nom</sub></i>: nominal PV power under STC [W]</li>
<li><i>A</i>: gross collector area [m²]</li>
<li><i>A<sub>c</sub></i>: effective collector area (equal to A if not otherwise specified)</li>
<li><i>G<sub>tilt</sub></i>: global irradiance on the tilted collector plane [W/m²]</li>
<li><i>G<sub>nom</sub></i>: nominal irradiance (typically 1000 W/m²)</li>
<li><i>γ</i>: temperature coefficient of power [%/K]</li>
<li><i>pLossFactor</i>: lumped system loss factor</li>
</ul>
</p>
<p>
The PV cell temperature is estimated from the fluid temperature and thermal power density using:
</p>
<p align=\"center\" style=\"font-style:italic;\">
T<sub>cell,i</sub> = T<sub>m,i</sub> + q<sub>th,i</sub> / U<sub>AbsFluid</sub>
</p>
<p>
The internal heat transfer coefficient <i>UAbsFluid</i> is approximately calculated from datasheet parameters:
</p>
<div style=\"display:flex; align-items:center; justify-content:center;\">
<div style=\"padding-right:8px;\"><i>UAbsFluid = </i></div>
<table style=\"border-collapse:collapse; text-align:center;\">
<tr>
<td style=\"padding:4px;\">
<em>(τ·α)<sub>eff</sub> – η<sub>0,el</sub></em> · (c<sub>1</sub> + c<sub>3</sub>·u + b<sub>1,el</sub>)
</td>
</tr>
<tr>
<td style=\"border-top:1px solid black; padding:4px;\">
<em>(τ·α)<sub>eff</sub> – η<sub>0,el</sub></em>
– (1 – <em>c<sub>6</sub>/η<sub>0,th</sub></em>·u) · η<sub>0,th</sub>
</td>
</tr>
</table>
</div>
<ul>
<li>
Here, <i>(τ·α)</i><sub>eff</sub> = 0.901 for unglazed PVT collectors as reported in Lämmle (2018), and = 0.84 for covered collectors.
</li>
<li>
The electrical temperature‑dependence term is <i>b</i><sub>1,el</sub> = |<i>β</i>| · G<sub>nom</sub>, where <i>β</i> is the temperature coefficient of power (in % K<sup>−1</sup>) and G<sub>nom</sub> = 1000 W m<sup>−2</sup>.
</li>
<li>
<i>u</i> is the in‑plane wind speed. In this approximation, <code>u = 0</code> is used to derive <i>UAbsFluid</i>—the internal heat transfer coefficient is only weakly dependent on external wind speed when the datasheet thermal parameters are accurate (Stegmann 2011).
</li>
</ul>
<h5>Electrical performance and losses</h5>
<p>
The electrical submodel includes an overall system loss factor <code>pLossFactor</code>. NREL’s PVWatts reports a total electrical power loss of 14%, resulting from the following mechanisms:
</p>
<table border=\"1\" cellpadding=\"4\">
<tr>
<th style=\"text-align:left;\">Electrical power loss mechanism</th>
<th style=\"text-align:center;\">Default value</th>
</tr>
<tr>
<td style=\"text-align:left;\">Soiling</td>
<td style=\"text-align:center;\">2 %</td>
</tr>
<tr>
<td style=\"text-align:left;\">Shading</td>
<td style=\"text-align:center;\">3 %</td>
</tr>
<tr>
<td style=\"text-align:left;\">Mismatch</td>
<td style=\"text-align:center;\">2 %</td>
</tr>
<tr>
<td style=\"text-align:left;\">Wiring</td>
<td style=\"text-align:center;\">2 %</td>
</tr>
<tr>
<td style=\"text-align:left;\">Connections</td>
<td style=\"text-align:center;\">0.5 %</td>
</tr>
<tr>
<td style=\"text-align:left;\">Light‑induced degradation</td>
<td style=\"text-align:center;\">1.5 %</td>
</tr>
<tr>
<td style=\"text-align:left;\">Nameplate rating</td>
<td style=\"text-align:center;\">1 %</td>
</tr>
<tr>
<td style=\"text-align:left;\">Availability</td>
<td style=\"text-align:center;\">3 %</td>
</tr>
<tr>
<th style=\"text-align:left;\">Total</th>
<th style=\"text-align:center;\">14 %</th>
</tr>
</table>
<p>
For well-maintained, unshaded modules, experimental validation (Meertens et al., 2025)
found that using <code>pLossFactor = 9 %</code> 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 <code>pLossFactor</code> to account for site-specific soiling or shading effects.
</p>
<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.
</p>

<h4>References</h4>
<ul>
<li>
Dobos, A.P., <i>PVWatts Version 5 Manual</i>, NREL, 2014
</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.
</li>
<li>
ISO 9806:2013, Solar energy — Solar thermal collectors — Test methods
</li>
</ul>
</html>",
revisions="<html>
<ul>
<li>
July 7, 2025, by Lone Meertens:<br/>
First implementation PVT model; tracked in
<a href=\"https://github.com/open-ideas/IDEAS/issues/1436\">
IDEAS #1436
</a>.
</li>
</ul>
</html>"));

end ElectricalPVT;
Loading
Loading