From a0d40d5358624e34a4a77a1d46426502f7929891 Mon Sep 17 00:00:00 2001
From: Giovanni La Mura <giovanni.lamura@inaf.it>
Date: Wed, 14 May 2025 15:44:21 +0200
Subject: [PATCH] Use differential dynamic order settings for inner and outer
 expansion

---
 src/cluster/cluster.cpp | 64 ++++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/src/cluster/cluster.cpp b/src/cluster/cluster.cpp
index 89ea580..ac13261 100644
--- a/src/cluster/cluster.cpp
+++ b/src/cluster/cluster.cpp
@@ -747,7 +747,7 @@ int cluster_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConf
 	+ to_string(jxi488) + " too low (recommended order is " + to_string(recommended_li)
 	+ ").\n";
       logger->log(message, LOG_WARN);
-    } else {
+    } else if (recommended_li < cid->c1->li) {
       message = "INFO: lowering internal order from " + to_string(cid->c1->li) + " to "
 	+ to_string(recommended_li) + " for scale iteration " + to_string(jxi488) + ".\n";
       logger->log(message, LOG_INFO);
@@ -757,13 +757,15 @@ int cluster_jxi488_cycle(int jxi488, ScattererConfiguration *sconf, GeometryConf
 	+ to_string(jxi488) + " too low (recommended order is " + to_string(recommended_le)
 	+ ").\n";
       logger->log(message, LOG_WARN);
-    } else {
+    } else if (recommended_le < cid->c1->le) {
       message = "INFO: lowering external order from " + to_string(cid->c1->le) + " to "
 	+ to_string(recommended_le) + " for scale iteration " + to_string(jxi488) + ".\n";
       logger->log(message, LOG_INFO);
     }
     if (recommended_li < cid->c1->li || recommended_le < cid->c1->le) {
-      cid->update_orders(sconf->_rcf, recommended_li, recommended_le);
+      int new_li = (recommended_li < cid->c1->li) ? recommended_li : cid->c1->li;
+      int new_le = (recommended_le < cid->c1->le) ? recommended_le : cid->c1->le;
+      cid->update_orders(sconf->_rcf, new_li, new_le);
     }
     cid->refinemode = 2;
   }
@@ -2113,39 +2115,37 @@ int ClusterIterationData::update_orders(double **rcf, int inner_order, int outer
   int old_le = c1->le;
   int old_lm = c1->lm;
   np_int old_ndit = 2 * c1->nsph * c1->nlim;
-  if (inner_order != old_li || outer_order != old_le) {
-    ((ParticleDescriptorCluster *)c1)->update_orders(inner_order, outer_order);
-    const int ndi = c1->nsph * c1->nlim;
-    const np_int ndit = 2 * ndi;
-    for (int zi = 0; zi < old_lm; zi++) {
-      for (int zj = 0; zj < 3; zj++) {
-	for (int zk = 0; zk < 2; zk++) {
-	  delete[] zpv[zi][zj][zk];
-	}
-	delete[] zpv[zi][zj];
+  ((ParticleDescriptorCluster *)c1)->update_orders(inner_order, outer_order);
+  const int ndi = c1->nsph * c1->nlim;
+  const np_int ndit = 2 * ndi;
+  for (int zi = 0; zi < old_lm; zi++) {
+    for (int zj = 0; zj < 3; zj++) {
+      for (int zk = 0; zk < 2; zk++) {
+	delete[] zpv[zi][zj][zk];
       }
-      delete[] zpv[zi];
+      delete[] zpv[zi][zj];
     }
-    delete[] zpv;
-    zpv = new double***[c1->lm];
-    for (int zi = 0; zi < c1->lm; zi++) {
-      zpv[zi] = new double**[3];
-      for (int zj = 0; zj < 3; zj++) {
-	zpv[zi][zj] = new double*[2];
-	for (int zk = 0; zk < 2; zk++) {
-	  zpv[zi][zj][zk] = new double[2]();
-	}
+    delete[] zpv[zi];
+  }
+  delete[] zpv;
+  zpv = new double***[c1->lm];
+  for (int zi = 0; zi < c1->lm; zi++) {
+    zpv[zi] = new double**[3];
+    for (int zj = 0; zj < 3; zj++) {
+      zpv[zi][zj] = new double*[2];
+      for (int zk = 0; zk < 2; zk++) {
+	zpv[zi][zj][zk] = new double[2]();
       }
     }
-    str(rcf, c1);
-    thdps(c1->lm, zpv);
-    delete[] am;
-    delete[] am_vector;
-    am_vector = new dcomplex[ndit * ndit]();
-    am = new dcomplex*[ndit];
-    for (int ai = 0; ai < ndit; ai++) {
-      am[ai] = (am_vector + ai * ndit);
-    }
+  }
+  str(rcf, c1);
+  thdps(c1->lm, zpv);
+  delete[] am;
+  delete[] am_vector;
+  am_vector = new dcomplex[ndit * ndit]();
+  am = new dcomplex*[ndit];
+  for (int ai = 0; ai < ndit; ai++) {
+    am[ai] = (am_vector + ai * ndit);
   }
   return result;
 }
-- 
GitLab