FixedSpin¶
- class FixedSpin(spin_directions=None, fixed_spin_energy=None)¶
Class for representing a fixed spin configuration.
The spins are fixed by adding an energy penalty on given atoms if their spins are not aligned with the desired direction.
- Parameters:
spin_directions (list of tuple of (int |
PeriodicTableElement
, PhysicalQuantity of type angle, PhysicalQuantity of type angle)) – The fixed spin direction for each atom should be given as a tuple with three numbers, corresponding to the atom index and the spherical coordinates theta and phi defining the direction. Alternatively, the spin directions can also be given by element. Default:(index, 0.0 * Degrees, 0.0 * Degrees)
for each atomfixed_spins_energy (PhysicalQuantity of type energy) – Scaling of the energy penalty if the spins are not aligned with the fixed spin direction. Default:
5.0 * eV
- fixedSpinEnergy()¶
- Returns:
The fixed spin energy
- Return type:
PhysicalQuantity of type energy
- uniqueString()¶
Return a unique string representing the state of the object.
Usage Examples¶
Setup a FixedSpin object using atom indices:
fixed_spin = FixedSpin(spin_directions=[(0, 60*Degrees, 30*Degrees),
(2, -45*Degrees, 330*Degrees)])
Setup a FixedSpin object by element:
fixed_spin = FixedSpin(spin_directions=[(Hydrogen, 90*Degrees, 30*Degrees),
(Carbon, 54*Degrees, 300*Degrees)])
The following example demonstrates how to run a calculation with the FixedSpin object for a chromium dimer. Note that the chosen parameters might not necessarily represent a physically relevant calculation.
Warning
If FixedSpin is used in conjunction with InitialSpin, the latter should define collinear spin directions for all atoms in the system.
# Define the elements and coordinates.
elements = [Chromium, Chromium]
cartesian_coordinates = [[0.0, 0.0, 0.0],
[0.0, 0.0, 1.77]]*Angstrom
# Set up the Cr dimer configuration.
configuration = MoleculeConfiguration(
elements=elements,
cartesian_coordinates=cartesian_coordinates
)
# Set up an LCAO calculator with non-collinear spin and
# the LDA exchange-correlation.
calculator = LCAOCalculator(
exchange_correlation=NCLDA.PZ,
numerical_accuracy_parameters=NumericalAccuracyParameters(
density_mesh_cutoff=75.0*Hartree,
occupation_method=FermiDirac(300.0*Kelvin),
)
)
# Set an initial spin of 1.0 in the direction (theta, phi) = (0, 0).
spin_list = [
(0, 1.0, 0*Degrees, 0*Degrees),
(1, 1.0, 0*Degrees, 0*Degrees)
]
initial_spin = InitialSpin(scaled_spins=spin_list)
# Set the spin to be fixed in the direction (theta_0, phi_0) = (0, 0)
# for the first atom and in the direction (theta_1, phi_1) = (15 Degrees, 0)
# for the second atom.
theta_0_fixed = 0*Degrees
theta_1_fixed = 15*Degrees
fixed_spin_list = [(0, theta_0_fixed, 0*Degrees), (1, theta_1_fixed, 0*Degrees)]
fixed_spin = FixedSpin(spin_directions=fixed_spin_list, fixed_spin_energy=5*eV)
# Set the fixed spins as a local magnetic field.
configuration.setMagneticField(fixed_spin)
# Set the calculator on the configuration and run the calculation.
configuration.setCalculator(calculator, initial_spin=initial_spin)
configuration.update()