Skip to content

Commit

Permalink
v1.5.0 Add bifacial model
Browse files Browse the repository at this point in the history
* Create GroundShading class. Calculates ground irradiance, accounting for panel shading of beam and diffuse components.

* Create BackTilter class. Calculates back side global irradiance, considering components of diffuse, rear front-reflected, ground-reflected, and beam irradiance.

* Add tracking compatibility.

* Add compatibility with Excel interface.

* Release beta version.

* Implement single row functionality.
  • Loading branch information
Emily authored Apr 19, 2018
1 parent 62fd882 commit b6afbf1
Show file tree
Hide file tree
Showing 38 changed files with 2,439 additions and 610 deletions.
4 changes: 4 additions & 0 deletions CASSYS Engine/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
*.exe
bin/*
obj/*
.vs/*
443 changes: 443 additions & 0 deletions CASSYS Engine/BackTilter.cs

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions CASSYS Engine/CASSYS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,11 @@
<Compile Include="ACWiring.cs" />
<Compile Include="ASTME2848.cs" />
<Compile Include="Astro.cs" />
<Compile Include="BackTilter.cs" />
<Compile Include="CASSYSClass.cs" />
<Compile Include="ErrorLogger.cs" />
<Compile Include="GridConnectedSystem.cs" />
<Compile Include="GroundShading.cs" />
<Compile Include="HorizonShading.cs" />
<Compile Include="Interpolate.cs" />
<Compile Include="Inverter.cs" />
Expand Down
4 changes: 2 additions & 2 deletions CASSYS Engine/CASSYS.csproj.user
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<StartWorkingDirectory>H:\Dev\Test\</StartWorkingDirectory>
<StartArguments>"H:\Dev\Sample Site - Toronto_v1_4a.csyx" "H:\Dev\Toronto_ClimateFile_CWEC.csv" "Toronto_Output.csv"</StartArguments>
<StartWorkingDirectory>H:\CASSYS\CASSYS Engine\bin\debug\</StartWorkingDirectory>
<StartArguments>"H:\Bifacial\Sample Site - Toronto.csyx" "H:\Bifacial\Toronto_Clearsky_June.csv" "out.csv"</StartArguments>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<StartWorkingDirectory>U:\CASS\Engineering\Monitoring\Simulation\Far Shading\CASSYS Horizon Shading\</StartWorkingDirectory>
Expand Down
5 changes: 1 addition & 4 deletions CASSYS Engine/CASSYS.sln
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,8 @@ Global
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B095D539-D9D0-4C36-A513-EAD9D1DF7491}.Debug|Any CPU.ActiveCfg = Debug|x86
{B095D539-D9D0-4C36-A513-EAD9D1DF7491}.Debug|x86.ActiveCfg = Debug|x86
{B095D539-D9D0-4C36-A513-EAD9D1DF7491}.Debug|x86.Build.0 = Debug|x86
{B095D539-D9D0-4C36-A513-EAD9D1DF7491}.Debug|Any CPU.Build.0 = Debug|x86
{B095D539-D9D0-4C36-A513-EAD9D1DF7491}.Release|Any CPU.ActiveCfg = Release|x86
{B095D539-D9D0-4C36-A513-EAD9D1DF7491}.Release|x86.ActiveCfg = Release|x86
{B095D539-D9D0-4C36-A513-EAD9D1DF7491}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
62 changes: 55 additions & 7 deletions CASSYS Engine/GridConnectedSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@

namespace CASSYS
{
// This enumeration is used to define the type of row to calculate
public enum RowType { INTERIOR = 0, FIRST = 1, LAST = 2, SINGLE = 3 };

class GridConnectedSystem
{
// Creating Array of PV Array and Inverter Objects
Expand All @@ -30,9 +33,11 @@ class GridConnectedSystem
ACWiring[] SimACWiring; // Array of Wires used in calculating AC wiring loss
Transformer SimTransformer = new Transformer(); // Transformer instance used in calculations

BackTilter SimBackTilter = new BackTilter(); // Used to calculate back side irradiance
SpectralEffects SimSpectral = new SpectralEffects(); // Used to calculate spectral correction relative to a given model

// Shading Related variables
GroundShading SimGround = new GroundShading(); // Used to calculate ground shading
HorizonShading SimHorizon = new HorizonShading(); // Used to calculate solar panel shading relative to a given horizon
Shading SimShading = new Shading(); // Used to calculate solar panel shading (row to row)
double ShadGloLoss; // Shading Losses in POA Global
Expand Down Expand Up @@ -72,7 +77,8 @@ class GridConnectedSystem
double farmACMinVoltageLoss = 0; // Loss of power when voltage of the array is too small and forces the inverters to 'shut off' and when inverter is not operating at MPP [W]

// Calculate method
public void Calculate(
public void Calculate
(
RadiationProc RadProc, // Radiation related data
SimMeteo SimMet // Meteological data from inputfile
)
Expand All @@ -89,6 +95,27 @@ SimMeteo SimMet // Meteological data from inputf
// Calculating solar panel shading
SimShading.Calculate(RadProc.SimSun.Zenith, RadProc.SimSun.Azimuth, RadProc.SimHorizonShading.TDir, RadProc.SimHorizonShading.TDif, RadProc.SimHorizonShading.TRef, RadProc.SimTracker.SurfSlope, RadProc.SimTracker.SurfAzimuth);

if (RadProc.SimTracker.useBifacial)
{
// Calculating shading of ground beneath solar panels
SimGround.Calculate(RadProc.SimSun.Zenith, RadProc.SimSun.Azimuth, RadProc.SimTracker.SurfSlope, RadProc.SimTracker.SurfAzimuth, RadProc.SimTracker.SurfClearance, RadProc.SimSplitter.HDir,
RadProc.SimSplitter.HDif, RadProc.TimeStampAnalyzed);

// Get front reflected diffuse irradiance, since it contributes to the back
SimPVA[0].CalcEffectiveIrradiance(SimShading.ShadTDir, SimShading.ShadTDif, SimShading.ShadTRef, SimBackTilter.BGlo, RadProc.SimTilter.IncidenceAngle, SimMet.MonthOfYear, SimSpectral.clearnessCorrection);

// Get incidence angle modifiers for components of irradiance
SimPVA[0].CalcIAM(out SimBackTilter.IAMDir, out SimBackTilter.IAMDif, out SimBackTilter.IAMRef, RadProc.SimTilterOpposite.IncidenceAngle);

// Calculate back side global irradiance
SimBackTilter.Calculate(RadProc.SimTracker.SurfSlope, RadProc.SimTracker.SurfClearance, RadProc.SimSplitter.HDif, SimPVA[0].TDifRef, SimMet.HGlo, SimGround.frontGroundGHI, SimGround.rearGroundGHI, SimGround.aveGroundGHI,
SimMet.MonthOfYear, SimShading.BackBeamSF, RadProc.SimTilterOpposite.TDir, RadProc.TimeStampAnalyzed);
}
else
{
SimBackTilter.BGlo = 0;
}

// Calculating spectral model effects
SimSpectral.Calculate(SimMet.HGlo, RadProc.SimSun.NExtra, RadProc.SimSun.Zenith);

Expand All @@ -97,8 +124,8 @@ SimMeteo SimMet // Meteological data from inputf
// Calculate PV Array Output for inputs read in this loop
for (int j = 0; j < ReadFarmSettings.SubArrayCount; j++)
{
// Adjust the IV Curve based on based on Temperature and Irradiance
SimPVA[j].CalcIVCurveParameters(SimMet.TGlo, SimShading.ShadTDir, SimShading.ShadTDif, SimShading.ShadTRef, RadProc.SimTilter.IncidenceAngle, SimMet.TAmbient, SimMet.WindSpeed, SimMet.TModMeasured, SimMet.MonthOfYear, SimSpectral.clearnessCorrection);
// Adjust the IV Curve based on Temperature and Irradiance.
SimPVA[j].CalcIVCurveParameters(SimMet.TGlo, SimShading.ShadTDir, SimShading.ShadTDif, SimShading.ShadTRef, SimBackTilter.BGlo, RadProc.SimTilter.IncidenceAngle, SimMet.TAmbient, SimMet.WindSpeed, SimMet.TModMeasured, SimMet.MonthOfYear, SimSpectral.clearnessCorrection);

// Check Inverter status to determine if the Inverter is ON or OFF
GetInverterStatus(j);
Expand All @@ -123,7 +150,7 @@ SimMeteo SimMet // Meteological data from inputf
ReadFarmSettings.Outputlist["SubArray_Voltage_Inv" + (j + 1).ToString()] = SimInv[j].itsOutputVoltage;
ReadFarmSettings.Outputlist["SubArray_Power_Inv" + (j + 1).ToString()] = SimInv[j].ACPwrOut / 1000;
}

//Calculating total farm output and total ohmic loss
farmACOutput = 0;
farmACOhmicLoss = 0;
Expand Down Expand Up @@ -179,7 +206,7 @@ SimMeteo SimMet // Meteological data from inputf
farmACClippingPower += SimInv[i].LossClipping;
farmACMaxVoltageLoss += SimInv[i].LossHighVoltage;
farmACMinVoltageLoss += SimInv[i].LossLowVoltage;
farmPnom += (SimPVA[i].itsPNom * SimPVA[i].itsNumModules) * SimPVA[i].TGloEff / 1000;
farmPnom += (SimPVA[i].itsPNom * SimPVA[i].itsNumModules) * SimPVA[i].RadEff / 1000;
farmTempLoss += SimPVA[i].tempLoss;
farmRadLoss += SimPVA[i].radLoss;
}
Expand Down Expand Up @@ -218,7 +245,7 @@ public void AssignOutputs()
ReadFarmSettings.Outputlist["Incidence_Loss_for_Beam"] = SimShading.ShadTDir * (1 - SimPVA[0].IAMDir);
ReadFarmSettings.Outputlist["Incidence_Loss_for_Diffuse"] = SimShading.ShadTDif * (1 - SimPVA[0].IAMDif);
ReadFarmSettings.Outputlist["Incidence_Loss_for_Ground_Reflected"] = SimShading.ShadTRef * (1 - SimPVA[0].IAMRef);
ReadFarmSettings.Outputlist["Profile_Angle"] = Util.RTOD * SimShading.ProfileAng;
ReadFarmSettings.Outputlist["Profile_Angle"] = Util.RTOD * SimShading.FrontProfileAng;
ReadFarmSettings.Outputlist["Near_Shading_Factor_on_Global"] = ShadGloFactor;
ReadFarmSettings.Outputlist["Near_Shading_Factor_on_Beam"] = SimShading.BeamSF;
ReadFarmSettings.Outputlist["Near_Shading_Factor_on__Diffuse"] = SimShading.DiffuseSF;
Expand All @@ -228,6 +255,18 @@ public void AssignOutputs()
ReadFarmSettings.Outputlist["IAM_Factor_on__Diffuse"] = SimPVA[0].IAMDif;
ReadFarmSettings.Outputlist["IAM_Factor_on_Ground_Reflected"] = SimPVA[0].IAMRef;
ReadFarmSettings.Outputlist["Effective_Irradiance_in_POA"] = SimPVA[0].TGloEff;
ReadFarmSettings.Outputlist["Interrow_Albedo"] = SimBackTilter.Albedo;
ReadFarmSettings.Outputlist["Average_Ground_GHI"] = SimGround.aveGroundGHI;
ReadFarmSettings.Outputlist["IAM_Factor_on_Beam_Back"] = SimBackTilter.IAMDir;
ReadFarmSettings.Outputlist["IAM_Factor_on_Diffuse_Back"] = SimBackTilter.IAMDif;
ReadFarmSettings.Outputlist["Effective_Back_Diffuse_Irradiance"] = SimBackTilter.BDif;
ReadFarmSettings.Outputlist["Effective_Back_Front_Reflected_Irradiance"] = SimBackTilter.BFroRef;
ReadFarmSettings.Outputlist["Effective_Back_Ground_Reflected_Irradiance"] = SimBackTilter.BGroRef;
ReadFarmSettings.Outputlist["Effective_Back_Beam_Irradiance"] = SimBackTilter.BDir;
ReadFarmSettings.Outputlist["Effective_Back_Global_Irradiance"] = SimBackTilter.BGlo;
ReadFarmSettings.Outputlist["Back_Global_Irradiance_Inhomogeneity"] = SimBackTilter.IrrInhomogeneity;
ReadFarmSettings.Outputlist["Bifacial_Gain"] = SimPVA[0].BifacialGain;
ReadFarmSettings.Outputlist["Radiation_Available_for_Power_Conversion"] = SimPVA[0].RadEff;
ReadFarmSettings.Outputlist["Array_Nominal_Power"] = farmPnom / 1000;
ReadFarmSettings.Outputlist["Array_Soiling_Loss"] = farmDCSoilingLoss / 1000;
ReadFarmSettings.Outputlist["Modules_Array_Mismatch_Loss"] = farmDCMismatchLoss / 1000;
Expand Down Expand Up @@ -263,6 +302,13 @@ public void AssignOutputs()
ReadFarmSettings.Outputlist["Energy_Loss_Due_to_Irradiance"] = farmRadLoss / 1000;
ReadFarmSettings.Outputlist["NightTime_Energizing_Loss"] = (SimTransformer.POut < 0) ? SimTransformer.itsPIronLoss / 1000 : 0;

ReadFarmSettings.Outputlist["ShowBackIrradianceProfile"] = "";

for (int rowNum = 1; rowNum < SimBackTilter.numCellRows + 1; rowNum++)
{
ReadFarmSettings.Outputlist["ShowBackIrradianceProfile"] += SimBackTilter.backGlo[rowNum - 1].ToString() + (rowNum != SimBackTilter.numCellRows ? "," : "");
}

// Get the power for individual Sub-Arrays
ReadFarmSettings.Outputlist["Sub_Array_Performance"] = "";
ReadFarmSettings.Outputlist["ShowSubInv"] = "";
Expand Down Expand Up @@ -367,7 +413,7 @@ void GetInverterStatus(int j)
if (SimInv[j].VInDC == SimInv[j].itsMppWindowMin)
{
// Calculate energy loss due to voltage too low
SimInv[j].LossLowVoltage = arrayPMPP;
SimInv[j].LossLowVoltage = arrayPMPP - SimPVA[j].POutNoLoss;
}

if (SimInv[j].VInDC == SimInv[j].itsMppWindowMax)
Expand Down Expand Up @@ -417,6 +463,8 @@ void GetInverterStatus(int j)
public void Config()
{
SimShading.Config();
SimGround.Config();
SimBackTilter.Config();
SimTransformer.Config();
SimSpectral.Config();

Expand Down
Loading

0 comments on commit b6afbf1

Please sign in to comment.