# 12. Mulliken charge calculation

This section shows how to obtain the Mulliken charges for an AlP crystal.

## 12.1. Example: Mulliken populations of AlP

We first obtain the ground state density which determines the Hamiltonian to be used in the Mulliken charge calculation.

```
LCAO.status = true
info.savepath = 'results/alp_lcao_scf'
info.outfile = 'falp_lcao_scf.out'
info.calculationType = 'self-consistent'
atom.element = [1 2]
atom.fracxyz = 0.25*[0 0 0; 1 1 1]
domain.latvec = 5.4510*0.5*[0 1 1;1 0 1;1 1 0]
domain.lowres = 0.3
units.latvec = 'A'
element(1).species = 'Al'
element(1).path = './Al_TM_LDA.mat'
element(2).species = 'P'
element(2).path = './P_TM_LDA.mat'
functional.list = {'XC_LDA_X','XC_LDA_C_PW'}
kpoint.gridn = [4,4,4]
```

Let’s call the previous input file `alp_lcao_scf`

. We pass this
standard self-consistent calculation input to RESCU

```
rescu -i alp_lcao_scf
```

and get the ground state density.

The next step is calculating the Mulliken charges. This is done using the following input file

```
info.savepath = 'results/alp_lcao_mul'
info.outfile = 'falp_lcao_mul.out'
info.calculationType = 'mulliken'
kpoint.gridn = [8 8 8]
rho.in = 'results/alp_lcao_scf'
```

named `alp_lcao_mul`

. RESCU performs a Mulliken calculation if the
keyword `info.calculationType`

is set to `mulliken`

. The path to the
converged density is passed using the keyword `rho.in`

. System data
like atomic and structural information are also read from `rho.in`

.
Remember to modify the output path, otherwise the self-consistent
results will be overwritten. Finally, the keyword `kpoint.gridn`

can
take the same value as in the ground state calculation, but we choose a
grid twice as fine here. We can now run RESCU

```
rescu -i alp_lcao_mul
```

After completing the calculation, the results are written to
`results/alp_lcao_mul.h5`

in `/LCAO/mullikenPop1`

. When doing a
spin-dependent calculation, the spin-up populations are saved in
`/LCAO/mullikenPop1`

and the spin-down populations are saved in
`/LCAO/mullikenPop2`

.

## 12.2. Analysis of the Mulliken populations

Field |
Index |
---|---|

Aorb |
atom |

Lorb |
\(L\) |

Morb |
\(L_z\) |

Oorb |
basis |

Rorb |
cutoff radius |

Sorb |
species |

Zorb |
zeta |

The Mulliken population matrix is imported as follows. In the MATLAB command window, type

```
h5path = './results/alp_lcao_mul.h5';
mul = loadDistArray(h5path,'/LCAO/mullikenPop1');
mul = mul.data;
```

and obtain the \(n_{nao}\times n_{nao}\) `mul`

matrix.

Suppose we want to know the total charge of the first atom, then we need
to know which orbitals are associated with it. The orbital information
for each row or column is stored in `LCAO.orbInfo`

in
`results/alp_lcao_mul.mat`

. The various fields of `LCAO.orbInfo`

are
summarized in Table 2.7.1. The field
`LCAO.orbInfo.Aorb`

contains the atomic indices, and hence we
calculate the first atom’s charge as follows

```
Aorb = LCAO.orbInfo.Aorb
sum(sum(mul(:,Aorb == 1)))
ans =
2.6670 - 0.0020i
```

Note that a partial sum such as the above is generally complex, but the sum of all entries in the Mulliken population matrix is real and equal to the number of valence electrons. The last point is not strictly satisfied if the calculation is performed on real space grids since the atomic orbitals do not form a complete basis.