Skip to main content

Magnetic system: bulk iron

I am following this example from the ICTP online school 2021.

We will perform the SCF KS orbital calculations on magnetic (nspin=2) iron. Since the d-orbitals of Fe atom are localized/ hard, we will use ultra-soft pseudo potential (USPP).


If we have crystal structure with only one atom per unit cell, or only one type of atoms, the only possible ordering is ferromagnetic. In such cases, we need to form supercell with more number of atoms or label multiple atoms separately, so that their magnetic orientation could be different thus having the possibility of ferro- or antiferromagnetic final states.

Run the SCF calculations for both ferro- and antiferromagnetic structures. Notice that for ferromagnetic, we have BCC structure with only one type of atom, while we use simple cubic structure for antiferromagnetic case with two different atomic labels. For antiferromagnetic calculation, we need to start with opposite initial spins.

pw.x -i > pw.scf.fe_fm.out
pw.x -i > pw.scf.fe_afm.out

In case of the AFM calculation, if we have started with FM (say, for both atom types starting_magnetization=0.6 ), the calculation would still converge to AFM state as it is the true ground state for this system, albeit it would take more iteration to converge. If a system has complex potential surface with local minima, it it possible to get different final state magnetization depending on the starting magnetization. In such cases, a stricter convergence criteria might help.


In case of ultrasoft pseudo potentials, the Quantum Espresso default of ecutrho 4 times of ecutoff is not sufficient. We need to set ecutrho 8 or even 12 times that of ecutoff. We must test the convergence for our set values.

Convergence test for USPP

Below is the PWTK script file:

# load the pw.x input from file

# dual is the ratio ecutrho/ecutwfc
foreach dual { 4 8 12 } {

set fid [open etot-vs-ecutwfc.dual$dual.dat w]

foreach ecutwfc [seq 25 5 50] {

set name pw.Fe.scf.ecutwfc-$ecutwfc.dual-$dual

SYSTEM "ecutwfc = $ecutwfc
ecutrho = $ecutwfc*$dual "
runPW $

set Etot [pwo_totene $name.out]
puts $fid "$ecutwfc $Etot"

close $fid

Run the script:

pwtk fe_ecut.pwtk

Density of states calculation

PWTK script to calculate DOS and p-DOS:


SYSTEM " ecutwfc = 40
ecutrho = 320 "

set name Fe

runPW pw.$

CONTROL { calculation = 'nscf' }
SYSTEM { occupations = 'tetrahedra' ,
degauss = , ! this is how variable is unset in PWTK
K_POINTS automatic {
12 12 12 1 1 1
runPW pw.$

fildos = '$name.dos.dat'
Emin = 5.0
Emax = 20.0,
DeltaE = 0.1
runDOS dos.$

filpdos = '$name.pdos.dat'
Emin = 5.0
Emax = 20.0,
DeltaE = 0.1
runPROJWFC projwfc.$

Below is the plots of total and projected density of states.

fe-dos fe-pdos

Also see bandstructure of Fe with and without SOC.


Paramagnetic materials have fluctuating magnetic moments that may not be properly described DFT. One approach is to model paramagnetic materials in DFT calculation by building a large supercell and assign randomly oriented magnetic moments.

Also note that DFT assumes zero temperature, so it makes sense to perform FM or AFM calculation for magnetic systems.

Visualizing magnetic moments

We can use XCrySDen to visualize the orientation of magnetic moments. XCrySDen cannot directly read the Quantum Espresso output files for magnetic moment vectors, instead we need to create the input .xsf file with magnetic moments as force vector. You can also change the background color from black from the Palette Menu which is located in the left of File menu.

# this is a specification for crystal structure

# primitive lattice vectors (in Angstroms)
2.8681404710 0.0000000000 0.0000000000
0.0000000000 2.8681404710 0.0000000000
0.0000000000 0.0000000000 2.8681404710

# conventional lattice vectors (in Angstroms)
2.8681404710 0.0000000000 0.0000000000
0.0000000000 2.8681404710 0.0000000000
0.0000000000 0.0000000000 2.8681404710

# First number stands for number of atoms in primitive cell
# the second number is always 1 for PRIMCOORD coordinates
# followed by atomic coordinates (in Angstroms) and forces:
# AtNum X Y Z Fx Fy Fz
2 1
26 0.0000000000 0.0000000000 0.0000000000 0.00 0.00 0.01
26 1.4340702350 1.4340702350 1.4340702350 0.00 0.00 -0.01

Open the file from XCrySDen Menu: File → Open Structure → Open XSF. Then go to Display menu and select Forces. If you want to adjust scaling for the force vectors, go to Modify → Force Settings and set suitable Length factor.