qsym2/sandbox/target/real_space_function/
real_space_function_transformation.rs1use itertools::Itertools;
4use nalgebra::Point3;
5use ndarray::{Array2, Axis, ShapeBuilder};
6use ndarray_linalg::types::Lapack;
7use num_complex::{Complex, ComplexFloat};
8
9use crate::permutation::Permutation;
10use crate::sandbox::target::real_space_function::RealSpaceFunction;
11use crate::symmetry::symmetry_element::SymmetryOperation;
12use crate::symmetry::symmetry_transformation::{
13 ComplexConjugationTransformable, DefaultTimeReversalTransformable, SpatialUnitaryTransformable,
14 SpinUnitaryTransformable, SymmetryTransformable, TimeReversalTransformable,
15 TransformationError,
16};
17
18impl<T, F> SpatialUnitaryTransformable for RealSpaceFunction<T, F>
22where
23 T: ComplexFloat + Lapack,
24 F: Clone + Fn(&Point3<f64>) -> T,
25{
26 fn transform_spatial_mut(
27 &mut self,
28 rmat: &Array2<f64>,
29 _: Option<&Permutation<usize>>,
30 ) -> Result<&mut Self, TransformationError> {
31 let rmat = rmat.select(Axis(0), &[2, 0, 1]).select(Axis(1), &[2, 0, 1]);
32 let rmatinv = rmat.t();
33 let grid_array = Array2::from_shape_vec(
34 (3, self.grid_points.len()).f(),
35 self.grid_points
36 .iter()
37 .flat_map(|pt| pt.iter().cloned())
38 .collect_vec(),
39 )
40 .map_err(|err| TransformationError(err.to_string()))?;
41 let rmatinv_grid_array = rmatinv.dot(&grid_array);
42 let rmatinv_grid_points = rmatinv_grid_array
43 .columns()
44 .into_iter()
45 .map(|col| Point3::new(col[0], col[1], col[2]))
46 .collect_vec();
47 self.grid_points = rmatinv_grid_points;
48 Ok(self)
49 }
50}
51
52impl<T, F> SpinUnitaryTransformable for RealSpaceFunction<T, F>
57where
58 T: ComplexFloat + Lapack,
59 F: Clone + Fn(&Point3<f64>) -> T,
60{
61 fn transform_spin_mut(
66 &mut self,
67 _: &Array2<Complex<f64>>,
68 ) -> Result<&mut Self, TransformationError> {
69 Ok(self)
70 }
71}
72
73impl<T, F> ComplexConjugationTransformable for RealSpaceFunction<T, F>
78where
79 T: ComplexFloat + Lapack,
80 F: Clone + Fn(&Point3<f64>) -> T,
81{
82 fn transform_cc_mut(&mut self) -> Result<&mut Self, TransformationError> {
83 self.complex_conjugated = !self.complex_conjugated;
84 Ok(self)
85 }
86}
87
88impl<T, F> DefaultTimeReversalTransformable for RealSpaceFunction<T, F>
92where
93 T: ComplexFloat + Lapack,
94 F: Clone + Fn(&Point3<f64>) -> T,
95{
96}
97
98impl<T, F> SymmetryTransformable for RealSpaceFunction<T, F>
102where
103 T: ComplexFloat + Lapack,
104 F: Clone + Fn(&Point3<f64>) -> T,
105 RealSpaceFunction<T, F>: SpatialUnitaryTransformable + TimeReversalTransformable,
106{
107 fn sym_permute_sites_spatial(
110 &self,
111 _: &SymmetryOperation,
112 ) -> Result<Permutation<usize>, TransformationError> {
113 Permutation::from_image(vec![0]).map_err(|err| TransformationError(err.to_string()))
114 }
115}