https://mooseframework.inl.gov
HexagonalLatticeTest.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "HexagonalLatticeTest.h"
11 
12 TEST_F(HexagonalLatticeTest, rings_and_pins)
13 {
14  Real bp = 10.0, pp = 0.1, pd = 0.04, wd = 0.01, wp = 50.0;
15  unsigned int nr = 1, a = 2;
16  HexagonalLatticeUtils hl1(bp, pp, pd, wd, wp, nr, a);
17 
18  // Test number of rings given number of pins
19  EXPECT_EQ(hl1.rings(1), (unsigned int)1);
20  EXPECT_EQ(hl1.rings(7), (unsigned int)2);
21  EXPECT_EQ(hl1.rings(19), (unsigned int)3);
22  EXPECT_EQ(hl1.rings(37), (unsigned int)4);
23 
24  try
25  {
26  hl1.rings(100);
27  FAIL() << "missing expected error";
28  }
29  catch (const std::exception & e)
30  {
31  std::string msg(e.what());
32  ASSERT_NE(msg.find("Number of pins 100 not evenly divisible in a hexagonal lattice!"),
33  std::string::npos)
34  << "failed with unexpected error: " << msg;
35  }
36 
37  // Test number of pins in given ring
38  EXPECT_EQ(hl1.pins(1), (unsigned int)1);
39  EXPECT_EQ(hl1.pins(2), (unsigned int)6);
40  EXPECT_EQ(hl1.pins(3), (unsigned int)12);
41 
42  // Test first and last pins in given ring
43  EXPECT_EQ(hl1.firstPinInRing(1), (unsigned int)0);
44  EXPECT_EQ(hl1.lastPinInRing(1), (unsigned int)0);
45 
46  EXPECT_EQ(hl1.firstPinInRing(2), (unsigned int)1);
47  EXPECT_EQ(hl1.lastPinInRing(2), (unsigned int)6);
48 
49  EXPECT_EQ(hl1.firstPinInRing(3), (unsigned int)7);
50  EXPECT_EQ(hl1.lastPinInRing(3), (unsigned int)18);
51 }
52 
53 TEST_F(HexagonalLatticeTest, variation_with_rings)
54 {
55  Real bp = 10.0, pp = 0.1, pd = 0.04, wd = 0.01, wp = 50.0;
56  unsigned int nr = 1, a = 2;
57  HexagonalLatticeUtils hl1(bp, pp, pd, wd, wp, nr, a);
58 
59  nr = 2;
60  HexagonalLatticeUtils hl2(bp, pp, pd, wd, wp, nr, a);
61 
62  nr = 3;
63  HexagonalLatticeUtils hl3(bp, pp, pd, wd, wp, nr, a);
64 
65  nr = 4;
66  HexagonalLatticeUtils hl4(bp, pp, pd, wd, wp, nr, a);
67 
68  EXPECT_EQ(hl1.nPins(), (unsigned int)1);
69  EXPECT_EQ(hl1.nInteriorPins(), (unsigned int)1);
70  EXPECT_EQ(hl1.nEdgePins(), (unsigned int)0);
71  EXPECT_EQ(hl1.nCornerPins(), (unsigned int)0);
72  EXPECT_EQ(hl1.nChannels(), (unsigned int)6);
73  EXPECT_EQ(hl1.nInteriorChannels(), (unsigned int)0);
74  EXPECT_EQ(hl1.nEdgeChannels(), (unsigned int)0);
75  EXPECT_EQ(hl1.nCornerChannels(), (unsigned int)6);
76 
77  EXPECT_EQ(hl2.nPins(), (unsigned int)7);
78  EXPECT_EQ(hl2.nInteriorPins(), (unsigned int)1);
79  EXPECT_EQ(hl2.nEdgePins(), (unsigned int)0);
80  EXPECT_EQ(hl2.nCornerPins(), (unsigned int)6);
81  EXPECT_EQ(hl2.nChannels(), (unsigned int)18);
82  EXPECT_EQ(hl2.nInteriorChannels(), (unsigned int)6);
83  EXPECT_EQ(hl2.nEdgeChannels(), (unsigned int)6);
84  EXPECT_EQ(hl2.nCornerChannels(), (unsigned int)6);
85 
86  EXPECT_EQ(hl3.nPins(), (unsigned int)19);
87  EXPECT_EQ(hl3.nInteriorPins(), (unsigned int)7);
88  EXPECT_EQ(hl3.nEdgePins(), (unsigned int)6);
89  EXPECT_EQ(hl3.nCornerPins(), (unsigned int)6);
90  EXPECT_EQ(hl3.nChannels(), (unsigned int)42);
91  EXPECT_EQ(hl3.nInteriorChannels(), (unsigned int)24);
92  EXPECT_EQ(hl3.nEdgeChannels(), (unsigned int)12);
93  EXPECT_EQ(hl3.nCornerChannels(), (unsigned int)6);
94 
95  EXPECT_EQ(hl4.nPins(), (unsigned int)37);
96  EXPECT_EQ(hl4.nInteriorPins(), (unsigned int)19);
97  EXPECT_EQ(hl4.nEdgePins(), (unsigned int)12);
98  EXPECT_EQ(hl4.nCornerPins(), (unsigned int)6);
99  EXPECT_EQ(hl4.nChannels(), (unsigned int)78);
100  EXPECT_EQ(hl4.nInteriorChannels(), (unsigned int)54);
101  EXPECT_EQ(hl4.nEdgeChannels(), (unsigned int)18);
102  EXPECT_EQ(hl4.nCornerChannels(), (unsigned int)6);
103 
104  auto interior_pins2 = hl2.interiorChannelPinIndices();
105  EXPECT_EQ(interior_pins2[0][0], (unsigned int)0);
106  EXPECT_EQ(interior_pins2[0][1], (unsigned int)1);
107  EXPECT_EQ(interior_pins2[0][2], (unsigned int)2);
108  EXPECT_EQ(interior_pins2[1][0], (unsigned int)0);
109  EXPECT_EQ(interior_pins2[1][1], (unsigned int)2);
110  EXPECT_EQ(interior_pins2[1][2], (unsigned int)3);
111  EXPECT_EQ(interior_pins2[2][0], (unsigned int)0);
112  EXPECT_EQ(interior_pins2[2][1], (unsigned int)3);
113  EXPECT_EQ(interior_pins2[2][2], (unsigned int)4);
114  EXPECT_EQ(interior_pins2[3][0], (unsigned int)0);
115  EXPECT_EQ(interior_pins2[3][1], (unsigned int)4);
116  EXPECT_EQ(interior_pins2[3][2], (unsigned int)5);
117  EXPECT_EQ(interior_pins2[4][0], (unsigned int)0);
118  EXPECT_EQ(interior_pins2[4][1], (unsigned int)5);
119  EXPECT_EQ(interior_pins2[4][2], (unsigned int)6);
120  EXPECT_EQ(interior_pins2[5][0], (unsigned int)0);
121  EXPECT_EQ(interior_pins2[5][1], (unsigned int)6);
122  EXPECT_EQ(interior_pins2[5][2], (unsigned int)1);
123 
124  auto edge_pins2 = hl2.edgeChannelPinIndices();
125  EXPECT_EQ(edge_pins2[0][0], (unsigned int)1);
126  EXPECT_EQ(edge_pins2[0][1], (unsigned int)2);
127  EXPECT_EQ(edge_pins2[1][0], (unsigned int)2);
128  EXPECT_EQ(edge_pins2[1][1], (unsigned int)3);
129  EXPECT_EQ(edge_pins2[2][0], (unsigned int)3);
130  EXPECT_EQ(edge_pins2[2][1], (unsigned int)4);
131  EXPECT_EQ(edge_pins2[3][0], (unsigned int)4);
132  EXPECT_EQ(edge_pins2[3][1], (unsigned int)5);
133  EXPECT_EQ(edge_pins2[4][0], (unsigned int)5);
134  EXPECT_EQ(edge_pins2[4][1], (unsigned int)6);
135  EXPECT_EQ(edge_pins2[5][0], (unsigned int)6);
136  EXPECT_EQ(edge_pins2[5][1], (unsigned int)1);
137 
138  auto corner_pins2 = hl2.cornerChannelPinIndices();
139  EXPECT_EQ(corner_pins2[0][0], (unsigned int)1);
140  EXPECT_EQ(corner_pins2[1][0], (unsigned int)2);
141  EXPECT_EQ(corner_pins2[2][0], (unsigned int)3);
142  EXPECT_EQ(corner_pins2[3][0], (unsigned int)4);
143  EXPECT_EQ(corner_pins2[4][0], (unsigned int)5);
144  EXPECT_EQ(corner_pins2[5][0], (unsigned int)6);
145 
146  auto interior_pins3 = hl3.interiorChannelPinIndices();
147  EXPECT_EQ(interior_pins3[0][0], (unsigned int)0);
148  EXPECT_EQ(interior_pins3[0][1], (unsigned int)1);
149  EXPECT_EQ(interior_pins3[0][2], (unsigned int)2);
150  EXPECT_EQ(interior_pins3[1][0], (unsigned int)0);
151  EXPECT_EQ(interior_pins3[1][1], (unsigned int)2);
152  EXPECT_EQ(interior_pins3[1][2], (unsigned int)3);
153  EXPECT_EQ(interior_pins3[2][0], (unsigned int)0);
154  EXPECT_EQ(interior_pins3[2][1], (unsigned int)3);
155  EXPECT_EQ(interior_pins3[2][2], (unsigned int)4);
156  EXPECT_EQ(interior_pins3[3][0], (unsigned int)0);
157  EXPECT_EQ(interior_pins3[3][1], (unsigned int)4);
158  EXPECT_EQ(interior_pins3[3][2], (unsigned int)5);
159  EXPECT_EQ(interior_pins3[4][0], (unsigned int)0);
160  EXPECT_EQ(interior_pins3[4][1], (unsigned int)5);
161  EXPECT_EQ(interior_pins3[4][2], (unsigned int)6);
162  EXPECT_EQ(interior_pins3[5][0], (unsigned int)0);
163  EXPECT_EQ(interior_pins3[5][1], (unsigned int)6);
164  EXPECT_EQ(interior_pins3[5][2], (unsigned int)1);
165  EXPECT_EQ(interior_pins3[6][0], (unsigned int)1);
166  EXPECT_EQ(interior_pins3[6][1], (unsigned int)7);
167  EXPECT_EQ(interior_pins3[6][2], (unsigned int)8);
168  EXPECT_EQ(interior_pins3[7][0], (unsigned int)8);
169  EXPECT_EQ(interior_pins3[7][1], (unsigned int)2);
170  EXPECT_EQ(interior_pins3[7][2], (unsigned int)1);
171  EXPECT_EQ(interior_pins3[8][0], (unsigned int)2);
172  EXPECT_EQ(interior_pins3[8][1], (unsigned int)8);
173  EXPECT_EQ(interior_pins3[8][2], (unsigned int)9);
174  EXPECT_EQ(interior_pins3[9][0], (unsigned int)2);
175  EXPECT_EQ(interior_pins3[9][1], (unsigned int)9);
176  EXPECT_EQ(interior_pins3[9][2], (unsigned int)10);
177  EXPECT_EQ(interior_pins3[10][0], (unsigned int)10);
178  EXPECT_EQ(interior_pins3[10][1], (unsigned int)3);
179  EXPECT_EQ(interior_pins3[10][2], (unsigned int)2);
180  EXPECT_EQ(interior_pins3[11][0], (unsigned int)3);
181  EXPECT_EQ(interior_pins3[11][1], (unsigned int)10);
182  EXPECT_EQ(interior_pins3[11][2], (unsigned int)11);
183  EXPECT_EQ(interior_pins3[12][0], (unsigned int)3);
184  EXPECT_EQ(interior_pins3[12][1], (unsigned int)11);
185  EXPECT_EQ(interior_pins3[12][2], (unsigned int)12);
186  EXPECT_EQ(interior_pins3[13][0], (unsigned int)12);
187  EXPECT_EQ(interior_pins3[13][1], (unsigned int)4);
188  EXPECT_EQ(interior_pins3[13][2], (unsigned int)3);
189  EXPECT_EQ(interior_pins3[14][0], (unsigned int)4);
190  EXPECT_EQ(interior_pins3[14][1], (unsigned int)12);
191  EXPECT_EQ(interior_pins3[14][2], (unsigned int)13);
192  EXPECT_EQ(interior_pins3[15][0], (unsigned int)4);
193  EXPECT_EQ(interior_pins3[15][1], (unsigned int)13);
194  EXPECT_EQ(interior_pins3[15][2], (unsigned int)14);
195  EXPECT_EQ(interior_pins3[16][0], (unsigned int)14);
196  EXPECT_EQ(interior_pins3[16][1], (unsigned int)5);
197  EXPECT_EQ(interior_pins3[16][2], (unsigned int)4);
198  EXPECT_EQ(interior_pins3[17][0], (unsigned int)5);
199  EXPECT_EQ(interior_pins3[17][1], (unsigned int)14);
200  EXPECT_EQ(interior_pins3[17][2], (unsigned int)15);
201  EXPECT_EQ(interior_pins3[18][0], (unsigned int)5);
202  EXPECT_EQ(interior_pins3[18][1], (unsigned int)15);
203  EXPECT_EQ(interior_pins3[18][2], (unsigned int)16);
204  EXPECT_EQ(interior_pins3[19][0], (unsigned int)16);
205  EXPECT_EQ(interior_pins3[19][1], (unsigned int)6);
206  EXPECT_EQ(interior_pins3[19][2], (unsigned int)5);
207  EXPECT_EQ(interior_pins3[20][0], (unsigned int)6);
208  EXPECT_EQ(interior_pins3[20][1], (unsigned int)16);
209  EXPECT_EQ(interior_pins3[20][2], (unsigned int)17);
210  EXPECT_EQ(interior_pins3[21][0], (unsigned int)6);
211  EXPECT_EQ(interior_pins3[21][1], (unsigned int)17);
212  EXPECT_EQ(interior_pins3[21][2], (unsigned int)18);
213  EXPECT_EQ(interior_pins3[22][0], (unsigned int)18);
214  EXPECT_EQ(interior_pins3[22][1], (unsigned int)1);
215  EXPECT_EQ(interior_pins3[22][2], (unsigned int)6);
216  EXPECT_EQ(interior_pins3[23][0], (unsigned int)1);
217  EXPECT_EQ(interior_pins3[23][1], (unsigned int)18);
218  EXPECT_EQ(interior_pins3[23][2], (unsigned int)7);
219 
220  auto edge_pins3 = hl3.edgeChannelPinIndices();
221  EXPECT_EQ(edge_pins3[0][0], (unsigned int)7);
222  EXPECT_EQ(edge_pins3[0][1], (unsigned int)8);
223  EXPECT_EQ(edge_pins3[1][0], (unsigned int)8);
224  EXPECT_EQ(edge_pins3[1][1], (unsigned int)9);
225  EXPECT_EQ(edge_pins3[2][0], (unsigned int)9);
226  EXPECT_EQ(edge_pins3[2][1], (unsigned int)10);
227  EXPECT_EQ(edge_pins3[3][0], (unsigned int)10);
228  EXPECT_EQ(edge_pins3[3][1], (unsigned int)11);
229  EXPECT_EQ(edge_pins3[4][0], (unsigned int)11);
230  EXPECT_EQ(edge_pins3[4][1], (unsigned int)12);
231  EXPECT_EQ(edge_pins3[5][0], (unsigned int)12);
232  EXPECT_EQ(edge_pins3[5][1], (unsigned int)13);
233  EXPECT_EQ(edge_pins3[6][0], (unsigned int)13);
234  EXPECT_EQ(edge_pins3[6][1], (unsigned int)14);
235  EXPECT_EQ(edge_pins3[7][0], (unsigned int)14);
236  EXPECT_EQ(edge_pins3[7][1], (unsigned int)15);
237  EXPECT_EQ(edge_pins3[8][0], (unsigned int)15);
238  EXPECT_EQ(edge_pins3[8][1], (unsigned int)16);
239  EXPECT_EQ(edge_pins3[9][0], (unsigned int)16);
240  EXPECT_EQ(edge_pins3[9][1], (unsigned int)17);
241  EXPECT_EQ(edge_pins3[10][0], (unsigned int)17);
242  EXPECT_EQ(edge_pins3[10][1], (unsigned int)18);
243  EXPECT_EQ(edge_pins3[11][0], (unsigned int)18);
244  EXPECT_EQ(edge_pins3[11][1], (unsigned int)7);
245 
246  auto corner_pins3 = hl3.cornerChannelPinIndices();
247  EXPECT_EQ(corner_pins3[0][0], (unsigned int)7);
248  EXPECT_EQ(corner_pins3[1][0], (unsigned int)9);
249  EXPECT_EQ(corner_pins3[2][0], (unsigned int)11);
250  EXPECT_EQ(corner_pins3[3][0], (unsigned int)13);
251  EXPECT_EQ(corner_pins3[4][0], (unsigned int)15);
252  EXPECT_EQ(corner_pins3[5][0], (unsigned int)17);
253 }
254 
255 TEST_F(HexagonalLatticeTest, pin_bundle_spacing)
256 {
257  Real bp = 5.0, pp = 1.0, pd = 0.8, wd = 0.05, wp = 50.0;
258  unsigned int nr = 1, a = 2;
259  HexagonalLatticeUtils hl5(bp, pp, pd, wd, wp, nr, a);
260 
261  nr = 2;
262  HexagonalLatticeUtils hl6(bp, pp, pd, wd, wp, nr, a);
263 
264  wd = 0.0;
265  nr = 1;
266  HexagonalLatticeUtils hl7(bp, pp, pd, wd, wp, nr, a);
267 
268  nr = 2;
269  HexagonalLatticeUtils hl8(bp, pp, pd, wd, wp, nr, a);
270 
271  // wire-wrapped bundles
272  EXPECT_DOUBLE_EQ(hl5.pinBundleSpacing(), 2.1);
273  EXPECT_DOUBLE_EQ(hl6.pinBundleSpacing(), (5.0 - (std::sqrt(3.0) + 0.8)) / 2.);
274 
275  // bare bundles
276  EXPECT_DOUBLE_EQ(hl7.pinBundleSpacing(), 2.1);
277  EXPECT_DOUBLE_EQ(hl8.pinBundleSpacing(), (5.0 - (std::sqrt(3.0) + 0.8)) / 2.);
278 }
279 
280 TEST_F(HexagonalLatticeTest, hydraulic_diameters)
281 {
282  int n_interior, n_edge, n_corner;
283  Real flow_interior, flow_edge, flow_corner;
284  Real area_interior, area_edge, area_corner;
285 
286  Real bp = 5.0, pp = 1.0, pd = 0.8, wd = 0.1, wp = 50.0;
287  unsigned int nr = 1, a = 2;
288  HexagonalLatticeUtils hl9(bp, pp, pd, wd, wp, nr, a);
289 
290  nr = 2;
291  HexagonalLatticeUtils hl10(bp, pp, pd, wd, wp, nr, a);
292 
293  pp = 0.99;
294  nr = 3;
295  HexagonalLatticeUtils hl11(bp, pp, pd, wd, wp, nr, a);
296 
297  pp = 1.0;
298  wd = 0.0;
299  nr = 1;
300  HexagonalLatticeUtils hl12(bp, pp, pd, wd, wp, nr, a);
301 
302  nr = 2;
303  HexagonalLatticeUtils hl13(bp, pp, pd, wd, wp, nr, a);
304 
305  pp = 0.99;
306  nr = 3;
307  HexagonalLatticeUtils hl14(bp, pp, pd, wd, wp, nr, a);
308 
309  // values are obtained from a completely separately-developed Python script for
310  // verifying the bundle-wide hydraulic diameter. We verify the diameters for each
311  // individual channel by requiring that the n-channel-weighted sum equals the
312  // bundle-wide values for volume and areas, since we can verify that easily.
313  EXPECT_DOUBLE_EQ(hl9.hydraulicDiameter(), 4.196872851813099);
314  n_interior = hl9.nInteriorChannels();
315  n_edge = hl9.nEdgeChannels();
316  n_corner = hl9.nCornerChannels();
317  flow_interior = hl9.interiorFlowVolume();
318  flow_edge = hl9.edgeFlowVolume();
319  flow_corner = hl9.cornerFlowVolume();
320  area_interior = hl9.interiorWettedArea();
321  area_edge = hl9.edgeWettedArea();
322  area_corner = hl9.cornerWettedArea();
323  EXPECT_DOUBLE_EQ(hl9.flowVolume(),
324  n_interior * flow_interior + n_edge * flow_edge + n_corner * flow_corner);
325  EXPECT_DOUBLE_EQ(hl9.wettedArea(),
326  n_interior * area_interior + n_edge * area_edge + n_corner * area_corner);
327 
328  EXPECT_DOUBLE_EQ(hl10.hydraulicDiameter(), 1.948158075579034);
329  n_interior = hl10.nInteriorChannels();
330  n_edge = hl10.nEdgeChannels();
331  n_corner = hl10.nCornerChannels();
332  flow_interior = hl10.interiorFlowVolume();
333  flow_edge = hl10.edgeFlowVolume();
334  flow_corner = hl10.cornerFlowVolume();
335  area_interior = hl10.interiorWettedArea();
336  area_edge = hl10.edgeWettedArea();
337  area_corner = hl10.cornerWettedArea();
338  EXPECT_DOUBLE_EQ(hl10.flowVolume(),
339  n_interior * flow_interior + n_edge * flow_edge + n_corner * flow_corner);
340  EXPECT_DOUBLE_EQ(hl10.wettedArea(),
341  n_interior * area_interior + n_edge * area_edge + n_corner * area_corner);
342 
343  EXPECT_DOUBLE_EQ(hl11.hydraulicDiameter(), 0.6727946134052672);
344  n_interior = hl11.nInteriorChannels();
345  n_edge = hl11.nEdgeChannels();
346  n_corner = hl11.nCornerChannels();
347  flow_interior = hl11.interiorFlowVolume();
348  flow_edge = hl11.edgeFlowVolume();
349  flow_corner = hl11.cornerFlowVolume();
350  area_interior = hl11.interiorWettedArea();
351  area_edge = hl11.edgeWettedArea();
352  area_corner = hl11.cornerWettedArea();
353  EXPECT_DOUBLE_EQ(hl11.flowVolume(),
354  n_interior * flow_interior + n_edge * flow_edge + n_corner * flow_corner);
355  EXPECT_DOUBLE_EQ(hl11.wettedArea(),
356  n_interior * area_interior + n_edge * area_edge + n_corner * area_corner);
357 
358  // bare bundles
359  EXPECT_DOUBLE_EQ(hl12.hydraulicDiameter(), 4.2650423521483205);
360  n_interior = hl12.nInteriorChannels();
361  n_edge = hl12.nEdgeChannels();
362  n_corner = hl12.nCornerChannels();
363  flow_interior = hl12.interiorFlowVolume();
364  flow_edge = hl12.edgeFlowVolume();
365  flow_corner = hl12.cornerFlowVolume();
366  area_interior = hl12.interiorWettedArea();
367  area_edge = hl12.edgeWettedArea();
368  area_corner = hl12.cornerWettedArea();
369  EXPECT_DOUBLE_EQ(hl12.flowVolume(),
370  n_interior * flow_interior + n_edge * flow_edge + n_corner * flow_corner);
371  EXPECT_DOUBLE_EQ(hl12.wettedArea(),
372  n_interior * area_interior + n_edge * area_edge + n_corner * area_corner);
373 
374  EXPECT_DOUBLE_EQ(hl13.hydraulicDiameter(), 2.077372852104904);
375  n_interior = hl13.nInteriorChannels();
376  n_edge = hl13.nEdgeChannels();
377  n_corner = hl13.nCornerChannels();
378  flow_interior = hl13.interiorFlowVolume();
379  flow_edge = hl13.edgeFlowVolume();
380  flow_corner = hl13.cornerFlowVolume();
381  area_interior = hl13.interiorWettedArea();
382  area_edge = hl13.edgeWettedArea();
383  area_corner = hl13.cornerWettedArea();
384  EXPECT_DOUBLE_EQ(hl13.flowVolume(),
385  n_interior * flow_interior + n_edge * flow_edge + n_corner * flow_corner);
386  EXPECT_DOUBLE_EQ(hl13.wettedArea(),
387  n_interior * area_interior + n_edge * area_edge + n_corner * area_corner);
388 
389  EXPECT_DOUBLE_EQ(hl14.hydraulicDiameter(), 0.7437951937590452);
390  n_interior = hl14.nInteriorChannels();
391  n_edge = hl14.nEdgeChannels();
392  n_corner = hl14.nCornerChannels();
393  flow_interior = hl14.interiorFlowVolume();
394  flow_edge = hl14.edgeFlowVolume();
395  flow_corner = hl14.cornerFlowVolume();
396  area_interior = hl14.interiorWettedArea();
397  area_edge = hl14.edgeWettedArea();
398  area_corner = hl14.cornerWettedArea();
399  EXPECT_DOUBLE_EQ(hl14.flowVolume(),
400  n_interior * flow_interior + n_edge * flow_edge + n_corner * flow_corner);
401  EXPECT_DOUBLE_EQ(hl14.wettedArea(),
402  n_interior * area_interior + n_edge * area_edge + n_corner * area_corner);
403 }
404 
406 {
407  Real bp = 5.0, pp = 0.99, pd = 0.8, wd = 0.0, wp = 50.0;
408  unsigned int nr = 3, a = 2;
409  HexagonalLatticeUtils hl14(bp, pp, pd, wd, wp, nr, a);
410 
411  nr = 1;
412  HexagonalLatticeUtils hl15(bp, pp, pd, wd, wp, nr, a);
413 
414  nr = 2;
415  HexagonalLatticeUtils hl16(bp, pp, pd, wd, wp, nr, a);
416 
417  bp = 10.0;
418  nr = 4;
419  HexagonalLatticeUtils hl17(bp, pp, pd, wd, wp, nr, a);
420 
421  Real cos60 = 0.5;
422  Real sin60 = std::sqrt(3.0) / 2.0;
423 
424  auto & centers = hl15.pinCenters();
425  EXPECT_EQ(centers.size(), hl15.nPins());
426  EXPECT_DOUBLE_EQ(centers[0](0), 0.0);
427  EXPECT_DOUBLE_EQ(centers[0](1), 0.0);
428  EXPECT_DOUBLE_EQ(centers[0](2), 0.0);
429 
430  Real p = 0.99;
431  auto & centers2 = hl16.pinCenters();
432  EXPECT_EQ(centers2.size(), hl16.nPins());
433  EXPECT_DOUBLE_EQ(centers2[0](0), 0.0);
434  EXPECT_DOUBLE_EQ(centers2[0](1), 0.0);
435  EXPECT_DOUBLE_EQ(centers2[1](0), cos60 * p);
436  EXPECT_DOUBLE_EQ(centers2[1](1), sin60 * p);
437  EXPECT_DOUBLE_EQ(centers2[2](0), -cos60 * p);
438  EXPECT_DOUBLE_EQ(centers2[2](1), sin60 * p);
439  EXPECT_DOUBLE_EQ(centers2[3](0), -p);
440  EXPECT_DOUBLE_EQ(centers2[3](1), 0.0);
441  EXPECT_DOUBLE_EQ(centers2[4](0), -cos60 * p);
442  EXPECT_DOUBLE_EQ(centers2[4](1), -sin60 * p);
443  EXPECT_DOUBLE_EQ(centers2[5](0), cos60 * p);
444  EXPECT_DOUBLE_EQ(centers2[5](1), -sin60 * p);
445  EXPECT_DOUBLE_EQ(centers2[6](0), p);
446  EXPECT_DOUBLE_EQ(centers2[6](1), (unsigned int)0);
447 
448  for (const auto i : make_range(hl16.nPins()))
449  EXPECT_DOUBLE_EQ(centers2[i](2), 0.0);
450 
451  auto & centers3 = hl14.pinCenters();
452  EXPECT_EQ(centers3.size(), hl14.nPins());
453  EXPECT_DOUBLE_EQ(centers3[0](0), 0.0);
454  EXPECT_DOUBLE_EQ(centers3[0](1), 0.0);
455  EXPECT_DOUBLE_EQ(centers3[1](0), cos60 * p);
456  EXPECT_DOUBLE_EQ(centers3[1](1), sin60 * p);
457  EXPECT_DOUBLE_EQ(centers3[2](0), -cos60 * p);
458  EXPECT_DOUBLE_EQ(centers3[2](1), sin60 * p);
459  EXPECT_DOUBLE_EQ(centers3[3](0), -p);
460  EXPECT_DOUBLE_EQ(centers3[3](1), 0.0);
461  EXPECT_DOUBLE_EQ(centers3[4](0), -cos60 * p);
462  EXPECT_DOUBLE_EQ(centers3[4](1), -sin60 * p);
463  EXPECT_DOUBLE_EQ(centers3[5](0), cos60 * p);
464  EXPECT_DOUBLE_EQ(centers3[5](1), -sin60 * p);
465  EXPECT_DOUBLE_EQ(centers3[6](0), p);
466  EXPECT_DOUBLE_EQ(centers3[6](1), (unsigned int)0);
467 
468  EXPECT_DOUBLE_EQ(centers3[7](0), p);
469  EXPECT_DOUBLE_EQ(centers3[7](1), 2 * p * sin60);
470  EXPECT_DOUBLE_EQ(centers3[8](0), (unsigned int)0);
471  EXPECT_DOUBLE_EQ(centers3[8](1), 2 * p * sin60);
472  EXPECT_DOUBLE_EQ(centers3[9](0), -p);
473  EXPECT_DOUBLE_EQ(centers3[9](1), 2 * p * sin60);
474  EXPECT_DOUBLE_EQ(centers3[10](0), -p - p * cos60);
475  EXPECT_DOUBLE_EQ(centers3[10](1), p * sin60);
476  EXPECT_DOUBLE_EQ(centers3[11](0), -2 * p);
477  EXPECT_DOUBLE_EQ(centers3[11](1), (unsigned int)0);
478  EXPECT_DOUBLE_EQ(centers3[12](0), -p - p * cos60);
479  EXPECT_DOUBLE_EQ(centers3[12](1), -p * sin60);
480  EXPECT_DOUBLE_EQ(centers3[13](0), -p);
481  EXPECT_DOUBLE_EQ(centers3[13](1), -2 * p * sin60);
482  EXPECT_DOUBLE_EQ(centers3[14](0), (unsigned int)0);
483  EXPECT_DOUBLE_EQ(centers3[14](1), -2 * p * sin60);
484  EXPECT_DOUBLE_EQ(centers3[15](0), p);
485  EXPECT_DOUBLE_EQ(centers3[15](1), -2 * p * sin60);
486  EXPECT_DOUBLE_EQ(centers3[16](0), p + p * cos60);
487  EXPECT_DOUBLE_EQ(centers3[16](1), -p * sin60);
488  EXPECT_DOUBLE_EQ(centers3[17](0), 2 * p);
489  EXPECT_DOUBLE_EQ(centers3[17](1), 0.0);
490  EXPECT_DOUBLE_EQ(centers3[18](0), p + p * cos60);
491  EXPECT_DOUBLE_EQ(centers3[18](1), p * sin60);
492 
493  for (const auto i : make_range(hl14.nPins()))
494  EXPECT_DOUBLE_EQ(centers3[i](2), 0.0);
495 
496  auto & centers4 = hl17.pinCenters();
497  EXPECT_EQ(centers4.size(), hl17.nPins());
498  EXPECT_DOUBLE_EQ(centers4[0](0), 0.0);
499  EXPECT_DOUBLE_EQ(centers4[0](1), 0.0);
500  EXPECT_DOUBLE_EQ(centers4[1](0), cos60 * p);
501  EXPECT_DOUBLE_EQ(centers4[1](1), sin60 * p);
502  EXPECT_DOUBLE_EQ(centers4[2](0), -cos60 * p);
503  EXPECT_DOUBLE_EQ(centers4[2](1), sin60 * p);
504  EXPECT_DOUBLE_EQ(centers4[3](0), -p);
505  EXPECT_DOUBLE_EQ(centers4[3](1), 0.0);
506  EXPECT_DOUBLE_EQ(centers4[4](0), -cos60 * p);
507  EXPECT_DOUBLE_EQ(centers4[4](1), -sin60 * p);
508  EXPECT_DOUBLE_EQ(centers4[5](0), cos60 * p);
509  EXPECT_DOUBLE_EQ(centers4[5](1), -sin60 * p);
510  EXPECT_DOUBLE_EQ(centers4[6](0), p);
511  EXPECT_DOUBLE_EQ(centers4[6](1), (unsigned int)0);
512 
513  EXPECT_DOUBLE_EQ(centers4[7](0), p);
514  EXPECT_DOUBLE_EQ(centers4[7](1), 2 * p * sin60);
515  EXPECT_DOUBLE_EQ(centers4[8](0), (unsigned int)0);
516  EXPECT_DOUBLE_EQ(centers4[8](1), 2 * p * sin60);
517  EXPECT_DOUBLE_EQ(centers4[9](0), -p);
518  EXPECT_DOUBLE_EQ(centers4[9](1), 2 * p * sin60);
519  EXPECT_DOUBLE_EQ(centers4[10](0), -p - p * cos60);
520  EXPECT_DOUBLE_EQ(centers4[10](1), p * sin60);
521  EXPECT_DOUBLE_EQ(centers4[11](0), -2 * p);
522  EXPECT_DOUBLE_EQ(centers4[11](1), (unsigned int)0);
523  EXPECT_DOUBLE_EQ(centers4[12](0), -p - p * cos60);
524  EXPECT_DOUBLE_EQ(centers4[12](1), -p * sin60);
525  EXPECT_DOUBLE_EQ(centers4[13](0), -p);
526  EXPECT_DOUBLE_EQ(centers4[13](1), -2 * p * sin60);
527  EXPECT_DOUBLE_EQ(centers4[14](0), (unsigned int)0);
528  EXPECT_DOUBLE_EQ(centers4[14](1), -2 * p * sin60);
529  EXPECT_DOUBLE_EQ(centers4[15](0), p);
530  EXPECT_DOUBLE_EQ(centers4[15](1), -2 * p * sin60);
531  EXPECT_DOUBLE_EQ(centers4[16](0), p + p * cos60);
532  EXPECT_DOUBLE_EQ(centers4[16](1), -p * sin60);
533  EXPECT_DOUBLE_EQ(centers4[17](0), 2 * p);
534  EXPECT_DOUBLE_EQ(centers4[17](1), 0.0);
535  EXPECT_DOUBLE_EQ(centers4[18](0), p + p * cos60);
536  EXPECT_DOUBLE_EQ(centers4[18](1), p * sin60);
537 
538  EXPECT_DOUBLE_EQ(centers4[19](0), p + p * cos60);
539  EXPECT_DOUBLE_EQ(centers4[19](1), 3 * p * sin60);
540  EXPECT_DOUBLE_EQ(centers4[20](0), p * cos60);
541  EXPECT_DOUBLE_EQ(centers4[20](1), 3 * p * sin60);
542  EXPECT_DOUBLE_EQ(centers4[21](0), -p * cos60);
543  EXPECT_DOUBLE_EQ(centers4[21](1), 3 * p * sin60);
544  EXPECT_DOUBLE_EQ(centers4[22](0), -p - p * cos60);
545  EXPECT_DOUBLE_EQ(centers4[22](1), 3 * p * sin60);
546  EXPECT_DOUBLE_EQ(centers4[23](0), -2 * p);
547  EXPECT_DOUBLE_EQ(centers4[23](1), 2 * p * sin60);
548  EXPECT_DOUBLE_EQ(centers4[24](0), -2 * p - p * cos60);
549  EXPECT_DOUBLE_EQ(centers4[24](1), p * sin60);
550  EXPECT_DOUBLE_EQ(centers4[25](0), -3 * p);
551  EXPECT_DOUBLE_EQ(centers4[25](1), (unsigned int)0);
552  EXPECT_DOUBLE_EQ(centers4[26](0), -2 * p - p * cos60);
553  EXPECT_DOUBLE_EQ(centers4[26](1), -p * sin60);
554  EXPECT_DOUBLE_EQ(centers4[27](0), -2 * p);
555  EXPECT_DOUBLE_EQ(centers4[27](1), -2 * p * sin60);
556  EXPECT_DOUBLE_EQ(centers4[28](0), -p - p * cos60);
557  EXPECT_DOUBLE_EQ(centers4[28](1), -3 * p * sin60);
558  EXPECT_DOUBLE_EQ(centers4[29](0), -p * cos60);
559  EXPECT_DOUBLE_EQ(centers4[29](1), -3 * p * sin60);
560  EXPECT_DOUBLE_EQ(centers4[30](0), p * cos60);
561  EXPECT_DOUBLE_EQ(centers4[30](1), -3 * p * sin60);
562  EXPECT_DOUBLE_EQ(centers4[31](0), p + p * cos60);
563  EXPECT_DOUBLE_EQ(centers4[31](1), -3 * p * sin60);
564  EXPECT_DOUBLE_EQ(centers4[32](0), 2 * p);
565  EXPECT_DOUBLE_EQ(centers4[32](1), -2 * p * sin60);
566  EXPECT_DOUBLE_EQ(centers4[33](0), 2 * p + p * cos60);
567  EXPECT_DOUBLE_EQ(centers4[33](1), -p * sin60);
568  EXPECT_DOUBLE_EQ(centers4[34](0), 3 * p);
569  EXPECT_DOUBLE_EQ(centers4[34](1), (unsigned int)0);
570  EXPECT_DOUBLE_EQ(centers4[35](0), 2 * p + p * cos60);
571  EXPECT_DOUBLE_EQ(centers4[35](1), p * sin60);
572  EXPECT_DOUBLE_EQ(centers4[36](0), 2 * p);
573  EXPECT_DOUBLE_EQ(centers4[36](1), 2 * p * sin60);
574 
575  for (const auto i : make_range(hl17.nPins()))
576  EXPECT_DOUBLE_EQ(centers4[i](2), 0.0);
577 }
578 
579 TEST_F(HexagonalLatticeTest, pin_centers_rotated_pi)
580 {
581  Real bp = 5.0, pp = 0.99, pd = 0.8, wd = 0.0, wp = 50.0;
582  unsigned int nr = 3, a = 2;
583  HexagonalLatticeUtils hl14(bp, pp, pd, wd, wp, nr, a, 180);
584 
585  nr = 1;
586  HexagonalLatticeUtils hl15(bp, pp, pd, wd, wp, nr, a, 180);
587 
588  nr = 2;
589  HexagonalLatticeUtils hl16(bp, pp, pd, wd, wp, nr, a, 180);
590 
591  bp = 10.0;
592  nr = 4;
593  HexagonalLatticeUtils hl17(bp, pp, pd, wd, wp, nr, a, 180);
594 
595  Real cos60 = 0.5;
596  Real sin60 = std::sqrt(3.0) / 2.0;
597 
598  auto & centers = hl15.pinCenters();
599  EXPECT_EQ(centers.size(), hl15.nPins());
600  ABS_DOUBLE_TEST(centers[0](0), 0.0);
601  ABS_DOUBLE_TEST(centers[0](1), 0.0);
602  ABS_DOUBLE_TEST(centers[0](2), 0.0);
603 
604  Real p = 0.99;
605  auto & centers2 = hl16.pinCenters();
606  EXPECT_EQ(centers2.size(), hl16.nPins());
607  ABS_DOUBLE_TEST(centers2[0](0), 0.0);
608  ABS_DOUBLE_TEST(centers2[0](1), 0.0);
609  ABS_DOUBLE_TEST(centers2[1](0), -cos60 * p);
610  ABS_DOUBLE_TEST(centers2[1](1), -sin60 * p);
611  ABS_DOUBLE_TEST(centers2[2](0), cos60 * p);
612  ABS_DOUBLE_TEST(centers2[2](1), -sin60 * p);
613  ABS_DOUBLE_TEST(centers2[3](0), p);
614  ABS_DOUBLE_TEST(centers2[3](1), 0.0);
615  ABS_DOUBLE_TEST(centers2[4](0), cos60 * p);
616  ABS_DOUBLE_TEST(centers2[4](1), sin60 * p);
617  ABS_DOUBLE_TEST(centers2[5](0), -cos60 * p);
618  ABS_DOUBLE_TEST(centers2[5](1), sin60 * p);
619  ABS_DOUBLE_TEST(centers2[6](0), -p);
620  ABS_DOUBLE_TEST(centers2[6](1), (unsigned int)0);
621 
622  for (const auto i : make_range(hl16.nPins()))
623  ABS_DOUBLE_TEST(centers2[i](2), 0.0);
624 
625  auto & centers3 = hl14.pinCenters();
626  EXPECT_EQ(centers3.size(), hl14.nPins());
627  ABS_DOUBLE_TEST(centers3[0](0), 0.0);
628  ABS_DOUBLE_TEST(centers3[0](1), 0.0);
629  ABS_DOUBLE_TEST(centers3[1](0), -cos60 * p);
630  ABS_DOUBLE_TEST(centers3[1](1), -sin60 * p);
631  ABS_DOUBLE_TEST(centers3[2](0), cos60 * p);
632  ABS_DOUBLE_TEST(centers3[2](1), -sin60 * p);
633  ABS_DOUBLE_TEST(centers3[3](0), p);
634  ABS_DOUBLE_TEST(centers3[3](1), 0.0);
635  ABS_DOUBLE_TEST(centers3[4](0), cos60 * p);
636  ABS_DOUBLE_TEST(centers3[4](1), sin60 * p);
637  ABS_DOUBLE_TEST(centers3[5](0), -cos60 * p);
638  ABS_DOUBLE_TEST(centers3[5](1), sin60 * p);
639  ABS_DOUBLE_TEST(centers3[6](0), -p);
640  ABS_DOUBLE_TEST(centers3[6](1), (unsigned int)0);
641 
642  ABS_DOUBLE_TEST(centers3[7](0), -p);
643  ABS_DOUBLE_TEST(centers3[7](1), -2 * p * sin60);
644  ABS_DOUBLE_TEST(centers3[8](0), (unsigned int)0);
645  ABS_DOUBLE_TEST(centers3[8](1), -2 * p * sin60);
646  ABS_DOUBLE_TEST(centers3[9](0), p);
647  ABS_DOUBLE_TEST(centers3[9](1), -2 * p * sin60);
648  ABS_DOUBLE_TEST(centers3[10](0), p + p * cos60);
649  ABS_DOUBLE_TEST(centers3[10](1), -p * sin60);
650  ABS_DOUBLE_TEST(centers3[11](0), 2 * p);
651  ABS_DOUBLE_TEST(centers3[11](1), (unsigned int)0);
652  ABS_DOUBLE_TEST(centers3[12](0), p + p * cos60);
653  ABS_DOUBLE_TEST(centers3[12](1), p * sin60);
654  ABS_DOUBLE_TEST(centers3[13](0), p);
655  ABS_DOUBLE_TEST(centers3[13](1), 2 * p * sin60);
656  ABS_DOUBLE_TEST(centers3[14](0), (unsigned int)0);
657  ABS_DOUBLE_TEST(centers3[14](1), 2 * p * sin60);
658  ABS_DOUBLE_TEST(centers3[15](0), -p);
659  ABS_DOUBLE_TEST(centers3[15](1), 2 * p * sin60);
660  ABS_DOUBLE_TEST(centers3[16](0), -p - p * cos60);
661  ABS_DOUBLE_TEST(centers3[16](1), p * sin60);
662  ABS_DOUBLE_TEST(centers3[17](0), -2 * p);
663  ABS_DOUBLE_TEST(centers3[17](1), 0.0);
664  ABS_DOUBLE_TEST(centers3[18](0), -p - p * cos60);
665  ABS_DOUBLE_TEST(centers3[18](1), -p * sin60);
666 
667  for (const auto i : make_range(hl14.nPins()))
668  ABS_DOUBLE_TEST(centers3[i](2), 0.0);
669 
670  auto & centers4 = hl17.pinCenters();
671  EXPECT_EQ(centers4.size(), hl17.nPins());
672  ABS_DOUBLE_TEST(centers4[0](0), 0.0);
673  ABS_DOUBLE_TEST(centers4[0](1), 0.0);
674  ABS_DOUBLE_TEST(centers4[1](0), -cos60 * p);
675  ABS_DOUBLE_TEST(centers4[1](1), -sin60 * p);
676  ABS_DOUBLE_TEST(centers4[2](0), cos60 * p);
677  ABS_DOUBLE_TEST(centers4[2](1), -sin60 * p);
678  ABS_DOUBLE_TEST(centers4[3](0), p);
679  ABS_DOUBLE_TEST(centers4[3](1), 0.0);
680  ABS_DOUBLE_TEST(centers4[4](0), cos60 * p);
681  ABS_DOUBLE_TEST(centers4[4](1), sin60 * p);
682  ABS_DOUBLE_TEST(centers4[5](0), -cos60 * p);
683  ABS_DOUBLE_TEST(centers4[5](1), sin60 * p);
684  ABS_DOUBLE_TEST(centers4[6](0), -p);
685  ABS_DOUBLE_TEST(centers4[6](1), (unsigned int)0);
686 
687  ABS_DOUBLE_TEST(centers4[7](0), -p);
688  ABS_DOUBLE_TEST(centers4[7](1), -2 * p * sin60);
689  ABS_DOUBLE_TEST(centers4[8](0), (unsigned int)0);
690  ABS_DOUBLE_TEST(centers4[8](1), -2 * p * sin60);
691  ABS_DOUBLE_TEST(centers4[9](0), p);
692  ABS_DOUBLE_TEST(centers4[9](1), -2 * p * sin60);
693  ABS_DOUBLE_TEST(centers4[10](0), p + p * cos60);
694  ABS_DOUBLE_TEST(centers4[10](1), -p * sin60);
695  ABS_DOUBLE_TEST(centers4[11](0), 2 * p);
696  ABS_DOUBLE_TEST(centers4[11](1), (unsigned int)0);
697  ABS_DOUBLE_TEST(centers4[12](0), p + p * cos60);
698  ABS_DOUBLE_TEST(centers4[12](1), p * sin60);
699  ABS_DOUBLE_TEST(centers4[13](0), p);
700  ABS_DOUBLE_TEST(centers4[13](1), 2 * p * sin60);
701  ABS_DOUBLE_TEST(centers4[14](0), (unsigned int)0);
702  ABS_DOUBLE_TEST(centers4[14](1), 2 * p * sin60);
703  ABS_DOUBLE_TEST(centers4[15](0), -p);
704  ABS_DOUBLE_TEST(centers4[15](1), 2 * p * sin60);
705  ABS_DOUBLE_TEST(centers4[16](0), -p - p * cos60);
706  ABS_DOUBLE_TEST(centers4[16](1), p * sin60);
707  ABS_DOUBLE_TEST(centers4[17](0), -2 * p);
708  ABS_DOUBLE_TEST(centers4[17](1), 0.0);
709  ABS_DOUBLE_TEST(centers4[18](0), -p - p * cos60);
710  ABS_DOUBLE_TEST(centers4[18](1), -p * sin60);
711 
712  ABS_DOUBLE_TEST(centers4[19](0), -p - p * cos60);
713  ABS_DOUBLE_TEST(centers4[19](1), -3 * p * sin60);
714  ABS_DOUBLE_TEST(centers4[20](0), -p * cos60);
715  ABS_DOUBLE_TEST(centers4[20](1), -3 * p * sin60);
716  ABS_DOUBLE_TEST(centers4[21](0), p * cos60);
717  ABS_DOUBLE_TEST(centers4[21](1), -3 * p * sin60);
718  ABS_DOUBLE_TEST(centers4[22](0), p + p * cos60);
719  ABS_DOUBLE_TEST(centers4[22](1), -3 * p * sin60);
720  ABS_DOUBLE_TEST(centers4[23](0), 2 * p);
721  ABS_DOUBLE_TEST(centers4[23](1), -2 * p * sin60);
722  ABS_DOUBLE_TEST(centers4[24](0), 2 * p + p * cos60);
723  ABS_DOUBLE_TEST(centers4[24](1), -p * sin60);
724  ABS_DOUBLE_TEST(centers4[25](0), 3 * p);
725  ABS_DOUBLE_TEST(centers4[25](1), (unsigned int)0);
726  ABS_DOUBLE_TEST(centers4[26](0), 2 * p + p * cos60);
727  ABS_DOUBLE_TEST(centers4[26](1), p * sin60);
728  ABS_DOUBLE_TEST(centers4[27](0), 2 * p);
729  ABS_DOUBLE_TEST(centers4[27](1), 2 * p * sin60);
730  ABS_DOUBLE_TEST(centers4[28](0), p + p * cos60);
731  ABS_DOUBLE_TEST(centers4[28](1), 3 * p * sin60);
732  ABS_DOUBLE_TEST(centers4[29](0), p * cos60);
733  ABS_DOUBLE_TEST(centers4[29](1), 3 * p * sin60);
734  ABS_DOUBLE_TEST(centers4[30](0), -p * cos60);
735  ABS_DOUBLE_TEST(centers4[30](1), 3 * p * sin60);
736  ABS_DOUBLE_TEST(centers4[31](0), -p - p * cos60);
737  ABS_DOUBLE_TEST(centers4[31](1), 3 * p * sin60);
738  ABS_DOUBLE_TEST(centers4[32](0), -2 * p);
739  ABS_DOUBLE_TEST(centers4[32](1), 2 * p * sin60);
740  ABS_DOUBLE_TEST(centers4[33](0), -2 * p - p * cos60);
741  ABS_DOUBLE_TEST(centers4[33](1), p * sin60);
742  ABS_DOUBLE_TEST(centers4[34](0), -3 * p);
743  ABS_DOUBLE_TEST(centers4[34](1), (unsigned int)0);
744  ABS_DOUBLE_TEST(centers4[35](0), -2 * p - p * cos60);
745  ABS_DOUBLE_TEST(centers4[35](1), -p * sin60);
746  ABS_DOUBLE_TEST(centers4[36](0), -2 * p);
747  ABS_DOUBLE_TEST(centers4[36](1), -2 * p * sin60);
748 
749  for (const auto i : make_range(hl17.nPins()))
750  ABS_DOUBLE_TEST(centers4[i](2), 0.0);
751 }
752 
753 TEST_F(HexagonalLatticeTest, channel_index_shifted)
754 {
755  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
756  unsigned int nr = 3, a = 2;
757  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
758 
759  // check that the z-coordinate doesn't affect the channel index identification
760  Point pt0(0.06, 0.35, 3.5);
761  Point pt1(-0.47, 0.28, 3.5);
762  Point pt2(-0.26, -0.21, 3.5);
763  Point pt3(-0.12, -0.349, 3.5);
764  Point pt4(0.46, -0.27, 3.5);
765  Point pt5(0.37, 0.6, 3.5);
766 
767  EXPECT_EQ(hl.channelIndex(pt0), (unsigned int)0);
768  EXPECT_EQ(hl.channelIndex(pt1), (unsigned int)1);
769  EXPECT_EQ(hl.channelIndex(pt2), (unsigned int)2);
770  EXPECT_EQ(hl.channelIndex(pt3), (unsigned int)3);
771  EXPECT_EQ(hl.channelIndex(pt4), (unsigned int)4);
772  EXPECT_EQ(hl.channelIndex(pt5), (unsigned int)5);
773 
774  Point pt6(0.36, 1.06, -7.0);
775  Point pt7(0.11, 0.98, -7.0);
776  Point pt8(-0.43, 1.27, -7.0);
777  Point pt9(-0.81, 0.93, -7.0);
778  Point pt10(-0.75, 0.47, -7.0);
779  Point pt11(-1.06, 0.28, -7.0);
780  Point pt12(-1.16, -0.13, -7.0);
781  Point pt13(-0.73, -0.41, -7.0);
782  Point pt14(-0.73, -0.81, -7.0);
783  Point pt15(-0.46, -1.18, -7.0);
784  Point pt16(0.05, -0.98, -7.0);
785  Point pt17(0.27, -1.00, -7.0);
786  Point pt18(0.72, -0.98, -7.0);
787  Point pt19(0.75, -0.58, -7.0);
788  Point pt20(1.23, -0.23, -7.0);
789  Point pt21(1.17, 0.09, -7.0);
790  Point pt22(0.78, 0.38, -7.0);
791  Point pt23(0.74, 0.84, -7.0);
792 
793  EXPECT_EQ(hl.channelIndex(pt6), (unsigned int)6);
794  EXPECT_EQ(hl.channelIndex(pt7), (unsigned int)7);
795  EXPECT_EQ(hl.channelIndex(pt8), (unsigned int)8);
796  EXPECT_EQ(hl.channelIndex(pt9), (unsigned int)9);
797  EXPECT_EQ(hl.channelIndex(pt10), (unsigned int)10);
798  EXPECT_EQ(hl.channelIndex(pt11), (unsigned int)11);
799  EXPECT_EQ(hl.channelIndex(pt12), (unsigned int)12);
800  EXPECT_EQ(hl.channelIndex(pt13), (unsigned int)13);
801  EXPECT_EQ(hl.channelIndex(pt14), (unsigned int)14);
802  EXPECT_EQ(hl.channelIndex(pt15), (unsigned int)15);
803  EXPECT_EQ(hl.channelIndex(pt16), (unsigned int)16);
804  EXPECT_EQ(hl.channelIndex(pt17), (unsigned int)17);
805  EXPECT_EQ(hl.channelIndex(pt18), (unsigned int)18);
806  EXPECT_EQ(hl.channelIndex(pt19), (unsigned int)19);
807  EXPECT_EQ(hl.channelIndex(pt20), (unsigned int)20);
808  EXPECT_EQ(hl.channelIndex(pt21), (unsigned int)21);
809  EXPECT_EQ(hl.channelIndex(pt22), (unsigned int)22);
810  EXPECT_EQ(hl.channelIndex(pt23), (unsigned int)23);
811 
812  Point pt24(0.31, 1.44, -0.1);
813  Point pt25(-0.38, 1.61, -0.1);
814  Point pt26(-1.17, 1.52, -0.1);
815  Point pt27(-1.78, 0.38, -0.1);
816  Point pt28(-1.91, -0.42, -0.1);
817  Point pt29(-1.39, -1.24, -0.1);
818  Point pt30(-0.46, -1.74, -0.1);
819  Point pt31(0.18, -1.79, -0.1);
820  Point pt32(1.24, -1.17, -0.1);
821  Point pt33(1.75, -0.57, -0.1);
822  Point pt34(1.51, 0.37, -0.1);
823  Point pt35(1.16, 1.42, -0.1);
824 
825  EXPECT_EQ(hl.channelIndex(pt24), (unsigned int)24);
826  EXPECT_EQ(hl.channelIndex(pt25), (unsigned int)25);
827  // EXPECT_EQ(hl.channelIndex(pt26), (unsigned int)26);
828  EXPECT_EQ(hl.channelIndex(pt27), (unsigned int)27);
829  EXPECT_EQ(hl.channelIndex(pt28), (unsigned int)28);
830  EXPECT_EQ(hl.channelIndex(pt29), (unsigned int)29);
831  EXPECT_EQ(hl.channelIndex(pt30), (unsigned int)30);
832  EXPECT_EQ(hl.channelIndex(pt31), (unsigned int)31);
833  EXPECT_EQ(hl.channelIndex(pt32), (unsigned int)32);
834  EXPECT_EQ(hl.channelIndex(pt33), (unsigned int)33);
835  EXPECT_EQ(hl.channelIndex(pt34), (unsigned int)34);
836  EXPECT_EQ(hl.channelIndex(pt35), (unsigned int)35);
837 
838  Point pt36(1.05, 1.75, 1.2);
839  Point pt37(-1.02, 1.72, 1.2);
840  Point pt38(-2.03, -0.05, 1.2);
841  Point pt39(-1.01, -1.59, 1.2);
842  Point pt40(0.89, -1.79, 1.2);
843  Point pt41(1.98, 0.12, 1.2);
844 
845  EXPECT_EQ(hl.channelIndex(pt36), (unsigned int)36);
846  EXPECT_EQ(hl.channelIndex(pt37), (unsigned int)37);
847  EXPECT_EQ(hl.channelIndex(pt38), (unsigned int)38);
848  EXPECT_EQ(hl.channelIndex(pt39), (unsigned int)39);
849  EXPECT_EQ(hl.channelIndex(pt40), (unsigned int)40);
850  EXPECT_EQ(hl.channelIndex(pt41), (unsigned int)41);
851 }
852 
854 {
855  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
856  unsigned int nr = 3, a = 2;
857  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
858 
859  Point pt0(0.06, 0.35, 0.0);
860  Point pt1(-0.47, 0.28, 0.0);
861  Point pt2(-0.26, -0.21, 0.0);
862  Point pt3(-0.12, -0.349, 0.0);
863  Point pt4(0.46, -0.27, 0.0);
864  Point pt5(0.37, 0.6, 0.0);
865  EXPECT_EQ(hl.channelType(pt0), channel_type::interior);
866  EXPECT_EQ(hl.channelType(pt1), channel_type::interior);
867  EXPECT_EQ(hl.channelType(pt2), channel_type::interior);
868  EXPECT_EQ(hl.channelType(pt3), channel_type::interior);
869  EXPECT_EQ(hl.channelType(pt4), channel_type::interior);
870  EXPECT_EQ(hl.channelType(pt5), channel_type::interior);
871  EXPECT_EQ(hl.channelIndex(pt0), (unsigned int)0);
872  EXPECT_EQ(hl.channelIndex(pt1), (unsigned int)1);
873  EXPECT_EQ(hl.channelIndex(pt2), (unsigned int)2);
874  EXPECT_EQ(hl.channelIndex(pt3), (unsigned int)3);
875  EXPECT_EQ(hl.channelIndex(pt4), (unsigned int)4);
876  EXPECT_EQ(hl.channelIndex(pt5), (unsigned int)5);
877 
878  // check that a point exactly on the edge falls into one channel
879  pt0 = {0.5 * 0.8 * 0.5, 0.5 * 0.8 * std::sqrt(3.0) / 2.0, 0.0};
880  EXPECT_EQ(hl.channelIndex(pt0), (unsigned int)0);
881 
882  Point pt6(0.36, 1.06, 0.0);
883  Point pt7(0.11, 0.98, 0.0);
884  Point pt8(-0.43, 1.27, 0.0);
885  Point pt9(-0.81, 0.93, 0.0);
886  Point pt10(-0.75, 0.47, 0.0);
887  Point pt11(-1.06, 0.28, 0.0);
888  Point pt12(-1.16, -0.13, 0.0);
889  Point pt13(-0.73, -0.41, 0.0);
890  Point pt14(-0.73, -0.81, 0.0);
891  Point pt15(-0.46, -1.18, 0.0);
892  Point pt16(0.05, -0.98, 0.0);
893  Point pt17(0.27, -1.00, 0.0);
894  Point pt18(0.72, -0.98, 0.0);
895  Point pt19(0.75, -0.58, 0.0);
896  Point pt20(1.23, -0.23, 0.0);
897  Point pt21(1.17, 0.09, 0.0);
898  Point pt22(0.78, 0.38, 0.0);
899  Point pt23(0.74, 0.84, 0.0);
900 
901  EXPECT_EQ(hl.channelType(pt6), channel_type::interior);
902  EXPECT_EQ(hl.channelType(pt7), channel_type::interior);
903  EXPECT_EQ(hl.channelType(pt8), channel_type::interior);
904  EXPECT_EQ(hl.channelType(pt9), channel_type::interior);
905  EXPECT_EQ(hl.channelType(pt10), channel_type::interior);
906  EXPECT_EQ(hl.channelType(pt11), channel_type::interior);
907  EXPECT_EQ(hl.channelType(pt12), channel_type::interior);
908  EXPECT_EQ(hl.channelType(pt13), channel_type::interior);
909  EXPECT_EQ(hl.channelType(pt14), channel_type::interior);
910  EXPECT_EQ(hl.channelType(pt15), channel_type::interior);
911  EXPECT_EQ(hl.channelType(pt16), channel_type::interior);
912  EXPECT_EQ(hl.channelType(pt17), channel_type::interior);
913  EXPECT_EQ(hl.channelType(pt18), channel_type::interior);
914  EXPECT_EQ(hl.channelType(pt19), channel_type::interior);
915  EXPECT_EQ(hl.channelType(pt20), channel_type::interior);
916  EXPECT_EQ(hl.channelType(pt21), channel_type::interior);
917  EXPECT_EQ(hl.channelType(pt22), channel_type::interior);
918  EXPECT_EQ(hl.channelType(pt23), channel_type::interior);
919  EXPECT_EQ(hl.channelIndex(pt6), (unsigned int)6);
920  EXPECT_EQ(hl.channelIndex(pt7), (unsigned int)7);
921  EXPECT_EQ(hl.channelIndex(pt8), (unsigned int)8);
922  EXPECT_EQ(hl.channelIndex(pt9), (unsigned int)9);
923  EXPECT_EQ(hl.channelIndex(pt10), (unsigned int)10);
924  EXPECT_EQ(hl.channelIndex(pt11), (unsigned int)11);
925  EXPECT_EQ(hl.channelIndex(pt12), (unsigned int)12);
926  EXPECT_EQ(hl.channelIndex(pt13), (unsigned int)13);
927  EXPECT_EQ(hl.channelIndex(pt14), (unsigned int)14);
928  EXPECT_EQ(hl.channelIndex(pt15), (unsigned int)15);
929  EXPECT_EQ(hl.channelIndex(pt16), (unsigned int)16);
930  EXPECT_EQ(hl.channelIndex(pt17), (unsigned int)17);
931  EXPECT_EQ(hl.channelIndex(pt18), (unsigned int)18);
932  EXPECT_EQ(hl.channelIndex(pt19), (unsigned int)19);
933  EXPECT_EQ(hl.channelIndex(pt20), (unsigned int)20);
934  EXPECT_EQ(hl.channelIndex(pt21), (unsigned int)21);
935  EXPECT_EQ(hl.channelIndex(pt22), (unsigned int)22);
936  EXPECT_EQ(hl.channelIndex(pt23), (unsigned int)23);
937 
938  Point pt24(0.31, 1.44, 0.0);
939  Point pt25(-0.38, 1.61, 0.0);
940  Point pt26(-1.17, 1.52, 0.0);
941  Point pt27(-1.78, 0.38, 0.0);
942  Point pt28(-1.91, -0.42, 0.0);
943  Point pt29(-1.39, -1.24, 0.0);
944  Point pt30(-0.46, -1.74, 0.0);
945  Point pt31(0.18, -1.79, 0.0);
946  Point pt32(1.24, -1.17, 0.0);
947  Point pt33(1.75, -0.57, 0.0);
948  Point pt34(1.51, 0.37, 0.0);
949  Point pt35(1.16, 1.42, 0.0);
950 
951  EXPECT_EQ(hl.channelType(pt24), channel_type::edge);
952  EXPECT_EQ(hl.channelType(pt25), channel_type::edge);
953  EXPECT_EQ(hl.channelType(pt26), channel_type::edge);
954  EXPECT_EQ(hl.channelType(pt27), channel_type::edge);
955  EXPECT_EQ(hl.channelType(pt28), channel_type::edge);
956  EXPECT_EQ(hl.channelType(pt29), channel_type::edge);
957  EXPECT_EQ(hl.channelType(pt30), channel_type::edge);
958  EXPECT_EQ(hl.channelType(pt31), channel_type::edge);
959  EXPECT_EQ(hl.channelType(pt32), channel_type::edge);
960  EXPECT_EQ(hl.channelType(pt33), channel_type::edge);
961  EXPECT_EQ(hl.channelType(pt34), channel_type::edge);
962  EXPECT_EQ(hl.channelType(pt35), channel_type::edge);
963  EXPECT_EQ(hl.channelIndex(pt24), (unsigned int)24);
964  EXPECT_EQ(hl.channelIndex(pt25), (unsigned int)25);
965  // EXPECT_EQ(hl.channelIndex(pt26), (unsigned int)26);
966  EXPECT_EQ(hl.channelIndex(pt27), (unsigned int)27);
967  EXPECT_EQ(hl.channelIndex(pt28), (unsigned int)28);
968  EXPECT_EQ(hl.channelIndex(pt29), (unsigned int)29);
969  EXPECT_EQ(hl.channelIndex(pt30), (unsigned int)30);
970  EXPECT_EQ(hl.channelIndex(pt31), (unsigned int)31);
971  EXPECT_EQ(hl.channelIndex(pt32), (unsigned int)32);
972  EXPECT_EQ(hl.channelIndex(pt33), (unsigned int)33);
973  EXPECT_EQ(hl.channelIndex(pt34), (unsigned int)34);
974  EXPECT_EQ(hl.channelIndex(pt35), (unsigned int)35);
975 
976  Point pt36(1.05, 1.75, 0.0);
977  Point pt37(-1.02, 1.72, 0.0);
978  Point pt38(-2.03, -0.05, 0.0);
979  Point pt39(-1.01, -1.59, 0.0);
980  Point pt40(0.89, -1.79, 0.0);
981  Point pt41(1.98, 0.12, 0.0);
982 
983  EXPECT_EQ(hl.channelType(pt36), channel_type::corner);
984  EXPECT_EQ(hl.channelType(pt37), channel_type::corner);
985  EXPECT_EQ(hl.channelType(pt38), channel_type::corner);
986  EXPECT_EQ(hl.channelType(pt39), channel_type::corner);
987  EXPECT_EQ(hl.channelType(pt40), channel_type::corner);
988  EXPECT_EQ(hl.channelType(pt41), channel_type::corner);
989  EXPECT_EQ(hl.channelIndex(pt36), (unsigned int)36);
990  EXPECT_EQ(hl.channelIndex(pt37), (unsigned int)37);
991  EXPECT_EQ(hl.channelIndex(pt38), (unsigned int)38);
992  EXPECT_EQ(hl.channelIndex(pt39), (unsigned int)39);
993  EXPECT_EQ(hl.channelIndex(pt40), (unsigned int)40);
994  EXPECT_EQ(hl.channelIndex(pt41), (unsigned int)41);
995 }
996 
998 {
999  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1000  unsigned int nr = 1, a = 2;
1001  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1002  const auto & gi = hl.gapIndices();
1003  const auto & lg = hl.localToGlobalGaps();
1004 
1005  EXPECT_EQ(hl.nInteriorGaps(), (unsigned int)0);
1006 
1007  int i = 0;
1008  EXPECT_EQ(gi[i].first, 0);
1009  EXPECT_EQ(gi[i++].second, -1);
1010 
1011  EXPECT_EQ(gi[i].first, 0);
1012  EXPECT_EQ(gi[i++].second, -2);
1013 
1014  EXPECT_EQ(gi[i].first, 0);
1015  EXPECT_EQ(gi[i++].second, -3);
1016 
1017  EXPECT_EQ(gi[i].first, 0);
1018  EXPECT_EQ(gi[i++].second, -4);
1019 
1020  EXPECT_EQ(gi[i].first, 0);
1021  EXPECT_EQ(gi[i++].second, -5);
1022 
1023  EXPECT_EQ(gi[i].first, 0);
1024  EXPECT_EQ(gi[i++].second, -6);
1025 
1026  for (unsigned int i = 0; i < hl.nGaps(); ++i)
1027  EXPECT_FALSE(hl.lastGapInRing(i));
1028 
1029  i = 0;
1030  EXPECT_EQ(lg[i][0], 5);
1031  EXPECT_EQ(lg[i++][1], 0);
1032 
1033  EXPECT_EQ(lg[i][0], 0);
1034  EXPECT_EQ(lg[i++][1], 1);
1035 
1036  EXPECT_EQ(lg[i][0], 1);
1037  EXPECT_EQ(lg[i++][1], 2);
1038 
1039  EXPECT_EQ(lg[i][0], 2);
1040  EXPECT_EQ(lg[i++][1], 3);
1041 
1042  EXPECT_EQ(lg[i][0], 3);
1043  EXPECT_EQ(lg[i++][1], 4);
1044 
1045  EXPECT_EQ(lg[i][0], 4);
1046  EXPECT_EQ(lg[i++][1], 5);
1047 }
1048 
1050 {
1051  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1052  unsigned int nr = 2, a = 2;
1053  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1054  const auto & gi = hl.gapIndices();
1055  const auto & lg = hl.localToGlobalGaps();
1056 
1057  EXPECT_EQ(hl.nInteriorGaps(), (unsigned int)12);
1058 
1059  int i = 0;
1060  EXPECT_EQ(gi[i].first, 0);
1061  EXPECT_EQ(gi[i++].second, 1);
1062 
1063  EXPECT_EQ(gi[i].first, 0);
1064  EXPECT_EQ(gi[i++].second, 2);
1065 
1066  EXPECT_EQ(gi[i].first, 0);
1067  EXPECT_EQ(gi[i++].second, 3);
1068 
1069  EXPECT_EQ(gi[i].first, 0);
1070  EXPECT_EQ(gi[i++].second, 4);
1071 
1072  EXPECT_EQ(gi[i].first, 0);
1073  EXPECT_EQ(gi[i++].second, 5);
1074 
1075  EXPECT_EQ(gi[i].first, 0);
1076  EXPECT_EQ(gi[i++].second, 6);
1077 
1078  EXPECT_EQ(gi[i].first, 1);
1079  EXPECT_EQ(gi[i++].second, 2);
1080 
1081  EXPECT_EQ(gi[i].first, 1);
1082  EXPECT_EQ(gi[i++].second, 6);
1083 
1084  EXPECT_EQ(gi[i].first, 2);
1085  EXPECT_EQ(gi[i++].second, 3);
1086 
1087  EXPECT_EQ(gi[i].first, 3);
1088  EXPECT_EQ(gi[i++].second, 4);
1089 
1090  EXPECT_EQ(gi[i].first, 4);
1091  EXPECT_EQ(gi[i++].second, 5);
1092 
1093  EXPECT_EQ(gi[i].first, 5);
1094  EXPECT_EQ(gi[i++].second, 6);
1095 
1096  EXPECT_EQ(gi[i].first, 1);
1097  EXPECT_EQ(gi[i++].second, -1);
1098 
1099  EXPECT_EQ(gi[i].first, 2);
1100  EXPECT_EQ(gi[i++].second, -1);
1101 
1102  EXPECT_EQ(gi[i].first, 2);
1103  EXPECT_EQ(gi[i++].second, -2);
1104 
1105  EXPECT_EQ(gi[i].first, 3);
1106  EXPECT_EQ(gi[i++].second, -2);
1107 
1108  EXPECT_EQ(gi[i].first, 3);
1109  EXPECT_EQ(gi[i++].second, -3);
1110 
1111  EXPECT_EQ(gi[i].first, 4);
1112  EXPECT_EQ(gi[i++].second, -3);
1113 
1114  EXPECT_EQ(gi[i].first, 4);
1115  EXPECT_EQ(gi[i++].second, -4);
1116 
1117  EXPECT_EQ(gi[i].first, 5);
1118  EXPECT_EQ(gi[i++].second, -4);
1119 
1120  EXPECT_EQ(gi[i].first, 5);
1121  EXPECT_EQ(gi[i++].second, -5);
1122 
1123  EXPECT_EQ(gi[i].first, 6);
1124  EXPECT_EQ(gi[i++].second, -5);
1125 
1126  EXPECT_EQ(gi[i].first, 6);
1127  EXPECT_EQ(gi[i++].second, -6);
1128 
1129  EXPECT_EQ(gi[i].first, 1);
1130  EXPECT_EQ(gi[i++].second, -6);
1131 
1132  for (unsigned int i = 0; i < hl.nGaps(); ++i)
1133  {
1134  if (i == 7)
1135  EXPECT_TRUE(hl.lastGapInRing(i));
1136  else
1137  EXPECT_FALSE(hl.lastGapInRing(i));
1138  }
1139 
1140  i = 0;
1141  EXPECT_EQ(lg[i][0], 0);
1142  EXPECT_EQ(lg[i][1], 6);
1143  EXPECT_EQ(lg[i++][2], 1);
1144 
1145  EXPECT_EQ(lg[i][0], 1);
1146  EXPECT_EQ(lg[i][1], 8);
1147  EXPECT_EQ(lg[i++][2], 2);
1148 
1149  EXPECT_EQ(lg[i][0], 2);
1150  EXPECT_EQ(lg[i][1], 9);
1151  EXPECT_EQ(lg[i++][2], 3);
1152 
1153  EXPECT_EQ(lg[i][0], 3);
1154  EXPECT_EQ(lg[i][1], 10);
1155  EXPECT_EQ(lg[i++][2], 4);
1156 
1157  EXPECT_EQ(lg[i][0], 4);
1158  EXPECT_EQ(lg[i][1], 11);
1159  EXPECT_EQ(lg[i++][2], 5);
1160 
1161  EXPECT_EQ(lg[i][0], 5);
1162  EXPECT_EQ(lg[i][1], 7);
1163  EXPECT_EQ(lg[i++][2], 0);
1164 
1165  EXPECT_EQ(lg[i][0], 6);
1166  EXPECT_EQ(lg[i][1], 13);
1167  EXPECT_EQ(lg[i++][2], 12);
1168 
1169  EXPECT_EQ(lg[i][0], 8);
1170  EXPECT_EQ(lg[i][1], 15);
1171  EXPECT_EQ(lg[i++][2], 14);
1172 
1173  EXPECT_EQ(lg[i][0], 9);
1174  EXPECT_EQ(lg[i][1], 17);
1175  EXPECT_EQ(lg[i++][2], 16);
1176 
1177  EXPECT_EQ(lg[i][0], 10);
1178  EXPECT_EQ(lg[i][1], 19);
1179  EXPECT_EQ(lg[i++][2], 18);
1180 
1181  EXPECT_EQ(lg[i][0], 11);
1182  EXPECT_EQ(lg[i][1], 21);
1183  EXPECT_EQ(lg[i++][2], 20);
1184 
1185  EXPECT_EQ(lg[i][0], 7);
1186  EXPECT_EQ(lg[i][1], 23);
1187  EXPECT_EQ(lg[i++][2], 22);
1188 
1189  EXPECT_EQ(lg[i][0], 23);
1190  EXPECT_EQ(lg[i++][1], 12);
1191 
1192  EXPECT_EQ(lg[i][0], 13);
1193  EXPECT_EQ(lg[i++][1], 14);
1194 
1195  EXPECT_EQ(lg[i][0], 15);
1196  EXPECT_EQ(lg[i++][1], 16);
1197 
1198  EXPECT_EQ(lg[i][0], 17);
1199  EXPECT_EQ(lg[i++][1], 18);
1200 
1201  EXPECT_EQ(lg[i][0], 19);
1202  EXPECT_EQ(lg[i++][1], 20);
1203 
1204  EXPECT_EQ(lg[i][0], 21);
1205  EXPECT_EQ(lg[i++][1], 22);
1206 }
1207 
1209 {
1210  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1211  unsigned int nr = 3, a = 2;
1212  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1213  const auto & gi = hl.gapIndices();
1214  const auto & lg = hl.localToGlobalGaps();
1215 
1216  EXPECT_EQ(hl.nInteriorGaps(), (unsigned int)42);
1217 
1218  int i = 0;
1219  EXPECT_EQ(gi[i].first, 0);
1220  EXPECT_EQ(gi[i++].second, 1);
1221 
1222  EXPECT_EQ(gi[i].first, 0);
1223  EXPECT_EQ(gi[i++].second, 2);
1224 
1225  EXPECT_EQ(gi[i].first, 0);
1226  EXPECT_EQ(gi[i++].second, 3);
1227 
1228  EXPECT_EQ(gi[i].first, 0);
1229  EXPECT_EQ(gi[i++].second, 4);
1230 
1231  EXPECT_EQ(gi[i].first, 0);
1232  EXPECT_EQ(gi[i++].second, 5);
1233 
1234  EXPECT_EQ(gi[i].first, 0);
1235  EXPECT_EQ(gi[i++].second, 6);
1236 
1237  EXPECT_EQ(gi[i].first, 1);
1238  EXPECT_EQ(gi[i++].second, 2);
1239 
1240  EXPECT_EQ(gi[i].first, 1);
1241  EXPECT_EQ(gi[i++].second, 6);
1242 
1243  EXPECT_EQ(gi[i].first, 1);
1244  EXPECT_EQ(gi[i++].second, 7);
1245 
1246  EXPECT_EQ(gi[i].first, 1);
1247  EXPECT_EQ(gi[i++].second, 8);
1248 
1249  EXPECT_EQ(gi[i].first, 1);
1250  EXPECT_EQ(gi[i++].second, 18);
1251 
1252  EXPECT_EQ(gi[i].first, 2);
1253  EXPECT_EQ(gi[i++].second, 3);
1254 
1255  EXPECT_EQ(gi[i].first, 2);
1256  EXPECT_EQ(gi[i++].second, 8);
1257 
1258  EXPECT_EQ(gi[i].first, 2);
1259  EXPECT_EQ(gi[i++].second, 9);
1260 
1261  EXPECT_EQ(gi[i].first, 2);
1262  EXPECT_EQ(gi[i++].second, 10);
1263 
1264  EXPECT_EQ(gi[i].first, 3);
1265  EXPECT_EQ(gi[i++].second, 4);
1266 
1267  EXPECT_EQ(gi[i].first, 3);
1268  EXPECT_EQ(gi[i++].second, 10);
1269 
1270  EXPECT_EQ(gi[i].first, 3);
1271  EXPECT_EQ(gi[i++].second, 11);
1272 
1273  EXPECT_EQ(gi[i].first, 3);
1274  EXPECT_EQ(gi[i++].second, 12);
1275 
1276  EXPECT_EQ(gi[i].first, 4);
1277  EXPECT_EQ(gi[i++].second, 5);
1278 
1279  EXPECT_EQ(gi[i].first, 4);
1280  EXPECT_EQ(gi[i++].second, 12);
1281 
1282  EXPECT_EQ(gi[i].first, 4);
1283  EXPECT_EQ(gi[i++].second, 13);
1284 
1285  EXPECT_EQ(gi[i].first, 4);
1286  EXPECT_EQ(gi[i++].second, 14);
1287 
1288  EXPECT_EQ(gi[i].first, 5);
1289  EXPECT_EQ(gi[i++].second, 6);
1290 
1291  EXPECT_EQ(gi[i].first, 5);
1292  EXPECT_EQ(gi[i++].second, 14);
1293 
1294  EXPECT_EQ(gi[i].first, 5);
1295  EXPECT_EQ(gi[i++].second, 15);
1296 
1297  EXPECT_EQ(gi[i].first, 5);
1298  EXPECT_EQ(gi[i++].second, 16);
1299 
1300  EXPECT_EQ(gi[i].first, 6);
1301  EXPECT_EQ(gi[i++].second, 16);
1302 
1303  EXPECT_EQ(gi[i].first, 6);
1304  EXPECT_EQ(gi[i++].second, 17);
1305 
1306  EXPECT_EQ(gi[i].first, 6);
1307  EXPECT_EQ(gi[i++].second, 18);
1308 
1309  EXPECT_EQ(gi[i].first, 7);
1310  EXPECT_EQ(gi[i++].second, 8);
1311 
1312  EXPECT_EQ(gi[i].first, 7);
1313  EXPECT_EQ(gi[i++].second, 18);
1314 
1315  EXPECT_EQ(gi[i].first, 8);
1316  EXPECT_EQ(gi[i++].second, 9);
1317 
1318  EXPECT_EQ(gi[i].first, 9);
1319  EXPECT_EQ(gi[i++].second, 10);
1320 
1321  EXPECT_EQ(gi[i].first, 10);
1322  EXPECT_EQ(gi[i++].second, 11);
1323 
1324  EXPECT_EQ(gi[i].first, 11);
1325  EXPECT_EQ(gi[i++].second, 12);
1326 
1327  EXPECT_EQ(gi[i].first, 12);
1328  EXPECT_EQ(gi[i++].second, 13);
1329 
1330  EXPECT_EQ(gi[i].first, 13);
1331  EXPECT_EQ(gi[i++].second, 14);
1332 
1333  EXPECT_EQ(gi[i].first, 14);
1334  EXPECT_EQ(gi[i++].second, 15);
1335 
1336  EXPECT_EQ(gi[i].first, 15);
1337  EXPECT_EQ(gi[i++].second, 16);
1338 
1339  EXPECT_EQ(gi[i].first, 16);
1340  EXPECT_EQ(gi[i++].second, 17);
1341 
1342  EXPECT_EQ(gi[i].first, 17);
1343  EXPECT_EQ(gi[i++].second, 18);
1344 
1345  EXPECT_EQ(gi[i].first, 7);
1346  EXPECT_EQ(gi[i++].second, -1);
1347 
1348  EXPECT_EQ(gi[i].first, 8);
1349  EXPECT_EQ(gi[i++].second, -1);
1350 
1351  EXPECT_EQ(gi[i].first, 9);
1352  EXPECT_EQ(gi[i++].second, -1);
1353 
1354  EXPECT_EQ(gi[i].first, 9);
1355  EXPECT_EQ(gi[i++].second, -2);
1356 
1357  EXPECT_EQ(gi[i].first, 10);
1358  EXPECT_EQ(gi[i++].second, -2);
1359 
1360  EXPECT_EQ(gi[i].first, 11);
1361  EXPECT_EQ(gi[i++].second, -2);
1362 
1363  EXPECT_EQ(gi[i].first, 11);
1364  EXPECT_EQ(gi[i++].second, -3);
1365 
1366  EXPECT_EQ(gi[i].first, 12);
1367  EXPECT_EQ(gi[i++].second, -3);
1368 
1369  EXPECT_EQ(gi[i].first, 13);
1370  EXPECT_EQ(gi[i++].second, -3);
1371 
1372  EXPECT_EQ(gi[i].first, 13);
1373  EXPECT_EQ(gi[i++].second, -4);
1374 
1375  EXPECT_EQ(gi[i].first, 14);
1376  EXPECT_EQ(gi[i++].second, -4);
1377 
1378  EXPECT_EQ(gi[i].first, 15);
1379  EXPECT_EQ(gi[i++].second, -4);
1380 
1381  EXPECT_EQ(gi[i].first, 15);
1382  EXPECT_EQ(gi[i++].second, -5);
1383 
1384  EXPECT_EQ(gi[i].first, 16);
1385  EXPECT_EQ(gi[i++].second, -5);
1386 
1387  EXPECT_EQ(gi[i].first, 17);
1388  EXPECT_EQ(gi[i++].second, -5);
1389 
1390  EXPECT_EQ(gi[i].first, 17);
1391  EXPECT_EQ(gi[i++].second, -6);
1392 
1393  EXPECT_EQ(gi[i].first, 18);
1394  EXPECT_EQ(gi[i++].second, -6);
1395 
1396  EXPECT_EQ(gi[i].first, 7);
1397  EXPECT_EQ(gi[i++].second, -6);
1398 
1399  for (unsigned int i = 0; i < hl.nGaps(); ++i)
1400  {
1401  if (i == 7 || i == 31)
1402  EXPECT_TRUE(hl.lastGapInRing(i));
1403  else
1404  EXPECT_FALSE(hl.lastGapInRing(i));
1405  }
1406 
1407  i = 0;
1408  EXPECT_EQ(lg[i][0], 0);
1409  EXPECT_EQ(lg[i][1], 6);
1410  EXPECT_EQ(lg[i++][2], 1);
1411 
1412  EXPECT_EQ(lg[i][0], 1);
1413  EXPECT_EQ(lg[i][1], 11);
1414  EXPECT_EQ(lg[i++][2], 2);
1415 
1416  EXPECT_EQ(lg[i][0], 2);
1417  EXPECT_EQ(lg[i][1], 15);
1418  EXPECT_EQ(lg[i++][2], 3);
1419 
1420  EXPECT_EQ(lg[i][0], 3);
1421  EXPECT_EQ(lg[i][1], 19);
1422  EXPECT_EQ(lg[i++][2], 4);
1423 
1424  EXPECT_EQ(lg[i][0], 4);
1425  EXPECT_EQ(lg[i][1], 23);
1426  EXPECT_EQ(lg[i++][2], 5);
1427 
1428  EXPECT_EQ(lg[i][0], 5);
1429  EXPECT_EQ(lg[i][1], 7);
1430  EXPECT_EQ(lg[i++][2], 0);
1431 
1432  EXPECT_EQ(lg[i][0], 8);
1433  EXPECT_EQ(lg[i][1], 30);
1434  EXPECT_EQ(lg[i++][2], 9);
1435 
1436  EXPECT_EQ(lg[i][0], 12);
1437  EXPECT_EQ(lg[i][1], 6);
1438  EXPECT_EQ(lg[i++][2], 9);
1439 
1440  EXPECT_EQ(lg[i][0], 12);
1441  EXPECT_EQ(lg[i][1], 32);
1442  EXPECT_EQ(lg[i++][2], 13);
1443 
1444  EXPECT_EQ(lg[i][0], 13);
1445  EXPECT_EQ(lg[i][1], 33);
1446  EXPECT_EQ(lg[i++][2], 14);
1447 
1448  EXPECT_EQ(lg[i][0], 16);
1449  EXPECT_EQ(lg[i][1], 11);
1450  EXPECT_EQ(lg[i++][2], 14);
1451 
1452  EXPECT_EQ(lg[i][0], 16);
1453  EXPECT_EQ(lg[i][1], 34);
1454  EXPECT_EQ(lg[i++][2], 17);
1455 
1456  EXPECT_EQ(lg[i][0], 17);
1457  EXPECT_EQ(lg[i][1], 35);
1458  EXPECT_EQ(lg[i++][2], 18);
1459 
1460  EXPECT_EQ(lg[i][0], 20);
1461  EXPECT_EQ(lg[i][1], 15);
1462  EXPECT_EQ(lg[i++][2], 18);
1463 
1464  EXPECT_EQ(lg[i][0], 20);
1465  EXPECT_EQ(lg[i][1], 36);
1466  EXPECT_EQ(lg[i++][2], 21);
1467 
1468  EXPECT_EQ(lg[i][0], 21);
1469  EXPECT_EQ(lg[i][1], 37);
1470  EXPECT_EQ(lg[i++][2], 22);
1471 
1472  EXPECT_EQ(lg[i][0], 24);
1473  EXPECT_EQ(lg[i][1], 19);
1474  EXPECT_EQ(lg[i++][2], 22);
1475 
1476  EXPECT_EQ(lg[i][0], 24);
1477  EXPECT_EQ(lg[i][1], 38);
1478  EXPECT_EQ(lg[i++][2], 25);
1479 
1480  EXPECT_EQ(lg[i][0], 25);
1481  EXPECT_EQ(lg[i][1], 39);
1482  EXPECT_EQ(lg[i++][2], 26);
1483 
1484  EXPECT_EQ(lg[i][0], 27);
1485  EXPECT_EQ(lg[i][1], 23);
1486  EXPECT_EQ(lg[i++][2], 26);
1487 
1488  EXPECT_EQ(lg[i][0], 27);
1489  EXPECT_EQ(lg[i][1], 40);
1490  EXPECT_EQ(lg[i++][2], 28);
1491 
1492  EXPECT_EQ(lg[i][0], 28);
1493  EXPECT_EQ(lg[i][1], 41);
1494  EXPECT_EQ(lg[i++][2], 29);
1495 
1496  EXPECT_EQ(lg[i][0], 10);
1497  EXPECT_EQ(lg[i][1], 7);
1498  EXPECT_EQ(lg[i++][2], 29);
1499 
1500  EXPECT_EQ(lg[i][0], 10);
1501  EXPECT_EQ(lg[i][1], 31);
1502  EXPECT_EQ(lg[i++][2], 8);
1503 
1504  // edge channels
1505  EXPECT_EQ(lg[i][0], 30);
1506  EXPECT_EQ(lg[i][1], 43);
1507  EXPECT_EQ(lg[i++][2], 42);
1508 
1509  EXPECT_EQ(lg[i][0], 32);
1510  EXPECT_EQ(lg[i][1], 44);
1511  EXPECT_EQ(lg[i++][2], 43);
1512 
1513  EXPECT_EQ(lg[i][0], 33);
1514  EXPECT_EQ(lg[i][1], 46);
1515  EXPECT_EQ(lg[i++][2], 45);
1516 
1517  EXPECT_EQ(lg[i][0], 34);
1518  EXPECT_EQ(lg[i][1], 47);
1519  EXPECT_EQ(lg[i++][2], 46);
1520 
1521  EXPECT_EQ(lg[i][0], 35);
1522  EXPECT_EQ(lg[i][1], 49);
1523  EXPECT_EQ(lg[i++][2], 48);
1524 
1525  EXPECT_EQ(lg[i][0], 36);
1526  EXPECT_EQ(lg[i][1], 50);
1527  EXPECT_EQ(lg[i++][2], 49);
1528 
1529  EXPECT_EQ(lg[i][0], 37);
1530  EXPECT_EQ(lg[i][1], 52);
1531  EXPECT_EQ(lg[i++][2], 51);
1532 
1533  EXPECT_EQ(lg[i][0], 38);
1534  EXPECT_EQ(lg[i][1], 53);
1535  EXPECT_EQ(lg[i++][2], 52);
1536 
1537  EXPECT_EQ(lg[i][0], 39);
1538  EXPECT_EQ(lg[i][1], 55);
1539  EXPECT_EQ(lg[i++][2], 54);
1540 
1541  EXPECT_EQ(lg[i][0], 40);
1542  EXPECT_EQ(lg[i][1], 56);
1543  EXPECT_EQ(lg[i++][2], 55);
1544 
1545  EXPECT_EQ(lg[i][0], 41);
1546  EXPECT_EQ(lg[i][1], 58);
1547  EXPECT_EQ(lg[i++][2], 57);
1548 
1549  EXPECT_EQ(lg[i][0], 31);
1550  EXPECT_EQ(lg[i][1], 59);
1551  EXPECT_EQ(lg[i++][2], 58);
1552 
1553  // corner channels
1554  EXPECT_EQ(lg[i][0], 59);
1555  EXPECT_EQ(lg[i++][1], 42);
1556 
1557  EXPECT_EQ(lg[i][0], 44);
1558  EXPECT_EQ(lg[i++][1], 45);
1559 
1560  EXPECT_EQ(lg[i][0], 47);
1561  EXPECT_EQ(lg[i++][1], 48);
1562 
1563  EXPECT_EQ(lg[i][0], 50);
1564  EXPECT_EQ(lg[i++][1], 51);
1565 
1566  EXPECT_EQ(lg[i][0], 53);
1567  EXPECT_EQ(lg[i++][1], 54);
1568 
1569  EXPECT_EQ(lg[i][0], 56);
1570  EXPECT_EQ(lg[i++][1], 57);
1571 }
1572 
1574 {
1575  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1576  unsigned int nr = 3, a = 2;
1577  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1578 
1579  Point pt1(0.23, 0.27, 0.0);
1580  EXPECT_EQ(hl.gapIndex(pt1), (unsigned int)0);
1581 
1582  Point pt2(-0.5, 0.29, 0.0);
1583  EXPECT_EQ(hl.gapIndex(pt2), (unsigned int)11);
1584 
1585  Point pt3(1.14, 0.275, 0.0);
1586  EXPECT_EQ(hl.gapIndex(pt3), (unsigned int)29);
1587 
1588  Point pt4(-0.77, 1.015, 0.0);
1589  EXPECT_EQ(hl.gapIndex(pt4), (unsigned int)13);
1590 
1591  Point pt5(-0.84, 0.445, 0.0);
1592  EXPECT_EQ(hl.gapIndex(pt5), (unsigned int)16);
1593 
1594  Point pt6(-0.47, 1.55, 0.0);
1595  EXPECT_EQ(hl.gapIndex(pt6), (unsigned int)32);
1596 
1597  Point pt7(-0.069, 1.94, 0.0);
1598  EXPECT_EQ(hl.gapIndex(pt7), (unsigned int)43);
1599 
1600  Point pt8(-1.22, 1.79, 0.0);
1601  EXPECT_EQ(hl.gapIndex(pt8), (unsigned int)45);
1602 
1603  Point pt10(-0.26, -1.61, 0.0);
1604  EXPECT_EQ(hl.gapIndex(pt10), (unsigned int)37);
1605 
1606  Point pt11(2.23, 0.03, 0.0);
1607  EXPECT_EQ(hl.gapIndex(pt11), (unsigned int)57);
1608 
1609  Point pt12(-1.77, -0.70, 0.0);
1610  EXPECT_EQ(hl.gapIndex(pt12), (unsigned int)49);
1611 }
1612 
1614 {
1615  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1616  unsigned int nr = 1, a = 2;
1617  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1618  const auto & normals = hl.gapUnitNormals();
1619  Real sin60 = std::sqrt(3.0) / 2.0;
1620 
1621  for (const auto & n : normals)
1622  EXPECT_DOUBLE_EQ(n(2), 0.0);
1623 
1624  EXPECT_DOUBLE_EQ(normals[0](0), -1.0);
1625  EXPECT_DOUBLE_EQ(normals[0](1), 0.0);
1626 
1627  EXPECT_DOUBLE_EQ(normals[1](0), -0.5);
1628  EXPECT_DOUBLE_EQ(normals[1](1), -sin60);
1629 
1630  EXPECT_DOUBLE_EQ(normals[2](0), 0.5);
1631  EXPECT_DOUBLE_EQ(normals[2](1), -sin60);
1632 
1633  EXPECT_DOUBLE_EQ(normals[3](0), 1.0);
1634  EXPECT_DOUBLE_EQ(normals[3](1), 0.0);
1635 
1636  EXPECT_DOUBLE_EQ(normals[4](0), 0.5);
1637  EXPECT_DOUBLE_EQ(normals[4](1), sin60);
1638 
1639  EXPECT_DOUBLE_EQ(normals[5](0), -0.5);
1640  EXPECT_DOUBLE_EQ(normals[5](1), sin60);
1641 }
1642 
1644 {
1645  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1646  unsigned int nr = 2, a = 2;
1647  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1648  const auto & normals = hl.gapUnitNormals();
1649  Real sin60 = std::sqrt(3.0) / 2.0;
1650 
1651  for (const auto & n : normals)
1652  EXPECT_DOUBLE_EQ(n(2), 0.0);
1653 
1654  EXPECT_DOUBLE_EQ(normals[0](0), -sin60);
1655  EXPECT_DOUBLE_EQ(normals[0](1), 0.5);
1656 
1657  EXPECT_DOUBLE_EQ(normals[1](0), -sin60);
1658  EXPECT_DOUBLE_EQ(normals[1](1), -0.5);
1659 
1660  EXPECT_DOUBLE_EQ(normals[2](0), 0.0);
1661  EXPECT_DOUBLE_EQ(normals[2](1), -1.0);
1662 
1663  EXPECT_DOUBLE_EQ(normals[3](0), sin60);
1664  EXPECT_DOUBLE_EQ(normals[3](1), -0.5);
1665 
1666  EXPECT_DOUBLE_EQ(normals[4](0), sin60);
1667  EXPECT_DOUBLE_EQ(normals[4](1), 0.5);
1668 
1669  EXPECT_DOUBLE_EQ(normals[5](0), 0.0);
1670  EXPECT_DOUBLE_EQ(normals[5](1), 1.0);
1671 
1672  EXPECT_DOUBLE_EQ(normals[6](0), 0.0);
1673  EXPECT_DOUBLE_EQ(normals[6](1), -1.0);
1674 
1675  EXPECT_DOUBLE_EQ(normals[7](0), -sin60);
1676  EXPECT_DOUBLE_EQ(normals[7](1), -0.5);
1677 
1678  EXPECT_DOUBLE_EQ(normals[8](0), sin60);
1679  EXPECT_DOUBLE_EQ(normals[8](1), -0.5);
1680 
1681  EXPECT_DOUBLE_EQ(normals[9](0), sin60);
1682  EXPECT_DOUBLE_EQ(normals[9](1), 0.5);
1683 
1684  EXPECT_DOUBLE_EQ(normals[10](0), 0.0);
1685  EXPECT_DOUBLE_EQ(normals[10](1), 1.0);
1686 
1687  EXPECT_DOUBLE_EQ(normals[11](0), -sin60);
1688  EXPECT_DOUBLE_EQ(normals[11](1), 0.5);
1689 
1690  EXPECT_DOUBLE_EQ(normals[12](0), -1.0);
1691  EXPECT_DOUBLE_EQ(normals[12](1), 0.0);
1692 
1693  EXPECT_DOUBLE_EQ(normals[13](0), -1.0);
1694  EXPECT_DOUBLE_EQ(normals[13](1), 0.0);
1695 
1696  EXPECT_DOUBLE_EQ(normals[14](0), -0.5);
1697  EXPECT_DOUBLE_EQ(normals[14](1), -sin60);
1698 
1699  EXPECT_DOUBLE_EQ(normals[15](0), -0.5);
1700  EXPECT_DOUBLE_EQ(normals[15](1), -sin60);
1701 
1702  EXPECT_DOUBLE_EQ(normals[16](0), 0.5);
1703  EXPECT_DOUBLE_EQ(normals[16](1), -sin60);
1704 
1705  EXPECT_DOUBLE_EQ(normals[17](0), 0.5);
1706  EXPECT_DOUBLE_EQ(normals[17](1), -sin60);
1707 
1708  EXPECT_DOUBLE_EQ(normals[18](0), 1.0);
1709  EXPECT_DOUBLE_EQ(normals[18](1), 0.0);
1710 
1711  EXPECT_DOUBLE_EQ(normals[19](0), 1.0);
1712  EXPECT_DOUBLE_EQ(normals[19](1), 0.0);
1713 
1714  EXPECT_DOUBLE_EQ(normals[20](0), 0.5);
1715  EXPECT_DOUBLE_EQ(normals[20](1), sin60);
1716 
1717  EXPECT_DOUBLE_EQ(normals[21](0), 0.5);
1718  EXPECT_DOUBLE_EQ(normals[21](1), sin60);
1719 
1720  EXPECT_DOUBLE_EQ(normals[22](0), -0.5);
1721  EXPECT_DOUBLE_EQ(normals[22](1), sin60);
1722 
1723  EXPECT_DOUBLE_EQ(normals[23](0), -0.5);
1724  EXPECT_DOUBLE_EQ(normals[23](1), sin60);
1725 }
1726 
1728 {
1729  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1730  unsigned int nr = 3, a = 2;
1731  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1732  const auto & normals = hl.gapUnitNormals();
1733  Real sin60 = std::sqrt(3.0) / 2.0;
1734 
1735  for (const auto & n : normals)
1736  EXPECT_DOUBLE_EQ(n(2), 0.0);
1737 
1738  EXPECT_DOUBLE_EQ(normals[0](0), -sin60);
1739  EXPECT_DOUBLE_EQ(normals[0](1), 0.5);
1740 
1741  EXPECT_DOUBLE_EQ(normals[1](0), -sin60);
1742  EXPECT_DOUBLE_EQ(normals[1](1), -0.5);
1743 
1744  EXPECT_DOUBLE_EQ(normals[2](0), 0.0);
1745  EXPECT_DOUBLE_EQ(normals[2](1), -1.0);
1746 
1747  EXPECT_DOUBLE_EQ(normals[3](0), sin60);
1748  EXPECT_DOUBLE_EQ(normals[3](1), -0.5);
1749 
1750  EXPECT_DOUBLE_EQ(normals[4](0), sin60);
1751  EXPECT_DOUBLE_EQ(normals[4](1), 0.5);
1752 
1753  EXPECT_DOUBLE_EQ(normals[5](0), 0.0);
1754  EXPECT_DOUBLE_EQ(normals[5](1), 1.0);
1755 
1756  EXPECT_DOUBLE_EQ(normals[6](0), 0.0);
1757  EXPECT_DOUBLE_EQ(normals[6](1), -1.0);
1758 
1759  EXPECT_DOUBLE_EQ(normals[7](0), -sin60);
1760  EXPECT_DOUBLE_EQ(normals[7](1), -0.5);
1761 
1762  EXPECT_DOUBLE_EQ(normals[8](0), -sin60);
1763  EXPECT_DOUBLE_EQ(normals[8](1), 0.5);
1764 
1765  EXPECT_DOUBLE_EQ(normals[9](0), -sin60);
1766  EXPECT_DOUBLE_EQ(normals[9](1), -0.5);
1767 
1768  EXPECT_DOUBLE_EQ(normals[10](0), 0.0);
1769  EXPECT_DOUBLE_EQ(normals[10](1), 1.0);
1770 
1771  EXPECT_DOUBLE_EQ(normals[11](0), sin60);
1772  EXPECT_DOUBLE_EQ(normals[11](1), -0.5);
1773 
1774  EXPECT_DOUBLE_EQ(normals[12](0), -sin60);
1775  EXPECT_DOUBLE_EQ(normals[12](1), 0.5);
1776 
1777  EXPECT_DOUBLE_EQ(normals[13](0), -sin60);
1778  EXPECT_DOUBLE_EQ(normals[13](1), -0.5);
1779 
1780  EXPECT_DOUBLE_EQ(normals[14](0), 0.0);
1781  EXPECT_DOUBLE_EQ(normals[14](1), -1.0);
1782 
1783  EXPECT_DOUBLE_EQ(normals[15](0), sin60);
1784  EXPECT_DOUBLE_EQ(normals[15](1), 0.5);
1785 
1786  EXPECT_DOUBLE_EQ(normals[16](0), -sin60);
1787  EXPECT_DOUBLE_EQ(normals[16](1), -0.5);
1788 
1789  EXPECT_DOUBLE_EQ(normals[17](0), 0.0);
1790  EXPECT_DOUBLE_EQ(normals[17](1), -1.0);
1791 
1792  EXPECT_DOUBLE_EQ(normals[18](0), sin60);
1793  EXPECT_DOUBLE_EQ(normals[18](1), -0.5);
1794 
1795  EXPECT_DOUBLE_EQ(normals[19](0), 0.0);
1796  EXPECT_DOUBLE_EQ(normals[19](1), 1.0);
1797 
1798  EXPECT_DOUBLE_EQ(normals[20](0), 0.0);
1799  EXPECT_DOUBLE_EQ(normals[20](1), -1.0);
1800 
1801  EXPECT_DOUBLE_EQ(normals[21](0), sin60);
1802  EXPECT_DOUBLE_EQ(normals[21](1), -0.5);
1803 
1804  EXPECT_DOUBLE_EQ(normals[22](0), sin60);
1805  EXPECT_DOUBLE_EQ(normals[22](1), 0.5);
1806 
1807  EXPECT_DOUBLE_EQ(normals[23](0), -sin60);
1808  EXPECT_DOUBLE_EQ(normals[23](1), 0.5);
1809 
1810  EXPECT_DOUBLE_EQ(normals[24](0), sin60);
1811  EXPECT_DOUBLE_EQ(normals[24](1), -0.5);
1812 
1813  EXPECT_DOUBLE_EQ(normals[25](0), sin60);
1814  EXPECT_DOUBLE_EQ(normals[25](1), 0.5);
1815 
1816  EXPECT_DOUBLE_EQ(normals[26](0), 0.0);
1817  EXPECT_DOUBLE_EQ(normals[26](1), 1.0);
1818 
1819  EXPECT_DOUBLE_EQ(normals[27](0), sin60);
1820  EXPECT_DOUBLE_EQ(normals[27](1), 0.5);
1821 
1822  EXPECT_DOUBLE_EQ(normals[28](0), 0.0);
1823  EXPECT_DOUBLE_EQ(normals[28](1), 1.0);
1824 
1825  EXPECT_DOUBLE_EQ(normals[29](0), -sin60);
1826  EXPECT_DOUBLE_EQ(normals[29](1), 0.5);
1827 
1828  EXPECT_DOUBLE_EQ(normals[30](0), 0.0);
1829  EXPECT_DOUBLE_EQ(normals[30](1), -1.0);
1830 
1831  EXPECT_DOUBLE_EQ(normals[31](0), -sin60);
1832  EXPECT_DOUBLE_EQ(normals[31](1), -0.5);
1833 
1834  EXPECT_DOUBLE_EQ(normals[32](0), 0.0);
1835  EXPECT_DOUBLE_EQ(normals[32](1), -1.0);
1836 
1837  EXPECT_DOUBLE_EQ(normals[33](0), sin60);
1838  EXPECT_DOUBLE_EQ(normals[33](1), -0.5);
1839 
1840  EXPECT_DOUBLE_EQ(normals[34](0), sin60);
1841  EXPECT_DOUBLE_EQ(normals[34](1), -0.5);
1842 
1843  EXPECT_DOUBLE_EQ(normals[35](0), sin60);
1844  EXPECT_DOUBLE_EQ(normals[35](1), 0.5);
1845 
1846  EXPECT_DOUBLE_EQ(normals[36](0), sin60);
1847  EXPECT_DOUBLE_EQ(normals[36](1), 0.5);
1848 
1849  EXPECT_DOUBLE_EQ(normals[37](0), 0.0);
1850  EXPECT_DOUBLE_EQ(normals[37](1), 1.0);
1851 
1852  EXPECT_DOUBLE_EQ(normals[38](0), 0.0);
1853  EXPECT_DOUBLE_EQ(normals[38](1), 1.0);
1854 
1855  EXPECT_DOUBLE_EQ(normals[39](0), -sin60);
1856  EXPECT_DOUBLE_EQ(normals[39](1), 0.5);
1857 
1858  EXPECT_DOUBLE_EQ(normals[40](0), -sin60);
1859  EXPECT_DOUBLE_EQ(normals[40](1), 0.5);
1860 
1861  EXPECT_DOUBLE_EQ(normals[41](0), -sin60);
1862  EXPECT_DOUBLE_EQ(normals[41](1), -0.5);
1863 
1864  EXPECT_DOUBLE_EQ(normals[42](0), -1.0);
1865  EXPECT_DOUBLE_EQ(normals[42](1), 0.0);
1866 
1867  EXPECT_DOUBLE_EQ(normals[43](0), -1.0);
1868  EXPECT_DOUBLE_EQ(normals[43](1), 0.0);
1869 
1870  EXPECT_DOUBLE_EQ(normals[44](0), -1.0);
1871  EXPECT_DOUBLE_EQ(normals[44](1), 0.0);
1872 
1873  EXPECT_DOUBLE_EQ(normals[45](0), -0.5);
1874  EXPECT_DOUBLE_EQ(normals[45](1), -sin60);
1875 
1876  EXPECT_DOUBLE_EQ(normals[46](0), -0.5);
1877  EXPECT_DOUBLE_EQ(normals[46](1), -sin60);
1878 
1879  EXPECT_DOUBLE_EQ(normals[47](0), -0.5);
1880  EXPECT_DOUBLE_EQ(normals[47](1), -sin60);
1881 
1882  EXPECT_DOUBLE_EQ(normals[48](0), 0.5);
1883  EXPECT_DOUBLE_EQ(normals[48](1), -sin60);
1884 
1885  EXPECT_DOUBLE_EQ(normals[49](0), 0.5);
1886  EXPECT_DOUBLE_EQ(normals[49](1), -sin60);
1887 
1888  EXPECT_DOUBLE_EQ(normals[50](0), 0.5);
1889  EXPECT_DOUBLE_EQ(normals[50](1), -sin60);
1890 
1891  EXPECT_DOUBLE_EQ(normals[51](0), 1.0);
1892  EXPECT_DOUBLE_EQ(normals[51](1), 0.0);
1893 
1894  EXPECT_DOUBLE_EQ(normals[52](0), 1.0);
1895  EXPECT_DOUBLE_EQ(normals[52](1), 0.0);
1896 
1897  EXPECT_DOUBLE_EQ(normals[53](0), 1.0);
1898  EXPECT_DOUBLE_EQ(normals[53](1), 0.0);
1899 
1900  EXPECT_DOUBLE_EQ(normals[54](0), 0.5);
1901  EXPECT_DOUBLE_EQ(normals[54](1), sin60);
1902 
1903  EXPECT_DOUBLE_EQ(normals[55](0), 0.5);
1904  EXPECT_DOUBLE_EQ(normals[55](1), sin60);
1905 
1906  EXPECT_DOUBLE_EQ(normals[56](0), 0.5);
1907  EXPECT_DOUBLE_EQ(normals[56](1), sin60);
1908 
1909  EXPECT_DOUBLE_EQ(normals[57](0), -0.5);
1910  EXPECT_DOUBLE_EQ(normals[57](1), sin60);
1911 
1912  EXPECT_DOUBLE_EQ(normals[58](0), -0.5);
1913  EXPECT_DOUBLE_EQ(normals[58](1), sin60);
1914 
1915  EXPECT_DOUBLE_EQ(normals[59](0), -0.5);
1916  EXPECT_DOUBLE_EQ(normals[59](1), sin60);
1917 }
1918 
1920 {
1921  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1922  unsigned int nr = 2, a = 2;
1923  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1924  const auto & pin_corners = hl.pinCenteredCornerCoordinates();
1925  Real sin60 = std::sqrt(3.0) / 2.0;
1926  Real cos60 = 0.5;
1927 
1928  // center pin
1929  double side = 0.46188021535170065;
1930  const auto & pin0 = pin_corners[0];
1931  EXPECT_DOUBLE_EQ(pin0[0](0), 0.0);
1932  EXPECT_DOUBLE_EQ(pin0[0](1), side);
1933 
1934  EXPECT_DOUBLE_EQ(pin0[1](0), -side * sin60);
1935  EXPECT_DOUBLE_EQ(pin0[1](1), side * cos60);
1936 
1937  EXPECT_DOUBLE_EQ(pin0[2](0), -side * sin60);
1938  EXPECT_DOUBLE_EQ(pin0[2](1), -side * cos60);
1939 
1940  EXPECT_DOUBLE_EQ(pin0[3](0), (unsigned int)0);
1941  EXPECT_DOUBLE_EQ(pin0[3](1), -side);
1942 
1943  EXPECT_DOUBLE_EQ(pin0[4](0), side * sin60);
1944  EXPECT_DOUBLE_EQ(pin0[4](1), -side * cos60);
1945 
1946  EXPECT_DOUBLE_EQ(pin0[5](0), side * sin60);
1947  EXPECT_DOUBLE_EQ(pin0[5](1), side * cos60);
1948 
1949  // second pin
1950  const auto & pin_centers = hl.pinCenters();
1951  const auto & pin1 = pin_corners[1];
1952  double x = pin_centers[1](0);
1953  double y = pin_centers[1](1);
1954 
1955  EXPECT_DOUBLE_EQ(pin1[0](0), x + 0.0);
1956  EXPECT_DOUBLE_EQ(pin1[0](1), y + side);
1957 
1958  ABS_DOUBLE_TEST(pin1[1](0), x + -side * sin60);
1959  EXPECT_DOUBLE_EQ(pin1[1](1), y + side * cos60);
1960 
1961  ABS_DOUBLE_TEST(pin1[2](0), x + -side * sin60);
1962  EXPECT_DOUBLE_EQ(pin1[2](1), y + -side * cos60);
1963 
1964  EXPECT_DOUBLE_EQ(pin1[3](0), x + 0);
1965  EXPECT_DOUBLE_EQ(pin1[3](1), y + -side);
1966 
1967  EXPECT_DOUBLE_EQ(pin1[4](0), x + side * sin60);
1968  EXPECT_DOUBLE_EQ(pin1[4](1), y + -side * cos60);
1969 
1970  EXPECT_DOUBLE_EQ(pin1[5](0), x + side * sin60);
1971  EXPECT_DOUBLE_EQ(pin1[5](1), y + side * cos60);
1972 
1973  // check for bin indexing
1974  Point p(0.07, 0.195, 0.0);
1975  EXPECT_EQ(hl.pinIndex(p), (unsigned int)0);
1976 
1977  p = {0.02, 0.42, 0.0};
1978  EXPECT_EQ(hl.pinIndex(p), (unsigned int)0);
1979 
1980  p = {0.74, 0.46, 0.0};
1981  EXPECT_EQ(hl.pinIndex(p), (unsigned int)1);
1982 
1983  p = {-0.206, 0.668, 0.0};
1984  EXPECT_EQ(hl.pinIndex(p), (unsigned int)2);
1985 
1986  p = {-0.99, 0.313, 0.0};
1987  EXPECT_EQ(hl.pinIndex(p), (unsigned int)3);
1988 
1989  p = {-0.257, -0.67, 0.0};
1990  EXPECT_EQ(hl.pinIndex(p), (unsigned int)4);
1991 
1992  p = {0.67, -0.79, 0.0};
1993  EXPECT_EQ(hl.pinIndex(p), (unsigned int)5);
1994 
1995  p = {0.43, 0.0206, 0.0};
1996  EXPECT_EQ(hl.pinIndex(p), (unsigned int)6);
1997 
1998  p = {0.85, 0.51, 0.0};
1999  EXPECT_EQ(hl.pinIndex(p), (unsigned int)7);
2000 }
2001 
2003 {
2004  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
2005  unsigned int nr = 3, a = 2;
2006  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
2007  EXPECT_DOUBLE_EQ(hl.bundlePitch(), 4.0);
2008  EXPECT_DOUBLE_EQ(hl.pinPitch(), 0.8);
2009  EXPECT_DOUBLE_EQ(hl.pinDiameter(), 0.6);
2010  EXPECT_DOUBLE_EQ(hl.pinRadius(), 0.3);
2011  EXPECT_DOUBLE_EQ(hl.wireDiameter(), 0.05);
2012  EXPECT_DOUBLE_EQ(hl.wirePitch(), 50.0);
2013 }
Real cornerFlowVolume() const
Get the flow volume of an corner channel per wire pitch.
Real cornerWettedArea() const
Get the wetted area of a corner channel per wire pitch.
unsigned int rings(const unsigned int n) const
Get the number of rings for a specified number of pins.
unsigned int pinIndex(const Point &point) const
Get the pin index given a point.
unsigned int nInteriorPins() const
Get the number of interior pins.
unsigned int nChannels() const
Get the total number of channels.
unsigned int channelIndex(const Point &point) const
Get the channel index given a point.
channel_type::ChannelTypeEnum channelType(const Point &p) const
Get the channel type (interior, edge, corner) given a point.
Real interiorFlowVolume() const
Get the flow volume of an interior channel per wire pitch.
const std::vector< std::vector< unsigned int > > & interiorChannelPinIndices() const
Get the pin indices forming the corners of all interior channels.
const std::vector< double > y
Real flowVolume() const
Get the flow volume of the bundle per wire pitch.
unsigned int nEdgeChannels() const
Get the number of edge channels.
Real pinBundleSpacing() const
Get the distance between the outermost pins and the duct walls.
Real edgeWettedArea() const
Get the wetted area of an edge channel per wire pitch.
const std::vector< std::vector< unsigned int > > & cornerChannelPinIndices() const
Get the pin indices forming one of the corners of all corner channels.
unsigned int nCornerPins() const
Get the number of corner pins.
Real wireDiameter() const
Get the wire diameter.
const std::vector< std::vector< unsigned int > > & edgeChannelPinIndices() const
Get the pin indices forming two of the corners of all edge channels.
unsigned int gapIndex(const Point &point) const
Get the index for the gap closest to the point.
Real wirePitch() const
Get the wire pitch.
Class providing various utility functions related to triangular lattices of pins enclosed in a hexago...
unsigned int nCornerChannels() const
Get the number of corner channels.
const std::vector< double > x
Real wettedArea() const
Get the wetted area of entire bundle per wire pitch.
unsigned int nInteriorChannels() const
Get the number of interior channels.
unsigned int pins(const unsigned int n) const
Get the number of pins in a given ring.
bool lastGapInRing(const unsigned int gap_index) const
Whether this gap is the "last" in the ring, i.e.
const std::vector< std::vector< int > > & localToGlobalGaps() const
For each subchannel, get the indices of the gaps that touch that subchannel.
unsigned int nEdgePins() const
Get the number of edge pins.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const std::vector< std::pair< int, int > > & gapIndices() const
Get the pin and side indices on each gap.
Real pinRadius() const
Get the pin outer radius.
const std::vector< std::vector< Point > > & pinCenteredCornerCoordinates() const
Get the corner coordinates of a hexagon surrounding each pin.
IntRange< T > make_range(T beg, T end)
unsigned int nGaps() const
Get the number of gaps.
const std::vector< Point > & gapUnitNormals() const
Get the unit normals for all of the gaps.
Real hydraulicDiameter() const
Get the overall bundle hydraulic diameter.
const std::vector< Point > & pinCenters() const
Get the center coordinates of the pins.
Real interiorWettedArea() const
Get the wetted area of an interior channel per wire pitch.
TEST_F(HexagonalLatticeTest, rings_and_pins)
Real pinPitch() const
Get the pin pitch.
unsigned int firstPinInRing(const unsigned int ring) const
Get the index of the "first" pin in a ring.
unsigned int nInteriorGaps() const
Get the number of gaps that touch an interior channel.
Real edgeFlowVolume() const
Get the flow volume of an edge channel per wire pitch.
void ErrorVector unsigned int
unsigned int nPins() const
Get the total number of pins for the lattice.
unsigned int lastPinInRing(const unsigned int ring) const
Get the index of the "last" pin in a ring.
Real bundlePitch() const
Get the bundle pitch.
Real pinDiameter() const
Get the pin diameter.