Scripts pour l'étude de la grille de points k
Script pour lancer la série de calculs
Il s'agit du fichier run_kpoints.sh. Cette procédure
écrit le fichier KPOINTS
et exécute VASP pour une série de grilles de points
k allant de 1x1x1 à 12x12x12. À la fin de chaque calcul, certains fichiers de
sortie sont sauvegardés pour être analysés par la suite.
#!/bin/bash
# boucle sur i = 1 a 12
for i in $(seq 1 12)
do
# ecriture du fichier KPOINTS
echo "k points" > KPOINTS
echo " 0" >> KPOINTS
echo "Gamma" >> KPOINTS
echo " $i $i $i" >> KPOINTS
echo " 0 0 0" >> KPOINTS
# affiche le fichier KPOINTS
echo -e "\n ================================================================"
echo " KPOINTS file"
echo " ================================================================"
cat KPOINTS
echo -e " ================================================================\n"
# execution de vasp
vasp
# sauvegarde des fichiers importants
echo ""
cp -v OSZICAR OSZICAR_$i
cp -v CONTCAR CONTCAR_$i
# supprime les fichiers de fonction d'onde (WAVECAR)
# et de densite (CHGCAR) pour eviter un restart
echo ""
rm -v WAVECAR CHGCAR
done
Script d'analyse des résultats
Il s'agit du fichier ana_kpoints.py. Ce script utilise le module pymatgen pour extraire les données des fichiers de sortie de VASP. Ce script suppose que les fichiers sont nommés et numérotés comme le fait le script précédent pour lancer les calculs.
Pour exécuter le script :
python3 ana_kpoints.py
Code :
#!/usr/bin/env python
import os
# use pymatgen objects
from pymatgen.io.vasp.inputs import Poscar
from pymatgen.io.vasp.outputs import Oszicar
# header
print("# k a b c alpha beta gamma" +
" Econv SinglePts DE")
# OSZICAR files
oszicar = [f for f in os.listdir("./") if "OSZICAR_" in f]
oszicar.sort(key=lambda x: int(x.strip("OSZICAR_")))
# CONTCAR files
contcar = [f for f in os.listdir("./") if "CONTCAR_" in f]
contcar.sort(key=lambda x: int(x.strip("CONTCAR_")))
save = 0.0
# boucle sur les points k
for cont, osz in zip(contcar, oszicar):
i = int(cont.strip("CONTCAR_"))
# chargement de la structure
p = Poscar.from_file(cont)
a, b, c = p.structure.lattice.abc
alpha, beta, gamma = p.structure.lattice.angles
# lecture du fichier OSZICAR
o = Oszicar(osz)
elast = o.final_energy
singlePoint = o.ionic_steps[0]["E0"]
# affiche les resultats
print("%4d %7.3f %7.3f %7.3f %6.1f %6.1f %6.1f %12.7f %12.7f %12.3f" %
(i, a, b, c, alpha, beta, gamma, elast, singlePoint,
(singlePoint - save) * 1000.))
# save energy to compute convergence
save = singlePoint