Skip to content

Quick Start Guide

schmager edited this page May 28, 2021 · 2 revisions

Download and extract the EYcalc project. Open the main.m, which contains all definitions and settings to calculate the energy yield (EY) of an exemplary perovskite/c-Si multi-junction solar cell.

Note: The EYcalc software will not run without additional files. You either need to add pre-calculated irradiance data or calculate the irradiance data for locations of your choice. Before you continue, see the setup guide for details.

General settings

First, we add all sub folders to the current working path. Next, you need to set the paths to store data. If StoreInDatabase is true, the Optics and Energy Yield core module auto-saves the results and loads them in case the data exists.

Note: you need to define valid paths, even if you use StoreInDatabase = false.

% ### PATH ###
addpath(genpath(pwd)); % add all sub folders to the current working path

% ### DATABASE ###
% Use database to store simulations and load already simulated data
StoreInDatabase = false;
PathOpticsResults = 'path/to/optics/data';
PathEYResults = 'path/to/ey/data';

Next, we need to specify the complex refractive indices for all layers of interest. This is done by loading them from e.g., an Excel (*.xlsx) database:

[IndRefr.nkdata,IndRefr.names]=xlsread('_RefractiveIndexLib.xlsx');

Note: the refractive index data is defined in 1 nm steps. The first column contains the wavelengths, the next columns contain the real and imaginary part of the complex refractive indices. If you add new data, use the same unique name to identify the material and add the suffix: _n and _k.

Irradiance

The energy yield will be calculated for a specific location, covered by the TMY3 dataset. The code you downloaded does not contain this dataset (~1.7GB). However, it can be obtained for free here. Please check out the setup guide for this!

Note: If you want to skip the (first) calculation, you can download the pre-calculated irradiance data for Miami in our first release. Extract the files to Irradiance\Spectra_722020TYA_Miami\ (see the setup guide for details).

In the main.m, we first define the location alias and the corresponding location code. You'll find the alias and code in the TMY3 user manual (p23).

AliasLocation = 'Miami';         % To be specified
CodeLocation  = '722020TYA';     % Code to be looked up from User Manual TMY3.pdf

Next, the Irradiance data is calculated and saved, i.e. in Irradiance\Spectra_722020TYA_Miami\.

Irradiance(CodeLocation, AliasLocation);

The calculation might take some time (~20 min) for one location. However, once performed for any of the possible locations, the stored data is simply loaded.

Note: it is also possible to load the AM1.5G reference spectrum for testing. For this, you need to use:

AliasLocation = 'Spectra_AM1.5G';
CodeLocation  = 'spectrum';

Optics

To calculate the absorptance in the absorber layers, the optics module is called. Here, we first define the stack by the names specified in the refractive index database, its layer thicknesses, and its morphology.

Note: the boundary layers need to be incoherent and their thicknesses should be Infinite.

For each incoherent layer (except the first one) a morphology needs to be defined. The morphology works upwards. In this example the cSi layer is double-sided textured - the front air/glass interface is Flat.

Stack = {'Air','MgF2','Glass1.5','ITOfront','SnO2','Pero1.62','SpiroOMeTAD',...
    'ITOfront','aSi(n)','aSi(i)','cSi','aSi(i)','aSi(p)','ITOfront','Air'};
LayerThickness = [inf,100,1E4,100,10,450,20,25,5,5,250E3,5,5,100,inf];
Morphology = {'Flat','RandomUpright','RandomUpright'};
Polarization   = 'mixed';
lambdaTMM      = 300:5:1200;  
AngleResolution = 5;
IncoherentLayers = {'Air','Glass','EVA','Encapsulation','PDMS','cSi'};
bifacial = false;
Absorbers = {'Pero1.62','cSi'};

In addition, the polarization for the transfer matrix simulations can be defined. The wavelengths (lambdaTMM) for the transfer matrix simulations needs to be provided in nanometers. The AngleResolution defines the spacing for the angular depended transfer matrix calculations and should not be larger than 5°.

It is possible to define which layers should be treated as incoherent. If not specified, the optics code automatically treats layers with thicknesses > 5µm incoherent. This threshold could be modified in OpticsModule.m.

If the EY of a bifacial solar module should be calculated, the bifacial option needs to be true. Then, the optics code simulates the stack from both sides.

For proper indexing, it's best to define the absorbers by their names in the stack. Then the energy yield core module takes the right layers to calculate the short-circuit current densities. If the absorbers are not defined Absorbers = {}, the optics code auto-detects them. Usually, this works fine as well.

Finally, we call the OpticsModule() :

optics = OpticsModule(IndRefr, Stack, LayerThickness, AngleResolution, Morphology, bifacial, Polarization, lambdaTMM, PathOpticsResults, StoreInDatabase, IncoherentLayers, Absorbers);

Electrics

The electrics module is called by the energy yield core module. However, we need to predefine all the electrical parameters. For each absorber within the stack, one needs to define the properties below. This means, for n absorbers, the properties need to be [ 1 x n ] in size.

electrics.configuration = '2T';       % 2T, 3T, 4T, 2T exp, 3T exp, 4T exp
electrics.shunt = 'with';             % with, without
electrics.RshTandem = 1000;            % shunt resistance of tandem device
electrics.RsTandem = 3;            % serial resistance of tandem device
electrics.Rsh = [1300, 800];          % shunt resistance of n-th cell
electrics.Rs = [2, 1];               % serial resistance of n-th cell
electrics.CE = [1, 1];                % collection efficiency of n-th cell
electrics.[2.7e-18, 1e-12];           % reverse-blocking current of n-th cell
electrics.n = [1.1, 1];               % ideality factor of n-th cell
electrics.Temp = [25, 25];            % temperature of cells (can also be n vectors)
electrics.NOCT = [48, 48];            % nominal temperature of n-th cell, if a number, Temp is overwritten
electrics.tcJsc = [0.0002, 0.00032];  % temperature coefficient of Jsc in K^-1 of n-th cell
electrics.tcVoc = [-0.002, -0.0041];  % temperature coefficient of Voc in K^-1 of n-th cell

Energy Yield

The energy yield calculations rely on the previous calculations and definitions. Further, we need to define the tilt and rotation angle of the solar module. They can both be 0, which means that the solar panel is lying flat on the ground.

Note: Tilting the module facing the southern hemisphere can be achieved by a rotation angle of 180° and a tilt angle >0°. If the rotation angle is 0°, a tilt angle >0°, tilts the module facing north.

SolarCellRotationAngle = 180;
SolarCellTiltAngle = 20;

Next, we define, if we would like to use one of the tracking methods (see main.m for details) and, if albedo should be taken into account. The albedo string needs to match an existing file in the EnergyYield\LibraryEcospec\ folder, whereas the *.txt file extension is missing in the string. By default, only artificial black and artificial white are included. If you like add other or define your own grounds, check out the ECOSTRESS library or consult the ECOSTRESS documentation.

Note: In a tilted module configuration, the albedo can also reach the front of a solar module. In case of a bifacial simulation, additional contributions from the semi-transparent rear due to albedo and due to direct and diffuse irradiation is used.

tracking = 0;           
groundtype = 'artificialblack';

Finally, the energy yield is calculated by calling the EnergyYield() function:

EY = EnergyYield(irradiance, optics, electrics, SolarCellRotationAngle, SolarCellTiltAngle, tracking, albedo, groundtype, PathEYResults, StoreInDatabase); 

An example output of the EY struct, is documented here.

Clone this wiki locally