From 528af56a3bcfe1bd85c8160aef848b45d5c35e58 Mon Sep 17 00:00:00 2001
From: Matthieu Schaller <schaller@strw.leidenuniv.nl>
Date: Sat, 25 Apr 2020 14:58:42 +0200
Subject: [PATCH] Do not store the dipole terms since they are always zero.

---
 src/cell.c             |   5 -
 src/multipole.h        | 366 +++++++++++++++++++++--------------------
 src/multipole_struct.h |   4 +-
 src/space.c            |   5 -
 4 files changed, 187 insertions(+), 193 deletions(-)

diff --git a/src/cell.c b/src/cell.c
index 20631e5030..54bb5bd2c3 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -2283,11 +2283,6 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current,
     /* Take minimum of both limits */
     c->grav.multipole->r_max = min(r_max, sqrt(dx * dx + dy * dy + dz * dz));
 
-    /* We know the first-order multipole (dipole) is 0. */
-    c->grav.multipole->m_pole.M_100 = 0.f;
-    c->grav.multipole->m_pole.M_010 = 0.f;
-    c->grav.multipole->m_pole.M_001 = 0.f;
-
     /* Compute the multipole power */
     gravity_multipole_compute_power(&c->grav.multipole->m_pole);
 
diff --git a/src/multipole.h b/src/multipole.h
index 07825bfe15..950ec991da 100644
--- a/src/multipole.h
+++ b/src/multipole.h
@@ -305,8 +305,7 @@ __attribute__((nonnull)) INLINE static void gravity_multipole_print(
   printf("M_000= %12.5e\n", m->M_000);
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
   printf("-------------------------\n");
-  printf("M_100= %12.5e M_010= %12.5e M_001= %12.5e\n", m->M_100, m->M_010,
-         m->M_001);
+  printf("M_100= %12.5e M_010= %12.5e M_001= %12.5e\n", 0., 0., 0.);
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
   printf("-------------------------\n");
@@ -364,10 +363,10 @@ __attribute__((nonnull)) INLINE static void gravity_multipole_add(
   ma->M_000 += mb->M_000;
 
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-  /* Add 1st order terms */
-  ma->M_100 += mb->M_100;
-  ma->M_010 += mb->M_010;
-  ma->M_001 += mb->M_001;
+  /* Add 1st order terms (all 0 since we expand around CoM) */
+  /* ma->M_100 += mb->M_100; */
+  /* ma->M_010 += mb->M_010; */
+  /* ma->M_001 += mb->M_001; */
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
   /* Add 2nd order terms */
@@ -527,27 +526,9 @@ __attribute__((nonnull)) INLINE static int gravity_multipole_equal(
     return 0;
   }
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-  /* Manhattan Norm of 1st order terms */
-  const float order1_norm = fabsf(ma->M_001) + fabsf(mb->M_001) +
-                            fabsf(ma->M_010) + fabsf(mb->M_010) +
-                            fabsf(ma->M_100) + fabsf(mb->M_100);
-
-  /* Compare 1st order terms above 1% of norm */
-  if (fabsf(ma->M_001 + mb->M_001) > 0.01f * order1_norm &&
-      fabsf(ma->M_001 - mb->M_001) / fabsf(ma->M_001 + mb->M_001) > tolerance) {
-    message("M_001 term different");
-    return 0;
-  }
-  if (fabsf(ma->M_010 + mb->M_010) > 0.01f * order1_norm &&
-      fabsf(ma->M_010 - mb->M_010) / fabsf(ma->M_010 + mb->M_010) > tolerance) {
-    message("M_010 term different");
-    return 0;
-  }
-  if (fabsf(ma->M_100 + mb->M_100) > 0.01f * order1_norm &&
-      fabsf(ma->M_100 - mb->M_100) / fabsf(ma->M_100 + mb->M_100) > tolerance) {
-    message("M_100 term different");
-    return 0;
-  }
+    /* Manhattan Norm of 1st order terms */
+    /* Nothing to do here all the 1st order terms are 0 since we expand around
+     * CoM */
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
   /* Manhattan Norm of 2nd order terms */
@@ -903,12 +884,13 @@ __attribute__((nonnull)) INLINE static void gravity_multipole_compute_power(
   m->power[0] = m->M_000;
 
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-  /* 1st order terms */
-  power[1] += m->M_001 * m->M_001;
-  power[1] += m->M_010 * m->M_010;
-  power[1] += m->M_100 * m->M_100;
+  /* 1st order terms (all 0 since we expand around CoM) */
+  // power[1] += m->M_001 * m->M_001;
+  // power[1] += m->M_010 * m->M_010;
+  // power[1] += m->M_100 * m->M_100;
 
-  m->power[1] = sqrt(power[1]);
+  // m->power[1] = sqrt(power[1]);
+  m->power[1] = 0.;
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
   /* 2nd order terms */
@@ -1177,12 +1159,6 @@ __attribute__((nonnull)) INLINE static void gravity_P2M(
 #endif
   }
 
-#if SELF_GRAVITY_MULTIPOLE_ORDER > 0
-
-  /* We know the first-order multipole (dipole) is 0. */
-  M_100 = M_010 = M_001 = 0.f;
-#endif
-
   /* Store the data on the multipole. */
   multi->r_max = sqrt(r_max2);
   multi->CoM[0] = com[0];
@@ -1203,10 +1179,10 @@ __attribute__((nonnull)) INLINE static void gravity_P2M(
 
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
 
-  /* 1st order terms */
-  multi->m_pole.M_100 = M_100;
-  multi->m_pole.M_010 = M_010;
-  multi->m_pole.M_001 = M_001;
+  /* 1st order terms (all 0 since we expand around CoM) */
+  // multi->m_pole.M_100 = M_100;
+  // multi->m_pole.M_010 = M_010;
+  // multi->m_pole.M_001 = M_001;
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
 
@@ -1312,228 +1288,256 @@ __attribute__((nonnull)) INLINE static void gravity_M2M(
   const double dx[3] = {pos_a[0] - pos_b[0], pos_a[1] - pos_b[1],
                         pos_a[2] - pos_b[2]};
 
-  /* Shift 1st order term */
-  m_a->M_100 = m_b->M_100 + X_100(dx) * m_b->M_000;
-  m_a->M_010 = m_b->M_010 + X_010(dx) * m_b->M_000;
-  m_a->M_001 = m_b->M_001 + X_001(dx) * m_b->M_000;
+  /* Shift 1st order term (all 0 (after add) since we expand around CoM) */
+  // m_a->M_100 = m_b->M_100 + X_100(dx) * m_b->M_000;
+  // m_a->M_010 = m_b->M_010 + X_010(dx) * m_b->M_000;
+  // m_a->M_001 = m_b->M_001 + X_001(dx) * m_b->M_000;
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
 
-  /* Shift 2nd order term */
-  m_a->M_200 = m_b->M_200 + X_100(dx) * m_b->M_100 + X_200(dx) * m_b->M_000;
-  m_a->M_020 = m_b->M_020 + X_010(dx) * m_b->M_010 + X_020(dx) * m_b->M_000;
-  m_a->M_002 = m_b->M_002 + X_001(dx) * m_b->M_001 + X_002(dx) * m_b->M_000;
-  m_a->M_110 = m_b->M_110 + X_100(dx) * m_b->M_010 + X_010(dx) * m_b->M_100 +
-               X_110(dx) * m_b->M_000;
-  m_a->M_101 = m_b->M_101 + X_100(dx) * m_b->M_001 + X_001(dx) * m_b->M_100 +
-               X_101(dx) * m_b->M_000;
-  m_a->M_011 = m_b->M_011 + X_010(dx) * m_b->M_001 + X_001(dx) * m_b->M_010 +
-               X_011(dx) * m_b->M_000;
+  /* Shift 2nd order term (Simplify 1st order terms that are all 0) */
+  m_a->M_200 = m_b->M_200 + /*X_100(dx) * m_b->M_100 +*/ X_200(dx) * m_b->M_000;
+  m_a->M_020 = m_b->M_020 + /*X_010(dx) * m_b->M_010 +*/ X_020(dx) * m_b->M_000;
+  m_a->M_002 = m_b->M_002 + /*X_001(dx) * m_b->M_001 +*/ X_002(dx) * m_b->M_000;
+  m_a->M_110 = m_b->M_110 +
+               /*X_100(dx) * m_b->M_010 + X_010(dx) * m_b->M_100 +*/ X_110(dx) *
+                   m_b->M_000;
+  m_a->M_101 = m_b->M_101 +
+               /*X_100(dx) * m_b->M_001 + X_001(dx) * m_b->M_100 +*/ X_101(dx) *
+                   m_b->M_000;
+  m_a->M_011 = m_b->M_011 +
+               /*X_010(dx) * m_b->M_001 + X_001(dx) * m_b->M_010 +*/ X_011(dx) *
+                   m_b->M_000;
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 2
 
-  /* Shift 3rd order term */
-  m_a->M_300 = m_b->M_300 + X_100(dx) * m_b->M_200 + X_200(dx) * m_b->M_100 +
-               X_300(dx) * m_b->M_000;
-  m_a->M_030 = m_b->M_030 + X_010(dx) * m_b->M_020 + X_020(dx) * m_b->M_010 +
-               X_030(dx) * m_b->M_000;
-  m_a->M_003 = m_b->M_003 + X_001(dx) * m_b->M_002 + X_002(dx) * m_b->M_001 +
-               X_003(dx) * m_b->M_000;
-  m_a->M_210 = m_b->M_210 + X_100(dx) * m_b->M_110 + X_010(dx) * m_b->M_200 +
-               X_200(dx) * m_b->M_010 + X_110(dx) * m_b->M_100 +
-               X_210(dx) * m_b->M_000;
+  /* Shift 3rd order term (Simplify 1st order terms that are all 0) */
+  m_a->M_300 = m_b->M_300 + X_100(dx) * m_b->M_200 +
+               /*X_200(dx) * m_b->M_100 +*/ X_300(dx) * m_b->M_000;
+  m_a->M_030 = m_b->M_030 + X_010(dx) * m_b->M_020 +
+               /*X_020(dx) * m_b->M_010 +*/ X_030(dx) * m_b->M_000;
+  m_a->M_003 = m_b->M_003 + X_001(dx) * m_b->M_002 +
+               /*X_002(dx) * m_b->M_001 +*/ X_003(dx) * m_b->M_000;
+  m_a->M_210 =
+      m_b->M_210 + X_100(dx) * m_b->M_110 + X_010(dx) * m_b->M_200 +
+      /*X_200(dx) * m_b->M_010 + X_110(dx) * m_b->M_100 + */ X_210(dx) *
+          m_b->M_000;
   m_a->M_201 = m_b->M_201 + X_100(dx) * m_b->M_101 + X_001(dx) * m_b->M_200 +
-               X_200(dx) * m_b->M_001 + X_101(dx) * m_b->M_100 +
-               X_201(dx) * m_b->M_000;
+               /*X_200(dx) * m_b->M_001 + X_101(dx) * m_b->M_100 +*/ X_201(dx) *
+                   m_b->M_000;
   m_a->M_120 = m_b->M_120 + X_010(dx) * m_b->M_110 + X_100(dx) * m_b->M_020 +
-               X_020(dx) * m_b->M_100 + X_110(dx) * m_b->M_010 +
-               X_120(dx) * m_b->M_000;
+               /*X_020(dx) * m_b->M_100 + X_110(dx) * m_b->M_010 +*/ X_120(dx) *
+                   m_b->M_000;
   m_a->M_021 = m_b->M_021 + X_010(dx) * m_b->M_011 + X_001(dx) * m_b->M_020 +
-               X_020(dx) * m_b->M_001 + X_011(dx) * m_b->M_010 +
-               X_021(dx) * m_b->M_000;
+               /*X_020(dx) * m_b->M_001 + X_011(dx) * m_b->M_010 +*/ X_021(dx) *
+                   m_b->M_000;
   m_a->M_102 = m_b->M_102 + X_001(dx) * m_b->M_101 + X_100(dx) * m_b->M_002 +
-               X_002(dx) * m_b->M_100 + X_101(dx) * m_b->M_001 +
-               X_102(dx) * m_b->M_000;
+               /*X_002(dx) * m_b->M_100 + X_101(dx) * m_b->M_001 +*/ X_102(dx) *
+                   m_b->M_000;
   m_a->M_012 = m_b->M_012 + X_001(dx) * m_b->M_011 + X_010(dx) * m_b->M_002 +
-               X_002(dx) * m_b->M_010 + X_011(dx) * m_b->M_001 +
-               X_012(dx) * m_b->M_000;
+               /*X_002(dx) * m_b->M_010 + X_011(dx) * m_b->M_001 +*/ X_012(dx) *
+                   m_b->M_000;
   m_a->M_111 = m_b->M_111 + X_100(dx) * m_b->M_011 + X_010(dx) * m_b->M_101 +
-               X_001(dx) * m_b->M_110 + X_110(dx) * m_b->M_001 +
-               X_101(dx) * m_b->M_010 + X_011(dx) * m_b->M_100 +
+               X_001(dx) * m_b->M_110 + /*X_110(dx) * m_b->M_001 + */
+               /*X_101(dx) * m_b->M_010 + X_011(dx) * m_b->M_100 +*/
                X_111(dx) * m_b->M_000;
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 3
-  /* Shift 4th order terms */
+  /* Shift 4th order terms (Simplify 1st order terms that are all 0) */
   m_a->M_004 = m_b->M_004 + X_001(dx) * m_b->M_003 + X_002(dx) * m_b->M_002 +
-               X_003(dx) * m_b->M_001 + X_004(dx) * m_b->M_000;
+               /*X_003(dx) * m_b->M_001 +*/ X_004(dx) * m_b->M_000;
   m_a->M_013 = m_b->M_013 + X_001(dx) * m_b->M_012 + X_002(dx) * m_b->M_011 +
-               X_003(dx) * m_b->M_010 + X_010(dx) * m_b->M_003 +
-               X_011(dx) * m_b->M_002 + X_012(dx) * m_b->M_001 +
+               /*X_003(dx) * m_b->M_010 +*/ X_010(dx) * m_b->M_003 +
+               X_011(dx) * m_b->M_002 + /*X_012(dx) * m_b->M_001 +*/
                X_013(dx) * m_b->M_000;
   m_a->M_022 = m_b->M_022 + X_001(dx) * m_b->M_021 + X_002(dx) * m_b->M_020 +
                X_010(dx) * m_b->M_012 + X_011(dx) * m_b->M_011 +
-               X_012(dx) * m_b->M_010 + X_020(dx) * m_b->M_002 +
-               X_021(dx) * m_b->M_001 + X_022(dx) * m_b->M_000;
+               /*X_012(dx) * m_b->M_010*/ +X_020(dx) * m_b->M_002 +
+               /*X_021(dx) * m_b->M_001*/ +X_022(dx) * m_b->M_000;
   m_a->M_031 = m_b->M_031 + X_001(dx) * m_b->M_030 + X_010(dx) * m_b->M_021 +
                X_011(dx) * m_b->M_020 + X_020(dx) * m_b->M_011 +
-               X_021(dx) * m_b->M_010 + X_030(dx) * m_b->M_001 +
+               /*X_021(dx) * m_b->M_010 + X_030(dx) * m_b->M_001 + */
                X_031(dx) * m_b->M_000;
   m_a->M_040 = m_b->M_040 + X_010(dx) * m_b->M_030 + X_020(dx) * m_b->M_020 +
-               X_030(dx) * m_b->M_010 + X_040(dx) * m_b->M_000;
+               /*X_030(dx) * m_b->M_010 +*/ X_040(dx) * m_b->M_000;
   m_a->M_103 = m_b->M_103 + X_001(dx) * m_b->M_102 + X_002(dx) * m_b->M_101 +
-               X_003(dx) * m_b->M_100 + X_100(dx) * m_b->M_003 +
-               X_101(dx) * m_b->M_002 + X_102(dx) * m_b->M_001 +
+               /*X_003(dx) * m_b->M_100 +*/ X_100(dx) * m_b->M_003 +
+               X_101(dx) * m_b->M_002 + /*X_102(dx) * m_b->M_001 +*/
                X_103(dx) * m_b->M_000;
-  m_a->M_112 =
-      m_b->M_112 + X_001(dx) * m_b->M_111 + X_002(dx) * m_b->M_110 +
-      X_010(dx) * m_b->M_102 + X_011(dx) * m_b->M_101 + X_012(dx) * m_b->M_100 +
-      X_100(dx) * m_b->M_012 + X_101(dx) * m_b->M_011 + X_102(dx) * m_b->M_010 +
-      X_110(dx) * m_b->M_002 + X_111(dx) * m_b->M_001 + X_112(dx) * m_b->M_000;
-  m_a->M_121 =
-      m_b->M_121 + X_001(dx) * m_b->M_120 + X_010(dx) * m_b->M_111 +
-      X_011(dx) * m_b->M_110 + X_020(dx) * m_b->M_101 + X_021(dx) * m_b->M_100 +
-      X_100(dx) * m_b->M_021 + X_101(dx) * m_b->M_020 + X_110(dx) * m_b->M_011 +
-      X_111(dx) * m_b->M_010 + X_120(dx) * m_b->M_001 + X_121(dx) * m_b->M_000;
+  m_a->M_112 = m_b->M_112 + X_001(dx) * m_b->M_111 + X_002(dx) * m_b->M_110 +
+               X_010(dx) * m_b->M_102 +
+               X_011(dx) * m_b->M_101 + /*X_012(dx) * m_b->M_100 + */
+               X_100(dx) * m_b->M_012 +
+               X_101(dx) * m_b->M_011 + /*X_102(dx) * m_b->M_010 +*/
+               X_110(dx) * m_b->M_002 +
+               /*X_111(dx) * m_b->M_001 +*/ X_112(dx) * m_b->M_000;
+  m_a->M_121 = m_b->M_121 + X_001(dx) * m_b->M_120 + X_010(dx) * m_b->M_111 +
+               X_011(dx) * m_b->M_110 +
+               X_020(dx) * m_b->M_101 + /*X_021(dx) * m_b->M_100 +*/
+               X_100(dx) * m_b->M_021 + X_101(dx) * m_b->M_020 +
+               X_110(dx) * m_b->M_011 +
+               /*X_111(dx) * m_b->M_010 + X_120(dx) * m_b->M_001 +*/ X_121(dx) *
+                   m_b->M_000;
   m_a->M_130 = m_b->M_130 + X_010(dx) * m_b->M_120 + X_020(dx) * m_b->M_110 +
-               X_030(dx) * m_b->M_100 + X_100(dx) * m_b->M_030 +
-               X_110(dx) * m_b->M_020 + X_120(dx) * m_b->M_010 +
+               /*X_030(dx) * m_b->M_100 +*/ X_100(dx) * m_b->M_030 +
+               X_110(dx) * m_b->M_020 + /*X_120(dx) * m_b->M_010 +*/
                X_130(dx) * m_b->M_000;
   m_a->M_202 = m_b->M_202 + X_001(dx) * m_b->M_201 + X_002(dx) * m_b->M_200 +
                X_100(dx) * m_b->M_102 + X_101(dx) * m_b->M_101 +
-               X_102(dx) * m_b->M_100 + X_200(dx) * m_b->M_002 +
-               X_201(dx) * m_b->M_001 + X_202(dx) * m_b->M_000;
-  m_a->M_211 =
-      m_b->M_211 + X_001(dx) * m_b->M_210 + X_010(dx) * m_b->M_201 +
-      X_011(dx) * m_b->M_200 + X_100(dx) * m_b->M_111 + X_101(dx) * m_b->M_110 +
-      X_110(dx) * m_b->M_101 + X_111(dx) * m_b->M_100 + X_200(dx) * m_b->M_011 +
-      X_201(dx) * m_b->M_010 + X_210(dx) * m_b->M_001 + X_211(dx) * m_b->M_000;
+               /*X_102(dx) * m_b->M_100 +*/ X_200(dx) * m_b->M_002 +
+               /*X_201(dx) * m_b->M_001 +*/ X_202(dx) * m_b->M_000;
+  m_a->M_211 = m_b->M_211 + X_001(dx) * m_b->M_210 + X_010(dx) * m_b->M_201 +
+               X_011(dx) * m_b->M_200 + X_100(dx) * m_b->M_111 +
+               X_101(dx) * m_b->M_110 + X_110(dx) * m_b->M_101 +
+               /*X_111(dx) * m_b->M_100 +*/ X_200(dx) * m_b->M_011 +
+               /*X_201(dx) * m_b->M_010 + X_210(dx) * m_b->M_001 +*/ X_211(dx) *
+                   m_b->M_000;
   m_a->M_220 = m_b->M_220 + X_010(dx) * m_b->M_210 + X_020(dx) * m_b->M_200 +
                X_100(dx) * m_b->M_120 + X_110(dx) * m_b->M_110 +
-               X_120(dx) * m_b->M_100 + X_200(dx) * m_b->M_020 +
-               X_210(dx) * m_b->M_010 + X_220(dx) * m_b->M_000;
+               /*X_120(dx) * m_b->M_100 +*/ X_200(dx) * m_b->M_020 +
+               /*X_210(dx) * m_b->M_010 +*/ X_220(dx) * m_b->M_000;
   m_a->M_301 = m_b->M_301 + X_001(dx) * m_b->M_300 + X_100(dx) * m_b->M_201 +
                X_101(dx) * m_b->M_200 + X_200(dx) * m_b->M_101 +
-               X_201(dx) * m_b->M_100 + X_300(dx) * m_b->M_001 +
+               /*X_201(dx) * m_b->M_100 + X_300(dx) * m_b->M_001 + */
                X_301(dx) * m_b->M_000;
   m_a->M_310 = m_b->M_310 + X_010(dx) * m_b->M_300 + X_100(dx) * m_b->M_210 +
                X_110(dx) * m_b->M_200 + X_200(dx) * m_b->M_110 +
-               X_210(dx) * m_b->M_100 + X_300(dx) * m_b->M_010 +
+               /*X_210(dx) * m_b->M_100 + X_300(dx) * m_b->M_010 +*/
                X_310(dx) * m_b->M_000;
   m_a->M_400 = m_b->M_400 + X_100(dx) * m_b->M_300 + X_200(dx) * m_b->M_200 +
-               X_300(dx) * m_b->M_100 + X_400(dx) * m_b->M_000;
+               /*X_300(dx) * m_b->M_100 +*/ X_400(dx) * m_b->M_000;
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 4
   /* Shift 5th order terms */
   m_a->M_005 = m_b->M_005 + X_001(dx) * m_b->M_004 + X_002(dx) * m_b->M_003 +
-               X_003(dx) * m_b->M_002 + X_004(dx) * m_b->M_001 +
+               X_003(dx) * m_b->M_002 + /*X_004(dx) * m_b->M_001 +*/
                X_005(dx) * m_b->M_000;
   m_a->M_014 = m_b->M_014 + X_001(dx) * m_b->M_013 + X_002(dx) * m_b->M_012 +
-               X_003(dx) * m_b->M_011 + X_004(dx) * m_b->M_010 +
+               X_003(dx) * m_b->M_011 + /*X_004(dx) * m_b->M_010 +*/
                X_010(dx) * m_b->M_004 + X_011(dx) * m_b->M_003 +
-               X_012(dx) * m_b->M_002 + X_013(dx) * m_b->M_001 +
+               X_012(dx) * m_b->M_002 + /*X_013(dx) * m_b->M_001 +*/
                X_014(dx) * m_b->M_000;
-  m_a->M_023 =
-      m_b->M_023 + X_001(dx) * m_b->M_022 + X_002(dx) * m_b->M_021 +
-      X_003(dx) * m_b->M_020 + X_010(dx) * m_b->M_013 + X_011(dx) * m_b->M_012 +
-      X_012(dx) * m_b->M_011 + X_013(dx) * m_b->M_010 + X_020(dx) * m_b->M_003 +
-      X_021(dx) * m_b->M_002 + X_022(dx) * m_b->M_001 + X_023(dx) * m_b->M_000;
-  m_a->M_032 =
-      m_b->M_032 + X_001(dx) * m_b->M_031 + X_002(dx) * m_b->M_030 +
-      X_010(dx) * m_b->M_022 + X_011(dx) * m_b->M_021 + X_012(dx) * m_b->M_020 +
-      X_020(dx) * m_b->M_012 + X_021(dx) * m_b->M_011 + X_022(dx) * m_b->M_010 +
-      X_030(dx) * m_b->M_002 + X_031(dx) * m_b->M_001 + X_032(dx) * m_b->M_000;
+  m_a->M_023 = m_b->M_023 + X_001(dx) * m_b->M_022 + X_002(dx) * m_b->M_021 +
+               X_003(dx) * m_b->M_020 + X_010(dx) * m_b->M_013 +
+               X_011(dx) * m_b->M_012 + X_012(dx) * m_b->M_011 +
+               /*X_013(dx) * m_b->M_010 +*/ X_020(dx) * m_b->M_003 +
+               X_021(dx) * m_b->M_002 +
+               /*X_022(dx) * m_b->M_001 +*/ X_023(dx) * m_b->M_000;
+  m_a->M_032 = m_b->M_032 + X_001(dx) * m_b->M_031 + X_002(dx) * m_b->M_030 +
+               X_010(dx) * m_b->M_022 + X_011(dx) * m_b->M_021 +
+               X_012(dx) * m_b->M_020 + X_020(dx) * m_b->M_012 +
+               X_021(dx) * m_b->M_011 + /*X_022(dx) * m_b->M_010 +*/
+               X_030(dx) * m_b->M_002 +
+               /*X_031(dx) * m_b->M_001 +*/ X_032(dx) * m_b->M_000;
   m_a->M_041 = m_b->M_041 + X_001(dx) * m_b->M_040 + X_010(dx) * m_b->M_031 +
                X_011(dx) * m_b->M_030 + X_020(dx) * m_b->M_021 +
                X_021(dx) * m_b->M_020 + X_030(dx) * m_b->M_011 +
-               X_031(dx) * m_b->M_010 + X_040(dx) * m_b->M_001 +
+               /*X_031(dx) * m_b->M_010 + X_040(dx) * m_b->M_001 +*/
                X_041(dx) * m_b->M_000;
   m_a->M_050 = m_b->M_050 + X_010(dx) * m_b->M_040 + X_020(dx) * m_b->M_030 +
-               X_030(dx) * m_b->M_020 + X_040(dx) * m_b->M_010 +
+               X_030(dx) * m_b->M_020 + /* X_040(dx) * m_b->M_010 +*/
                X_050(dx) * m_b->M_000;
   m_a->M_104 = m_b->M_104 + X_001(dx) * m_b->M_103 + X_002(dx) * m_b->M_102 +
-               X_003(dx) * m_b->M_101 + X_004(dx) * m_b->M_100 +
+               X_003(dx) * m_b->M_101 + /*X_004(dx) * m_b->M_100 +*/
                X_100(dx) * m_b->M_004 + X_101(dx) * m_b->M_003 +
-               X_102(dx) * m_b->M_002 + X_103(dx) * m_b->M_001 +
+               X_102(dx) * m_b->M_002 + /*X_103(dx) * m_b->M_001 +*/
                X_104(dx) * m_b->M_000;
-  m_a->M_113 =
-      m_b->M_113 + X_001(dx) * m_b->M_112 + X_002(dx) * m_b->M_111 +
-      X_003(dx) * m_b->M_110 + X_010(dx) * m_b->M_103 + X_011(dx) * m_b->M_102 +
-      X_012(dx) * m_b->M_101 + X_013(dx) * m_b->M_100 + X_100(dx) * m_b->M_013 +
-      X_101(dx) * m_b->M_012 + X_102(dx) * m_b->M_011 + X_103(dx) * m_b->M_010 +
-      X_110(dx) * m_b->M_003 + X_111(dx) * m_b->M_002 + X_112(dx) * m_b->M_001 +
-      X_113(dx) * m_b->M_000;
-  m_a->M_122 =
-      m_b->M_122 + X_001(dx) * m_b->M_121 + X_002(dx) * m_b->M_120 +
-      X_010(dx) * m_b->M_112 + X_011(dx) * m_b->M_111 + X_012(dx) * m_b->M_110 +
-      X_020(dx) * m_b->M_102 + X_021(dx) * m_b->M_101 + X_022(dx) * m_b->M_100 +
-      X_100(dx) * m_b->M_022 + X_101(dx) * m_b->M_021 + X_102(dx) * m_b->M_020 +
-      X_110(dx) * m_b->M_012 + X_111(dx) * m_b->M_011 + X_112(dx) * m_b->M_010 +
-      X_120(dx) * m_b->M_002 + X_121(dx) * m_b->M_001 + X_122(dx) * m_b->M_000;
+  m_a->M_113 = m_b->M_113 + X_001(dx) * m_b->M_112 + X_002(dx) * m_b->M_111 +
+               X_003(dx) * m_b->M_110 + X_010(dx) * m_b->M_103 +
+               X_011(dx) * m_b->M_102 + X_012(dx) * m_b->M_101 +
+               /*X_013(dx) * m_b->M_100 +*/ X_100(dx) * m_b->M_013 +
+               X_101(dx) * m_b->M_012 +
+               X_102(dx) * m_b->M_011 + /*X_103(dx) * m_b->M_010 +*/
+               X_110(dx) * m_b->M_003 +
+               X_111(dx) * m_b->M_002 + /* X_112(dx) * m_b->M_001 +*/
+               X_113(dx) * m_b->M_000;
+  m_a->M_122 = m_b->M_122 + X_001(dx) * m_b->M_121 + X_002(dx) * m_b->M_120 +
+               X_010(dx) * m_b->M_112 + X_011(dx) * m_b->M_111 +
+               X_012(dx) * m_b->M_110 + X_020(dx) * m_b->M_102 +
+               X_021(dx) * m_b->M_101 + /*X_022(dx) * m_b->M_100 +*/
+               X_100(dx) * m_b->M_022 + X_101(dx) * m_b->M_021 +
+               X_102(dx) * m_b->M_020 + X_110(dx) * m_b->M_012 +
+               X_111(dx) * m_b->M_011 + /*X_112(dx) * m_b->M_010 +*/
+               X_120(dx) * m_b->M_002 +
+               /*X_121(dx) * m_b->M_001+*/ X_122(dx) * m_b->M_000;
   m_a->M_131 =
       m_b->M_131 + X_001(dx) * m_b->M_130 + X_010(dx) * m_b->M_121 +
       X_011(dx) * m_b->M_120 + X_020(dx) * m_b->M_111 + X_021(dx) * m_b->M_110 +
-      X_030(dx) * m_b->M_101 + X_031(dx) * m_b->M_100 + X_100(dx) * m_b->M_031 +
+      X_030(dx) * m_b->M_101 +
+      /*X_031(dx) * m_b->M_100 +*/ X_100(dx) * m_b->M_031 +
       X_101(dx) * m_b->M_030 + X_110(dx) * m_b->M_021 + X_111(dx) * m_b->M_020 +
-      X_120(dx) * m_b->M_011 + X_121(dx) * m_b->M_010 + X_130(dx) * m_b->M_001 +
+      X_120(dx) *
+          m_b->M_011 + /*X_121(dx) * m_b->M_010 + X_130(dx) * m_b->M_001 +*/
       X_131(dx) * m_b->M_000;
   m_a->M_140 = m_b->M_140 + X_010(dx) * m_b->M_130 + X_020(dx) * m_b->M_120 +
-               X_030(dx) * m_b->M_110 + X_040(dx) * m_b->M_100 +
+               X_030(dx) * m_b->M_110 + /*X_040(dx) * m_b->M_100 +*/
                X_100(dx) * m_b->M_040 + X_110(dx) * m_b->M_030 +
-               X_120(dx) * m_b->M_020 + X_130(dx) * m_b->M_010 +
+               X_120(dx) * m_b->M_020 + /*X_130(dx) * m_b->M_010 +*/
                X_140(dx) * m_b->M_000;
-  m_a->M_203 =
-      m_b->M_203 + X_001(dx) * m_b->M_202 + X_002(dx) * m_b->M_201 +
-      X_003(dx) * m_b->M_200 + X_100(dx) * m_b->M_103 + X_101(dx) * m_b->M_102 +
-      X_102(dx) * m_b->M_101 + X_103(dx) * m_b->M_100 + X_200(dx) * m_b->M_003 +
-      X_201(dx) * m_b->M_002 + X_202(dx) * m_b->M_001 + X_203(dx) * m_b->M_000;
-  m_a->M_212 =
-      m_b->M_212 + X_001(dx) * m_b->M_211 + X_002(dx) * m_b->M_210 +
-      X_010(dx) * m_b->M_202 + X_011(dx) * m_b->M_201 + X_012(dx) * m_b->M_200 +
-      X_100(dx) * m_b->M_112 + X_101(dx) * m_b->M_111 + X_102(dx) * m_b->M_110 +
-      X_110(dx) * m_b->M_102 + X_111(dx) * m_b->M_101 + X_112(dx) * m_b->M_100 +
-      X_200(dx) * m_b->M_012 + X_201(dx) * m_b->M_011 + X_202(dx) * m_b->M_010 +
-      X_210(dx) * m_b->M_002 + X_211(dx) * m_b->M_001 + X_212(dx) * m_b->M_000;
+  m_a->M_203 = m_b->M_203 + X_001(dx) * m_b->M_202 + X_002(dx) * m_b->M_201 +
+               X_003(dx) * m_b->M_200 + X_100(dx) * m_b->M_103 +
+               X_101(dx) * m_b->M_102 + X_102(dx) * m_b->M_101 +
+               /*X_103(dx) * m_b->M_100 +*/ X_200(dx) * m_b->M_003 +
+               X_201(dx) * m_b->M_002 +
+               /* X_202(dx) * m_b->M_001 +*/ X_203(dx) * m_b->M_000;
+  m_a->M_212 = m_b->M_212 + X_001(dx) * m_b->M_211 + X_002(dx) * m_b->M_210 +
+               X_010(dx) * m_b->M_202 + X_011(dx) * m_b->M_201 +
+               X_012(dx) * m_b->M_200 + X_100(dx) * m_b->M_112 +
+               X_101(dx) * m_b->M_111 + X_102(dx) * m_b->M_110 +
+               X_110(dx) * m_b->M_102 +
+               X_111(dx) * m_b->M_101 + /*X_112(dx) * m_b->M_100 +*/
+               X_200(dx) * m_b->M_012 +
+               X_201(dx) * m_b->M_011 + /*X_202(dx) * m_b->M_010 +*/
+               X_210(dx) * m_b->M_002 +
+               /*X_211(dx) * m_b->M_001 +*/ X_212(dx) * m_b->M_000;
   m_a->M_221 =
       m_b->M_221 + X_001(dx) * m_b->M_220 + X_010(dx) * m_b->M_211 +
       X_011(dx) * m_b->M_210 + X_020(dx) * m_b->M_201 + X_021(dx) * m_b->M_200 +
       X_100(dx) * m_b->M_121 + X_101(dx) * m_b->M_120 + X_110(dx) * m_b->M_111 +
-      X_111(dx) * m_b->M_110 + X_120(dx) * m_b->M_101 + X_121(dx) * m_b->M_100 +
+      X_111(dx) * m_b->M_110 +
+      X_120(dx) * m_b->M_101 + /*X_121(dx) * m_b->M_100 +*/
       X_200(dx) * m_b->M_021 + X_201(dx) * m_b->M_020 + X_210(dx) * m_b->M_011 +
-      X_211(dx) * m_b->M_010 + X_220(dx) * m_b->M_001 + X_221(dx) * m_b->M_000;
-  m_a->M_230 =
-      m_b->M_230 + X_010(dx) * m_b->M_220 + X_020(dx) * m_b->M_210 +
-      X_030(dx) * m_b->M_200 + X_100(dx) * m_b->M_130 + X_110(dx) * m_b->M_120 +
-      X_120(dx) * m_b->M_110 + X_130(dx) * m_b->M_100 + X_200(dx) * m_b->M_030 +
-      X_210(dx) * m_b->M_020 + X_220(dx) * m_b->M_010 + X_230(dx) * m_b->M_000;
-  m_a->M_302 =
-      m_b->M_302 + X_001(dx) * m_b->M_301 + X_002(dx) * m_b->M_300 +
-      X_100(dx) * m_b->M_202 + X_101(dx) * m_b->M_201 + X_102(dx) * m_b->M_200 +
-      X_200(dx) * m_b->M_102 + X_201(dx) * m_b->M_101 + X_202(dx) * m_b->M_100 +
-      X_300(dx) * m_b->M_002 + X_301(dx) * m_b->M_001 + X_302(dx) * m_b->M_000;
+      /*X_211(dx) * m_b->M_010 + X_220(dx) * m_b->M_001 +*/ X_221(dx) *
+          m_b->M_000;
+  m_a->M_230 = m_b->M_230 + X_010(dx) * m_b->M_220 + X_020(dx) * m_b->M_210 +
+               X_030(dx) * m_b->M_200 + X_100(dx) * m_b->M_130 +
+               X_110(dx) * m_b->M_120 + X_120(dx) * m_b->M_110 +
+               /*X_130(dx) * m_b->M_100 +*/ X_200(dx) * m_b->M_030 +
+               X_210(dx) * m_b->M_020 +
+               /*X_220(dx) * m_b->M_010 +*/ X_230(dx) * m_b->M_000;
+  m_a->M_302 = m_b->M_302 + X_001(dx) * m_b->M_301 + X_002(dx) * m_b->M_300 +
+               X_100(dx) * m_b->M_202 + X_101(dx) * m_b->M_201 +
+               X_102(dx) * m_b->M_200 + X_200(dx) * m_b->M_102 +
+               X_201(dx) * m_b->M_101 + /*X_202(dx) * m_b->M_100 +*/
+               X_300(dx) * m_b->M_002 +
+               /*X_301(dx) * m_b->M_001 +*/ X_302(dx) * m_b->M_000;
   m_a->M_311 =
       m_b->M_311 + X_001(dx) * m_b->M_310 + X_010(dx) * m_b->M_301 +
       X_011(dx) * m_b->M_300 + X_100(dx) * m_b->M_211 + X_101(dx) * m_b->M_210 +
       X_110(dx) * m_b->M_201 + X_111(dx) * m_b->M_200 + X_200(dx) * m_b->M_111 +
-      X_201(dx) * m_b->M_110 + X_210(dx) * m_b->M_101 + X_211(dx) * m_b->M_100 +
-      X_300(dx) * m_b->M_011 + X_301(dx) * m_b->M_010 + X_310(dx) * m_b->M_001 +
+      X_201(dx) * m_b->M_110 +
+      X_210(dx) * m_b->M_101 + /*X_211(dx) * m_b->M_100 +*/
+      X_300(dx) *
+          m_b->M_011 + /*X_301(dx) * m_b->M_010 + X_310(dx) * m_b->M_001 +*/
       X_311(dx) * m_b->M_000;
-  m_a->M_320 =
-      m_b->M_320 + X_010(dx) * m_b->M_310 + X_020(dx) * m_b->M_300 +
-      X_100(dx) * m_b->M_220 + X_110(dx) * m_b->M_210 + X_120(dx) * m_b->M_200 +
-      X_200(dx) * m_b->M_120 + X_210(dx) * m_b->M_110 + X_220(dx) * m_b->M_100 +
-      X_300(dx) * m_b->M_020 + X_310(dx) * m_b->M_010 + X_320(dx) * m_b->M_000;
+  m_a->M_320 = m_b->M_320 + X_010(dx) * m_b->M_310 + X_020(dx) * m_b->M_300 +
+               X_100(dx) * m_b->M_220 + X_110(dx) * m_b->M_210 +
+               X_120(dx) * m_b->M_200 + X_200(dx) * m_b->M_120 +
+               X_210(dx) * m_b->M_110 + /*X_220(dx) * m_b->M_100 +*/
+               X_300(dx) * m_b->M_020 +
+               /*X_310(dx) * m_b->M_010 +*/ X_320(dx) * m_b->M_000;
   m_a->M_401 = m_b->M_401 + X_001(dx) * m_b->M_400 + X_100(dx) * m_b->M_301 +
                X_101(dx) * m_b->M_300 + X_200(dx) * m_b->M_201 +
                X_201(dx) * m_b->M_200 + X_300(dx) * m_b->M_101 +
-               X_301(dx) * m_b->M_100 + X_400(dx) * m_b->M_001 +
+               /*X_301(dx) * m_b->M_100 + X_400(dx) * m_b->M_001 +*/
                X_401(dx) * m_b->M_000;
   m_a->M_410 = m_b->M_410 + X_010(dx) * m_b->M_400 + X_100(dx) * m_b->M_310 +
                X_110(dx) * m_b->M_300 + X_200(dx) * m_b->M_210 +
                X_210(dx) * m_b->M_200 + X_300(dx) * m_b->M_110 +
-               X_310(dx) * m_b->M_100 + X_400(dx) * m_b->M_010 +
+               /*X_310(dx) * m_b->M_100 + X_400(dx) * m_b->M_010 +*/
                X_410(dx) * m_b->M_000;
   m_a->M_500 = m_b->M_500 + X_100(dx) * m_b->M_400 + X_200(dx) * m_b->M_300 +
-               X_300(dx) * m_b->M_200 + X_400(dx) * m_b->M_100 +
+               X_300(dx) * m_b->M_200 + /*X_400(dx) * m_b->M_100 +*/
                X_500(dx) * m_b->M_000;
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 5
diff --git a/src/multipole_struct.h b/src/multipole_struct.h
index f6f95576c2..ffd615cd79 100644
--- a/src/multipole_struct.h
+++ b/src/multipole_struct.h
@@ -132,8 +132,8 @@ struct multipole {
 
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 0
 
-  /* 1st order terms */
-  float M_100, M_010, M_001;
+  /* 1st order terms (all 0 since we expand around CoM) */
+  // float M_100, M_010, M_001;
 
 #endif
 #if SELF_GRAVITY_MULTIPOLE_ORDER > 1
diff --git a/src/space.c b/src/space.c
index 5110873789..45dddc1b4b 100644
--- a/src/space.c
+++ b/src/space.c
@@ -3659,11 +3659,6 @@ void space_split_recursive(struct space *s, struct cell *c,
       c->grav.multipole->CoM_rebuild[1] = c->grav.multipole->CoM[1];
       c->grav.multipole->CoM_rebuild[2] = c->grav.multipole->CoM[2];
 
-      /* We know the first-order multipole (dipole) is 0. */
-      c->grav.multipole->m_pole.M_100 = 0.f;
-      c->grav.multipole->m_pole.M_010 = 0.f;
-      c->grav.multipole->m_pole.M_001 = 0.f;
-
       /* Compute the multipole power */
       gravity_multipole_compute_power(&c->grav.multipole->m_pole);
 
-- 
GitLab