Commit f0463d96 authored by Giovanni La Mura's avatar Giovanni La Mura
Browse files

Implement order updating functions for CLUSTER

parent 714bf8d8
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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.
+9 −0
Original line number Diff line number Diff line
@@ -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 <<<

+86 −0
Original line number Diff line number Diff line
@@ -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. <<< //