All grid-like objects now contain a dual-template `InterpolationData<T,R>` object. The templated classses determine the data types of the (eigen)values and (eigen)vectors, respectively, held by the `InterpolationData` object. Internally the `InterpolationData` object has been split into two `InnerInterpolationData` objects, each with a single template parameter.
This allows for, e.g., real-valued eigenvalues and complex-valued eigenvectors to be handled without casting the strictly-real eigenvalues to complex. In addition to reducing the total memory usage this has advantages for distinguishing between scalar-like complex eigenvectors and real eigenvalues.
The `InnerInterpolationData` objects now support vector- and tensor-like data which rotates like reciprocal vectors, real space vectors, axial vectors, or _phonon eigenvectors_.
Phonon eigenvectors are not invariant under application of a symmetry operation due to atom-label permutations and complex phase-factors as a result of a symmetry operation sending atoms from one unit cell into multiple, different, unit cells. This complication is now handled correctly, allowing for interpolation in only the irreducible Brillouin zone.