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