Name

AtomicShift — Represents a potential shift of the orbitals on individual atoms.

Synopsis

Namespace: NanoLanguage
AtomicShift(atomic_shifts)

Description

Constructor for the AtomicShift object.

AtomicShift Arguments

atomic_shifts

The energy shift that should be applied for any given atom and/or element.

Type: a list of tuples with atom indices and corresponding energy shifts; or a list of tuples with element and energy shift value; or a combination of the two.

Default: None (no energy shift for any atom).

Usage Examples

Add a periodic external potential to Silicon and calculate the band structure.

# Define a periodic potential along z
def potentialShift(f, shift):
    """
    @param  f    : position in fractional coordinates
    @param shift : amplitude of the shift with unit energy
    @return The external potential at fractional coordinate position
    """

    return shift*numpy.cos(2.*numpy.pi*f[2])


# Set up a silicon lattice
configuration = BulkConfiguration(
    SimpleCubic(5.4306*Angstrom),
    [Silicon,]*8,
    fractional_coordinates = [[0.0, 0.0, 0.0], [0.25, 0.25, 0.25],
                              [0.5, 0.5, 0.0], [0.75, 0.75, 0.25],
                              [0.5, 0.0, 0.5], [0.75, 0.25, 0.75],
                              [0.0, 0.5, 0.5], [0.25, 0.75, 0.75]])

# Repeat the structure along z
configuration = configuration.repeat(1,1,3)

# Define a selfconsistent Huckel calculator
calculator = HuckelCalculator(
    basis_set=CerdaHuckelParameters.Silicon_GW_diamond_Basis,
    numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(4, 4, 2)),
    iteration_control_parameters = IterationControlParameters()
    )

# Set a calculator on the configuration
configuration.setCalculator(calculator())

# Perform a loop with 4 different shifts
for shift in [0.0, 1.0, 5.0, 10.0]*eV:

    fractional = configuration.fractionalCoordinates()
    atom_potentials = [(i,potentialShift(f, shift)) for i,f in enumerate(fractional)]

    configuration.setExternalPotential(AtomicShift(atom_potentials))


    # Calculate the bandstructure
    bandstructure = Bandstructure(
        configuration=configuration,
        route=['G', 'Z'],
        )

    nlsave('atomic_shift.nc', bandstructure)

atomic_shift.py

Notes

The atomic shift adds a term to the tight binding Hamiltonian,

\displaystyle

\Delta H_{ij} = \frac{1}{2} \left[ V_i + V_j) \right] S_{ij},

where S_{ij} is the overlap matrix, and V_i is the atomic shift of orbital i.

An atomic shift can be applied to a MoleculeConfiguration, BulkConfiguration, and DeviceConfiguration via the setExternalPotential method.