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. <<< //