diff --git a/src/include/Commons.h b/src/include/Commons.h
index 31efcc39feb264b0b62b275076477b9402a5e475..260228fcb2469d010e3a22899822e06a2cc0694d 100644
--- a/src/include/Commons.h
+++ b/src/include/Commons.h
@@ -451,6 +451,14 @@ public:
    * \return descriptor_type: `string` The descriptor type name.
    */
   std::string get_descriptor_type() override { return "cluster descriptor"; }
+  
+  /*! \brief Interface function to update field expansion orders.
+   *
+   * \param inner_order: `int` The new inner expansion order to be set.
+   * \param outer_order: `int` The new outer expansion order to be set.
+   * \return result: `int` An exit code (0 if successful).
+   */
+  int update_orders(int inner_order, int outer_order);
 };
 
 /*! \brief The data structure describing a particle model for a sphere with inclusions.
@@ -493,6 +501,14 @@ public:
    * \return descriptor_type: `string` The descriptor type name.
    */
   std::string get_descriptor_type() override { return "inclusion descriptor"; }
+  
+  /*! \brief Interface function to update field expansion orders.
+   *
+   * \param inner_order: `int` The new inner expansion order to be set.
+   * \param outer_order: `int` The new outer expansion order to be set.
+   * \return result: `int` An exit code (0 if successful).
+   */
+  int update_orders(int inner_order, int outer_order) { return 0; }
 };
 
 /*! \brief The data structure describing a spherical particle model.
@@ -535,6 +551,13 @@ public:
    * \return descriptor_type: `string` The descriptor type name.
    */
   std::string get_descriptor_type() override { return "sphere descriptor"; }
+  
+  /*! \brief Interface function to update field expansion orders.
+   *
+   * \param order: `int` The new expansion order to be set.
+   * \return result: `int` An exit code (0 if successful).
+   */
+  int update_order(int order) { return 0; }
 };
 
 /*! \brief A data structure representing the angles to be evaluated in the problem.
diff --git a/src/include/IterationData.h b/src/include/IterationData.h
index bf38b033096cfd0329dd53ddf075a2f70f36ec26..1a42d0aa610cb73697e088c34674c57ea7af65c1 100644
--- a/src/include/IterationData.h
+++ b/src/include/IterationData.h
@@ -178,6 +178,15 @@ public:
   /*! \brief `ClusterIterationData` instance destroyer.
    */
   ~ClusterIterationData();
+
+  /*! \brief Update field expansion orders.
+   *
+   * \param rcf: `double **` Matrix of sphere fractional radii.
+   * \param inner_order: `int` The new inner expansion order to be set.
+   * \param outer_order: `int` The new outer expansion order to be set.
+   * \return result: `int` An exit code (0 if successful).
+   */
+  int update_orders(double** rcf, int inner_order, int outer_order);
 };
 // >>> END OF ClusterIterationData CLASS DEFINITION <<<
 
diff --git a/src/libnptm/Commons.cpp b/src/libnptm/Commons.cpp
index 29bf18b637b149e7d3d6b9fa71ae8433c7e135cd..dddc30fcfb6106f4d3e566e191c118ed6c0a8729 100644
--- a/src/libnptm/Commons.cpp
+++ b/src/libnptm/Commons.cpp
@@ -982,6 +982,92 @@ ParticleDescriptorCluster::ParticleDescriptorCluster(const mixMPI *mpidata) : Pa
   MPI_Bcast(rac3j, _lmtpo, MPI_DOUBLE, 0, MPI_COMM_WORLD);
 }
 #endif // MPI_VERSION
+
+int ParticleDescriptorCluster::update_orders(int inner_order, int outer_order) {
+  int result = 0;
+  bool changed_li = false;
+  bool changed_le = false;
+  if (inner_order != _li) {
+    _li = inner_order;
+    changed_li = true;
+    delete[] vec_rmi;
+    delete[] rmi;
+    vec_rmi = new dcomplex[_li * _nsph]();
+    rmi = new dcomplex*[_li];
+    delete[] vec_rei;
+    delete[] rei;
+    vec_rei = new dcomplex[_li * _nsph]();
+    rei = new dcomplex*[_li];
+    for (int ri = 0; ri < _li; ri++) {
+      rmi[ri] = vec_rmi + (_nsph * ri);
+      rei[ri] = vec_rei + (_nsph * ri);
+    }
+    _litpo = _li + _li + 1;
+    _litpos = _litpo * _litpo;
+    delete[] vh;
+    vh = new dcomplex[_ncou * _litpo]();
+    delete[] vyhj;
+    vyhj = new dcomplex[_ncou * _litpos]();
+  }
+  if (outer_order != _le) {
+    _le = outer_order;
+    changed_le = true;
+    _nlem = _le * (_le + 2);
+    _nlemt = 2 * _nlem;
+    delete[] vec_am0m;
+    vec_am0m = new dcomplex[_nlemt * _nlemt]();
+    delete[] am0m;
+    am0m = new dcomplex*[_nlemt];
+    for (int ai = 0; ai < _nlemt; ai++) am0m[ai] = vec_am0m + (ai * _nlemt);
+  }
+  if (changed_li || changed_le) {
+    _lm = (_li > _le) ? _li : _le;
+    _lmpo = _lm + 1;
+    _lmtpo = _li + _le + 1;
+    _lmtpos = _lmtpo * _lmtpo;
+    _nv3j = (_lm * (_lm + 1) * (2 * _lm + 7)) / 6;
+    _nlim = _li * (_le + 2);
+    _ndi = _nsph * _nlim;
+    _ndit = 2 * _nsph * _nlim;
+    delete[] vec_ind3j;
+    vec_ind3j = new int[(_lm + 1) * _lm]();
+    delete[] vj0;
+    vj0 = new dcomplex[_nsph * _lmtpo]();
+    delete[] vyj0;
+    vyj0 = new dcomplex[_nsph * _lmtpos]();
+    delete[] v3j0;
+    v3j0 = new double[_nv3j]();
+    delete[] ind3j;
+    ind3j = new int*[_lm + 1];
+    for (int ii = 0; ii <= _lm; ii++) ind3j[ii] = vec_ind3j + (_lm * ii);
+    delete[] rac3j;
+    rac3j = new double[_lmtpo]();
+    delete[] vec_gis;
+    vec_gis = new dcomplex[_ndi * _nlem]();
+    delete[] gis;
+    gis = new dcomplex*[_ndi];
+    delete[] vec_gls;
+    vec_gls = new dcomplex[_ndi * _nlem]();
+    delete[] gls;
+    gls = new dcomplex*[_ndi];
+    for (int gi = 0; gi < _ndi; gi++) {
+      gis[gi] = vec_gis + (gi * _nlem);
+      gls[gi] = vec_gls + (gi * _nlem);
+    }
+    delete[] vec_sam;
+    vec_sam = new dcomplex[_ndit * _nlemt]();
+    delete[] sam;
+    sam = new dcomplex*[_ndit];
+    for (int si = 0; si < _ndit; si++) sam[si] = vec_sam + (si * _nlemt);
+    int nllt = (_nlemt == 0) ? 2 * _nsph * _li * (_li + 2) : _nlemt;
+    delete[] vec_w;
+    delete[] w;
+    vec_w = new dcomplex[nllt * 4]();
+    w = new dcomplex*[nllt];
+    for (int wi = 0; wi < nllt; wi++) w[wi] = vec_w + (4 * wi);
+  }
+  return result;
+}
 // >>> End of ParticleDescriptorCluster class implementation. <<< //
 
 // >>> ParticleDescriptorInclusion class implementation. <<< //