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, channel_index_shifted)
580 {
581  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
582  unsigned int nr = 3, a = 2;
583  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
584 
585  // check that the z-coordinate doesn't affect the channel index identification
586  Point pt0(0.06, 0.35, 3.5);
587  Point pt1(-0.47, 0.28, 3.5);
588  Point pt2(-0.26, -0.21, 3.5);
589  Point pt3(-0.12, -0.349, 3.5);
590  Point pt4(0.46, -0.27, 3.5);
591  Point pt5(0.37, 0.6, 3.5);
592 
593  EXPECT_EQ(hl.channelIndex(pt0), (unsigned int)0);
594  EXPECT_EQ(hl.channelIndex(pt1), (unsigned int)1);
595  EXPECT_EQ(hl.channelIndex(pt2), (unsigned int)2);
596  EXPECT_EQ(hl.channelIndex(pt3), (unsigned int)3);
597  EXPECT_EQ(hl.channelIndex(pt4), (unsigned int)4);
598  EXPECT_EQ(hl.channelIndex(pt5), (unsigned int)5);
599 
600  Point pt6(0.36, 1.06, -7.0);
601  Point pt7(0.11, 0.98, -7.0);
602  Point pt8(-0.43, 1.27, -7.0);
603  Point pt9(-0.81, 0.93, -7.0);
604  Point pt10(-0.75, 0.47, -7.0);
605  Point pt11(-1.06, 0.28, -7.0);
606  Point pt12(-1.16, -0.13, -7.0);
607  Point pt13(-0.73, -0.41, -7.0);
608  Point pt14(-0.73, -0.81, -7.0);
609  Point pt15(-0.46, -1.18, -7.0);
610  Point pt16(0.05, -0.98, -7.0);
611  Point pt17(0.27, -1.00, -7.0);
612  Point pt18(0.72, -0.98, -7.0);
613  Point pt19(0.75, -0.58, -7.0);
614  Point pt20(1.23, -0.23, -7.0);
615  Point pt21(1.17, 0.09, -7.0);
616  Point pt22(0.78, 0.38, -7.0);
617  Point pt23(0.74, 0.84, -7.0);
618 
619  EXPECT_EQ(hl.channelIndex(pt6), (unsigned int)6);
620  EXPECT_EQ(hl.channelIndex(pt7), (unsigned int)7);
621  EXPECT_EQ(hl.channelIndex(pt8), (unsigned int)8);
622  EXPECT_EQ(hl.channelIndex(pt9), (unsigned int)9);
623  EXPECT_EQ(hl.channelIndex(pt10), (unsigned int)10);
624  EXPECT_EQ(hl.channelIndex(pt11), (unsigned int)11);
625  EXPECT_EQ(hl.channelIndex(pt12), (unsigned int)12);
626  EXPECT_EQ(hl.channelIndex(pt13), (unsigned int)13);
627  EXPECT_EQ(hl.channelIndex(pt14), (unsigned int)14);
628  EXPECT_EQ(hl.channelIndex(pt15), (unsigned int)15);
629  EXPECT_EQ(hl.channelIndex(pt16), (unsigned int)16);
630  EXPECT_EQ(hl.channelIndex(pt17), (unsigned int)17);
631  EXPECT_EQ(hl.channelIndex(pt18), (unsigned int)18);
632  EXPECT_EQ(hl.channelIndex(pt19), (unsigned int)19);
633  EXPECT_EQ(hl.channelIndex(pt20), (unsigned int)20);
634  EXPECT_EQ(hl.channelIndex(pt21), (unsigned int)21);
635  EXPECT_EQ(hl.channelIndex(pt22), (unsigned int)22);
636  EXPECT_EQ(hl.channelIndex(pt23), (unsigned int)23);
637 
638  Point pt24(0.31, 1.44, -0.1);
639  Point pt25(-0.38, 1.61, -0.1);
640  Point pt26(-1.17, 1.52, -0.1);
641  Point pt27(-1.78, 0.38, -0.1);
642  Point pt28(-1.91, -0.42, -0.1);
643  Point pt29(-1.39, -1.24, -0.1);
644  Point pt30(-0.46, -1.74, -0.1);
645  Point pt31(0.18, -1.79, -0.1);
646  Point pt32(1.24, -1.17, -0.1);
647  Point pt33(1.75, -0.57, -0.1);
648  Point pt34(1.51, 0.37, -0.1);
649  Point pt35(1.16, 1.42, -0.1);
650 
651  EXPECT_EQ(hl.channelIndex(pt24), (unsigned int)24);
652  EXPECT_EQ(hl.channelIndex(pt25), (unsigned int)25);
653  // EXPECT_EQ(hl.channelIndex(pt26), (unsigned int)26);
654  EXPECT_EQ(hl.channelIndex(pt27), (unsigned int)27);
655  EXPECT_EQ(hl.channelIndex(pt28), (unsigned int)28);
656  EXPECT_EQ(hl.channelIndex(pt29), (unsigned int)29);
657  EXPECT_EQ(hl.channelIndex(pt30), (unsigned int)30);
658  EXPECT_EQ(hl.channelIndex(pt31), (unsigned int)31);
659  EXPECT_EQ(hl.channelIndex(pt32), (unsigned int)32);
660  EXPECT_EQ(hl.channelIndex(pt33), (unsigned int)33);
661  EXPECT_EQ(hl.channelIndex(pt34), (unsigned int)34);
662  EXPECT_EQ(hl.channelIndex(pt35), (unsigned int)35);
663 
664  Point pt36(1.05, 1.75, 1.2);
665  Point pt37(-1.02, 1.72, 1.2);
666  Point pt38(-2.03, -0.05, 1.2);
667  Point pt39(-1.01, -1.59, 1.2);
668  Point pt40(0.89, -1.79, 1.2);
669  Point pt41(1.98, 0.12, 1.2);
670 
671  EXPECT_EQ(hl.channelIndex(pt36), (unsigned int)36);
672  EXPECT_EQ(hl.channelIndex(pt37), (unsigned int)37);
673  EXPECT_EQ(hl.channelIndex(pt38), (unsigned int)38);
674  EXPECT_EQ(hl.channelIndex(pt39), (unsigned int)39);
675  EXPECT_EQ(hl.channelIndex(pt40), (unsigned int)40);
676  EXPECT_EQ(hl.channelIndex(pt41), (unsigned int)41);
677 }
678 
680 {
681  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
682  unsigned int nr = 3, a = 2;
683  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
684 
685  Point pt0(0.06, 0.35, 0.0);
686  Point pt1(-0.47, 0.28, 0.0);
687  Point pt2(-0.26, -0.21, 0.0);
688  Point pt3(-0.12, -0.349, 0.0);
689  Point pt4(0.46, -0.27, 0.0);
690  Point pt5(0.37, 0.6, 0.0);
691  EXPECT_EQ(hl.channelType(pt0), channel_type::interior);
692  EXPECT_EQ(hl.channelType(pt1), channel_type::interior);
693  EXPECT_EQ(hl.channelType(pt2), channel_type::interior);
694  EXPECT_EQ(hl.channelType(pt3), channel_type::interior);
695  EXPECT_EQ(hl.channelType(pt4), channel_type::interior);
696  EXPECT_EQ(hl.channelType(pt5), channel_type::interior);
697  EXPECT_EQ(hl.channelIndex(pt0), (unsigned int)0);
698  EXPECT_EQ(hl.channelIndex(pt1), (unsigned int)1);
699  EXPECT_EQ(hl.channelIndex(pt2), (unsigned int)2);
700  EXPECT_EQ(hl.channelIndex(pt3), (unsigned int)3);
701  EXPECT_EQ(hl.channelIndex(pt4), (unsigned int)4);
702  EXPECT_EQ(hl.channelIndex(pt5), (unsigned int)5);
703 
704  // check that a point exactly on the edge falls into one channel
705  pt0 = {0.5 * 0.8 * 0.5, 0.5 * 0.8 * std::sqrt(3.0) / 2.0, 0.0};
706  EXPECT_EQ(hl.channelIndex(pt0), (unsigned int)0);
707 
708  Point pt6(0.36, 1.06, 0.0);
709  Point pt7(0.11, 0.98, 0.0);
710  Point pt8(-0.43, 1.27, 0.0);
711  Point pt9(-0.81, 0.93, 0.0);
712  Point pt10(-0.75, 0.47, 0.0);
713  Point pt11(-1.06, 0.28, 0.0);
714  Point pt12(-1.16, -0.13, 0.0);
715  Point pt13(-0.73, -0.41, 0.0);
716  Point pt14(-0.73, -0.81, 0.0);
717  Point pt15(-0.46, -1.18, 0.0);
718  Point pt16(0.05, -0.98, 0.0);
719  Point pt17(0.27, -1.00, 0.0);
720  Point pt18(0.72, -0.98, 0.0);
721  Point pt19(0.75, -0.58, 0.0);
722  Point pt20(1.23, -0.23, 0.0);
723  Point pt21(1.17, 0.09, 0.0);
724  Point pt22(0.78, 0.38, 0.0);
725  Point pt23(0.74, 0.84, 0.0);
726 
727  EXPECT_EQ(hl.channelType(pt6), channel_type::interior);
728  EXPECT_EQ(hl.channelType(pt7), channel_type::interior);
729  EXPECT_EQ(hl.channelType(pt8), channel_type::interior);
730  EXPECT_EQ(hl.channelType(pt9), channel_type::interior);
731  EXPECT_EQ(hl.channelType(pt10), channel_type::interior);
732  EXPECT_EQ(hl.channelType(pt11), channel_type::interior);
733  EXPECT_EQ(hl.channelType(pt12), channel_type::interior);
734  EXPECT_EQ(hl.channelType(pt13), channel_type::interior);
735  EXPECT_EQ(hl.channelType(pt14), channel_type::interior);
736  EXPECT_EQ(hl.channelType(pt15), channel_type::interior);
737  EXPECT_EQ(hl.channelType(pt16), channel_type::interior);
738  EXPECT_EQ(hl.channelType(pt17), channel_type::interior);
739  EXPECT_EQ(hl.channelType(pt18), channel_type::interior);
740  EXPECT_EQ(hl.channelType(pt19), channel_type::interior);
741  EXPECT_EQ(hl.channelType(pt20), channel_type::interior);
742  EXPECT_EQ(hl.channelType(pt21), channel_type::interior);
743  EXPECT_EQ(hl.channelType(pt22), channel_type::interior);
744  EXPECT_EQ(hl.channelType(pt23), channel_type::interior);
745  EXPECT_EQ(hl.channelIndex(pt6), (unsigned int)6);
746  EXPECT_EQ(hl.channelIndex(pt7), (unsigned int)7);
747  EXPECT_EQ(hl.channelIndex(pt8), (unsigned int)8);
748  EXPECT_EQ(hl.channelIndex(pt9), (unsigned int)9);
749  EXPECT_EQ(hl.channelIndex(pt10), (unsigned int)10);
750  EXPECT_EQ(hl.channelIndex(pt11), (unsigned int)11);
751  EXPECT_EQ(hl.channelIndex(pt12), (unsigned int)12);
752  EXPECT_EQ(hl.channelIndex(pt13), (unsigned int)13);
753  EXPECT_EQ(hl.channelIndex(pt14), (unsigned int)14);
754  EXPECT_EQ(hl.channelIndex(pt15), (unsigned int)15);
755  EXPECT_EQ(hl.channelIndex(pt16), (unsigned int)16);
756  EXPECT_EQ(hl.channelIndex(pt17), (unsigned int)17);
757  EXPECT_EQ(hl.channelIndex(pt18), (unsigned int)18);
758  EXPECT_EQ(hl.channelIndex(pt19), (unsigned int)19);
759  EXPECT_EQ(hl.channelIndex(pt20), (unsigned int)20);
760  EXPECT_EQ(hl.channelIndex(pt21), (unsigned int)21);
761  EXPECT_EQ(hl.channelIndex(pt22), (unsigned int)22);
762  EXPECT_EQ(hl.channelIndex(pt23), (unsigned int)23);
763 
764  Point pt24(0.31, 1.44, 0.0);
765  Point pt25(-0.38, 1.61, 0.0);
766  Point pt26(-1.17, 1.52, 0.0);
767  Point pt27(-1.78, 0.38, 0.0);
768  Point pt28(-1.91, -0.42, 0.0);
769  Point pt29(-1.39, -1.24, 0.0);
770  Point pt30(-0.46, -1.74, 0.0);
771  Point pt31(0.18, -1.79, 0.0);
772  Point pt32(1.24, -1.17, 0.0);
773  Point pt33(1.75, -0.57, 0.0);
774  Point pt34(1.51, 0.37, 0.0);
775  Point pt35(1.16, 1.42, 0.0);
776 
777  EXPECT_EQ(hl.channelType(pt24), channel_type::edge);
778  EXPECT_EQ(hl.channelType(pt25), channel_type::edge);
779  EXPECT_EQ(hl.channelType(pt26), channel_type::edge);
780  EXPECT_EQ(hl.channelType(pt27), channel_type::edge);
781  EXPECT_EQ(hl.channelType(pt28), channel_type::edge);
782  EXPECT_EQ(hl.channelType(pt29), channel_type::edge);
783  EXPECT_EQ(hl.channelType(pt30), channel_type::edge);
784  EXPECT_EQ(hl.channelType(pt31), channel_type::edge);
785  EXPECT_EQ(hl.channelType(pt32), channel_type::edge);
786  EXPECT_EQ(hl.channelType(pt33), channel_type::edge);
787  EXPECT_EQ(hl.channelType(pt34), channel_type::edge);
788  EXPECT_EQ(hl.channelType(pt35), channel_type::edge);
789  EXPECT_EQ(hl.channelIndex(pt24), (unsigned int)24);
790  EXPECT_EQ(hl.channelIndex(pt25), (unsigned int)25);
791  // EXPECT_EQ(hl.channelIndex(pt26), (unsigned int)26);
792  EXPECT_EQ(hl.channelIndex(pt27), (unsigned int)27);
793  EXPECT_EQ(hl.channelIndex(pt28), (unsigned int)28);
794  EXPECT_EQ(hl.channelIndex(pt29), (unsigned int)29);
795  EXPECT_EQ(hl.channelIndex(pt30), (unsigned int)30);
796  EXPECT_EQ(hl.channelIndex(pt31), (unsigned int)31);
797  EXPECT_EQ(hl.channelIndex(pt32), (unsigned int)32);
798  EXPECT_EQ(hl.channelIndex(pt33), (unsigned int)33);
799  EXPECT_EQ(hl.channelIndex(pt34), (unsigned int)34);
800  EXPECT_EQ(hl.channelIndex(pt35), (unsigned int)35);
801 
802  Point pt36(1.05, 1.75, 0.0);
803  Point pt37(-1.02, 1.72, 0.0);
804  Point pt38(-2.03, -0.05, 0.0);
805  Point pt39(-1.01, -1.59, 0.0);
806  Point pt40(0.89, -1.79, 0.0);
807  Point pt41(1.98, 0.12, 0.0);
808 
809  EXPECT_EQ(hl.channelType(pt36), channel_type::corner);
810  EXPECT_EQ(hl.channelType(pt37), channel_type::corner);
811  EXPECT_EQ(hl.channelType(pt38), channel_type::corner);
812  EXPECT_EQ(hl.channelType(pt39), channel_type::corner);
813  EXPECT_EQ(hl.channelType(pt40), channel_type::corner);
814  EXPECT_EQ(hl.channelType(pt41), channel_type::corner);
815  EXPECT_EQ(hl.channelIndex(pt36), (unsigned int)36);
816  EXPECT_EQ(hl.channelIndex(pt37), (unsigned int)37);
817  EXPECT_EQ(hl.channelIndex(pt38), (unsigned int)38);
818  EXPECT_EQ(hl.channelIndex(pt39), (unsigned int)39);
819  EXPECT_EQ(hl.channelIndex(pt40), (unsigned int)40);
820  EXPECT_EQ(hl.channelIndex(pt41), (unsigned int)41);
821 }
822 
824 {
825  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
826  unsigned int nr = 1, a = 2;
827  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
828  const auto & gi = hl.gapIndices();
829  const auto & lg = hl.localToGlobalGaps();
830 
831  EXPECT_EQ(hl.nInteriorGaps(), (unsigned int)0);
832 
833  int i = 0;
834  EXPECT_EQ(gi[i].first, 0);
835  EXPECT_EQ(gi[i++].second, -1);
836 
837  EXPECT_EQ(gi[i].first, 0);
838  EXPECT_EQ(gi[i++].second, -2);
839 
840  EXPECT_EQ(gi[i].first, 0);
841  EXPECT_EQ(gi[i++].second, -3);
842 
843  EXPECT_EQ(gi[i].first, 0);
844  EXPECT_EQ(gi[i++].second, -4);
845 
846  EXPECT_EQ(gi[i].first, 0);
847  EXPECT_EQ(gi[i++].second, -5);
848 
849  EXPECT_EQ(gi[i].first, 0);
850  EXPECT_EQ(gi[i++].second, -6);
851 
852  for (unsigned int i = 0; i < hl.nGaps(); ++i)
853  EXPECT_FALSE(hl.lastGapInRing(i));
854 
855  i = 0;
856  EXPECT_EQ(lg[i][0], 5);
857  EXPECT_EQ(lg[i++][1], 0);
858 
859  EXPECT_EQ(lg[i][0], 0);
860  EXPECT_EQ(lg[i++][1], 1);
861 
862  EXPECT_EQ(lg[i][0], 1);
863  EXPECT_EQ(lg[i++][1], 2);
864 
865  EXPECT_EQ(lg[i][0], 2);
866  EXPECT_EQ(lg[i++][1], 3);
867 
868  EXPECT_EQ(lg[i][0], 3);
869  EXPECT_EQ(lg[i++][1], 4);
870 
871  EXPECT_EQ(lg[i][0], 4);
872  EXPECT_EQ(lg[i++][1], 5);
873 }
874 
876 {
877  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
878  unsigned int nr = 2, a = 2;
879  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
880  const auto & gi = hl.gapIndices();
881  const auto & lg = hl.localToGlobalGaps();
882 
883  EXPECT_EQ(hl.nInteriorGaps(), (unsigned int)12);
884 
885  int i = 0;
886  EXPECT_EQ(gi[i].first, 0);
887  EXPECT_EQ(gi[i++].second, 1);
888 
889  EXPECT_EQ(gi[i].first, 0);
890  EXPECT_EQ(gi[i++].second, 2);
891 
892  EXPECT_EQ(gi[i].first, 0);
893  EXPECT_EQ(gi[i++].second, 3);
894 
895  EXPECT_EQ(gi[i].first, 0);
896  EXPECT_EQ(gi[i++].second, 4);
897 
898  EXPECT_EQ(gi[i].first, 0);
899  EXPECT_EQ(gi[i++].second, 5);
900 
901  EXPECT_EQ(gi[i].first, 0);
902  EXPECT_EQ(gi[i++].second, 6);
903 
904  EXPECT_EQ(gi[i].first, 1);
905  EXPECT_EQ(gi[i++].second, 2);
906 
907  EXPECT_EQ(gi[i].first, 1);
908  EXPECT_EQ(gi[i++].second, 6);
909 
910  EXPECT_EQ(gi[i].first, 2);
911  EXPECT_EQ(gi[i++].second, 3);
912 
913  EXPECT_EQ(gi[i].first, 3);
914  EXPECT_EQ(gi[i++].second, 4);
915 
916  EXPECT_EQ(gi[i].first, 4);
917  EXPECT_EQ(gi[i++].second, 5);
918 
919  EXPECT_EQ(gi[i].first, 5);
920  EXPECT_EQ(gi[i++].second, 6);
921 
922  EXPECT_EQ(gi[i].first, 1);
923  EXPECT_EQ(gi[i++].second, -1);
924 
925  EXPECT_EQ(gi[i].first, 2);
926  EXPECT_EQ(gi[i++].second, -1);
927 
928  EXPECT_EQ(gi[i].first, 2);
929  EXPECT_EQ(gi[i++].second, -2);
930 
931  EXPECT_EQ(gi[i].first, 3);
932  EXPECT_EQ(gi[i++].second, -2);
933 
934  EXPECT_EQ(gi[i].first, 3);
935  EXPECT_EQ(gi[i++].second, -3);
936 
937  EXPECT_EQ(gi[i].first, 4);
938  EXPECT_EQ(gi[i++].second, -3);
939 
940  EXPECT_EQ(gi[i].first, 4);
941  EXPECT_EQ(gi[i++].second, -4);
942 
943  EXPECT_EQ(gi[i].first, 5);
944  EXPECT_EQ(gi[i++].second, -4);
945 
946  EXPECT_EQ(gi[i].first, 5);
947  EXPECT_EQ(gi[i++].second, -5);
948 
949  EXPECT_EQ(gi[i].first, 6);
950  EXPECT_EQ(gi[i++].second, -5);
951 
952  EXPECT_EQ(gi[i].first, 6);
953  EXPECT_EQ(gi[i++].second, -6);
954 
955  EXPECT_EQ(gi[i].first, 1);
956  EXPECT_EQ(gi[i++].second, -6);
957 
958  for (unsigned int i = 0; i < hl.nGaps(); ++i)
959  {
960  if (i == 7)
961  EXPECT_TRUE(hl.lastGapInRing(i));
962  else
963  EXPECT_FALSE(hl.lastGapInRing(i));
964  }
965 
966  i = 0;
967  EXPECT_EQ(lg[i][0], 0);
968  EXPECT_EQ(lg[i][1], 6);
969  EXPECT_EQ(lg[i++][2], 1);
970 
971  EXPECT_EQ(lg[i][0], 1);
972  EXPECT_EQ(lg[i][1], 8);
973  EXPECT_EQ(lg[i++][2], 2);
974 
975  EXPECT_EQ(lg[i][0], 2);
976  EXPECT_EQ(lg[i][1], 9);
977  EXPECT_EQ(lg[i++][2], 3);
978 
979  EXPECT_EQ(lg[i][0], 3);
980  EXPECT_EQ(lg[i][1], 10);
981  EXPECT_EQ(lg[i++][2], 4);
982 
983  EXPECT_EQ(lg[i][0], 4);
984  EXPECT_EQ(lg[i][1], 11);
985  EXPECT_EQ(lg[i++][2], 5);
986 
987  EXPECT_EQ(lg[i][0], 5);
988  EXPECT_EQ(lg[i][1], 7);
989  EXPECT_EQ(lg[i++][2], 0);
990 
991  EXPECT_EQ(lg[i][0], 6);
992  EXPECT_EQ(lg[i][1], 13);
993  EXPECT_EQ(lg[i++][2], 12);
994 
995  EXPECT_EQ(lg[i][0], 8);
996  EXPECT_EQ(lg[i][1], 15);
997  EXPECT_EQ(lg[i++][2], 14);
998 
999  EXPECT_EQ(lg[i][0], 9);
1000  EXPECT_EQ(lg[i][1], 17);
1001  EXPECT_EQ(lg[i++][2], 16);
1002 
1003  EXPECT_EQ(lg[i][0], 10);
1004  EXPECT_EQ(lg[i][1], 19);
1005  EXPECT_EQ(lg[i++][2], 18);
1006 
1007  EXPECT_EQ(lg[i][0], 11);
1008  EXPECT_EQ(lg[i][1], 21);
1009  EXPECT_EQ(lg[i++][2], 20);
1010 
1011  EXPECT_EQ(lg[i][0], 7);
1012  EXPECT_EQ(lg[i][1], 23);
1013  EXPECT_EQ(lg[i++][2], 22);
1014 
1015  EXPECT_EQ(lg[i][0], 23);
1016  EXPECT_EQ(lg[i++][1], 12);
1017 
1018  EXPECT_EQ(lg[i][0], 13);
1019  EXPECT_EQ(lg[i++][1], 14);
1020 
1021  EXPECT_EQ(lg[i][0], 15);
1022  EXPECT_EQ(lg[i++][1], 16);
1023 
1024  EXPECT_EQ(lg[i][0], 17);
1025  EXPECT_EQ(lg[i++][1], 18);
1026 
1027  EXPECT_EQ(lg[i][0], 19);
1028  EXPECT_EQ(lg[i++][1], 20);
1029 
1030  EXPECT_EQ(lg[i][0], 21);
1031  EXPECT_EQ(lg[i++][1], 22);
1032 }
1033 
1035 {
1036  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1037  unsigned int nr = 3, a = 2;
1038  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1039  const auto & gi = hl.gapIndices();
1040  const auto & lg = hl.localToGlobalGaps();
1041 
1042  EXPECT_EQ(hl.nInteriorGaps(), (unsigned int)42);
1043 
1044  int i = 0;
1045  EXPECT_EQ(gi[i].first, 0);
1046  EXPECT_EQ(gi[i++].second, 1);
1047 
1048  EXPECT_EQ(gi[i].first, 0);
1049  EXPECT_EQ(gi[i++].second, 2);
1050 
1051  EXPECT_EQ(gi[i].first, 0);
1052  EXPECT_EQ(gi[i++].second, 3);
1053 
1054  EXPECT_EQ(gi[i].first, 0);
1055  EXPECT_EQ(gi[i++].second, 4);
1056 
1057  EXPECT_EQ(gi[i].first, 0);
1058  EXPECT_EQ(gi[i++].second, 5);
1059 
1060  EXPECT_EQ(gi[i].first, 0);
1061  EXPECT_EQ(gi[i++].second, 6);
1062 
1063  EXPECT_EQ(gi[i].first, 1);
1064  EXPECT_EQ(gi[i++].second, 2);
1065 
1066  EXPECT_EQ(gi[i].first, 1);
1067  EXPECT_EQ(gi[i++].second, 6);
1068 
1069  EXPECT_EQ(gi[i].first, 1);
1070  EXPECT_EQ(gi[i++].second, 7);
1071 
1072  EXPECT_EQ(gi[i].first, 1);
1073  EXPECT_EQ(gi[i++].second, 8);
1074 
1075  EXPECT_EQ(gi[i].first, 1);
1076  EXPECT_EQ(gi[i++].second, 18);
1077 
1078  EXPECT_EQ(gi[i].first, 2);
1079  EXPECT_EQ(gi[i++].second, 3);
1080 
1081  EXPECT_EQ(gi[i].first, 2);
1082  EXPECT_EQ(gi[i++].second, 8);
1083 
1084  EXPECT_EQ(gi[i].first, 2);
1085  EXPECT_EQ(gi[i++].second, 9);
1086 
1087  EXPECT_EQ(gi[i].first, 2);
1088  EXPECT_EQ(gi[i++].second, 10);
1089 
1090  EXPECT_EQ(gi[i].first, 3);
1091  EXPECT_EQ(gi[i++].second, 4);
1092 
1093  EXPECT_EQ(gi[i].first, 3);
1094  EXPECT_EQ(gi[i++].second, 10);
1095 
1096  EXPECT_EQ(gi[i].first, 3);
1097  EXPECT_EQ(gi[i++].second, 11);
1098 
1099  EXPECT_EQ(gi[i].first, 3);
1100  EXPECT_EQ(gi[i++].second, 12);
1101 
1102  EXPECT_EQ(gi[i].first, 4);
1103  EXPECT_EQ(gi[i++].second, 5);
1104 
1105  EXPECT_EQ(gi[i].first, 4);
1106  EXPECT_EQ(gi[i++].second, 12);
1107 
1108  EXPECT_EQ(gi[i].first, 4);
1109  EXPECT_EQ(gi[i++].second, 13);
1110 
1111  EXPECT_EQ(gi[i].first, 4);
1112  EXPECT_EQ(gi[i++].second, 14);
1113 
1114  EXPECT_EQ(gi[i].first, 5);
1115  EXPECT_EQ(gi[i++].second, 6);
1116 
1117  EXPECT_EQ(gi[i].first, 5);
1118  EXPECT_EQ(gi[i++].second, 14);
1119 
1120  EXPECT_EQ(gi[i].first, 5);
1121  EXPECT_EQ(gi[i++].second, 15);
1122 
1123  EXPECT_EQ(gi[i].first, 5);
1124  EXPECT_EQ(gi[i++].second, 16);
1125 
1126  EXPECT_EQ(gi[i].first, 6);
1127  EXPECT_EQ(gi[i++].second, 16);
1128 
1129  EXPECT_EQ(gi[i].first, 6);
1130  EXPECT_EQ(gi[i++].second, 17);
1131 
1132  EXPECT_EQ(gi[i].first, 6);
1133  EXPECT_EQ(gi[i++].second, 18);
1134 
1135  EXPECT_EQ(gi[i].first, 7);
1136  EXPECT_EQ(gi[i++].second, 8);
1137 
1138  EXPECT_EQ(gi[i].first, 7);
1139  EXPECT_EQ(gi[i++].second, 18);
1140 
1141  EXPECT_EQ(gi[i].first, 8);
1142  EXPECT_EQ(gi[i++].second, 9);
1143 
1144  EXPECT_EQ(gi[i].first, 9);
1145  EXPECT_EQ(gi[i++].second, 10);
1146 
1147  EXPECT_EQ(gi[i].first, 10);
1148  EXPECT_EQ(gi[i++].second, 11);
1149 
1150  EXPECT_EQ(gi[i].first, 11);
1151  EXPECT_EQ(gi[i++].second, 12);
1152 
1153  EXPECT_EQ(gi[i].first, 12);
1154  EXPECT_EQ(gi[i++].second, 13);
1155 
1156  EXPECT_EQ(gi[i].first, 13);
1157  EXPECT_EQ(gi[i++].second, 14);
1158 
1159  EXPECT_EQ(gi[i].first, 14);
1160  EXPECT_EQ(gi[i++].second, 15);
1161 
1162  EXPECT_EQ(gi[i].first, 15);
1163  EXPECT_EQ(gi[i++].second, 16);
1164 
1165  EXPECT_EQ(gi[i].first, 16);
1166  EXPECT_EQ(gi[i++].second, 17);
1167 
1168  EXPECT_EQ(gi[i].first, 17);
1169  EXPECT_EQ(gi[i++].second, 18);
1170 
1171  EXPECT_EQ(gi[i].first, 7);
1172  EXPECT_EQ(gi[i++].second, -1);
1173 
1174  EXPECT_EQ(gi[i].first, 8);
1175  EXPECT_EQ(gi[i++].second, -1);
1176 
1177  EXPECT_EQ(gi[i].first, 9);
1178  EXPECT_EQ(gi[i++].second, -1);
1179 
1180  EXPECT_EQ(gi[i].first, 9);
1181  EXPECT_EQ(gi[i++].second, -2);
1182 
1183  EXPECT_EQ(gi[i].first, 10);
1184  EXPECT_EQ(gi[i++].second, -2);
1185 
1186  EXPECT_EQ(gi[i].first, 11);
1187  EXPECT_EQ(gi[i++].second, -2);
1188 
1189  EXPECT_EQ(gi[i].first, 11);
1190  EXPECT_EQ(gi[i++].second, -3);
1191 
1192  EXPECT_EQ(gi[i].first, 12);
1193  EXPECT_EQ(gi[i++].second, -3);
1194 
1195  EXPECT_EQ(gi[i].first, 13);
1196  EXPECT_EQ(gi[i++].second, -3);
1197 
1198  EXPECT_EQ(gi[i].first, 13);
1199  EXPECT_EQ(gi[i++].second, -4);
1200 
1201  EXPECT_EQ(gi[i].first, 14);
1202  EXPECT_EQ(gi[i++].second, -4);
1203 
1204  EXPECT_EQ(gi[i].first, 15);
1205  EXPECT_EQ(gi[i++].second, -4);
1206 
1207  EXPECT_EQ(gi[i].first, 15);
1208  EXPECT_EQ(gi[i++].second, -5);
1209 
1210  EXPECT_EQ(gi[i].first, 16);
1211  EXPECT_EQ(gi[i++].second, -5);
1212 
1213  EXPECT_EQ(gi[i].first, 17);
1214  EXPECT_EQ(gi[i++].second, -5);
1215 
1216  EXPECT_EQ(gi[i].first, 17);
1217  EXPECT_EQ(gi[i++].second, -6);
1218 
1219  EXPECT_EQ(gi[i].first, 18);
1220  EXPECT_EQ(gi[i++].second, -6);
1221 
1222  EXPECT_EQ(gi[i].first, 7);
1223  EXPECT_EQ(gi[i++].second, -6);
1224 
1225  for (unsigned int i = 0; i < hl.nGaps(); ++i)
1226  {
1227  if (i == 7 || i == 31)
1228  EXPECT_TRUE(hl.lastGapInRing(i));
1229  else
1230  EXPECT_FALSE(hl.lastGapInRing(i));
1231  }
1232 
1233  i = 0;
1234  EXPECT_EQ(lg[i][0], 0);
1235  EXPECT_EQ(lg[i][1], 6);
1236  EXPECT_EQ(lg[i++][2], 1);
1237 
1238  EXPECT_EQ(lg[i][0], 1);
1239  EXPECT_EQ(lg[i][1], 11);
1240  EXPECT_EQ(lg[i++][2], 2);
1241 
1242  EXPECT_EQ(lg[i][0], 2);
1243  EXPECT_EQ(lg[i][1], 15);
1244  EXPECT_EQ(lg[i++][2], 3);
1245 
1246  EXPECT_EQ(lg[i][0], 3);
1247  EXPECT_EQ(lg[i][1], 19);
1248  EXPECT_EQ(lg[i++][2], 4);
1249 
1250  EXPECT_EQ(lg[i][0], 4);
1251  EXPECT_EQ(lg[i][1], 23);
1252  EXPECT_EQ(lg[i++][2], 5);
1253 
1254  EXPECT_EQ(lg[i][0], 5);
1255  EXPECT_EQ(lg[i][1], 7);
1256  EXPECT_EQ(lg[i++][2], 0);
1257 
1258  EXPECT_EQ(lg[i][0], 8);
1259  EXPECT_EQ(lg[i][1], 30);
1260  EXPECT_EQ(lg[i++][2], 9);
1261 
1262  EXPECT_EQ(lg[i][0], 12);
1263  EXPECT_EQ(lg[i][1], 6);
1264  EXPECT_EQ(lg[i++][2], 9);
1265 
1266  EXPECT_EQ(lg[i][0], 12);
1267  EXPECT_EQ(lg[i][1], 32);
1268  EXPECT_EQ(lg[i++][2], 13);
1269 
1270  EXPECT_EQ(lg[i][0], 13);
1271  EXPECT_EQ(lg[i][1], 33);
1272  EXPECT_EQ(lg[i++][2], 14);
1273 
1274  EXPECT_EQ(lg[i][0], 16);
1275  EXPECT_EQ(lg[i][1], 11);
1276  EXPECT_EQ(lg[i++][2], 14);
1277 
1278  EXPECT_EQ(lg[i][0], 16);
1279  EXPECT_EQ(lg[i][1], 34);
1280  EXPECT_EQ(lg[i++][2], 17);
1281 
1282  EXPECT_EQ(lg[i][0], 17);
1283  EXPECT_EQ(lg[i][1], 35);
1284  EXPECT_EQ(lg[i++][2], 18);
1285 
1286  EXPECT_EQ(lg[i][0], 20);
1287  EXPECT_EQ(lg[i][1], 15);
1288  EXPECT_EQ(lg[i++][2], 18);
1289 
1290  EXPECT_EQ(lg[i][0], 20);
1291  EXPECT_EQ(lg[i][1], 36);
1292  EXPECT_EQ(lg[i++][2], 21);
1293 
1294  EXPECT_EQ(lg[i][0], 21);
1295  EXPECT_EQ(lg[i][1], 37);
1296  EXPECT_EQ(lg[i++][2], 22);
1297 
1298  EXPECT_EQ(lg[i][0], 24);
1299  EXPECT_EQ(lg[i][1], 19);
1300  EXPECT_EQ(lg[i++][2], 22);
1301 
1302  EXPECT_EQ(lg[i][0], 24);
1303  EXPECT_EQ(lg[i][1], 38);
1304  EXPECT_EQ(lg[i++][2], 25);
1305 
1306  EXPECT_EQ(lg[i][0], 25);
1307  EXPECT_EQ(lg[i][1], 39);
1308  EXPECT_EQ(lg[i++][2], 26);
1309 
1310  EXPECT_EQ(lg[i][0], 27);
1311  EXPECT_EQ(lg[i][1], 23);
1312  EXPECT_EQ(lg[i++][2], 26);
1313 
1314  EXPECT_EQ(lg[i][0], 27);
1315  EXPECT_EQ(lg[i][1], 40);
1316  EXPECT_EQ(lg[i++][2], 28);
1317 
1318  EXPECT_EQ(lg[i][0], 28);
1319  EXPECT_EQ(lg[i][1], 41);
1320  EXPECT_EQ(lg[i++][2], 29);
1321 
1322  EXPECT_EQ(lg[i][0], 10);
1323  EXPECT_EQ(lg[i][1], 7);
1324  EXPECT_EQ(lg[i++][2], 29);
1325 
1326  EXPECT_EQ(lg[i][0], 10);
1327  EXPECT_EQ(lg[i][1], 31);
1328  EXPECT_EQ(lg[i++][2], 8);
1329 
1330  // edge channels
1331  EXPECT_EQ(lg[i][0], 30);
1332  EXPECT_EQ(lg[i][1], 43);
1333  EXPECT_EQ(lg[i++][2], 42);
1334 
1335  EXPECT_EQ(lg[i][0], 32);
1336  EXPECT_EQ(lg[i][1], 44);
1337  EXPECT_EQ(lg[i++][2], 43);
1338 
1339  EXPECT_EQ(lg[i][0], 33);
1340  EXPECT_EQ(lg[i][1], 46);
1341  EXPECT_EQ(lg[i++][2], 45);
1342 
1343  EXPECT_EQ(lg[i][0], 34);
1344  EXPECT_EQ(lg[i][1], 47);
1345  EXPECT_EQ(lg[i++][2], 46);
1346 
1347  EXPECT_EQ(lg[i][0], 35);
1348  EXPECT_EQ(lg[i][1], 49);
1349  EXPECT_EQ(lg[i++][2], 48);
1350 
1351  EXPECT_EQ(lg[i][0], 36);
1352  EXPECT_EQ(lg[i][1], 50);
1353  EXPECT_EQ(lg[i++][2], 49);
1354 
1355  EXPECT_EQ(lg[i][0], 37);
1356  EXPECT_EQ(lg[i][1], 52);
1357  EXPECT_EQ(lg[i++][2], 51);
1358 
1359  EXPECT_EQ(lg[i][0], 38);
1360  EXPECT_EQ(lg[i][1], 53);
1361  EXPECT_EQ(lg[i++][2], 52);
1362 
1363  EXPECT_EQ(lg[i][0], 39);
1364  EXPECT_EQ(lg[i][1], 55);
1365  EXPECT_EQ(lg[i++][2], 54);
1366 
1367  EXPECT_EQ(lg[i][0], 40);
1368  EXPECT_EQ(lg[i][1], 56);
1369  EXPECT_EQ(lg[i++][2], 55);
1370 
1371  EXPECT_EQ(lg[i][0], 41);
1372  EXPECT_EQ(lg[i][1], 58);
1373  EXPECT_EQ(lg[i++][2], 57);
1374 
1375  EXPECT_EQ(lg[i][0], 31);
1376  EXPECT_EQ(lg[i][1], 59);
1377  EXPECT_EQ(lg[i++][2], 58);
1378 
1379  // corner channels
1380  EXPECT_EQ(lg[i][0], 59);
1381  EXPECT_EQ(lg[i++][1], 42);
1382 
1383  EXPECT_EQ(lg[i][0], 44);
1384  EXPECT_EQ(lg[i++][1], 45);
1385 
1386  EXPECT_EQ(lg[i][0], 47);
1387  EXPECT_EQ(lg[i++][1], 48);
1388 
1389  EXPECT_EQ(lg[i][0], 50);
1390  EXPECT_EQ(lg[i++][1], 51);
1391 
1392  EXPECT_EQ(lg[i][0], 53);
1393  EXPECT_EQ(lg[i++][1], 54);
1394 
1395  EXPECT_EQ(lg[i][0], 56);
1396  EXPECT_EQ(lg[i++][1], 57);
1397 }
1398 
1400 {
1401  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1402  unsigned int nr = 3, a = 2;
1403  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1404 
1405  Point pt1(0.23, 0.27, 0.0);
1406  EXPECT_EQ(hl.gapIndex(pt1), (unsigned int)0);
1407 
1408  Point pt2(-0.5, 0.29, 0.0);
1409  EXPECT_EQ(hl.gapIndex(pt2), (unsigned int)11);
1410 
1411  Point pt3(1.14, 0.275, 0.0);
1412  EXPECT_EQ(hl.gapIndex(pt3), (unsigned int)29);
1413 
1414  Point pt4(-0.77, 1.015, 0.0);
1415  EXPECT_EQ(hl.gapIndex(pt4), (unsigned int)13);
1416 
1417  Point pt5(-0.84, 0.445, 0.0);
1418  EXPECT_EQ(hl.gapIndex(pt5), (unsigned int)16);
1419 
1420  Point pt6(-0.47, 1.55, 0.0);
1421  EXPECT_EQ(hl.gapIndex(pt6), (unsigned int)32);
1422 
1423  Point pt7(-0.069, 1.94, 0.0);
1424  EXPECT_EQ(hl.gapIndex(pt7), (unsigned int)43);
1425 
1426  Point pt8(-1.22, 1.79, 0.0);
1427  EXPECT_EQ(hl.gapIndex(pt8), (unsigned int)45);
1428 
1429  Point pt10(-0.26, -1.61, 0.0);
1430  EXPECT_EQ(hl.gapIndex(pt10), (unsigned int)37);
1431 
1432  Point pt11(2.23, 0.03, 0.0);
1433  EXPECT_EQ(hl.gapIndex(pt11), (unsigned int)57);
1434 
1435  Point pt12(-1.77, -0.70, 0.0);
1436  EXPECT_EQ(hl.gapIndex(pt12), (unsigned int)49);
1437 }
1438 
1440 {
1441  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1442  unsigned int nr = 1, a = 2;
1443  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1444  const auto & normals = hl.gapUnitNormals();
1445  Real sin60 = std::sqrt(3.0) / 2.0;
1446 
1447  for (const auto & n : normals)
1448  EXPECT_DOUBLE_EQ(n(2), 0.0);
1449 
1450  EXPECT_DOUBLE_EQ(normals[0](0), -1.0);
1451  EXPECT_DOUBLE_EQ(normals[0](1), 0.0);
1452 
1453  EXPECT_DOUBLE_EQ(normals[1](0), -0.5);
1454  EXPECT_DOUBLE_EQ(normals[1](1), -sin60);
1455 
1456  EXPECT_DOUBLE_EQ(normals[2](0), 0.5);
1457  EXPECT_DOUBLE_EQ(normals[2](1), -sin60);
1458 
1459  EXPECT_DOUBLE_EQ(normals[3](0), 1.0);
1460  EXPECT_DOUBLE_EQ(normals[3](1), 0.0);
1461 
1462  EXPECT_DOUBLE_EQ(normals[4](0), 0.5);
1463  EXPECT_DOUBLE_EQ(normals[4](1), sin60);
1464 
1465  EXPECT_DOUBLE_EQ(normals[5](0), -0.5);
1466  EXPECT_DOUBLE_EQ(normals[5](1), sin60);
1467 }
1468 
1470 {
1471  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1472  unsigned int nr = 2, a = 2;
1473  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1474  const auto & normals = hl.gapUnitNormals();
1475  Real sin60 = std::sqrt(3.0) / 2.0;
1476 
1477  for (const auto & n : normals)
1478  EXPECT_DOUBLE_EQ(n(2), 0.0);
1479 
1480  EXPECT_DOUBLE_EQ(normals[0](0), -sin60);
1481  EXPECT_DOUBLE_EQ(normals[0](1), 0.5);
1482 
1483  EXPECT_DOUBLE_EQ(normals[1](0), -sin60);
1484  EXPECT_DOUBLE_EQ(normals[1](1), -0.5);
1485 
1486  EXPECT_DOUBLE_EQ(normals[2](0), 0.0);
1487  EXPECT_DOUBLE_EQ(normals[2](1), -1.0);
1488 
1489  EXPECT_DOUBLE_EQ(normals[3](0), sin60);
1490  EXPECT_DOUBLE_EQ(normals[3](1), -0.5);
1491 
1492  EXPECT_DOUBLE_EQ(normals[4](0), sin60);
1493  EXPECT_DOUBLE_EQ(normals[4](1), 0.5);
1494 
1495  EXPECT_DOUBLE_EQ(normals[5](0), 0.0);
1496  EXPECT_DOUBLE_EQ(normals[5](1), 1.0);
1497 
1498  EXPECT_DOUBLE_EQ(normals[6](0), 0.0);
1499  EXPECT_DOUBLE_EQ(normals[6](1), -1.0);
1500 
1501  EXPECT_DOUBLE_EQ(normals[7](0), -sin60);
1502  EXPECT_DOUBLE_EQ(normals[7](1), -0.5);
1503 
1504  EXPECT_DOUBLE_EQ(normals[8](0), sin60);
1505  EXPECT_DOUBLE_EQ(normals[8](1), -0.5);
1506 
1507  EXPECT_DOUBLE_EQ(normals[9](0), sin60);
1508  EXPECT_DOUBLE_EQ(normals[9](1), 0.5);
1509 
1510  EXPECT_DOUBLE_EQ(normals[10](0), 0.0);
1511  EXPECT_DOUBLE_EQ(normals[10](1), 1.0);
1512 
1513  EXPECT_DOUBLE_EQ(normals[11](0), -sin60);
1514  EXPECT_DOUBLE_EQ(normals[11](1), 0.5);
1515 
1516  EXPECT_DOUBLE_EQ(normals[12](0), -1.0);
1517  EXPECT_DOUBLE_EQ(normals[12](1), 0.0);
1518 
1519  EXPECT_DOUBLE_EQ(normals[13](0), -1.0);
1520  EXPECT_DOUBLE_EQ(normals[13](1), 0.0);
1521 
1522  EXPECT_DOUBLE_EQ(normals[14](0), -0.5);
1523  EXPECT_DOUBLE_EQ(normals[14](1), -sin60);
1524 
1525  EXPECT_DOUBLE_EQ(normals[15](0), -0.5);
1526  EXPECT_DOUBLE_EQ(normals[15](1), -sin60);
1527 
1528  EXPECT_DOUBLE_EQ(normals[16](0), 0.5);
1529  EXPECT_DOUBLE_EQ(normals[16](1), -sin60);
1530 
1531  EXPECT_DOUBLE_EQ(normals[17](0), 0.5);
1532  EXPECT_DOUBLE_EQ(normals[17](1), -sin60);
1533 
1534  EXPECT_DOUBLE_EQ(normals[18](0), 1.0);
1535  EXPECT_DOUBLE_EQ(normals[18](1), 0.0);
1536 
1537  EXPECT_DOUBLE_EQ(normals[19](0), 1.0);
1538  EXPECT_DOUBLE_EQ(normals[19](1), 0.0);
1539 
1540  EXPECT_DOUBLE_EQ(normals[20](0), 0.5);
1541  EXPECT_DOUBLE_EQ(normals[20](1), sin60);
1542 
1543  EXPECT_DOUBLE_EQ(normals[21](0), 0.5);
1544  EXPECT_DOUBLE_EQ(normals[21](1), sin60);
1545 
1546  EXPECT_DOUBLE_EQ(normals[22](0), -0.5);
1547  EXPECT_DOUBLE_EQ(normals[22](1), sin60);
1548 
1549  EXPECT_DOUBLE_EQ(normals[23](0), -0.5);
1550  EXPECT_DOUBLE_EQ(normals[23](1), sin60);
1551 }
1552 
1554 {
1555  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1556  unsigned int nr = 3, a = 2;
1557  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1558  const auto & normals = hl.gapUnitNormals();
1559  Real sin60 = std::sqrt(3.0) / 2.0;
1560 
1561  for (const auto & n : normals)
1562  EXPECT_DOUBLE_EQ(n(2), 0.0);
1563 
1564  EXPECT_DOUBLE_EQ(normals[0](0), -sin60);
1565  EXPECT_DOUBLE_EQ(normals[0](1), 0.5);
1566 
1567  EXPECT_DOUBLE_EQ(normals[1](0), -sin60);
1568  EXPECT_DOUBLE_EQ(normals[1](1), -0.5);
1569 
1570  EXPECT_DOUBLE_EQ(normals[2](0), 0.0);
1571  EXPECT_DOUBLE_EQ(normals[2](1), -1.0);
1572 
1573  EXPECT_DOUBLE_EQ(normals[3](0), sin60);
1574  EXPECT_DOUBLE_EQ(normals[3](1), -0.5);
1575 
1576  EXPECT_DOUBLE_EQ(normals[4](0), sin60);
1577  EXPECT_DOUBLE_EQ(normals[4](1), 0.5);
1578 
1579  EXPECT_DOUBLE_EQ(normals[5](0), 0.0);
1580  EXPECT_DOUBLE_EQ(normals[5](1), 1.0);
1581 
1582  EXPECT_DOUBLE_EQ(normals[6](0), 0.0);
1583  EXPECT_DOUBLE_EQ(normals[6](1), -1.0);
1584 
1585  EXPECT_DOUBLE_EQ(normals[7](0), -sin60);
1586  EXPECT_DOUBLE_EQ(normals[7](1), -0.5);
1587 
1588  EXPECT_DOUBLE_EQ(normals[8](0), -sin60);
1589  EXPECT_DOUBLE_EQ(normals[8](1), 0.5);
1590 
1591  EXPECT_DOUBLE_EQ(normals[9](0), -sin60);
1592  EXPECT_DOUBLE_EQ(normals[9](1), -0.5);
1593 
1594  EXPECT_DOUBLE_EQ(normals[10](0), 0.0);
1595  EXPECT_DOUBLE_EQ(normals[10](1), 1.0);
1596 
1597  EXPECT_DOUBLE_EQ(normals[11](0), sin60);
1598  EXPECT_DOUBLE_EQ(normals[11](1), -0.5);
1599 
1600  EXPECT_DOUBLE_EQ(normals[12](0), -sin60);
1601  EXPECT_DOUBLE_EQ(normals[12](1), 0.5);
1602 
1603  EXPECT_DOUBLE_EQ(normals[13](0), -sin60);
1604  EXPECT_DOUBLE_EQ(normals[13](1), -0.5);
1605 
1606  EXPECT_DOUBLE_EQ(normals[14](0), 0.0);
1607  EXPECT_DOUBLE_EQ(normals[14](1), -1.0);
1608 
1609  EXPECT_DOUBLE_EQ(normals[15](0), sin60);
1610  EXPECT_DOUBLE_EQ(normals[15](1), 0.5);
1611 
1612  EXPECT_DOUBLE_EQ(normals[16](0), -sin60);
1613  EXPECT_DOUBLE_EQ(normals[16](1), -0.5);
1614 
1615  EXPECT_DOUBLE_EQ(normals[17](0), 0.0);
1616  EXPECT_DOUBLE_EQ(normals[17](1), -1.0);
1617 
1618  EXPECT_DOUBLE_EQ(normals[18](0), sin60);
1619  EXPECT_DOUBLE_EQ(normals[18](1), -0.5);
1620 
1621  EXPECT_DOUBLE_EQ(normals[19](0), 0.0);
1622  EXPECT_DOUBLE_EQ(normals[19](1), 1.0);
1623 
1624  EXPECT_DOUBLE_EQ(normals[20](0), 0.0);
1625  EXPECT_DOUBLE_EQ(normals[20](1), -1.0);
1626 
1627  EXPECT_DOUBLE_EQ(normals[21](0), sin60);
1628  EXPECT_DOUBLE_EQ(normals[21](1), -0.5);
1629 
1630  EXPECT_DOUBLE_EQ(normals[22](0), sin60);
1631  EXPECT_DOUBLE_EQ(normals[22](1), 0.5);
1632 
1633  EXPECT_DOUBLE_EQ(normals[23](0), -sin60);
1634  EXPECT_DOUBLE_EQ(normals[23](1), 0.5);
1635 
1636  EXPECT_DOUBLE_EQ(normals[24](0), sin60);
1637  EXPECT_DOUBLE_EQ(normals[24](1), -0.5);
1638 
1639  EXPECT_DOUBLE_EQ(normals[25](0), sin60);
1640  EXPECT_DOUBLE_EQ(normals[25](1), 0.5);
1641 
1642  EXPECT_DOUBLE_EQ(normals[26](0), 0.0);
1643  EXPECT_DOUBLE_EQ(normals[26](1), 1.0);
1644 
1645  EXPECT_DOUBLE_EQ(normals[27](0), sin60);
1646  EXPECT_DOUBLE_EQ(normals[27](1), 0.5);
1647 
1648  EXPECT_DOUBLE_EQ(normals[28](0), 0.0);
1649  EXPECT_DOUBLE_EQ(normals[28](1), 1.0);
1650 
1651  EXPECT_DOUBLE_EQ(normals[29](0), -sin60);
1652  EXPECT_DOUBLE_EQ(normals[29](1), 0.5);
1653 
1654  EXPECT_DOUBLE_EQ(normals[30](0), 0.0);
1655  EXPECT_DOUBLE_EQ(normals[30](1), -1.0);
1656 
1657  EXPECT_DOUBLE_EQ(normals[31](0), -sin60);
1658  EXPECT_DOUBLE_EQ(normals[31](1), -0.5);
1659 
1660  EXPECT_DOUBLE_EQ(normals[32](0), 0.0);
1661  EXPECT_DOUBLE_EQ(normals[32](1), -1.0);
1662 
1663  EXPECT_DOUBLE_EQ(normals[33](0), sin60);
1664  EXPECT_DOUBLE_EQ(normals[33](1), -0.5);
1665 
1666  EXPECT_DOUBLE_EQ(normals[34](0), sin60);
1667  EXPECT_DOUBLE_EQ(normals[34](1), -0.5);
1668 
1669  EXPECT_DOUBLE_EQ(normals[35](0), sin60);
1670  EXPECT_DOUBLE_EQ(normals[35](1), 0.5);
1671 
1672  EXPECT_DOUBLE_EQ(normals[36](0), sin60);
1673  EXPECT_DOUBLE_EQ(normals[36](1), 0.5);
1674 
1675  EXPECT_DOUBLE_EQ(normals[37](0), 0.0);
1676  EXPECT_DOUBLE_EQ(normals[37](1), 1.0);
1677 
1678  EXPECT_DOUBLE_EQ(normals[38](0), 0.0);
1679  EXPECT_DOUBLE_EQ(normals[38](1), 1.0);
1680 
1681  EXPECT_DOUBLE_EQ(normals[39](0), -sin60);
1682  EXPECT_DOUBLE_EQ(normals[39](1), 0.5);
1683 
1684  EXPECT_DOUBLE_EQ(normals[40](0), -sin60);
1685  EXPECT_DOUBLE_EQ(normals[40](1), 0.5);
1686 
1687  EXPECT_DOUBLE_EQ(normals[41](0), -sin60);
1688  EXPECT_DOUBLE_EQ(normals[41](1), -0.5);
1689 
1690  EXPECT_DOUBLE_EQ(normals[42](0), -1.0);
1691  EXPECT_DOUBLE_EQ(normals[42](1), 0.0);
1692 
1693  EXPECT_DOUBLE_EQ(normals[43](0), -1.0);
1694  EXPECT_DOUBLE_EQ(normals[43](1), 0.0);
1695 
1696  EXPECT_DOUBLE_EQ(normals[44](0), -1.0);
1697  EXPECT_DOUBLE_EQ(normals[44](1), 0.0);
1698 
1699  EXPECT_DOUBLE_EQ(normals[45](0), -0.5);
1700  EXPECT_DOUBLE_EQ(normals[45](1), -sin60);
1701 
1702  EXPECT_DOUBLE_EQ(normals[46](0), -0.5);
1703  EXPECT_DOUBLE_EQ(normals[46](1), -sin60);
1704 
1705  EXPECT_DOUBLE_EQ(normals[47](0), -0.5);
1706  EXPECT_DOUBLE_EQ(normals[47](1), -sin60);
1707 
1708  EXPECT_DOUBLE_EQ(normals[48](0), 0.5);
1709  EXPECT_DOUBLE_EQ(normals[48](1), -sin60);
1710 
1711  EXPECT_DOUBLE_EQ(normals[49](0), 0.5);
1712  EXPECT_DOUBLE_EQ(normals[49](1), -sin60);
1713 
1714  EXPECT_DOUBLE_EQ(normals[50](0), 0.5);
1715  EXPECT_DOUBLE_EQ(normals[50](1), -sin60);
1716 
1717  EXPECT_DOUBLE_EQ(normals[51](0), 1.0);
1718  EXPECT_DOUBLE_EQ(normals[51](1), 0.0);
1719 
1720  EXPECT_DOUBLE_EQ(normals[52](0), 1.0);
1721  EXPECT_DOUBLE_EQ(normals[52](1), 0.0);
1722 
1723  EXPECT_DOUBLE_EQ(normals[53](0), 1.0);
1724  EXPECT_DOUBLE_EQ(normals[53](1), 0.0);
1725 
1726  EXPECT_DOUBLE_EQ(normals[54](0), 0.5);
1727  EXPECT_DOUBLE_EQ(normals[54](1), sin60);
1728 
1729  EXPECT_DOUBLE_EQ(normals[55](0), 0.5);
1730  EXPECT_DOUBLE_EQ(normals[55](1), sin60);
1731 
1732  EXPECT_DOUBLE_EQ(normals[56](0), 0.5);
1733  EXPECT_DOUBLE_EQ(normals[56](1), sin60);
1734 
1735  EXPECT_DOUBLE_EQ(normals[57](0), -0.5);
1736  EXPECT_DOUBLE_EQ(normals[57](1), sin60);
1737 
1738  EXPECT_DOUBLE_EQ(normals[58](0), -0.5);
1739  EXPECT_DOUBLE_EQ(normals[58](1), sin60);
1740 
1741  EXPECT_DOUBLE_EQ(normals[59](0), -0.5);
1742  EXPECT_DOUBLE_EQ(normals[59](1), sin60);
1743 }
1744 
1746 {
1747  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1748  unsigned int nr = 2, a = 2;
1749  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1750  const auto & pin_corners = hl.pinCenteredCornerCoordinates();
1751  Real sin60 = std::sqrt(3.0) / 2.0;
1752  Real cos60 = 0.5;
1753 
1754  // center pin
1755  double side = 0.46188021535170065;
1756  const auto & pin0 = pin_corners[0];
1757  EXPECT_DOUBLE_EQ(pin0[0](0), 0.0);
1758  EXPECT_DOUBLE_EQ(pin0[0](1), side);
1759 
1760  EXPECT_DOUBLE_EQ(pin0[1](0), -side * sin60);
1761  EXPECT_DOUBLE_EQ(pin0[1](1), side * cos60);
1762 
1763  EXPECT_DOUBLE_EQ(pin0[2](0), -side * sin60);
1764  EXPECT_DOUBLE_EQ(pin0[2](1), -side * cos60);
1765 
1766  EXPECT_DOUBLE_EQ(pin0[3](0), (unsigned int)0);
1767  EXPECT_DOUBLE_EQ(pin0[3](1), -side);
1768 
1769  EXPECT_DOUBLE_EQ(pin0[4](0), side * sin60);
1770  EXPECT_DOUBLE_EQ(pin0[4](1), -side * cos60);
1771 
1772  EXPECT_DOUBLE_EQ(pin0[5](0), side * sin60);
1773  EXPECT_DOUBLE_EQ(pin0[5](1), side * cos60);
1774 
1775  // second pin
1776  const auto & pin_centers = hl.pinCenters();
1777  const auto & pin1 = pin_corners[1];
1778  double x = pin_centers[1](0);
1779  double y = pin_centers[1](1);
1780 
1781  EXPECT_DOUBLE_EQ(pin1[0](0), x + 0.0);
1782  EXPECT_DOUBLE_EQ(pin1[0](1), y + side);
1783 
1784  EXPECT_DOUBLE_EQ(pin1[1](0), x + -side * sin60);
1785  EXPECT_DOUBLE_EQ(pin1[1](1), y + side * cos60);
1786 
1787  EXPECT_DOUBLE_EQ(pin1[2](0), x + -side * sin60);
1788  EXPECT_DOUBLE_EQ(pin1[2](1), y + -side * cos60);
1789 
1790  EXPECT_DOUBLE_EQ(pin1[3](0), x + 0);
1791  EXPECT_DOUBLE_EQ(pin1[3](1), y + -side);
1792 
1793  EXPECT_DOUBLE_EQ(pin1[4](0), x + side * sin60);
1794  EXPECT_DOUBLE_EQ(pin1[4](1), y + -side * cos60);
1795 
1796  EXPECT_DOUBLE_EQ(pin1[5](0), x + side * sin60);
1797  EXPECT_DOUBLE_EQ(pin1[5](1), y + side * cos60);
1798 
1799  // check for bin indexing
1800  Point p(0.07, 0.195, 0.0);
1801  EXPECT_EQ(hl.pinIndex(p), (unsigned int)0);
1802 
1803  p = {0.02, 0.42, 0.0};
1804  EXPECT_EQ(hl.pinIndex(p), (unsigned int)0);
1805 
1806  p = {0.74, 0.46, 0.0};
1807  EXPECT_EQ(hl.pinIndex(p), (unsigned int)1);
1808 
1809  p = {-0.206, 0.668, 0.0};
1810  EXPECT_EQ(hl.pinIndex(p), (unsigned int)2);
1811 
1812  p = {-0.99, 0.313, 0.0};
1813  EXPECT_EQ(hl.pinIndex(p), (unsigned int)3);
1814 
1815  p = {-0.257, -0.67, 0.0};
1816  EXPECT_EQ(hl.pinIndex(p), (unsigned int)4);
1817 
1818  p = {0.67, -0.79, 0.0};
1819  EXPECT_EQ(hl.pinIndex(p), (unsigned int)5);
1820 
1821  p = {0.43, 0.0206, 0.0};
1822  EXPECT_EQ(hl.pinIndex(p), (unsigned int)6);
1823 
1824  p = {0.85, 0.51, 0.0};
1825  EXPECT_EQ(hl.pinIndex(p), (unsigned int)7);
1826 }
1827 
1829 {
1830  Real bp = 4.0, pp = 0.8, pd = 0.6, wd = 0.05, wp = 50.0;
1831  unsigned int nr = 3, a = 2;
1832  HexagonalLatticeUtils hl(bp, pp, pd, wd, wp, nr, a);
1833  EXPECT_DOUBLE_EQ(hl.bundlePitch(), 4.0);
1834  EXPECT_DOUBLE_EQ(hl.pinPitch(), 0.8);
1835  EXPECT_DOUBLE_EQ(hl.pinDiameter(), 0.6);
1836  EXPECT_DOUBLE_EQ(hl.pinRadius(), 0.3);
1837  EXPECT_DOUBLE_EQ(hl.wireDiameter(), 0.05);
1838  EXPECT_DOUBLE_EQ(hl.wirePitch(), 50.0);
1839 }
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.