def read(self, label=None): """Read results from VASP output files. Files which are read: OUTCAR, CONTCAR and vasprun.xml Raises ReadError if they are not found""" if label is None: label = self.label Calculator.read(self, label) # If we restart, self.parameters isn't initialized if self.parameters is None: self.parameters = self.get_default_parameters() # Check for existence of the necessary output files for f in ['OUTCAR', 'CONTCAR', 'vasprun.xml']: file = self._indir(f) if not file.is_file(): raise calculator.ReadError( 'VASP outputfile {} was not found'.format(file)) # Build sorting and resorting lists self.read_sort() # Read atoms self.atoms = self.read_atoms() # Read parameters self.read_incar(filename=self._indir('INCAR')) self.read_kpoints(filename=self._indir('KPOINTS')) self.read_potcar(filename=self._indir('POTCAR')) # Read the results from the calculation self.read_results()
def _read_xml(self) -> SinglePointDFTCalculator: """Read vasprun.xml, and return the last calculator object. Returns calculator from the xml file. Raises a ReadError if the reader is not able to construct a calculator. """ file = self._indir('vasprun.xml') incomplete_msg = ( f'The file "{file}" is incomplete, and no DFT data was available. ' 'This is likely due to an incomplete calculation.') try: _xml_atoms = read(file, index=-1, format='vasp-xml') # Silence mypy, we should only ever get a single atoms object assert isinstance(_xml_atoms, ase.Atoms) except ElementTree.ParseError as exc: raise calculator.ReadError(incomplete_msg) from exc if _xml_atoms is None or _xml_atoms.calc is None: raise calculator.ReadError(incomplete_msg) self._xml_calc = _xml_atoms.calc return self._xml_calc