OrbitalMoment

class OrbitalMoment(configuration, kpoints=None, temperature=None)

Class for calculating the orbital moment for a BulkConfiguration or a MoleculeConfiguration.

Parameters:
  • configuration (BulkConfiguration) – The BulkConfiguration for which to calculate the inter-site coupling matrix.

  • kpoints (sequence (size 3) of int | MonkhorstPackGrid | KpointDensity | RegularKpointGrid) – The k-points with which to calculate the orbital moment.
    Default: The k-point sampling used on the calculator.

  • temperature (PhysicalQuantity of type temperature) – The temperature for the thermal smearing of the Fermi distribution.
    Default: 300 * Kelvin

atomResolvedOrbitalMoment()
Returns:

The orbital magnetic moment for each atom.

Return type:

PhysicalQuantity of Bohr magneton

kpoints()
Returns:

The k-points with which to calculate the Heisenberg exchange constants.

Return type:

class:~.MonkhorstPackGrid | RegularKpointGrid

metatext()
Returns:

The metatext of the object or None if no metatext is present.

Return type:

str | None

nlprint(stream=None)

Print a string containing an ASCII table useful for plotting the AnalysisSpin object.

Parameters:

stream (python stream) – The stream the table should be written to.
Default: NLPrintLogger()

orbitalMoment()
Returns:

The total orbital magnetic moment.

Return type:

PhysicalQuantity of Bohr magneton

setMetatext(metatext)

Set a given metatext string on the object.

Parameters:

metatext (str | None) – The metatext string that should be set. A value of “None” can be given to remove the current metatext.

temperature()
Returns:

The temperature for the thermal smearing of the Fermi distribution.

Return type:

PhysicalQuantity of type temperature

uniqueString()

Return a unique string representing the state of the object.

Usage Examples

Calculate the OrbitalMoment for iron.

# Set minimal log verbosity
setVerbosity(MinimalLog)

# %% bulk_iron

# Set up lattice
lattice = BodyCenteredCubic(2.8665*Angstrom)

# Define elements
elements = [Iron]

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

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


# %% InitialSpin

scaled_spins = [
    1.0,
]
initial_spin = InitialSpin(
    scaled_spins=scaled_spins
)
nlsave('orbital_moment_results.hdf5', initial_spin)


# %% Set LCAOCalculator

# %% LCAOCalculator

#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = SGGA.PBE

k_point_sampling = KpointDensity(
    density_a=7.0*Angstrom,
    density_b=7.0*Angstrom,
    density_c=7.0*Angstrom
)

numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=k_point_sampling
)

checkpoint_handler = NoCheckpointHandler

calculator = LCAOCalculator(
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    checkpoint_handler=checkpoint_handler
)


# %% Set Calculator

bulk_iron.setCalculator(
    calculator=calculator,
    initial_spin=initial_spin
)

bulk_iron.update()

nlsave('orbital_moment_results.hdf5', bulk_iron)


# %% Set LCAOCalculator

# %% LCAOCalculator

#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = SOGGA.PBE

k_point_sampling = KpointDensity(
    density_a=7.0*Angstrom,
    density_b=7.0*Angstrom,
    density_c=7.0*Angstrom
)

numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=k_point_sampling
)

checkpoint_handler = NoCheckpointHandler

calculator_1 = LCAOCalculator(
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    checkpoint_handler=checkpoint_handler
)


# %% Set Calculator

bulk_iron.setCalculator(
    calculator=calculator_1,
    initial_spin=initial_spin,
    initial_state=bulk_iron
)

bulk_iron.update()

nlsave('orbital_moment_results.hdf5', bulk_iron)


# %% OrbitalMoment

kpoints = MonkhorstPackGrid(
    na=22,
    nb=22,
    nc=22
)

orbital_moment = OrbitalMoment(
    configuration=bulk_iron,
    kpoints=kpoints
)
nlsave('orbital_moment_results.hdf5', orbital_moment)

Notes

The orbital moment is calculated following [1] as

\[\langle \mathbf{L}_i \rangle = {\rm Re}\sum_{\alpha \mathbf{k}} w_\mathbf{k} f_{\alpha, \mathbf{k}} \sum_{\lambda \mu \nu} c_{\lambda}^{\alpha*}(\mathbf{k})\left[\mathbf{L}_i\right]_{\lambda\mu} \mathbf{S}_{\mu\nu}(\mathbf{k})c_{\nu}^{\alpha}(\mathbf{k})\]

where \(\alpha\) denotes band index, \(\mathbf{k}\) is a k-point with corresponding weight \(w_\mathbf{k}\) and \(f_{\alpha, \mathbf{k}}\) is the occupation factor. The second sum runs over basis function orbitals and \(c_{\lambda}^{\alpha}(\mathbf{k})\) it the eigenvector component for basis orbital \(\lambda\) and band index \(\alpha\) calculated at the k-point \(\mathbf{k}\). The angular momentum operator is \(\mathbf{L}\) and \(\mathbf{S}(\mathbf{k})\) is the basis orbital overlap matrix.