2 * actually do mapping from metaspace to realspace
8 * Our metaspace dimensions are, in order:
9 * - y realspace coordinate of symmetry axis vertices
10 * - x,y,z realspace coordinates of even-y opposite-of-axis vertices
11 * - x,y,z realspace coordinates of even-y non-axis vertices
12 * - x,y,z realspace coordinates of odd-y vertices in canonical order
15 #define FOR_MAP_DIMENSION__VERTEX_PAIR(body,mirror) \
16 k=0; sign=-1; { body } { mirror } i++; \
17 k=1; sign=+1; { body } { mirror } i++; \
18 k=2; sign=-1; { body } { mirror } i++;
20 /*#define FOR_MAP_DIMENSION_VPRIME \
24 #define FOR_MAP_DIMENSION(body, mirror, degenerate) \
26 int i,v,vprime,k,sign; /* public */ \
27 int fmd_i, fmd_x, fmd_y; \
29 for (fmd_i=0; fmd_i<HALF_DEGRADED_NVERTICES; fmd_i++) { \
32 k=1; sign=+1; { body } i++; \
35 for (fmd_y=0; fmd_y<Y; fmd_y+=2) { \
36 v= fmd_y << YSHIFT | (X/2); \
37 FOR_MAP_DIMENSION__VERTEX_PAIR(body,) \
39 for (fmd_y=0; fmd_y<Y; fmd_y+=2) \
40 for (fmd_x=1; fmd_x<X/2; fmd_x++) { \
41 v= fmd_y << YSHIFT | fmd_x; \
42 vprime= ((Y-1) << YSHIFT | X) - v; \
43 FOR_MAP_DIMENSION__VERTEX_PAIR(body,mirror) \
45 for (fmd_y=1; fmd_y<Y; fmd_y+=2) \
46 for (fmd_x=0; fmd_x<X/2; fmd_x++) { \
47 v= fmd_y << YSHIFT | fmd_x; \
48 vprime= ((Y-1) << YSHIFT | (X-1)) - v; \
49 FOR_MAP_DIMENSION__VERTEX_PAIR(body,mirror) \
54 void pmap_dimensions(const struct Vertices *vs) {
55 int ixfrom[N][D3], count[N][D3], bad;
66 #define CHECK_V(v) assert(v >= 0); assert(v < N);
67 #define CHECK_NEAR(a,b) \
68 if (abs(a-b) >= 1e-6) { printf(" BAD!"); bad++; } \
72 (printf("i=%2d v=%03x k=%d %# 20g\n",
80 // FOR_MAP_DIMENSION_VPRIME;
81 (printf("i=%2d v'=%03x k=%d %# 20g := %# 20g",
83 vs->a[vprime][k], sign*vs->a[v][k]
86 CHECK_NEAR(vs->a[vprime][k], sign*vs->a[v][k])
90 (printf("zero v=%03x k=%d %# 20g := 0",
95 CHECK_NEAR(vs->a[v][k], 0)
101 if (count[vc][kc]==1) continue;
102 printf("BAD %03x %d count=%d ixfrom=%d\n",
103 vc,kc, count[vc][kc], ixfrom[vc][kc]);
109 void map_dimensions(const double metavertex[DIM], Vertices out) {
110 FOR_MAP_DIMENSION(out[v ][k]= metavertex[i];,
112 // FOR_MAP_DIMENSION_VPRIME;
113 out[vprime][k]= sign*metavertex[i];,
119 void unmap_dimensions(double metavertex[DIM], const struct Vertices *in) {
121 metavertex[i]= in->a[v][k];,
130 * Our numbering is as follows:
135 * ___| 0 ___ 1 ___ 2 ___ 3 ___ 4 ___ up to X"-1
137 * / :\ / \ / \ / \ / \
138 * /| : \ / \ / \ / \ / \
139 * |___ 0 ___ 1 ___ 2 ___ 3 ___ 4
140 * | : +X" +X" +X" +X" +X"
141 * \| : / \ / \ / \ / \ /
142 * \ :/ \ / \ / \ / \ /
143 * ___|2*X"___ 1+ ___ 2+ ___ 3+ __ 4+ ___
144 * | : 2*X" 2*X" 2*X" 2*X"
145 * / :\ / \ / \ / \ / \
146 * /| : \ / \ / \ / \ / \
147 * |___ 0+ ___ 1+ ___ 2+ ___ 3+ ___ 4+
148 * | : 3*X" 3*X" 3*X" 3*X" 3*X"
151 * X" is still a power of two so a vertex pair can be named by a
152 * number structured like this:
154 * vertex number": 0000 | y | x