aboutsummaryrefslogtreecommitdiff
path: root/vquad/test/test_tables.py
diff options
context:
space:
mode:
Diffstat (limited to 'vquad/test/test_tables.py')
-rw-r--r--vquad/test/test_tables.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/vquad/test/test_tables.py b/vquad/test/test_tables.py
new file mode 100644
index 0000000..79b8ffe
--- /dev/null
+++ b/vquad/test/test_tables.py
@@ -0,0 +1,53 @@
+# Copyright 2017 Christoph Groth (CEA).
+#
+# This file is part of Vquad. It is subject to the license terms in the file
+# LICENSE.rst found in the top-level directory of this distribution.
+
+from fractions import Fraction as Frac
+from itertools import combinations
+import numpy as np
+from numpy.testing import assert_allclose
+
+from .. import tables
+
+
+def test_legendre():
+ legs = tables.legendre(11)
+ comparisons = [(legs[0], [1], 1),
+ (legs[1], [0, 1], 1),
+ (legs[10], [-63, 0, 3465, 0, -30030, 0,
+ 90090, 0, -109395, 0, 46189], 256)]
+ for a, b, div in comparisons:
+ for c, d in zip(a, b):
+ assert c * div == d
+
+
+def test_scalar_product(n=33):
+ legs = tables.legendre(n)
+ selection = [0, 5, 7, n-1]
+ for i in selection:
+ for j in selection:
+ assert (tables.scalar_product(legs[i], legs[j])
+ == ((i == j) and Frac(2, 2*i + 1)))
+
+
+def simple_newton(n):
+ """Slower than 'newton()' and prone to numerical error."""
+ nodes = -np.cos(np.arange(n) / (n-1) * np.pi)
+ return [sum(np.prod(-np.asarray(sel))
+ for sel in combinations(nodes, n - d))
+ for d in range(n + 1)]
+
+
+def test_newton():
+ assert_allclose(tables.newton(9), simple_newton(9), atol=1e-15)
+
+
+def test_newton_legendre(level=1):
+ legs = [np.array(leg, float)
+ for leg in tables.legendre(tables.sizes[level] + 1)]
+ result = np.zeros(len(legs[-1]))
+ for factor, leg in zip(tables.newton_coeffs[level], legs):
+ factor *= np.sqrt((2*len(leg) - 1) / 2)
+ result[:len(leg)] += factor * leg
+ assert_allclose(result, tables.newton(tables.sizes[level]), rtol=1e-15)