# AtomicShift¶

class AtomicShift(atomic_shifts=None)

Class to represent a potential shift of the orbitals on individual atoms.

Parameters: atomic_shifts (list of tuple (size 2) with elements: int | PeriodicTableElement, PhysicalQuantity of type energy) – A list of potential shifts to be applied to different atoms/elements. Each entry should be a tuple giving the atoms for which the shift is applied (either by index or by element) and the value of the potential shift. Mixing tuple types is allowed. Default: no potential 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
:type  f:       array of floats

:param shift:   Amplitude of the shift with unit energy
:type shift:    float

:returns:   The external potential at fractional coordinate position.
:rtype:     float
"""
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 of the form

$\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, SurfaceConfiguration, and DeviceConfiguration through the setExternalPotential method.