From 1143f823eeb65cad899fecb514615315ede8660e Mon Sep 17 00:00:00 2001 From: "Adam J. Jackson" Date: Wed, 14 Feb 2024 13:39:05 +0000 Subject: [PATCH] Explicitly check CASTEP version and error out if too low --- euphonic/readers/castep.py | 25 ++++++++++++++----------- setup.py | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/euphonic/readers/castep.py b/euphonic/readers/castep.py index 0ab196590..c7f373dbb 100644 --- a/euphonic/readers/castep.py +++ b/euphonic/readers/castep.py @@ -1,4 +1,5 @@ from collections import defaultdict +from packaging.version import Version import re import struct from typing import (Any, BinaryIO, Dict, Iterator, List, NamedTuple, @@ -451,6 +452,17 @@ def read_interpolation_data( float_type = '>f8' first_cell_read = True while (header := _read_entry(f).strip()) != b'END': + if header == b'BEGIN_PARAMETERS_DUMP': + castep_version: Version = Version(_read_entry(f).decode().strip()) + if castep_version < Version("17.1"): + raise ValueError('Old castep file detected: ' + 'Euphonic only supports post-Castep 17.1 files. ' + 'Please rerun the calculation with a newer version ' + 'of Castep with the original .cell file and a ' + '.castep file with a single line with the ' + '"continuation: " keyword and ' + 'use the new output .castep_bin file in Euphonic.') + if header == b'BEGIN_UNIT_CELL': # CASTEP writes the cell twice: the first is the # geometry optimised cell, the second is the original @@ -470,17 +482,8 @@ def read_interpolation_data( (n_cells_in_sc, 3*n_atoms, 3*n_atoms)), axes=[0, 2, 1])) - cell_origins = _read_entry(f, int_type) - if isinstance(cell_origins, int): - raise ValueError('Old castep file detected: ' - 'Euphonic only supports post-Castep 17.1 files. ' - 'Please rerun the calculation with a newer version ' - 'of Castep with the original .cell file and a ' - '.castep file with a single line with the ' - '"continuation: " keyword and ' - 'use the new output .castep_bin file in Euphonic.') - - cell_origins = np.reshape(cell_origins, (n_cells_in_sc, 3)) + cell_origins = np.reshape(_read_entry(f, int_type), + (n_cells_in_sc, 3)) _ = _read_entry(f, int_type) # FC row not used elif header == b'BORN_CHGS': diff --git a/setup.py b/setup.py index be128a9a1..44e0ebabd 100644 --- a/setup.py +++ b/setup.py @@ -138,6 +138,7 @@ def run_setup(): packages=packages, include_package_data=True, install_requires=[ + 'packaging', 'scipy>=1.10', # requires numpy >= 1.19.5 'seekpath>=1.1.0', 'spglib>=1.9.4',