SentaurusBandstructureCalibration

class SentaurusBandstructureCalibration(bandstructure_model, max_steps=50, sband_file='sband.cmd', sprocess_file='sprocess.cmd', structure_mesh_file='structure_msh.tdr', optimization_parameters=None)

Fit a bandstructure model.

Parameters:
  • bandstructure_model (SentaurusSlabKdotPmodel | SentaurusWireKdotPmodel | SentaurusWireEffectiveMassModel) – A model bandstructure to fit.
  • max_steps (int) – The maximum number of optimization steps.
    Default: 50
  • sband_file (str) – Writes a Sentaurus Band input file, with the optimized parameters, to this path.
    Default: “sband.cmd”
  • sprocess_file – Writes a Sentaurus Process input file, used for structure generation, to this path.
    Default: “sprocess.cmd”
  • structure_file (str) – Writes a Sentaurus Structure Mesh (TDR) file to this path. This file is required by Sentaurus Band.
    Default: “structure_msh.tdr”
calibratedModelBands()
Returns:array Sentaurus Band before postprocessing.
Return type:array of size number kpoints x number of bands, PhysicalQuantity of type energy
fitPathDFTBands()
Returns:Selected DFT bands for fitting. This model only fit few top valence bands. Returns a tuple (DFT bands, HOMO energy), with - DFT bands: PhysicalQuantity of type energy, size number of kpoints x number of selected bands. - HOMO energy: The energy of the HOMO state at Gamma. PhysicalQuantity of type energy.
Return type:tuple of length 2.
fitPathKpoints()
Returns:array of DFT kpoints
Return type:array of size number kpoints x 3, PhysicalQuantity of type inverse length,
fitPathModelBands()
Returns:array of Sentaurus Band bandstructure after postprocessing.
Return type:array of size number kpoints x number of bands, PhysicalQuantity of type energy,
modelParameters()
Returns:The fitted bandstructure model parameters. The exact meaning of these values will vary based upon the model that is being fit.
Return type:array
optimizationParameters()
Returns:The parameters used for optimization
Return type:OptimizationParameters
parametersList()
Returns:A list of lists of parameters and their fitting errors
Return type:list of list

Usage example for nanowire k.p calibration

The atomistic generation of the nanowire (Wire), the DFT self-consistent convergence, and DFT bandstructure calculation (WireBandstructure) is:

from QuantumATK import *
from SMW import *

filename_dft ='wire_dft.hdf5'
filename_bands ='wire_bandstructure_kp.hdf5'

# Set up lattice
lattice = FaceCenteredCubic(5.4306*Angstrom)

# Define elements
elements = [Silicon, Silicon]

# Define coordinates
fractional_coordinates = [[ 0.  ,  0.  ,  0.  ],
                          [ 0.25,  0.25,  0.25]]

# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

wire_configuration = Wire(
    bulk_configuration,
    wire_orientation='<100>/<110>',
    height=5 * nm,
    width=6 * nm
    )

# Passivate with hydrogen
wire_configuration.passivate()

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
# Basis set.
basis_set = basicBasisSet()

# Exchange correlation.
exchange_correlation = LDA.PZ

# Numerical accuracy.
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=MonkhorstPackGrid(na=1, nb=1, nc=11),
)

# Calculator.
calculator = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
)
wire_configuration.setCalculator(calculator)
wire_configuration.update()
nlsave(filename_dft, wire_configuration, object_id='wire_tag')

# -------------------------------------------------------------
# Bandstructure
# -------------------------------------------------------------
wire_configuration = nlread(filename_dft, object_id='wire_tag')[0]

wire_bandstructure = WireBandstructure(
    wire_configuration=wire_configuration,
    max_kpoint=0.2,
    number_kpoints=51,
)
nlsave(filename_bands, wire_bandstructure, object_id='bandstructure_tag')

wire_bandstructure_example.py

Use class SentaurusBandstructureCalibration to obtain optimized k.p model parameters (\(\gamma_1, \gamma_2, \gamma_3, \Delta_\textrm{so}\), see sband_wire_kp.cmd) that reproduce the DFT bandstructure.

    sband_file='sband_wire_kp.cmd',
    sprocess_file='sprocess_wire_kp.cmd',
    structure_mesh_file='structure_msh_wire_kp.tdr',
)
# Relevant data is serialized to hdf5 for later use 
nlsave(filename_bands, calibration, object_id='bandcalibration_tag')

wire_calibration_kp_example.py

At the end of the calibration process, input files for the Sentaurus tools with the calibrated modes are generated:

sprocess_wire_kp.cmd

sband_wire_kp.cmd

Fig. 152 shows the evolution of the calibration process.

../../../_images/wire_calibration_evolution.png

Fig. 152 DFT (black) vs. calibrated k·p bands (red) for a nanowire. Initial, final, and three intermediate steps of the calibration process are shown. The calibration window (blue rectangle) is defined by parameters fit energy window and max kpoint.

Usage example for nanowire effective-mass calibration

