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 Complex3DParallelTest 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 Complex3DParallelTest(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 data = new double[tot * 2];
76 expected = new double[tot];
77 recip = new double[tot];
78 parallelTeam = new ParallelTeam(nCPUs);
79 }
80
81 @Parameters
82 public static Collection<Object[]> data() {
83 return Arrays.asList(
84 new Object[][] {
85 {"Test nx=32, ny=32, nz=32, nCPUs=1}", 32, 32, 32, 1},
86 {"Test nx=32, ny=32, nz=32, nCPUs=2}", 32, 32, 32, 2},
87 {"Test nx=32, ny=45, nz=21, nCPUs=1}", 32, 45, 21, 1},
88 {"Test nx=32, ny=45, nz=21, nCPUs=2}", 32, 45, 21, 2}
89 });
90 }
91
92 @Before
93 public void setUp() {
94 Random random = new Random();
95 for (int i = 0; i < tot; i++) {
96 int index = i * 2;
97 double r = random.nextDouble();
98 data[index] = r;
99 expected[i] = r;
100 recip[i] = 1.0e0;
101 }
102 }
103
104
105 @Test
106 public void testConvolution() {
107 Complex3DParallel complex3D = new Complex3DParallel(nx, ny, nz, parallelTeam);
108 complex3D.setRecip(recip);
109 complex3D.convolution(data);
110 for (int i = 0; i < tot; i++) {
111 int index = i * 2;
112 double actual = data[index] / tot;
113 double orig = expected[i];
114 assertEquals(info, orig, actual, tolerance);
115 }
116 }
117
118
119 @Test
120 public void testFft() {
121 Complex3DParallel complex3D = new Complex3DParallel(nx, ny, nz, parallelTeam);
122 complex3D.fft(data);
123 complex3D.ifft(data);
124 for (int i = 0; i < tot; i++) {
125 int index = i * 2;
126 double actual = data[index] / tot;
127 double orig = expected[i];
128 assertEquals(info, orig, actual, tolerance);
129 }
130 }
131 }