diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f08a31e5e..ad44dfd77 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,10 +1,21 @@ `Unreleased `_ +- Requirements + + - ``packaging`` library added to dependencies. + - Bug fixes - Fixed an error loading QpointPhononModes from JSON when there is a single q-point in the data +- Improvements + + - When loading ``.castep_bin`` files, explicitly check the CASTEP + version number and give a useful error message if this is < 17.1. + (These files are missing information about the unit cell origins, + and would previously cause an error with an unhelpful message.) + - Maintenance - Compatibility fix for spglib 2.4 update: a new sanity-check in diff --git a/euphonic/readers/castep.py b/euphonic/readers/castep.py index 65455a0d9..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 @@ -469,8 +481,10 @@ def read_interpolation_data( np.reshape(_read_entry(f, float_type), (n_cells_in_sc, 3*n_atoms, 3*n_atoms)), axes=[0, 2, 1])) - cell_origins = np.reshape( - _read_entry(f, int_type), (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': born = np.reshape( 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',