diff --git a/scripts/tcd/Basis_Function.py b/scripts/tcd/Basis_Function.py index b5463d58df8c3e43ae7799c34a625eea7a33580c..01eaf271f62e3c003a45bce4074fb13123f94ba4 100644 --- a/scripts/tcd/Basis_Function.py +++ b/scripts/tcd/Basis_Function.py @@ -533,17 +533,44 @@ class OrthonormalLegendre(Legendre): Notes ----- - To increase speed. this function uses a simplified calculation + To increase speed, this function uses a simplified calculation specific to the orthonormal Legendre polynomial basis. """ - left_reconstructions = [ - sum(projection[degree][cell] * (-1)**degree - * np.sqrt(degree + 0.5) - for degree in range(self._polynomial_degree+1)) - for cell in range(len(projection[0]))] - right_reconstructions = [ - sum(projection[degree][cell] * np.sqrt(degree + 0.5) - for degree in range(self._polynomial_degree+1)) - for cell in range(len(projection[0]))] - return left_reconstructions, right_reconstructions + left_reconstruction = projection.T @ (self._root_vector * + self._sign_vector) + right_reconstruction = projection.T @ self._sign_vector + + return left_reconstruction, right_reconstruction + + @property + @cache + def _root_vector(self): + """Return root vector. + + Return vector with the roots of all degrees plus 0.5. + + Returns + ------- + ndarray + Root vector. + + """ + return np.array([np.sqrt(degree+0.5) + for degree in range(self.polynomial_degree+1)]) + + @property + @cache + def _sign_vector(self): + """Return sign vector. + + Return identity vector with sign changes for all even degrees. + + Returns + ------- + ndarray + Sign vector. + + """ + return np.array([-1 if degree % 2 else 1 + for degree in range(self._polynomial_degree+1)])