1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.numerics.fft;
39
40 import static org.junit.Assert.assertEquals;
41
42 import java.util.Arrays;
43 import java.util.Collection;
44 import java.util.Random;
45
46 import ffx.utilities.FFXTest;
47 import org.junit.Before;
48 import org.junit.Test;
49 import org.junit.runner.RunWith;
50 import org.junit.runners.Parameterized;
51 import org.junit.runners.Parameterized.Parameters;
52
53
54 @RunWith(Parameterized.class)
55 public class Real3DTest extends FFXTest {
56
57 private final String info;
58 private final int nx;
59 private final int ny;
60 private final int nz;
61 private final int tot;
62 private final double[] data;
63 private final double[] expected;
64 private final double[] recip;
65 private final double tolerance = 1.0e-14;
66
67 public Real3DTest(String info, int nx, int ny, int nz) {
68 this.info = info;
69 this.nx = nx;
70 this.ny = ny;
71 this.nz = nz;
72 int paddedTot = (nx + 2) * ny * nz;
73 tot = nx * ny * nz;
74 data = new double[paddedTot];
75 expected = new double[tot];
76 recip = new double[tot];
77 }
78
79 @Parameters
80 public static Collection<Object[]> data() {
81 return Arrays.asList(
82 new Object[][] {
83 {"Test nx=32, ny=32, nz=32}", 32, 32, 32}, {"Test nx=32, ny=45, nz=21}", 32, 45, 21}
84 });
85 }
86
87 @Before
88 public void setUp() {
89 Random random = new Random();
90 int paddedIndex = 0;
91 int index = 0;
92 for (int z = 0; z < nz; z++) {
93 for (int y = 0; y < ny; y++) {
94 for (int x = 0; x < nx; x++) {
95 double r = random.nextDouble();
96 data[paddedIndex++] = r;
97 expected[index] = r;
98 recip[index++] = 1.0e0;
99 }
100 paddedIndex += 2;
101 }
102 }
103 }
104
105
106 @Test
107 public void testConvolution() {
108 Real3D real3D = new Real3D(nx, ny, nz);
109 real3D.setRecip(recip);
110 real3D.convolution(data);
111 int paddedIndex = 0;
112 int index = 0;
113 for (int z = 0; z < nz; z++) {
114 for (int y = 0; y < ny; y++) {
115 for (int x = 0; x < nx; x++) {
116 double actual = data[paddedIndex++] / tot;
117 double orig = expected[index++];
118 assertEquals(info, orig, actual, tolerance);
119 }
120 paddedIndex += 2;
121 }
122 }
123 }
124
125
126 @Test
127 public void testFft() {
128 Real3D real3D = new Real3D(nx, ny, nz);
129 real3D.fft(data);
130 real3D.ifft(data);
131 int paddedIndex = 0;
132 int index = 0;
133 for (int z = 0; z < nz; z++) {
134 for (int y = 0; y < ny; y++) {
135 for (int x = 0; x < nx; x++) {
136 double actual = data[paddedIndex++] / tot;
137 double orig = expected[index++];
138 assertEquals(info, orig, actual, tolerance);
139 }
140 paddedIndex += 2;
141 }
142 }
143 }
144 }