44 {
45 using DESCRIPTOR = typename CELL::descriptor_t;
46 int reflectionPop[DESCRIPTOR::q];
47 int mirrorDirection0;
48 int mirrorDirection1;
49 int mult = 2 / (NX*NX + NY*NY);
50 reflectionPop[0] =0;
51 for (int iPop = 1; iPop < DESCRIPTOR::q; iPop++) {
52 reflectionPop[iPop] = 0;
53
54 int scalarProduct = descriptors::c<DESCRIPTOR>(iPop,0)*NX + descriptors::c<DESCRIPTOR>(iPop,1)*NY;
55 if ( scalarProduct < 0) {
56
57 if (mult == 1) {
58 mirrorDirection0 = -descriptors::c<DESCRIPTOR>(iPop,0);
59 mirrorDirection1 = -descriptors::c<DESCRIPTOR>(iPop,1);
60 }
61 else {
62 mirrorDirection0 = descriptors::c<DESCRIPTOR>(iPop,0) - mult*
scalarProduct*NX;
63 mirrorDirection1 = descriptors::c<DESCRIPTOR>(iPop,1) - mult*
scalarProduct*NY;
64 }
65
66
67 for (int i = 1; i < DESCRIPTOR::q; i++) {
68 if (descriptors::c<DESCRIPTOR>(i,0)==mirrorDirection0
69 && descriptors::c<DESCRIPTOR>(i,1)==mirrorDirection1) {
70 reflectionPop[iPop] = i;
71 break;
72 }
73 }
74 }
75 }
76 for (int iPop = 1; iPop < DESCRIPTOR::q ; ++iPop) {
77 if (reflectionPop[iPop]!=0) {
78
79 x_b[iPop] = x_b[reflectionPop[iPop]];
80 }
81 }
82 }
T scalarProduct(const T u1[d], const T u2[d])