示例#1
0
def test_effective_mass():
    """Test calculation of valence band masses from Luttinger parameters."""
    matlib = materials.Materials()
    gasb = matlib['GaSb']
    # check basic mass anisotropy
    assert gasb.holeMass('heavy', 'z') == gasb.holeMass('heavy', '001')
    assert gasb.holeMass('heavy', '001') < gasb.holeMass('heavy', '110')
    assert gasb.holeMass('heavy', '110') < gasb.holeMass('heavy', '111')
    assert gasb.holeMass('light', 'z') == gasb.holeMass('light', '001')
    assert gasb.holeMass('light', '001') > gasb.holeMass('light', '110')
    assert gasb.holeMass('light', '110') > gasb.holeMass('light', '111')
    # compare DOS average masses to directional masses
    assert gasb.holeMass('heavy', '001') < gasb.holeMass('heavy', 'dos') < \
        gasb.holeMass('heavy', '110')
    assert gasb.holeMass('light', '001') > gasb.holeMass('light', 'dos') > \
        gasb.holeMass('light', '110')
    assert gasb.holeMass('light', 'dos') < gasb.holeMass('heavy', 'dos') < \
        gasb.holeMass('dos', 'dos')
    # compare to a few reference values from http://www.ioffe.ru/SVA/NSM/
    assert gasb.holeMass('heavy', 'dos') == approx(0.4, rel=0.2)
    assert gasb.holeMass('light', 'dos') == approx(0.05, rel=0.2)
    inas = matlib.find('InAs')
    inas.holeMass('heavy', 'dos')
    assert inas.holeMass('heavy', 'dos') == approx(0.41, rel=0.2)
    assert inas.holeMass('light', 'dos') == approx(0.026, rel=0.2)
    assert inas.holeMass('dos', 'dos') == approx(0.41, rel=0.2)
示例#2
0
def test_bowing_parameters():
    """Test calculation of alloy band positions with bowing parameters."""
    matlib = materials.Materials()
    inas = matlib.find('InAs', eunit='meV')
    insb = matlib.find('InSb', eunit='meV')
    alloy = matlib.find('InAs80Sb20', eunit='meV')
    # band gap bowing for InAsSb is strong enough to push CBM in alloy below
    # CBM in either binary
    assert matlib.conductionBandMinimum(alloy) < matlib.conductionBandMinimum(
        inas)
    assert matlib.conductionBandMinimum(inas) < matlib.conductionBandMinimum(
        insb)
    # check that we have bowing parameters for m_* and E_g, which are
    # significant for this alloy
    bow = matlib.bowingParameters[('InAs', 'InSb')]
    assert 'directBandGap' in bow and 'electronMass' in bow
    # check interpolation with bowing parameters
    x = 0.2
    gap = (1 - x) * inas['directBandGap'] + x * insb['directBandGap'] \
        - x * (1 - x) * bow['directBandGap']
    mass = (1 - x) * inas['electronMass'] + x * insb['electronMass'] \
        - x * (1 - x) * bow['electronMass']
    assert alloy['directBandGap'] == approx(gap)
    assert alloy['electronMass'] == approx(mass)
    # parameters for which we don't have bowing parameters should be linearly
    # interpolated
    assert 'valenceBandOffset' not in bow
    vbo = (1 - x) * inas['valenceBandOffset'] + x * insb['valenceBandOffset']
    assert alloy['valenceBandOffset'] == approx(vbo)
示例#3
0
def test_band_offsets_fallback():
    """Test calculation of band positions and offsets via fallback on Anderson's rule."""
    # define a couple of semiconductors without valenceBandOffset
    matlib = materials.Materials()
    matlib.add_material("GaAs",
                        "semi",
                        electronAffinity=4070.0,
                        directBandGap=1519.0)
    matlib.add_material("InAs",
                        "semi",
                        directBandGap=417.0,
                        electronAffinity=4900.0)
    matlib.add_material("InSb",
                        "semi",
                        electronAffinity=4590.0,
                        directBandGap=235.0)
    mat1 = matlib.find("InSb", eunit="eV")
    mat2 = matlib.find("InAs", eunit="eV")
    mat3 = matlib.find("GaAs", eunit="eV")
    assert matlib.conduction_band_minimum(
        mat1) - mat1["directBandGap"] == approx(
            matlib.valence_band_maximum(mat1))
    assert matlib.conduction_band_minimum(
        mat1) - matlib.conduction_band_minimum(mat2) == approx(
            materials.conduction_band_offset(mat1, mat2))
    assert matlib.valence_band_maximum(mat1) + mat1["directBandGap"] == approx(
        matlib.conduction_band_minimum(mat1))
    assert matlib.valence_band_maximum(mat1) - matlib.valence_band_maximum(
        mat2) == approx(materials.valence_band_offset(mat1, mat2))
    assert materials.conduction_band_offset(
        mat1, mat2) + materials.conduction_band_offset(mat2, mat3) == approx(
            materials.conduction_band_offset(mat1, mat3))
    assert materials.valence_band_offset(
        mat1, mat2) + materials.valence_band_offset(mat2, mat3) == approx(
            materials.valence_band_offset(mat1, mat3))
