# Interface to VASP

## General remarks

One can use the official Vasp 5.4.4 patch 1 version with a few modifications:

there is a bug in

`fileio.F`

around line 1710 where the code tries print out something like “reading the density matrix from Gamma”, but this should be done only by the master node. Adding a`IF (IO%IU0>=0) THEN ... ENDIF`

around it fixes thisin the current version of the dft_tools interface the file

`LOCPROJ`

should contain the fermi energy in the header. Therefore one should replace the following line in`locproj.F`

:

```
WRITE(99,'(4I6," # of spin, # of k-points, # of bands, # of proj" )') NS,NK,NB,NF
```

by

```
WRITE(99,'(4I6,F12.7," # of spin, # of k-points, # of bands, # of proj, Efermi" )') W%WDES%NCDIJ,NK,NB,NF,EFERMI
```

and add the variable `EFERMI`

accordingly in the function call.

Vasp gets sometimes stuck and does not write the

`OSZICAR`

file correctly due to a stuck buffer. Adding a flush to the buffer to have a correctly written`OSZICAR`

to extract the DFT energy helps, by adding in`electron.F`

around line 580 after

```
CALL STOP_TIMING("G",IO%IU6,"DOS")
```

two lines:

```
flush(17)
print *, ' '
```

this one is

**essential**for the current version of the DMFT code. Vasp spends a very long time in the function`LPRJ_LDApU`

and this function is not needed! It is used for some basic checks and a manual LDA+U implementation. Removing the call to this function in`electron.F`

in line 644 speeds up the calculation by up to 30%! If this is not done, Vasp will create a GAMMA file each iteration which needs to be removed manually to not overwrite the DMFT GAMMA file!make sure that mixing in VASP stays turned on. Don’t set IMIX or the DFT steps won’t converge!

## LOCPROJ bug for individual projections:

Example use of LOCPROJ for t2g manifold of SrVO3 (the order of the orbitals seems to be mixed up… this example leads to x^2 -y^2, z^2, yz… ) In the current version there is some mix up in the mapping between selected orbitals in the INCAR and actual selected in the LOCPROJ. This is what the software does (left side is INCAR, right side is resulting in the LOCPROJ)

xy -> x2-y2

yz -> z2

xz -> yz

x2-y2 -> xz

z2 -> xy

```
LOCPROJ = 2 : dxz : Pr 1
LOCPROJ = 2 : dx2-y2 : Pr 1
LOCPROJ = 2 : dz2 : Pr 1
```

However, if the complete d manifold is chosen, the usual VASP order (xy, yz, z2, xz, x2-y2) is obtained in the LOCPROJ. This is done as shown below

```
LOCPROJ = 2 : d : Pr 1
```

## convergence of projectors with Vasp

for a good convergence of the projectors it is important to convergence the wavefunctions to high accuracy. Otherwise this often leads to off-diagonal elements in the the local Green’s function. To check convergence pay attention to the rms and rms© values in the Vasp output. The former specifies the convergence of the KS wavefunction and the latter is difference of the input and out charge density. Note, this does not necessarily coincide with good convergence of the total energy in DFT! Here an example of two calculations for the same system, both converged down to `EDIFF= 1E-10`

and Vasp stopped. First run:

```
N E dE d eps ncg rms rms(c)
...
DAV: 25 -0.394708006287E+02 -0.65893E-09 -0.11730E-10 134994 0.197E-06 0.992E-05
...
```

second run with different smearing:

```
...
DAV: 31 -0.394760088659E+02 0.39472E-09 0.35516E-13 132366 0.110E-10 0.245E-10
...
```

The total energy is lower as well. But more importantly the second calculation produces well converged projectors preserving symmetries way better, with less off-diagonal elements in Gloc, making it way easier for the solver. Always pay attention to rms.

## Enabling CSC calculations with Wannier90 projectors

You basically only need to add two things to have W90 run in Vasp’s CSC mode, all in `electron.F`

:

the line

`USE mlwf`

at the top of the`SUBROUTINE ELMIN`

together with all the other`USE ...`

statements.right below where you removed the call to

`LPRJ_LDApU`

(see above, around line 650), there is the line`CALL LPRJ_DEALLOC_COVL`

. Just add the following block right below, inside the same “if” as the`CALL LPRJ_DEALLOC_COVL`

:

```
IF (WANNIER90()) THEN
CALL KPAR_SYNC_ALL(WDES,W)
CALL MLWF_WANNIER90(WDES,W,P,CQIJ,T_INFO,LATT_CUR,INFO,IO)
ENDIF
```

Then, the only problem you’ll have is the order of compilation in the `.objects`

file. It has to change because now electron.F references mlwf. For that move the entries `twoelectron4o.o`

and `mlwf.o`

(in this order) up right behind `linear_optics.o`

. Then, move the lines from `electron.o`

to `stm.o`

behind the new position of `mlwf.o`

.

Remarks:

W90-CSC requires Wannier90 v3, in v2 the tag write_u_matrices does not work correctly. Until now, linking W90 v3 to Vasp with the

`DVASP2WANNIER90v2`

has worked without any problems even though it is not officially supportedsymmetries in Vasp should remain turned on, otherwise the determination of rotation matrices in dft_tools’ wannier converter will most likely fail

## Speeding up by not writing projectors at every step

This is very important for CSC calculations with W90 but also speeds up the PLO-based ones.

Writing the Wannier projectors is a time consuming step (and to a lesser extent, the PLO projectors) and basically needs only to be done in the DFT iteration right before a DMFT iteration. Therefore, solid_dmft writes the file `vasp.suppress_projs`

that tells Vasp when **not** to compute/write the projectors. This requires two small changes in `electron.F`

in the Vasp source code:

adding the definition of a logical variable where all other variables are defined for

`SUBROUTINE ELMIN`

, e.g. around line 150, by inserting`LOGICAL :: LSUPPRESS_PROJS_EXISTS`

go to the place where you removed the call to

`LPRJ_LDApU`

(see above, around line 650). This is inside a`IF (MOD(INFO%ICHARG,10)==5) THEN ... ENDIF`

block. This whole block has to be disabled when the file`vasp.suppress_projs`

exists. So, right under this block’s “IF”, add the lines

```
INQUIRE(FILE='vasp.suppress_projs',&
EXIST=LSUPPRESS_PROJS_EXISTS)
IF (.NOT. LSUPPRESS_PROJS_EXISTS) THEN
```

and right before this block’s “ENDIF”, add another `ENDIF`

.