def test_inc_coh_tmm():
    GaInP = material("GaInP")(In=0.5)
    GaAs = material("GaAs")()
    Ge = material("Ge")()

    optical_struct = SolarCell([
        Layer(material=GaInP, width=si("5000nm")),
        Layer(material=GaAs, width=si("200nm")),
        Layer(material=GaAs, width=si("5um")),
        Layer(material=Ge, width=si("50um")),
    ])

    wl = np.linspace(400, 1200, 5) * 1e-9

    options = State()
    options.wavelength = wl
    options.optics_method = "TMM"
    options.no_back_reflection = False
    options.BL_correction = True
    options.recalculate_absorption = True

    c_list = [
        ["c", "c", "c", "c"],
        ["c", "c", "c", "i"],
        ["c", "i", "i", "c"],
        ["i", "i", "i", "i"],
    ]

    results = []
    for i1, cl in enumerate(c_list):
        options.coherency_list = cl
        solar_cell_solver(optical_struct, "optics", options)
        results.append(optical_struct.absorbed)

    A_calc = np.stack(results)
    A_data = np.array(
        [[0.5742503, 0.67956899, 0.73481184, 0.725372, 0.76792856],
         [0.5742503, 0.67956899, 0.73481184, 0.725372, 0.76792856],
         [0.5742503, 0.67956899, 0.73474943, 0.70493469, 0.70361194],
         [0.5742503, 0.67956899, 0.70927724, 0.71509221, 0.71592772]])
    assert A_calc == approx(A_data)
Beispiel #2
0
]
# And, finally, we put everything together, adding also the surface recombination velocities sn and sp.
# setting kind = 'DA' in the Junction definition tells the electrical solver later to use the depletion approximation
optical_struct = SolarCell(ARC + top_junction + middle_junction + DBRa + DBRb +
                           DBRc + bottom_junction,
                           shading=0.05)

wl = np.linspace(250, 1700, 400) * 1e-9

options = State()
options.wavelength = wl
options.optics_method = 'TMM'
options.no_back_reflection = False
options.pol = 'p'
options.BL_correction = True
options.coherency_list = 111 * ['c']
options.theta = 30
solar_cell_solver(optical_struct, 'qe', options)

plt.figure()
plt.plot(
    wl * 1e9,
    optical_struct[0].layer_absorption + optical_struct[1].layer_absorption)
plt.plot(wl * 1e9, optical_struct[2].layer_absorption)
plt.plot(wl * 1e9, optical_struct[3].layer_absorption)
plt.plot(wl * 1e9, optical_struct[100].layer_absorption)
plt.plot(wl * 1e9, optical_struct.absorbed, '--')
plt.plot(wl * 1e9, optical_struct.transmitted, '--')
plt.plot(wl * 1e9, optical_struct.reflected, '--')
plt.legend(['ARC', 'top', 'middle', 'bottom', 'A', 'T', 'R'])
plt.ylim(0, 1)
Beispiel #3
0
    ["c", "c", "c", "c"],
    ["c", "c", "c", "i"],
    ["c", "i", "i", "c"],
    ["i", "i", "i", "i"],
]

titles = [
    "All coherent",
    "Bottom Ge layer explicity incoherent",
    "Both layers of GaAs junction incoherent",
    "All layers incoherent",
]

for i1, cl in enumerate(c_list):
    plt.figure(i1)
    options.coherency_list = cl
    solar_cell_solver(optical_struct, "optics", options)
    plt.plot(wl * 1e9, optical_struct[0].layer_absorption)
    plt.plot(wl * 1e9, optical_struct[1].layer_absorption)
    plt.plot(wl * 1e9, optical_struct[2].layer_absorption)
    plt.plot(wl * 1e9, optical_struct.reflected, "--")
    plt.plot(wl * 1e9, optical_struct.transmitted, "--")
    plt.plot(
        wl * 1e9,
        optical_struct[0].layer_absorption +
        optical_struct[1].layer_absorption +
        optical_struct[2].layer_absorption + optical_struct.reflected +
        optical_struct.transmitted,
    )
    plt.legend(["GaInP", "GaAs", "Ge", "R", "T", "R+A+T"], loc="upper left")
    plt.title(titles[i1])