Solar cell solvers

Solcore includes several methods to solve the properties of a solar cell, including optics and electrical properties. To solve the optics, Solcore have built in a transfer matrix solver and can be linked to S4, a rigorous couple wave analysis solver. For the electrical properties, Solcore includes from the fundamental detailed balance (DB) solver to the more rigorous Poisson-drift-diffusion (PDD) equation solver. The electrical solvers apply to the individual junctions separately, and then their ouput are combined to get the properties of a multi-junction device.

The two most important elements of the solar cell solver module are the solar_cell_solver function and the default_options variable (see Solver Options). The former is the function to be called to calculate any property of any solar cell, regardless of how the junctions have been defined or the specific property of interest. It provides a common interface for any calculation. To use it, simply do:
from solcore.solar_cell_solver import solar_cell_solver

solar_cell_solver(my_solar_cell_object, task, user_options)

The task has to be “optics”, “iv”, “qe”, “equilibrium” or “short_circuit”, the last two only working for PDD junctions. The sequence followed by the solver is:

  1. The default options are updated with the user defined options
  2. The solar cell structure is scanned, calculating derived information like the width of the junctions or the offset of each layer or junction with respect the front of the cell.
  3. The solar cell object and the updated options are sent to the corresponding solver (“optics”, “iv”, “qe”, “equilibrium” or “short_circuit”), depending on the chosen task.
  4. Except in the case of “Equilibrium”, all other tasks will require calculating the optics of the cell. This is done according to the chosen optics_method selected in the options. The default is “BL” (Beer-Lambert law). Alternative optics_method values are “TMM”, “RCWA”, “external” or None, if optics do not need to be calculated. Visit the optical methods section for information specific to the optical solvers.
  5. For the “iv” and “qe” tasks, each of the junctions present in the solar cell will be solved, according to the method used in their definition (“PDD”, “DA”, “2D” or “DB”). Details of each of this methods are described in the corresponding section.
  6. Finally, for the “iv” task, the individual IV curves of the junctions and tunnel junctions, if present, are combined to calculate the IV curve of the multi-junction solar cell, taking into account radiative coupling, if required.

All of the above calculations modify the original solar cell object, adding attributes or methods to its structure. For example, after calculating the IV curve of my_solar_cell_object, this will have a new attribute called “iv” that is a dictionary with the IV of the total solar cell, the IV curves of each of the junctions, information of the Voc and Isc, if relevant, etc.

More details of the specific electrical solvers included in Solcore can be found in:

Solver Options

All options that need to be passed to the solvers (either electrical or optical) are passed as a dictionary via de user_options keyword to the solar_cell_solver method described above. If no options are provided, the solver will try to use the default ones, which might or might not be adequate to your specific problem. These options are common for all calculations.

The options available as well as the default values are:

  • General
    • T_ambient = 298
      Ambient temperature (K)
    • T = 298
      Cell temperature (K). It is actually made equal to the temperature in the solar solar cell definition: my_solar_cell.T .
  • Illumination spectrum
    • wavelength = np.linspace(300, 1800, 251) * 1e-9
      Wavelengths of the illumination spectrum (m)
    • light_source = LightSource(source_type=’standard’, version=’AM1.5g’, x=default_options.wavelength, output_units=’photon_flux_per_m’)
      The illumination spectrum Air Mass 1.5 global spectrum, provided at the above wavelengths in units of photons•s-1 m-2.
  • IV control
    • voltages = np.linspace(0, 1.2, 100)
      Voltages at which to calculate the IV curve of the complete solar cell.
    • mpp = False
      If the parameters of the solar cell under illumination (Isc, Voc, Pmpp, Impp, Vmpp, fill factor and efficiency) have to be calculated. If False, all of them will have the value None.
    • light_iv = False
      If the light IV curve is to be simulated.
    • internal_voltages = np.linspace(-6, 4, 1000)
      The voltages at which the IV curve of each of the junctions inside the cell have to be calculated. This range has to be wider than the voltages above, in general. The same voltage range will be used in all junctions.
    • position = np.arange(0, solar_cell.width, 1e-10)
      Positions inside the solar cell structure in which to calculate the absorption. By default, it is calculated each angstrom for the whole width of the cell. To control the depth spacing, the user can pass:
      1. a vector which specifies each position (in m) at which the depth should be calculated
      2. a single number which specifies the spacing (in m) to generate the position vector, e.g. 1e-9 for 1 nm spacing
      3. a list of numbers which specify the spacing (in m) to be used in each layer. This list can have EITHER the length of the number of individual layers + the number of junctions in the cell object, OR the length of the total number of individual layers including layers inside junctions.
    • radiative_coupling = False
      If radiative coupling has to be included in the calculation.
  • Optics control
    • optics_method = ‘BL’
      Default method to calculate the optical properties of the cell. Other possible values are “TMM”, “RCWA”, “external” or None.
  • Rigorous couple wave analysis options
    Check the RCWA section for details on this parameters.
    • size = [500, 500]
    • orders = 4
    • theta = 0
    • phi = 0
    • pol = ‘u’
  • Detailed balance solver options
    • db_mode = ‘boltzmann’
      If the Boltzmann approximation should be used in the detailed balance solver. Any other choice will result in using the full Plank equation, which will be slower, in general.
  • Depletion approximation solver options
    • da_mode = ‘bvp’
      Selects the numerical approximation method for the drift-diffusion equation in the depletion approximation solver. Possible values are “bvp” for numerical solution using the solve_bvp method of the scipy.integrate module or ‘green’ for a semi-analytic solution using Green’s functions. The latter is expected to be faster.
  • Poisson-drift diffusion solver options
    Check the PDD section for details on this parameters.
    • Mesh control
      • meshpoints = -400
      • growth_rate = 0.7
      • coarse = 20e-9
      • fine = 1e-9
      • ultrafine = 0.2e-9
    • Convergence control
      • clamp = 20
      • nitermax = 100
      • ATol = 1e-14
      • RTol = 1e-6
    • Recombination control
      • srh = 1
      • rad = 1
      • aug = 0
      • sur = 1
      • gen = 0

