Name

MullikenPopulation — Class for calculating the Mulliken population for a configuration.

Synopsis

Namespace: NanoLanguage
MullikenPopulation(configuration)

Description

Constructor for the MullikenPopulation object.

MullikenPopulation Arguments

configuration

The Configuration which the Mulliken population should be calculated for.

Type: DeviceConfiguration | BulkConfiguration, | MoleculeConfiguration.

Default: None

MullikenPopulation Methods

A MullikenPopulation object provides the following methods:

  • atomicAngles(): Return the atomic polarization angles.

  • atoms(spin): Return an array with the Mulliken population of each atom.

    spin

    The mulliken population is calculated for this spin.

    Type: Spin.Up | Spin.Down | None

  • bond(atom_i, atom_j, spin): Return a float which is the Mulliken population projected onto the bond between atom_i and atom_j

    atom_i

    Index of the first atom in the bond projection.

    Type: Integer between zero and the number of atoms.

    atom_j

    Index of the second atom in the bond projection.

    Type: Integer between zero and the number of atoms.

    spin

    The mulliken population is calculated for this spin.

    Type: Spin.Up | Spin.Down | None

  • nlprint(stream): Print a string containing an ASCII table useful for plotting the molecular energy spectrum.

    stream

    The stream the Mulliken population should be written to.

    Type: A stream that supports strings being written to using 'write'.

    Default: sys.stdout
  • orbitals(spin): Return a list of arrays. The array in entry atom_i holds the Mulliken population of the orbitals on atom i

    spin

    The mulliken population is calculated for this spin.

    Type: Spin.Up | Spin.Down | None

  • spins(): Return the spins available in this Mulliken population

Usage Examples

Calculate the Mulliken population of an ammonia molecule and print projections of orbitals and bonds.

# Set up configuration
molecule_configuration = MoleculeConfiguration(
    elements=[Nitrogen, Hydrogen, Hydrogen, Hydrogen],
    cartesian_coordinates= [[ 0.      ,  0.      ,  0.124001],
                         [ 0.      ,  0.941173, -0.289336],
                         [ 0.81508 , -0.470587, -0.289336],
                         [-0.81508 , -0.470587, -0.289336]]*Angstrom )

# Define the calculator
calculator = HuckelCalculator()
molecule_configuration.setCalculator(calculator)

# Calculate and save the mulliken population
mulliken_population = MullikenPopulation(
    configuration=molecule_configuration)

nlsave('mulliken.nc', mulliken_population)

# print all occupations
nlprint(mulliken_population)

#print partial occupations of N
print 'N ',mulliken_population.atoms()[0],
print ' | ',mulliken_population.orbitals()[0]
print

#print partial occupations of first H
print 'H ',mulliken_population.atoms()[1],
print ' | ',mulliken_population.orbitals()[1]
print

#print mulliken population of N-H bond
print 'N-H bond ',mulliken_population.bond(0,1)

mulliken_nh3.py

Notes

The total number of electrons, N, is given by

\displaystyle

    N =  \sum_{ij} D_{ij} S_{ij}

where D is the Density Matrix, S the overlap matrix, and the sum is over all orbitals in the system.

The Mulliken population is defined by different partitions of this sum into orbitals, atoms and bonds.

Mulliken population of orbitals

The Mulliken Population of orbitals, M_i, is defined by restricting one of the sum indexes to the orbital, i.e.

\displaystyle

          M_i =  \sum_{j} D_{ij} S_{ji}
Mulliken population of atoms

The Mulliken Population of atoms, M_{\mu}, is defined by adding up all the orbital contributions on atom number \mu

\displaystyle

          M_\mu = \sum_{i \in \mu} \sum_{j} D_{ij} S_{ji}
Mulliken population of bonds

The Mulliken Population of bonds, M_{\mu \nu}, is defined by restricting the sum indexes to the orbitals on atom number \mu and \nu, i.e.

\displaystyle

          M_{\mu \nu} = (2-\delta_{\mu \nu}) \sum_{i \in \mu} \sum_{j \in \nu} D_{ij} S_{ji}

Note the factor two, which ensures

\displaystyle

          N = \sum_{\mu \ge \nu}  M_{\mu \nu}

Noncollinear spin

For noncollinear systems the atom mulliken population is a four component spin tensor

\displaystyle

       M_\mu^{\sigma \sigma'} = \sum_{i \in \mu} \sum_{j} D_{ij}^{\sigma \sigma'} S_{ji}.

The atom Mulliken Population can be diagonalized to give a local spin direction, and this direction is reported by the nlprint command for noncollinear systems.

The nlprint report for noncollinear spin also shows the orbital mulliken populations in the local spin direction.