Reading and writing VASP WAVECAR files¶
httk-io provides the numpy-backed binary WAVECAR layer through
httk.io.vasp. It reads the small metadata headers eagerly and reads one
coefficient vector at a time, which keeps the large coefficient data on disk
until requested.
Installation and dispatch¶
WAVECAR support requires the optional numpy extra:
python -m pip install -e '.[numpy]'
Importing httk.core discovers the WAVECAR reader and writer. Files named
WAVECAR and files with the .wavecar extension are registered. The core
loader returns a neutral payload:
import httk.core
payload = httk.core.load("WAVECAR", raw=True)
assert payload["format"] == "vasp-wavecar"
source = payload["wavecar"]
The wavecar value is a WavecarSource contract, not an atomistic-domain
object. It exposes nspins, nkpts, nbands, encut, cell, kpoints,
eigenvalues, occupations, nplanewaves, double_precision,
and coefficients(spin, kpt, band). record_length is specific to an open
WavecarFile and is not part of the common source contract. The atomistic
layer can provide the same contract for in-memory data without depending on
the concrete WavecarFile class.
All indices are zero-based:
coefficients = source.coefficients(spin=0, kpt=0, band=0)
WavecarFile is also a context manager. Its metadata arrays have shapes
(nkpts, 3), (nspins, nkpts, nbands), and (nkpts,) for k-points,
eigenvalues/occupations, and plane-wave counts respectively.
Compression and writing¶
WAVECAR is a random-access binary format. Compressed paths are deliberately refused: streaming decompression cannot support seeking to arbitrary spin/k-point/band coefficient records. Decompress a file on disk before reading it. Writing likewise requires a binary filesystem path rather than a compressed or text stream.
from httk.io.vasp import read_wavecar, write_wavecar
payload = read_wavecar("WAVECAR")
write_wavecar("WAVECAR.copy", payload)
write_wavecar accepts the neutral vasp-wavecar payload and any source that
implements the WavecarSource contract. It preserves single- versus
double-precision coefficient storage according to double_precision.
VASP/VESTA volumetric output¶
write_vasp_volumetric writes POSCAR content followed by a three-dimensional,
real-valued grid in Fortran order. It is the low-level writer used when a
wavefunction or other scalar field needs to be opened by VESTA; pass
grid.real or grid.imag explicitly for a complex array.
from httk.io.vasp import write_vasp_volumetric
write_vasp_volumetric("wave_r.vasp", poscar_payload, wave.real)
write_vasp_volumetric("wave_i.vasp", poscar_payload, wave.imag)