diff --git a/src/cluster/cluster.cpp b/src/cluster/cluster.cpp
index 8195ce0932a685ad0f41b5e01aec0058a632add7..8494bdd310826e4ac83c5e04b32f11f3e7b13636 100644
--- a/src/cluster/cluster.cpp
+++ b/src/cluster/cluster.cpp
@@ -113,16 +113,8 @@ void cluster(string config_file, string data_file, string output_path) {
     int lm = gconf->l_max;
     if (gconf->li > lm) lm = gconf->li;
     if (gconf->le > lm) lm = gconf->le;
-    C1 *c1 = new C1(nsph, lm, sconf->nshl_vec, sconf->iog_vec);
+    C1 *c1 = new C1(gconf, sconf);
     C3 *c3 = new C3();
-    for (int c1i = 0; c1i < nsph; c1i++) {
-      c1->rxx[c1i] = gconf->sph_x[c1i];
-      c1->ryy[c1i] = gconf->sph_y[c1i];
-      c1->rzz[c1i] = gconf->sph_z[c1i];
-    }
-    for (int c1i = 0; c1i < c1->configurations; c1i++) {
-      c1->ros[c1i] = sconf->radii_of_spheres[c1i];
-    }
     C4 *c4 = new C4(gconf->li, gconf->le, nsph);
     C1_AddOns *c1ao = new C1_AddOns(c4);
     // End of add-ons initialization
diff --git a/src/include/Commons.h b/src/include/Commons.h
index 013658248465e4d3fdaa19ed67cac78d46787f8f..f24de7d3de940c524f3807623c52415c359e1a5d 100644
--- a/src/include/Commons.h
+++ b/src/include/Commons.h
@@ -191,25 +191,25 @@ public:
  */
 class C4 {
 public:
-  //! \brief QUESTION: definition?
+  //! \brief LITPO = 2 * LI + 1.
   int litpo;
-  //! \brief QUESTION: definition?
+  //! \brief LITPOS = LITPO * LITPO
   int litpos;
-  //! \brief Maximum field expansion order plus one. QUESTION: correct?
+  //! \brief LMPO = LM + 1.
   int lmpo;
-  //! \brief Twice maximum field expansion order plus one. QUESTION: correct?
+  //! \brief LMTPO = 2 * LM + 1.
   int lmtpo;
-  //! \brief Square of `lmtpo`.
+  //! \brief LMTPOS = LMTPO * LMTPO.
   int lmtpos;
-  //! \brief QUESTION: definition?
+  //! \brief Internal field expansion order.
   int li;
   //! \brief QUESTION: definition?
   int nlim;
-  //! \brief QUESTION: definition?
+  //! \brief External field expansion order.
   int le;
   //! \brief QUESTION: definition?
   int nlem;
-  //! \brief Maximum field expansion order. QUESTION: correct?
+  //! \brief Maximum field expansion order.
   int lm;
   //! \brief Number of spheres.
   int nsph;
diff --git a/src/libnptm/Commons.cpp b/src/libnptm/Commons.cpp
index 03e19e6957db2b39fb5064a69b04d803a01bba26..65af7359cadf9a90623bd07a2a5a4d0f49ee04f5 100644
--- a/src/libnptm/Commons.cpp
+++ b/src/libnptm/Commons.cpp
@@ -26,6 +26,11 @@
 
 C1::C1(GeometryConfiguration *gconf, ScattererConfiguration *sconf) {
   lm = (int)gconf->get_param("l_max");
+  int li = (int)gconf->get_param("li");
+  int le = (int)gconf->get_param("le");
+  if (lm == 0) {
+    lm = (li > le) ? li : le;
+  }
   nsph = (int)gconf->get_param("nsph");
   nlmmt = 2 * (lm * (lm + 2));
 
@@ -68,8 +73,15 @@ C1::C1(GeometryConfiguration *gconf, ScattererConfiguration *sconf) {
   rxx = new double[nsph]();
   ryy = new double[nsph]();
   rzz = new double[nsph]();
-  ros = new double[nsph]();
-  for (int ri = 0; ri < nsph; ri++) {
+  if (nsph > 1) {
+    for (int c1i = 0; c1i < nsph; c1i++) {
+      rxx[c1i] = gconf->get_sph_x(c1i);
+      ryy[c1i] = gconf->get_sph_y(c1i);
+      rzz[c1i] = gconf->get_sph_z(c1i);
+    }
+  }
+  ros = new double[configurations]();
+  for (int ri = 0; ri < configurations; ri++) {
     ros[ri] = sconf->get_radius(ri);
   }