Source code for solcore.optics.external_optics
import types
import numpy as np
from numpy.typing import NDArray
from ..registries import register_optics
from ..solar_cell import SolarCell
[docs]@register_optics(name="external")
def solve_external_optics(
solar_cell: SolarCell, wavelength: NDArray, position: NDArray, **kwargs
) -> None:
"""Calculates RAT of a solar cell from external data
It also prepares the structure for further calculations. The external data that must
be provided in the solar cell definition is:
- external_reflected: a function that provides the fraction of reflected light at
the specified wavelengths (in m).
- external_absorbed: a function that provides an array with the differential
absorption at a depth Z (in m) at the specified wavelengths.
Note that both are functions of a single variable - wavelength in the first case and
position in the second - and that the latter provides as output an array at the
wavelengths indicated in the options.
Args:
- solar_cell: A solar_cell object
- wavelength: Array of wavelegth at which the optics are calculated.
- position: Array of positions in the z direction to calculate the absorption vs
depth.
Return:
None
"""
solar_cell.wavelength = wavelength
# We include the shadowing losses
initial = (1 - solar_cell.shading) if hasattr(solar_cell, "shading") else 1
# We try to get the external attributes
try:
solar_cell.reflected = solar_cell.external_reflected * initial
diff_absorption = solar_cell.external_absorbed
except AttributeError as err:
raise err
# We calculate the total amount of light absorbed in the solar cell, integrating
# over its whole thickness with a step of 1 nm
all_absorbed = np.trapz(diff_absorption(position), position)
# Each building block (layer or junction) needs to have access to the absorbed light
# in its region.
# We update each object with that information.
for j in range(len(solar_cell)):
solar_cell[j].diff_absorption = diff_absorption
solar_cell[j].absorbed = types.MethodType(absorbed, solar_cell[j])
solar_cell.transmitted = (
1 - solar_cell.external_reflected - all_absorbed
) * initial
solar_cell.absorbed = all_absorbed * initial
[docs]def absorbed(self, z):
out = self.diff_absorption(self.offset + z) * (z < self.width)
return out.T