Use class SentaurusBandstructureCalibration to obtain optimized effective-mass model parameters (see sband_wire_effmass.cmd) that reproduce the DFT bandstructure.

from QuantumATK import *
from SMW import *

filename_dft ='wire_dft.hdf5'
filename_bands ='wire_bandstructure_effmass.hdf5'

# -------------------------------------------------------------
# Bandstructure
# -------------------------------------------------------------
wire_configuration = nlread(filename_dft, object_id='wire_tag')[0]

wire_bandstructure = WireBandstructure(
    wire_configuration=wire_configuration,
    max_kpoint=0.5,
    number_kpoints=100,
)
nlsave(filename_bands, wire_bandstructure, object_id='bandstructure_tag')

wire_bandstructure_effmass_example.py

from QuantumATK import *
from SMW import *

filename_bands ='wire_bandstructure_effmass.hdf5'

# -------------------------------------------------------------
# Band Calibration
# -------------------------------------------------------------
# Load reference bandstructure
wire_bandstructure = nlread(filename, object_id='bandstructure_tag')[0]

# Setup model.
wire_model = SentaurusWireEffectiveMassModel(
    reference_bandstructure=wire_bandstructure,
    fit_k_window=0.55 * Angstrom**-1
)

# Band calibration.
calibration = SentaurusBandstructureCalibration(
    bandstructure_model=wire_model,
    max_steps=100,
    sband_file='sband_wire_effmass.cmd',
    sprocess_file='sprocess_wire_effmass.cmd',
    structure_mesh_file='structure_msh_wire_effmass.tdr',
)
# Relevant data is serialized to hdf5 for later use 
nlsave(filename, calibration, object_id='bandcalibration_tag')

wire_calibration_effmass_example.py

At the end of the calibration process. Input files for the Sentaurus tools with the calibrated modes are generated:

sprocess_wire_effmass.cmd

sband_wire_effmass.cmd

Usage example for slab k.p calibration

The atomistic generation of the nanoslab (Slab), the DFT self-consistent convergence, and DFT bandstructure calculation (SlabBandstructure) is:

from QuantumATK import *
from SMW import *

filename = 'slab_case1_calibration.hdf5'

# -------------------------------------------------------------
# Nanoslab
# -------------------------------------------------------------
# Set up lattice
lattice = FaceCenteredCubic(5.4306*Angstrom)

# Define elements
elements = [Silicon, Silicon]

# Define coordinates
fractional_coordinates = [[ 0.  ,  0.  ,  0.  ],
                          [ 0.25,  0.25,  0.25]]

# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

slab_configuration = Slab(
    bulk_configuration,
    slab_orientation='<100>/<100>',
    thickness=5 * nm
    )

# Passivate with hydrogen
slab_configuration.passivate()

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
# Basis set.
basis_set = basicBasisSet()

# Exchange correlation.
exchange_correlation = LDA.PZ

# Numerical accuracy.
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=MonkhorstPackGrid(na=11, nb=11, nc=1),
)

# Calculator.
calculator = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
)
slab_configuration.setCalculator(calculator)
slab_configuration.update()
nlsave(filename, slab_configuration, object_id='slab_tag')

# -------------------------------------------------------------
# Bandstructure
# -------------------------------------------------------------
slab_configuration = nlread(filename, object_id='slab_tag')[0]
slab_bandstructure = SlabBandstructure(
    slab_configuration=slab_configuration,
    max_kpoint=0.2,
    number_kpoints=51,
    calculate_2D_dispersion=False
)
nlsave(filename, slab_bandstructure, object_id='bandstructure_tag')

# -------------------------------------------------------------
# Band Calibration
# -------------------------------------------------------------
# Load reference bandstructure
slab_bandstructure = nlread(filename, object_id='bandstructure_tag')[0]

# Setup model.
slab_model = SentaurusSlabKdotPmodel(
    reference_bandstructure=slab_bandstructure,
    fit_energy_window=0.1 * eV,
    fit_weights=0.1
)

# Band calibration.
calibration = SentaurusBandstructureCalibration(
    bandstructure_model=slab_model,
    max_steps=100,
    sband_file='sband_slab_case1.cmd',
    sprocess_file='sprocess_slab_case1.cmd',
    structure_mesh_file='structure_msh_slab_case1.tdr',
)
# Relevant data is serialized to hdf5 for later use 
nlsave(filename, calibration, object_id='bandcalibration_tag')


slab_calibration_kp.py Use class SentaurusBandstructureCalibration to obtain optimized k.p model parameters (\(\gamma_1, \gamma_2, \gamma_3, \Delta_\textrm{so}\), see sband_slab_case1.cmd) that reproduce the DFT bandstructure.

At the end of the calibration process, input files for the Sentaurus tools with the calibrated modes are generated:

sprocess_slab_case1.cmd

sband_slab_case1.cmd

Fig. 153 shows the evolution of the calibration process.

../../../_images/slab_calibration_evolution.png