Coverage for /builds/hweiske/ase/ase/io/gpw.py: 11.86%
59 statements
« prev ^ index » next coverage.py v7.2.7, created at 2024-04-22 11:22 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2024-04-22 11:22 +0000
1"""Read gpw-file from GPAW."""
2import ase.io.ulm as ulm
3from ase import Atoms
4from ase.calculators.singlepoint import (SinglePointDFTCalculator,
5 SinglePointKPoint, all_properties)
6from ase.io.trajectory import read_atoms
7from ase.units import Bohr, Hartree
10def read_gpw(filename):
11 try:
12 reader = ulm.open(filename)
13 except ulm.InvalidULMFileError:
14 return read_old_gpw(filename)
16 atoms = read_atoms(reader.atoms, _try_except=False)
18 wfs = reader.wave_functions
19 kpts = wfs.get('kpts')
20 if kpts is None:
21 ibzkpts = None
22 bzkpts = None
23 bz2ibz = None
24 else:
25 ibzkpts = kpts.ibzkpts
26 bzkpts = kpts.get('bzkpts')
27 bz2ibz = kpts.get('bz2ibz')
29 if reader.version >= 3:
30 efermi = reader.wave_functions.fermi_levels.mean()
31 else:
32 efermi = reader.occupations.fermilevel
34 atoms.calc = SinglePointDFTCalculator(
35 atoms,
36 efermi=efermi,
37 ibzkpts=ibzkpts,
38 bzkpts=bzkpts,
39 bz2ibz=bz2ibz,
40 # New gpw-files may have "non_collinear_magmom(s)" which ASE
41 # doesn't know:
42 **{property: value
43 for property, value in reader.results.asdict().items()
44 if property in all_properties})
46 if kpts is not None:
47 atoms.calc.kpts = []
48 for spin, (eps_kn, f_kn) in enumerate(zip(wfs.eigenvalues,
49 wfs.occupations)):
50 for kpt, (weight, eps_n, f_n) in enumerate(zip(kpts.weights,
51 eps_kn, f_kn)):
52 atoms.calc.kpts.append(
53 SinglePointKPoint(weight, spin, kpt, eps_n, f_n))
54 reader.close()
56 return atoms
59def read_old_gpw(filename):
60 from gpaw.io.tar import Reader
61 r = Reader(filename)
62 positions = r.get('CartesianPositions') * Bohr
63 numbers = r.get('AtomicNumbers')
64 cell = r.get('UnitCell') * Bohr
65 pbc = r.get('BoundaryConditions')
66 tags = r.get('Tags')
67 magmoms = r.get('MagneticMoments')
68 energy = r.get('PotentialEnergy') * Hartree
70 if r.has_array('CartesianForces'):
71 forces = r.get('CartesianForces') * Hartree / Bohr
72 else:
73 forces = None
75 atoms = Atoms(positions=positions,
76 numbers=numbers,
77 cell=cell,
78 pbc=pbc)
79 if tags.any():
80 atoms.set_tags(tags)
82 if magmoms.any():
83 atoms.set_initial_magnetic_moments(magmoms)
84 magmom = magmoms.sum()
85 else:
86 magmoms = None
87 magmom = None
89 atoms.calc = SinglePointDFTCalculator(atoms, energy=energy,
90 forces=forces,
91 magmoms=magmoms,
92 magmom=magmom)
93 kpts = []
94 if r.has_array('IBZKPoints'):
95 for w, kpt, eps_n, f_n in zip(r.get('IBZKPointWeights'),
96 r.get('IBZKPoints'),
97 r.get('Eigenvalues'),
98 r.get('OccupationNumbers')):
99 kpts.append(SinglePointKPoint(w, kpt[0], kpt[1],
100 eps_n[0], f_n[0]))
101 atoms.calc.kpts = kpts
103 return atoms