# 9.2. Example: PDOS of graphene

We now turn to partial density of states calculations and use graphene
to illustrate how to set them up. PDOS calculations are fundamentally
similar to DOS calculations, the difference being that the energy levels
constituting the DOS are weighted by atomic orbital coefficients.
Suppose that the self-consistent ground state density of graphene may be
found in `./results/gr_lcao_scf.h5`

and `./results/gr_lcao_scf.mat`

,
one may compute the PDOS of graphene using the following input script

```
info.calculationType = 'dos'
info.savepath = 'results/gr_lcao_pdos'
kpoint.sampling = 'tetrahedron'
kpoint.gridn = [45,45,1]
rho.in = 'results/gr_lcao_scf'
dos.range = [-0.75,0.35]
dos.projL = [0,1,2]
dos.projM = -2:2
```

The relevant keywords in PDOS calculations are the following

`dos.range`

gives the energy range over which the DOS and PDOS are calculated. This is relative to the Fermi energy. The default units are Hartree.`dos.projAtom`

is an array containing the atom indices on which to project the DOS.`dos.projL`

is an array containing the orbital angular momenta on which to project the DOS.`dos.projM`

is an array containing the projected orbital angular momenta on which to project the DOS.`dos.projSpecies`

is an array containing the species (element) indices on which to project the DOS.`dos.projZ`

is an array containing the \(\zeta\)-numbers on which to project the DOS.

It is not necessary to project the DOS onto all valid values of a given
quantum number. For instance, we could have set `dos.projL`

equal to
[0,1]. Note however that the sum of the PDOS would not equal the DOS in
this case since part of the DOS has *d*-orbital character. Whereas the
values of `dos.projAtom`

, `dos.projL`

, `dos.projSpecies`

and
`dos.projZ`

are self-explanatory, `dos.projM`

depends on the
convention for the real spherical harmonics used by RESCU, which may be
found in Table 2.8.1.

In the present example, we decompose the DOS using both `dos.projL`

and `dos.projM`

. In this case, RESCU will decompose the DOS into all
valid – meaning that, say, `dos.projL = 3`

would be ignored since
there are no \(f\)-orbital in our atomic orbital basis –
combinations of the specified constraints. There are thus nine PDOS
calculated here. After loading the results, the `dos`

data structure
should look like

```
desc: [1x1 struct]
dosvec: [1100x1 double]
nrgvec: [1100x1 double]
pdosdef: [9x5 double]
pdosvec: [1100x1x9 double]
projAtom: []
projL: [0 1 2]
projM: [-2 -1 0 1 2]
projSpecies: []
projZ: []
```

In particular, the field `dos.pdosdef`

contains the constraints
specific to each PDOS. The field `dos.pdosdef`

has nine rows,
corresponding to the nine PDOS and five column corresponding to the
value of the atomic orbital indices. A negative value out of bound means
that the index is summed over. For instance, there is no minus-oneth
atom, so `projAtom = -1`

means that the contribution of all atoms is
accumulated. Similarly, `projM = -4`

means that the contribution of
\(Y_{l,m}\)-orbitals is summed over \(m\). In the latter case,
`projM = -1`

would simply refer to \(Y_{l,-1}\)-orbitals however.

```
dos.pdosdef
#projAtom projL projM projSpecies projZ
-1 0 0 -1 -1
-1 1 -1 -1 -1
-1 1 0 -1 -1
-1 1 1 -1 -1
-1 2 -2 -1 -1
-1 2 -1 -1 -1
-1 2 0 -1 -1
-1 2 1 -1 -1
-1 2 2 -1 -1
```

The total DOS along with the \(s\), \(p_y\), \(p_z\) and
\(p_x\) PDOS (first four rows of `dos.pdosdef`

respectively), are
plotted in Fig. 9.2.1. The low
lying state have \(s\) character while the Dirac cone is strictly
composed of \(p_z\) orbitals. The \(p_x\) and \(p_y\) PDOS
are virtually indistinguishable as expected from symmetry
considerations.