This program allows to perform DFT+DMFT ''one-shot'' and charge self-consistent calculations from h5 archives or VASP input files for multiband systems using the TRIQS package, in combination with the CThyb solver and SumkDFT from DFT-tools. Runs with both triqs 1.4.2 and triqs 2.1. (https://github.com/TRIQS/)
For one-shot calculations one starts directly by running run_dmft.py
, whereas
for CSC calculations one uses the vasp_dmft.sh
bash scripts to start both VASP
and triqs at once.
Copyright (C) 2019, A. Hampel, S. Beck and C. Ederer from Materials Theory Group at ETH Zurich.
This application is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version (see http://www.gnu.org/licenses/). You should have received a copy of the License (file: LICENSE) with this repository.
It is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Please also note that we do not provide user support for this code.
- run_dmft.py: main file that runs the calculation and start a CSC flow by
invoking
csc_flow_control
or a one shot calculation directly by invokingdmft_cycle
on a given h5 archive - read_config.py: contains the functions to read the dmft config file. Take a
look in
read_config.py
for a detailed list of parameters - dmft_cycle.py: contains the
dmft_cycle
function that run a predefined number of DMFT iterations - csc_flow.py: contains the
csc_flow_control
function to steer the CSC calculation and call then ones per DFT+DMFT cycle thedmft_cycle
function - observables.py: contains all functions necessary to calculate and write the
observables during the run, which are stored in a general dictionary:
observables
- toolset.py: contains several small helper functions
For one-shot calculations one starts directly by running run_dmft.py
, whereas
for CSC calculations one uses the vasp_dmft.sh
bash scripts to start both VASP
and triqs at once.
In the example
directory one finds several
examples to run. Best start with the svo-one-shot example. The
dmft_config.ini
file contains the configuration for the DMFT run, which is
explained in the read_config method in the main script. The svo.h5
is the DMFT
input data, which is obtained from projection on localized Wannier functions
(see folder svo-one-shot/converter
).
If one wishes to do CSC calculations the docker container must contain also a installed VASP version >5.4.4 that understands the ICHARG=5 flag.
To run the one shot examples one can use the triqs docker images on, https://hub.docker.com/r/materialstheory/triqs/ or the official ones on https://hub.docker.com/r/flatironinstitute/triqs/.
then one can run docker as:
docker run --rm -it -u $(id -u) -v ~/git/uni-dmft:/work materialstheory/triqs bash
go to the example directory inside the running container and the run it via:
mpirun -n 4 python work/run_dmft.py
or run it directly via:
docker run --rm -it -u $(id -u) -v ~/git/uni-dmft:/work materialstheory/triqs bash -c 'cd /work/tests/svo-one-shot/ && python /work/run_dmft.py'
the more elaborate version of the Docker container found in this repo in the
folder Docker
can be best started as:
docker run --rm -it --shm-size=4g -e USER_ID=`id -u` -e GROUP_ID=`id -g` -p 8378:8378 -v $PWD:/work -v ~/git/uni-dmft:/uni-dmft triqs_vasp_csc bash
where the -e
flags will translate your current user and group id into the
container and make sure writing permissions are correct for the mounted volumes.
Moreover, you can start by executing
jupyter.sh
a jupyter-lab server from the current dir.
Here one needs a special docker image with vasp included. This can be done by
building the Dockerfile in /Docker/
:
docker build -t triqs_vasp_csc ./
Then start this docker image as done above and go to the directory with all
necessary input files (start with svo-csc
example). You need a preconverged
CHGCAR and preferably a WAVECAR, a set of INCAR, POSCAR, KPOINTS and POTCAR
files, the PLO cfg file plo.cfg
and the usual DMFT input file
dmft_config.ini
.
One starts the whole machinery by calling via bash the vasp_dmft.sh
script in
the top dir from inside the docker container:
/work/vasp_dmft.sh -n 12 -v 12 /work/run_dmft.py
This will call automatically VASP with -v 12
threads and triqs with -n 12
threads, where triqs starts the specified run_dmft.py
. If one now set the csc
flag in the dmft_config.ini
file to True, triqs will wait for vasp to create
PLOs, run the converter, run the dmft_cycle, and then VASP again until the given
limit of DMFT iterations is reached.
One remark regarding the number of iterations per DFT cycle. Since VASP uses a block Davidson scheme for minimizing the energy functional not all eigenvalues of the Hamiltonian are updated simultaneously therefore one has to make several iterations before the changes from DMFT in the charge density are completely considered. The default value are 8 DFT iterations, which is very conservative. In general I found, that even in charge ordered systems 6 iterations are enough, but that can of course also differ with system size. Careful testing is advised!
I now use the official Vasp 5.4.4 patch 1 version with a few modifications:
- there is an 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. So I added aIF (IO%IU0>=0) THEN ... ENDIF
around it - in the current version of the dft_tools interface the file
LOCPROJ
should contain the fermi energy in the header. Therefore I replaced the following line inlocproj.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 added 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. I added a flush to the buffer to have a correctly writtenOSZICAR
to extract the DFT energy. I added inelectron.F
around line 580 after
CALL STOP_TIMING("G",IO%IU6,"DOS")
two lines:
flush(17)
print *, ' '
which did the job.
- this one is essential vor the current version of the DMFT code. I tried to
fasten everything and I figured that Vasp spends a very long time in the
function
LPRJ_LDApU
. I checked and this function is not needed! Is it used for some basic checks and a manual LDA+U implementation. Removing the call to this function inelectron.F
in line 644 speeds up the calculation by up to 30%! However, originally I added a copy of the fileGAMMA
toGAMMA.old
to keep the original GAMMA file from DMFT. This is not needed now anymore and I removed theshutil
copy call in our python code. - make sure that mixing in VASP is turned of IMIX=0