2424
2525template <class Type >
2626class expansion : public std ::array<Type, LP > {
27- private:
28- const size_t map2[3 ][3 ] = { { 0 , 1 , 2 }, { 1 , 3 , 4 }, { 2 , 4 , 5 } };
29- const size_t map3[3 ][3 ][3 ] = { { { 0 , 1 , 2 }, { 1 , 3 , 4 }, { 2 , 4 , 5 } }, {
30- { 1 , 3 , 4 }, { 3 , 6 , 7 }, { 4 , 7 , 8 } }, { { 2 , 4 , 5 }, { 4 , 7 , 8 },
31- { 5 , 8 , 9 } } };
27+
3228public:
3329 expansion<Type>& operator *=(Type r) {
3430 for (integer i = 0 ; i != LP ; ++i) {
@@ -84,19 +80,31 @@ inline Type& expansion<Type>::operator ()(int i) {
8480
8581template <class Type >
8682inline Type expansion<Type>::operator ()(int i, int j) const {
83+ static constexpr size_t
84+ map2[3 ][3 ] = { {0 , 1 , 2 }, {1 , 3 , 4 }, {2 , 4 , 5 }};
8785 return (*this )[4 + map2[i][j]];
8886}
8987template <class Type >
9088inline Type& expansion<Type>::operator ()(int i, int j) {
89+ static constexpr size_t
90+ map2[3 ][3 ] = { {0 , 1 , 2 }, {1 , 3 , 4 }, {2 , 4 , 5 }};
9191 return (*this )[4 + map2[i][j]];
9292}
9393
9494template <class Type >
9595inline Type expansion<Type>::operator ()(int i, int j, int k) const {
96+ static constexpr size_t
97+ map3[3 ][3 ][3 ] = { { {0 , 1 , 2 }, {1 , 3 , 4 }, {2 , 4 , 5 }}, { {1 , 3 , 4 }, {3 , 6 , 7 }, {4 , 7 , 8 }},
98+ { { 2 , 4 , 5 }, {4 , 7 , 8 }, {5 , 8 , 9 }}};
99+
96100 return (*this )[10 + map3[i][j][k]];
97101}
98102template <class Type >
99103inline Type& expansion<Type>::operator ()(int i, int j, int k) {
104+ static constexpr size_t
105+ map3[3 ][3 ][3 ] = { { {0 , 1 , 2 }, {1 , 3 , 4 }, {2 , 4 , 5 }}, { {1 , 3 , 4 }, {3 , 6 , 7 }, {4 , 7 , 8 }},
106+ { { 2 , 4 , 5 }, {4 , 7 , 8 }, {5 , 8 , 9 }}};
107+
100108 return (*this )[10 + map3[i][j][k]];
101109}
102110
@@ -134,7 +142,7 @@ inline expansion<Type>& expansion<Type>::operator<<=(
134142 }
135143 for (integer a = 0 ; a < 3 ; a++) {
136144 for (integer b = 0 ; b < 3 ; b++) {
137- me () += me (a, b) * dX[a] * dX[b] * 0.5 ;
145+ me () += me (a, b) * dX[a] * dX[b] * real ( 0.5 ) ;
138146 }
139147 }
140148 for (integer a = 0 ; a < 3 ; a++) {
@@ -152,7 +160,7 @@ inline expansion<Type>& expansion<Type>::operator<<=(
152160 for (integer a = 0 ; a < 3 ; a++) {
153161 for (integer b = 0 ; b < 3 ; b++) {
154162 for (integer c = 0 ; c < 3 ; c++) {
155- me (a) += me (a, b, c) * dX[b] * dX[c] * 0.5 ;
163+ me (a) += me (a, b, c) * dX[b] * dX[c] * real ( 0.5 ) ;
156164 }
157165 }
158166 }
@@ -176,7 +184,7 @@ inline Type expansion<Type>::translate_to_particle(
176184 }
177185 for (integer a = 0 ; a < 3 ; a++) {
178186 for (integer b = 0 ; b < 3 ; b++) {
179- this_phi += L (a, b) * dX[a] * dX[b] * 0.5 ;
187+ this_phi += L (a, b) * dX[a] * dX[b] * real ( 0.5 ) ;
180188 }
181189 }
182190 for (integer a = 0 ; a < 3 ; a++) {
@@ -229,6 +237,23 @@ template<class Type>
229237inline expansion<Type>::~expansion () {
230238}
231239
240+ static expansion<real> factor;
241+
242+ __attribute ((constructor))
243+ static void init_factors() {
244+ factor = 0.0 ;
245+ factor () += 1.0 ;
246+ for (integer a = 0 ; a < NDIM ; ++a) {
247+ factor (a) += 1.0 ;
248+ for (integer b = 0 ; b < NDIM ; ++b) {
249+ factor (a, b) += 1.0 ;
250+ for (integer c = 0 ; c < NDIM ; ++c) {
251+ factor (a, b, c) += 1.0 ;
252+ }
253+ }
254+ }
255+ }
256+
232257template <class Type , class Type2 >
233258inline void multipole_interaction (expansion<Type2>& L1 ,
234259 const multipole<Type>& M1 , const multipole<Type2>& M2 ,
@@ -309,8 +334,8 @@ inline void multipole_interaction(expansion<Type2>& L1,
309334
310335 L1 () += M2 () * D ();
311336 for (integer a = 0 ; a < 3 ; a++) {
312- for (integer b = 0 ; b < 3 ; b++) {
313- L1 () += M2 (a, b) * D (a, b) * 0.5 ;
337+ for (integer b = a ; b < 3 ; b++) {
338+ L1 () += M2 (a, b) * D (a, b) * real ( 0.5 ) * factor (a, b) ;
314339 }
315340 }
316341
@@ -319,8 +344,8 @@ inline void multipole_interaction(expansion<Type2>& L1,
319344 }
320345 for (integer a = 0 ; a < 3 ; a++) {
321346 for (integer b = 0 ; b < 3 ; b++) {
322- for (integer c = 0 ; c < 3 ; c++) {
323- L1 (a) += M2 (c, b) * D (a, b, c) * 0.5 ;
347+ for (integer c = b ; c < 3 ; c++) {
348+ L1 (a) += M2 (c, b) * D (a, b, c) * real ( 0.5 ) * factor (c, b) ;
324349 }
325350 }
326351 }
@@ -342,11 +367,11 @@ inline void multipole_interaction(expansion<Type2>& L1,
342367#ifdef CORRECTION_ON
343368 for (integer i = 0 ; i != NDIM ; ++i) {
344369 for (integer j = 0 ; j != NDIM ; ++j) {
345- for (integer k = 0 ; k != NDIM ; ++k) {
346- for (integer l = 0 ; l != NDIM ; ++l) {
370+ for (integer k = j ; k != NDIM ; ++k) {
371+ for (integer l = k ; l != NDIM ; ++l) {
347372 L1 (i) -= D4 [i](j, k, l)
348373 * (M2 (j, k, l) - M1 (j, k, l) * M2 () / M1 ())
349- * (Type (1 ) / Type (6 ));
374+ * (Type (1 ) / Type (6 )) * factor (j, k, l) ;
350375 }
351376 }
352377 }
0 commit comments