示例#4
0
def test_bowing_parameters():
    """Test calculation of alloy band positions with bowing parameters."""
    matlib = materials.Materials()
    inas = matlib.find("InAs", eunit="meV")
    insb = matlib.find("InSb", eunit="meV")
    alloy = matlib.find("InAs80Sb20", eunit="meV")
    # band gap bowing for InAsSb is strong enough to push CBM in alloy below
    # CBM in either binary
    assert matlib.conduction_band_minimum(
        alloy) < matlib.conduction_band_minimum(inas)
    assert matlib.conduction_band_minimum(
        inas) < matlib.conduction_band_minimum(insb)
    # check that we have bowing parameters for m_* and E_g, which are
    # significant for this alloy
    bow = matlib.bowingParameters[("InAs", "InSb")]
    assert "directBandGap" in bow and "electronMass" in bow
    # check interpolation with bowing parameters
    x = 0.2
    gap = ((1 - x) * inas["directBandGap"] + x * insb["directBandGap"] - x *
           (1 - x) * bow["directBandGap"])
    mass = ((1 - x) * inas["electronMass"] + x * insb["electronMass"] - x *
            (1 - x) * bow["electronMass"])
    assert alloy["directBandGap"] == approx(gap)
    assert alloy["electronMass"] == approx(mass)
    # parameters for which we don't have bowing parameters should be linearly
    # interpolated
    assert "valenceBandOffset" not in bow
    vbo = (1 - x) * inas["valenceBandOffset"] + x * insb["valenceBandOffset"]
    assert alloy["valenceBandOffset"] == approx(vbo)
示例#5
0
def test_effective_mass():
    """Test calculation of valence band masses from Luttinger parameters."""
    matlib = materials.Materials()
    gasb = matlib["GaSb"]
    # check basic mass anisotropy
    assert gasb.hole_mass("heavy", "z") == gasb.hole_mass("heavy", "001")
    assert gasb.hole_mass("heavy", "001") < gasb.hole_mass("heavy", "110")
    assert gasb.hole_mass("heavy", "110") < gasb.hole_mass("heavy", "111")
    assert gasb.hole_mass("light", "z") == gasb.hole_mass("light", "001")
    assert gasb.hole_mass("light", "001") > gasb.hole_mass("light", "110")
    assert gasb.hole_mass("light", "110") > gasb.hole_mass("light", "111")
    # compare DOS average masses to directional masses
    assert (gasb.hole_mass("heavy", "001") < gasb.hole_mass("heavy", "dos") <
            gasb.hole_mass("heavy", "110"))
    assert (gasb.hole_mass("light", "001") > gasb.hole_mass("light", "dos") >
            gasb.hole_mass("light", "110"))
    assert (gasb.hole_mass("light", "dos") < gasb.hole_mass("heavy", "dos") <
            gasb.hole_mass("dos", "dos"))
    # compare to a few reference values from http://www.ioffe.ru/SVA/NSM/
    assert gasb.hole_mass("heavy", "dos") == approx(0.4, rel=0.2)
    assert gasb.hole_mass("light", "dos") == approx(0.05, rel=0.2)
    inas = matlib.find("InAs")
    inas.hole_mass("heavy", "dos")
    assert inas.hole_mass("heavy", "dos") == approx(0.41, rel=0.2)
    assert inas.hole_mass("light", "dos") == approx(0.026, rel=0.2)
    assert inas.hole_mass("dos", "dos") == approx(0.41, rel=0.2)
