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 edu.rit.pj.ParallelTeam;
43 import java.util.Arrays;
44 import java.util.Collection;
45 import java.util.Random;
46
47 import ffx.utilities.FFXTest;
48 import org.junit.Before;
49 import org.junit.Test;
50 import org.junit.runner.RunWith;
51 import org.junit.runners.Parameterized;
52 import org.junit.runners.Parameterized.Parameters;
53
54
55 @RunWith(Parameterized.class)
56 public class Real3DParallelTest extends FFXTest {
57
58 private final String info;
59 private final int nx;
60 private final int ny;
61 private final int nz;
62 private final int tot;
63 private final double[] data;
64 private final double[] expected;
65 private final double[] recip;
66 private final ParallelTeam parallelTeam;
67 private final double tolerance = 1.0e-14;
68
69 public Real3DParallelTest(String info, int nx, int ny, int nz, int nCPUs) {
70 this.info = info;
71 this.nx = nx;
72 this.ny = ny;
73 this.nz = nz;
74 tot = nx * ny * nz;
75 int paddedTot = (nx + 2) * ny * nz;
76 data = new double[paddedTot * 2];
77 expected = new double[tot];
78 recip = new double[tot];
79 parallelTeam = new ParallelTeam(nCPUs);
80 }
81
82 @Parameters
83 public static Collection<Object[]> data() {
84 return Arrays.asList(
85 new Object[][] {
86 {"Test nx=32, ny=32, nz=32, nCPUs=1}", 32, 32, 32, 1},
87 {"Test nx=32, ny=32, nz=32, nCPUs=2}", 32, 32, 32, 2},
88 {"Test nx=32, ny=45, nz=21, nCPUs=1}", 32, 45, 21, 1},
89 {"Test nx=32, ny=45, nz=21, nCPUs=2}", 32, 45, 21, 2}
90 });
91 }
92
93 @Before
94 public void setUp() {
95 Random random = new Random();
96 int paddedIndex = 0;
97 int index = 0;
98 for (int z = 0; z < nz; z++) {
99 for (int y = 0; y < ny; y++) {
100 for (int x = 0; x < nx; x++) {
101 double r = random.nextDouble();
102 data[paddedIndex++] = r;
103 expected[index] = r;
104 recip[index++] = 1.0e0;
105 }
106 paddedIndex += 2;
107 }
108 }
109 }
110
111
112 @Test
113 public void testConvolution() {
114 Real3DParallel real3D = new Real3DParallel(nx, ny, nz, parallelTeam);
115 real3D.setRecip(recip);
116 real3D.convolution(data);
117 int paddedIndex = 0;
118 int index = 0;
119 for (int z = 0; z < nz; z++) {
120 for (int y = 0; y < ny; y++) {
121 for (int x = 0; x < nx; x++) {
122 double actual = data[paddedIndex++] / tot;
123 double orig = expected[index++];
124 assertEquals(info, orig, actual, tolerance);
125 }
126 paddedIndex += 2;
127 }
128 }
129 }
130
131
132 @Test
133 public void testFft() {
134 Real3DParallel real3D = new Real3DParallel(nx, ny, nz, parallelTeam);
135 real3D.fft(data);
136 real3D.ifft(data);
137 int paddedIndex = 0;
138 int index = 0;
139 for (int z = 0; z < nz; z++) {
140 for (int y = 0; y < ny; y++) {
141 for (int x = 0; x < nx; x++) {
142 double actual = data[paddedIndex++] / tot;
143 double orig = expected[index++];
144 assertEquals(info, orig, actual, tolerance);
145 }
146 paddedIndex += 2;
147 }
148 }
149 }
150 }