Solar cell solver module functions

solcore.solar_cell_solver.merge_dicts(*dict_args)[source]

Given any number of dicts, shallow copy and merge into a new dict, precedence goes to key value pairs in latter dicts.

solcore.solar_cell_solver.solar_cell_solver(solar_cell, task, user_options=None)[source]

Solves the properties of a solar cell object, either calculating its optical properties (R, A and T), its quantum efficiency or its current voltage characteristics in the dark or under illumination. The general options for the solvers are passed as dictionaries.

Parameters:
  • solar_cell – A solar_cell object
  • task – Task to perform. It has to be “optics”, “iv”, “qe”, “equilibrium” or “short_circuit”. The last two only work for PDD junctions
  • user_options – A dictionary containing the options for the solver, which will overwrite the default options.
Returns:

None

solcore.solar_cell_solver.solve_optics(solar_cell, options)[source]

Solves the optical properties of the structure, calculating the reflectance, absorptance and transmitance. The “optics_method” option controls which method is used to calculate the optical properties of the solar cell:

  • None: The calculation is skipped. Only useful for solar cells involving just “2-diode” kind of junctions.
  • BL: Uses the Beer-Lambert law to calculate the absorption in each layer. Front surface reflexion has to provided externally. It is the default method and the most flexible one.
  • TMM: Uses a transfer matrix calculation to obtain the RAT. Not valid for DB or 2D junction
  • RCWA: Uses the rigorous wave coupled analysisto obtain the RAT. This allows to include 2D photonic crystals in the structure, for example. Not valid for DB or 2D junctions
  • external: The reflection and absorption profiles are provided externally by the user, and therefore no calculation is performed by Solcore.
Parameters:
  • solar_cell – A solar_cell object
  • options – Options for the optics solver
Returns:

None

solcore.solar_cell_solver.solve_iv(solar_cell, options)[source]

Calculates the IV at a given voltage range, providing the IVs of the individual junctions in addition to the total IV

Parameters:
  • solar_cell – A solar_cell object
  • options – Options for the solvers
Returns:

None

solcore.solar_cell_solver.solve_qe(solar_cell, options)[source]

Calculates the QE of all the junctions

Parameters:
  • solar_cell – A solar_cell object
  • options – Options for the solvers
Returns:

None

solcore.solar_cell_solver.solve_equilibrium(solar_cell, options)[source]

Uses the PDD solver to calculate the properties of all the all the junctions under equilibrium

Parameters:
  • solar_cell – A solar_cell object
  • options – Options for the solvers
Returns:

None

solcore.solar_cell_solver.solve_short_circuit(solar_cell, options)[source]

Uses the PDD solver to calculate the properties of all the all the junctions under short circuit

Parameters:
  • solar_cell – A solar_cell object
  • options – Options for the solvers
Returns:

None

solcore.solar_cell_solver.prepare_solar_cell(solar_cell, options)[source]

This function scans all the layers and junctions of the cell, calculating the relative position of each of them with respect the front surface (offset). This information will later be use by the optical calculators, for example. It also processes the ‘position’ option, which determines the spacing used if the solver is going to calculate depth-dependent absorption.

Parameters:
  • solar_cell – A solar_cell object
  • options – an options (State) object with user/default options
Returns:

None

solcore.solar_cell_solver.process_position(solar_cell, options, layer_widths)[source]
To control the depth spacing, the user can pass:
  • a vector which specifies each position (in m) at which the depth should be calculated
  • a single number which specifies the spacing (in m) to generate the position vector, e.g. 1e-9 for 1 nm spacing
  • a list of numbers which specify the spacing (in m) to be used in each layer. This list can have EITHER the length

of the number of individual layers + the number of junctions in the cell object, OR the length of the total number of individual layers including layers inside junctions.

Parameters:
  • solar_cell – a SolarCell object
  • options – aan options (State) object with user/default options
  • layer_widths – list of widths of the individual layers in the stack, treating the layers within junctions as individual layers
Returns:

None