示例#6
0
def test_band_offsets_fallback():
    """Test calculation of band positions and offsets via fallback on Anderson's rule."""
    # define a couple of semiconductors without valenceBandOffset
    matlib = materials.Materials()
    matlib.add_material('GaAs',
                        'semi',
                        electronAffinity=4070.,
                        directBandGap=1519.)
    matlib.add_material('InAs',
                        'semi',
                        directBandGap=417.,
                        electronAffinity=4900.)
    matlib.add_material('InSb',
                        'semi',
                        electronAffinity=4590.,
                        directBandGap=235.)
    mat1 = matlib.find('InSb', eunit='eV')
    mat2 = matlib.find('InAs', eunit='eV')
    mat3 = matlib.find('GaAs', eunit='eV')
    assert matlib.conduction_band_minimum(mat1) - mat1['directBandGap'] == \
           approx(matlib.valence_band_maximum(mat1))
    assert matlib.conduction_band_minimum(
        mat1) - matlib.conduction_band_minimum(mat2) == approx(
            materials.conduction_band_offset(mat1, mat2))
    assert matlib.valence_band_maximum(mat1) + mat1['directBandGap'] == \
           approx(matlib.conduction_band_minimum(mat1))
    assert matlib.valence_band_maximum(mat1) - matlib.valence_band_maximum(
        mat2) == approx(materials.valence_band_offset(mat1, mat2))
    assert materials.conduction_band_offset(mat1, mat2) + \
        materials.conduction_band_offset(mat2, mat3) == \
        approx(materials.conduction_band_offset(mat1, mat3))
    assert materials.valence_band_offset(mat1, mat2) + \
        materials.valence_band_offset(mat2, mat3) == \
        approx(materials.valence_band_offset(mat1, mat3))
示例#7
0
def test_band_offsets():
    """Test calculation of band positions and offsets."""
    matlib = materials.Materials()
    mat1 = matlib.find("InSb", eunit="eV")
    mat2 = matlib.find("InAs", eunit="eV")
    mat3 = matlib.find("GaAs", eunit="eV")
    assert matlib.conduction_band_minimum(mat1) - mat1["directBandGap"] == approx(
        matlib.valence_band_maximum(mat1)
    )
    assert matlib.conduction_band_minimum(mat1) - matlib.conduction_band_minimum(
        mat2
    ) == approx(materials.conduction_band_offset(mat1, mat2))
    assert matlib.valence_band_maximum(mat1) + mat1["directBandGap"] == approx(
        matlib.conduction_band_minimum(mat1)
    )
    assert matlib.valence_band_maximum(mat1) - matlib.valence_band_maximum(
        mat2
    ) == approx(materials.valence_band_offset(mat1, mat2))
    assert materials.conduction_band_offset(
        mat1, mat2
    ) + materials.conduction_band_offset(mat2, mat3) == approx(
        materials.conduction_band_offset(mat1, mat3)
    )
    assert materials.valence_band_offset(mat1, mat2) + materials.valence_band_offset(
        mat2, mat3
    ) == approx(materials.valence_band_offset(mat1, mat3))
示例#8
0
def test_band_offsets():
    """Test calculation of band positions and offsets."""
    matlib = materials.Materials()
    mat1 = matlib.find('InSb', eunit='eV')
    mat2 = matlib.find('InAs', eunit='eV')
    mat3 = matlib.find('GaAs', eunit='eV')
    assert matlib.conductionBandMinimum(mat1) - mat1['directBandGap'] == \
        approx(matlib.valenceBandMaximum(mat1))
    assert matlib.conductionBandMinimum(mat1) - matlib.conductionBandMinimum(
        mat2) == approx(materials.conduction_band_offset(mat1, mat2))
    assert matlib.valenceBandMaximum(mat1) + mat1['directBandGap'] == \
        approx(matlib.conductionBandMinimum(mat1))
    assert matlib.valenceBandMaximum(mat1) - matlib.valenceBandMaximum(
        mat2) == approx(materials.valence_band_offset(mat1, mat2))
    assert materials.conduction_band_offset(mat1, mat2) + \
        materials.conduction_band_offset(mat2, mat3) == \
        approx(materials.conduction_band_offset(mat1, mat3))
    assert materials.valence_band_offset(mat1, mat2) + \
        materials.valence_band_offset(mat2, mat3) == \
        approx(materials.valence_band_offset(mat1, mat3))