Skip to content
Snippets Groups Projects
Select Git revision
  • 8bd360da461cd5ffd5ded44532fa650e30933634
  • master default protected
  • parallel_trapping
  • offload_trapping
  • script_devel
  • unify_iterations
  • containers-m10
  • magma_refinement
  • release9
  • enable_svd
  • parallel_angles_gmu
  • containers-m8
  • parallel_angles
  • profile_omp_leonardo
  • test_nvidia_profiler
  • containers
  • shaditest
  • test1
  • main
  • 3-error-in-run-the-program
  • experiment
  • NP_TMcode-M10a.03
  • NP_TMcode-M10a.02
  • NP_TMcode-M10a.01
  • NP_TMcode-M10a.00
  • NP_TMcode-M9.01
  • NP_TMcode-M9.00
  • NP_TMcode-M8.03
  • NP_TMcode-M8.02
  • NP_TMcode-M8.01
  • NP_TMcode-M8.00
  • NP_TMcode-M7.00
  • v0.0
33 results

IterationData.h

Blame
  • IterationData.h 19.53 KiB
    /* Copyright (C) 2024   INAF - Osservatorio Astronomico di Cagliari
    
       This program is free software: you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published by
       the Free Software Foundation, either version 3 of the License, or
       (at your option) any later version.
       
       This program is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       GNU General Public License for more details.
       
       A copy of the GNU General Public License is distributed along with
       this program in the COPYING file. If not, see: <https://www.gnu.org/licenses/>.
     */
    
    /*! \file IterationData.h
     *
     * \brief Multi-process communication data structures.
     *
     */
    
    #ifndef INCLUDE_ITERATION_DATA_H_
    #define INCLUDE_ITERATION_DATA_H_
    
    // >>> DEFINITION OF ClusterIterationData CLASS <<<
    /*! \brief A data structure representing the information used for a single scale
     * of the CLUSTER case.
     */
    class ClusterIterationData {
    public:
      //! \brief Pointer to a ParticleDescriptor structure.
      ParticleDescriptor *c1;
      //! \brief Vector of geometric asymmetry factors.
      double *gaps;
      //! \brief Components of extinction contribution to radiation torque on a single sphere along k.
      double **tqse;
      //! \brief Components of polarized extinction contribution to radiation torque on a single sphere along k.
      dcomplex **tqspe;
      //! \brief Components of scattering contribution to radiation torque on a single sphere along k.
      double **tqss;
      //! \brief Components of polarized scattering contribution to radiation torque on a single sphere along k.
      dcomplex **tqsps;
      //! \brief L-dependent coefficients of the geometric asymmetry parameter.
      double ****zpv;
      //! \brief Mean geometric asymmetry parameters.
      double **gapm;
      //! \brief Mean geometric asymmetry parameters referred to polarization plane.
      dcomplex **gappm;
      //! \brief Imaginary part of the harmonic functions argument.
      double *argi;
      //! \brief Argument of the harmonic functions referred to the scattering plane.
      double *args;
      //! \brief Geometric asymmetry parameters.
      double **gap;
      //! \brief Geometric asymmetry parameters referred to polarization plane.
      dcomplex **gapp;
      //! \brief Components of extinction contribution to radiation torque on the cluster along k.
      double **tqce;
      //! \brief Components of extinction contribution to radiation torque on the cluster along k referred to polarization plane.
      dcomplex **tqcpe;
      //! \brief Components of scattering contribution to radiation torque on the cluster along k.
      double **tqcs;
      //! \brief Components of scattering contribution to radiation torque on the cluster along k referred to polarization plane.
      dcomplex **tqcps;
      //! \brief Variation of unitary radiation vector. QUESTION: correct?
      double *duk;
      //! \brief Cluster extinction cross-section components referred to scattering plane.
      double **cextlr;
      //! \brief Cluster extinction cross-section components referred to meridional plane.
      double **cext;
      //! \brief Cluster Mueller Transformation Matrix components referred to scattering plane.
      double **cmullr;
      //! \brief Cluster Mueller Transformation Matrix components referred to meridional plane.
      double **cmul;
      //! \brief Geometric asymmetry parameter components.
      double *gapv;
      //! \brief Radiation extinction torque components.
      double *tqev;
      //! \brief Radiation scattering torque components.
      double *tqsv;
      //! \brief Incident unitary vector components.
      double *u;
      //! \brief Scattered unitary vector components.
      double *us;
      //! \brief Normal unitary vector components.
      double *un;
      //! \brief Normal scattered unitary vector components.
      double *uns;
      //! \brief Incident unitary vector components on polarization plane.
      double *up;
      //! \brief Scattered unitary vector components on polarization plane.
      double *ups;
      //! \brief Mean unitary vector components normal to polarization plane.
      double *unmp;
      //! \brief Mean scattered unitary vector components normal to polarization plane.
      double *unsmp;
      //! \brief Mean incident unitary vector components on polarization plane.
      double *upmp;
      //! \brief Mean scattered unitary vector components on polarization plane.
      double *upsmp;
      //! \brief Scattering angle.
      double scan;
      //! \brief Control parameter on incidence direction referred to meridional plane.
      double cfmp;
      //! \brief Control parameter on scattering direction referred to meridional plane.
      double sfmp;
      //! \brief Control parameter on incidence direction referred to scattering plane.
      double cfsp;
      //! \brief Control parameter on scattering direction referred to scattering plane.
      double sfsp;
      //! \brief SQSFI = XI^-2
      double sqsfi;
      //! \brief Vectorized scattering coefficient matrix.
      dcomplex *am_vector;
      //! \brief Scattering coefficient matrix.
      dcomplex **am;
      //! \brief Argument of harmonic functions. QUESTION: correct?
      dcomplex arg;
      //! \brief Vacuum magnitude of wave vector.
      double vk;
      //! \brief Wave number.
      double wn;
      //! \brief Normalization scale. QUESTION: correct?
      double xip;
      //! \brief Number of scales (wavelengths) to be computed.
      int number_of_scales;
      //! \brief Size of the block of scales handled by the current process.
      int xiblock;
      //! \brief Index of the first scale handled by the current process.
      int firstxi;
      //! \brief Index of the last scale handled by the current process.
      int lastxi;
      //! \brief ID of the GPU used by one MPI process.
      int proc_device;
      //! \brief Refinement mode selction flag.
      int refinemode;
      //! \brief Maximum number of refinement iterations.
      int maxrefiters;
      //! \brief Required accuracy level.
      double accuracygoal;
    
      /*! \brief `ClusterIterationData` default instance constructor.
       *
       * \param gconf: `GeometryConfiguration *` Pointer to a `GeometryConfiguration` object.
       * \param sconf: `ScattererConfiguration *` Pointer to a `ScattererConfiguration` object.
       * \param mpidata: `mixMPI *` Pointer to a `mixMPI` object.
       * \param device_count: `const int` Number of offload devices available on the system.
       */
      ClusterIterationData(GeometryConfiguration *gconf, ScattererConfiguration *sconf, const mixMPI *mpidata, const int device_count);
      
      /*! \brief `ClusterIterationData` copy constructor.
       *
       * \param rhs: `const ClusterIterationData &` Reference to the `ClusterIterationData` object to be copied.
       */
      ClusterIterationData(const ClusterIterationData& rhs);
    
    #ifdef MPI_VERSION
      /*! \brief `ClusterIterationData` MPI constructor.
       *
       * \param mpidata: `const mixMPI *` Pointer to a `mixMPI` instance.
       * \param device_count: `const int` Number of offload devices available on the system.
       */
      ClusterIterationData(const mixMPI *mpidata, const int device_count);
    
      /*! \brief Broadcast over MPI the ClusterIterationData instance from MPI process 0 to all others.
       *
       * When using MPI, the initial ClusterIterationData instance created by MPI process 0
       * needs to be replicated on all other processes. This function sends it using
       * MPI broadcast calls. The MPI broadcast calls in this function must match those
       * in the constructor using the mixMPI pointer.
       *
       * \param mpidata: `mixMPI *` Pointer to the mpi structure used to do the MPI broadcast.
       */
      void mpibcast(const mixMPI *mpidata);
    #endif // MPI_VERSION
    
      /*! \brief `ClusterIterationData` instance destroyer.
       */
      ~ClusterIterationData();
    };
    // >>> END OF ClusterIterationData CLASS DEFINITION <<<
    
    // >>> DEFINITION OF InclusionIterationData CLASS <<<
    /*! \brief A data structure representing the information used for a single scale
     * of the INCLUSION case.
     */
    class InclusionIterationData {
    protected:
      //! \brief Vectorized geometric asymmetry parameter components.
      double *vec_zpv;
      
    public:
      //! \brief External layer index.
      int nimd;
      //! \brief External layer radius.
      double extr;
      
      //! \brief Pointer to a ParticleDescriptor structure.
      ParticleDescriptor *c1;
      //! \brief Vector of geometric asymmetry factors.
      double *gaps;
        //! \brief Components of extinction contribution to radiation torque on a single sphere along k.
      double **tqse;
      //! \brief Components of polarized extinction contribution to radiation torque on a single sphere along k.
      dcomplex **tqspe;
      //! \brief Components of scattering contribution to radiation torque on a single sphere along k.
      double **tqss;
      //! \brief Components of polarized scattering contribution to radiation torque on a single sphere along k.
      dcomplex **tqsps;
      //! \brief L-dependent coefficients of the geometric asymmetry parameter.
      double ****zpv;
      //! \brief Mean geometric asymmetry parameters.
      double **gapm;
      //! \brief Mean geometric asymmetry parameters referred to polarization plane.
      dcomplex **gappm;
      //! \brief Imaginary part of the harmonic functions argument.
      double *argi;
      //! \brief Argument of the harmonic functions referred to the scattering plane.
      double *args;
      //! \brief Geometric asymmetry parameters.
      double **gap;
      //! \brief Geometric asymmetry parameters referred to polarization plane.
      dcomplex **gapp;
      //! \brief Components of extinction contribution to radiation torque on the cluster along k.
      double **tqce;
      //! \brief Components of extinction contribution to radiation torque on the cluster along k referred to polarization plane.
      dcomplex **tqcpe;
      //! \brief Components of scattering contribution to radiation torque on the cluster along k.
      double **tqcs;
      //! \brief Components of scattering contribution to radiation torque on the cluster along k referred to polarization plane.
      dcomplex **tqcps;
      //! \brief Variation of unitary radiation vector. QUESTION: correct?
      double *duk;
      //! \brief Cluster extinction cross-section components referred to scattering plane.
      double **cextlr;
      //! \brief Cluster extinction cross-section components referred to meridional plane.
      double **cext;
      //! \brief Cluster Mueller Transformation Matrix components referred to scattering plane.
      double **cmullr;
      //! \brief Cluster Mueller Transformation Matrix components referred to meridional plane.
      double **cmul;
      //! \brief Geometric asymmetry parameter components.
      double *gapv;
      //! \brief Radiation extinction torque components.
      double *tqev;
      //! \brief Radiation scattering torque components.
      double *tqsv;
      //! \brief Incident unitary vector components.
      double *u;
      //! \brief Scattered unitary vector components.
      double *us;
      //! \brief Normal unitary vector components.
      double *un;
      //! \brief Normal scattered unitary vector components.
      double *uns;
      //! \brief Incident unitary vector components on polarization plane.
      double *up;
      //! \brief Scattered unitary vector components on polarization plane.
      double *ups;
      //! \brief Mean unitary vector components normal to polarization plane.
      double *unmp;
      //! \brief Mean scattered unitary vector components normal to polarization plane.
      double *unsmp;
      //! \brief Mean incident unitary vector components on polarization plane.
      double *upmp;
      //! \brief Mean scattered unitary vector components on polarization plane.
      double *upsmp;
      //! \brief Scattering angle.
      double scan;
      //! \brief Control parameter on incidence direction referred to meridional plane.
      double cfmp;
      //! \brief Control parameter on scattering direction referred to meridional plane.
      double sfmp;
      //! \brief Control parameter on incidence direction referred to scattering plane.
      double cfsp;
      //! \brief Control parameter on scattering direction referred to scattering plane.
      double sfsp;
      //! \brief SQSFI = XI^-2
      double sqsfi;
      //! \brief Vectorized scattering coefficient matrix.
      dcomplex *am_vector;
      //! \brief Scattering coefficient matrix.
      dcomplex **am;
      //! \brief Argument of harmonic functions. QUESTION: correct?
      dcomplex arg;
      //! \brief Vacuum magnitude of wave vector.
      double vk;
      //! \brief Wave number.
      double wn;
      //! \brief Normalization scale. QUESTION: correct?
      double xip;
      //! \brief Number of scales (wavelengths) to be computed.
      int number_of_scales;
      //! \brief Size of the block of scales handled by the current process.
      int xiblock;
      //! \brief Index of the first scale handled by the current process.
      int firstxi;
      //! \brief Index of the last scale handled by the current process.
      int lastxi;
      //! \brief ID of the GPU used by one MPI process.
      int proc_device;
      //! \brief Refinement mode selction flag.
      int refinemode;
      //! \brief Maximum number of refinement iterations.
      int maxrefiters;
      //! \brief Required accuracy level.
      double accuracygoal;
    
      /*! \brief `InclusionIterationData` default instance constructor.
       *
       * \param gconf: `GeometryConfiguration *` Pointer to a `GeometryConfiguration` object.
       * \param sconf: `ScattererConfiguration *` Pointer to a `ScattererConfiguration` object.
       * \param mpidata: `mixMPI *` Pointer to a `mixMPI` object.
       * \param device_count: `const int` Number of offload devices available on the system.
       */
      InclusionIterationData(GeometryConfiguration *gconf, ScattererConfiguration *sconf, const mixMPI *mpidata, const int device_count);
      
      /*! \brief `InclusionIterationData` copy constructor.
       *
       * \param rhs: `const InclusionIterationData &` Reference to the `InclusionIterationData` object to be copied.
       */
      InclusionIterationData(const InclusionIterationData& rhs);
    
    #ifdef MPI_VERSION
      /*! \brief `InclusionIterationData` MPI constructor.
       *
       * \param mpidata: `const mixMPI *` Pointer to a `mixMPI` instance.
       * \param device_count: `const int` Number of offload devices available on the system.
       */
      InclusionIterationData(const mixMPI *mpidata, const int device_count);
    
      /*! \brief Broadcast over MPI the InclusionIterationData instance from MPI process 0 to all others.
       *
       * When using MPI, the initial InclusionIterationData instance created by MPI process 0
       * needs to be replicated on all other processes. This function sends it using
       * MPI broadcast calls. The MPI broadcast calls in this function must match those
       * in the constructor using the mixMPI pointer.
       *
       * \param mpidata: `mixMPI *` Pointer to the mpi structure used to do the MPI broadcast.
       */
      void mpibcast(const mixMPI *mpidata);
    #endif
    
      /*! \brief `InclusionIterationData` instance destroyer.
       */
      ~InclusionIterationData();
    };
    // >>> END OF InclusionIterationData CLASS DEFINITION <<< //
    
    // >>> DEFINITION OF SphereIterationData CLASS <<<
    /*! \brief A data structure representing the information used for a single scale
     * of the SPHERE case.
     */
    class SphereIterationData {
    protected:
      //! \brief Number of spheres
      int _nsph;
      //! \brief Maximum field expansion order.
      int _lm;
      //! \brief Vector of Mueller matrix components.
      double *vec_cmul;
      //! \brief Vector of Mueller matrix components referred to meridional plane.
      double *vec_cmullr;
      //! Vectorized TQSPE.
      dcomplex *vec_tqspe;
      //! Vectorized TQSPS.
      dcomplex *vec_tqsps;
      //! Vectorized TQSE.
      double *vec_tqse;
      //! Vectorized TQSS.
      double *vec_tqss;
      //! Vectorized ZPV.
      double *vec_zpv;
      
    public:
      //! \brief Vacuum magnitude of wave vector.
      double vk;
      //! \brief Wave number.
      double wn;
      //! \brief Normalization scale. QUESTION: correct?
      double xip;
      //! \brief Number of scales (wavelengths) to be computed.
      int number_of_scales;
      //! \brief Size of the block of scales handled by the current process.
      int xiblock;
      //! \brief Index of the first scale handled by the current process.
      int firstxi;
      //! \brief Index of the last scale handled by the current process.
      int lastxi;
      //! \brief Argument of harmonic functions.
      dcomplex arg;
      //! \brief S0 = FSAS / (4 PI K^3).
      dcomplex s0;
      //! \brief Total forward scattering amplitude of the spheres.
      dcomplex tfsas;
      //! \brief Pointer to a sphere particle descriptor.
      ParticleDescriptor *c1;
      //! \brief Imaginary part of `arg`.
      double *argi;
      //! \brief `arg` squared.
      double *args;
      //! \brief Scattering angle.
      double scan;
      //! \brief Control parameter on incidence direction referred to meridional plane.
      double cfmp;
      //! \brief Control parameter on scattering direction referred to meridional plane.
      double sfmp;
      //! \brief Control parameter on incidence direction referred to scattering plane.
      double cfsp;
      //! \brief Control parameter on scattering direction referred to scattering plane.
      double sfsp;
      //! \brief Geometry asymmetry parameter for spheres.
      double *gaps;
      //! \brief Variation of unitary wave vector.
      double *duk;
      //! \brief Incidence direction unitary vector.
      double *u;
      //! \brief Scattering direction unitary vector.
      double *us;
      //! \brief Normal direction unitary vector.
      double *un;
      //! \brief Scattering normal direction unitary vector.
      double *uns;
      //! \brief Polarization direction unitary vector.
      double *up;
      //! \brief Scattered polarization direction unitary vector.
      double *ups;
      //! \brief Polarization direction unitary vector referred to meridional plane.
      double *upmp;
      //! \brief Scattered polarization direction unitary vector referred to meridional plane.
      double *upsmp;
      //! \brief Normal direction unitary vector referred to meridional plane.
      double *unmp;
      //! \brief Scattering normal direction unitary vector referred to meridional plane.
      double *unsmp;
      //! \brief Mueller matrix components.
      double **cmul;
      //! \brief Mueller matrix components referred to meridional plane.
      double **cmullr;
      //! \brief Polarization-dependent extinction contribution to torque for each sphere.
      dcomplex **tqspe;
      //! \brief Polarization-dependent scattering contribution to torque for each sphere.
      dcomplex **tqsps;
      //! \brief Extinction contribution to torque for each sphere.
      double **tqse;
      //! \brief Scattering contribution to torque for each sphere.
      double **tqss;
      //! \brief Scattering coefficients tensor.
      double ****zpv;
      
      /*! \brief `SphereIterationData` default instance constructor.
       *
       * \param gconf: `GeometryConfiguration *` Pointer to a `GeometryConfiguration` object.
       * \param sconf: `ScattererConfiguration *` Pointer to a `ScattererConfiguration` object.
       * \param mpidata: `mixMPI *` Pointer to a `mixMPI` object.
       * \param device_count: `const int` Number of offload devices available on the system.
       */
      SphereIterationData(GeometryConfiguration *gconf, ScattererConfiguration *sconf, const mixMPI *mpidata, const int device_count);
      
      /*! \brief `SphereIterationData` copy constructor.
       *
       * \param rhs: `const SphereIterationData &` Reference to the object to be copied.
       */
      SphereIterationData(const SphereIterationData& rhs);
    
    #ifdef MPI_VERSION
      /*! \brief `SphereIterationData` MPI constructor.
       *
       * \param mpidata: `const mixMPI *` Pointer to a `mixMPI` instance.
       * \param device_count: `const int` Number of offload devices available on the system.
       */
      SphereIterationData(const mixMPI *mpidata, const int device_count);
    
      /*! \brief Broadcast over MPI the `SphereIterationData` instance from MPI process 0 to all others.
       *
       * When using MPI, the initial InclusionIterationData instance created by
       * MPI process 0 needs to be replicated on all other processes. This
       * function sends it using MPI broadcast calls. The MPI broadcast calls in
       * this function must match those in the constructor using the mixMPI pointer.
       *
       * \param mpidata: `mixMPI *` Pointer to `mixMPI` instance.
       */
      int mpibcast(const mixMPI *mpidata);
    #endif // MPI_VERSION
    
      /*! \brief `SphereIterationData` instance destroyer.
       */
      ~SphereIterationData();
    };
    // >>> END OF SphereIterationData CLASS DEFINITION <<<
    
    #endif // INCLUDE_ITERATION_DATA_H_