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