Source code for dfttopif.parsers.abinit
from .base import DFTParser
import os
import glob
from ase.calculators.abinit import Abinit
from pypif.obj.common import Value, Property
[docs]class AbinitParser(DFTParser):
'''
Parser for ABINIT calculations
'''
_label = None
[docs] def get_name(self): return "ABINIT"
[docs] def test_if_from(self, directory):
# Check whether any file has as name ABINIT in the file in the first two lines
files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
for f in files:
fp = open(os.path.join(directory, f), 'r')
for line in [fp.readline(), fp.readline()]:
if "ABINIT" in line:
fp.close()
return True
fp.close()
return False
def _get_label(self):
'''Find the label for the output files
for this calculation
'''
if self._label is None:
files = [f for f in os.listdir(self._directory) if os.path.isfile(os.path.join(self._directory, f))]
foundfiles = False
print(files)
for f in files:
if ".files" in f:
foundfiles = True
self._label = f.split(".")[0]
fp = open(os.path.join(self._directory, self._label + '.files'), 'r')
line = fp.readline().split()[0]
if line != self._label + ".in":
fp.close()
raise Exception('first line must be label.in')
line = fp.readline().split()[0]
if line != self._label + ".txt":
fp.close()
raise Exception('second line must be label.txt')
line = fp.readline().split()[0]
if line != self._label + "i":
fp.close()
raise Exception('third line must be labeli')
line = fp.readline().split()[0]
if line != self._label + "o":
fp.close()
raise Exception('fourth line must be labelo')
fp.close()
if foundfiles:
return self._label
else:
raise Exception('label.files not found')
#ASE format
# (self.prefix + '.in') # input
# (self.prefix + '.txt')# output
# (self.prefix + 'i') # input
# (self.prefix + 'o') # output
else:
return self._label
[docs] def get_cutoff_energy(self):
# Open up the label.txt file
fp = open(os.path.join(self._directory, self._label + '.out'), 'r')
foundecho = False
# Look for ecut after the occurence of "echo values of preprocessed input variables"
for line in fp:
if "echo values of preprocessed input variables" in line:
foundecho = True
if "ecut" in line and foundecho:
words = line.split()
return Value(scalars=float(words[1]), units=words[2])
# Error handling: ecut not found
raise Exception('ecut not found')