From 098577ec9add0ec8c661d7e9a81e5a8956d195f8 Mon Sep 17 00:00:00 2001 From: Giovanni La Mura <giovanni.lamura@inaf.it> Date: Sun, 16 Feb 2025 18:36:57 +0100 Subject: [PATCH] Define SphereOutputInfo headers --- src/include/outputs.h | 185 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) diff --git a/src/include/outputs.h b/src/include/outputs.h index b508e79d..39887cd0 100644 --- a/src/include/outputs.h +++ b/src/include/outputs.h @@ -969,4 +969,189 @@ public: }; // >>> END OF OUTPUT FOR INCLUSION <<< +// >>> OUTPUT FOR SPHERE <<< +class SphereOutputInfo { +protected: + //! \brief Number of incident azimuth calculations. + int _num_theta; + //! \brief Number of scattered azimuth calculations. + int _num_thetas; + //! \brief Number of incident elevation calculations. + int _num_phi; + //! \brief Number of scattered elevation calculations. + int _num_phis; + //! \brief ID of the first computed wavelength + int _first_xi; + + /*! \brief Write the output to a HDF5 file. + * + * \param file_name: `const string &` Path to the output to be written. + * \return result: `int` Exit code (0 if successful). + */ + int write_hdf5(const std::string &file_name); + + /*! \brief Write the output to a legacy text file. + * + * This function takes care of writing the output using the legacy + * formatted ASCII structure. If the output file does not exist, it + * is created. If it exists, the new content is overwritten. + * + * \param output: `const string &` Path to the output to be written. + * \return result: `int` Exit code (0 if successful). + */ + int write_legacy(const std::string &output); + +public: + //! \brief Read-only view on the ID of the first scale + const int &first_xi = _first_xi; + //! \brief Maximum field expansion order. + int lm; + //! \brief Maximum coefficient matrix dimension. + np_int mxndm; + //! \brief Incident polarization flag. + int inpol; + //! \brief Number of points for transition layer integration. + int npnt; + //! \brief Number of points for non-transition layer integration. + int npntts; + //! \brief Flag for intensity. + int iavm; + //! \brief Flag for reference to meridional plane. + int isam; + //! \brief Flag for dielectric function definition. + int idfc; + //! \brief First incident radiation azimuth angle. + double th; + //! \brief Incident radiation azimuth angle step. + double thstp; + //! \brief Last incident radiation azimuth angle. + double thlst; + //! \brief First scattered radiation azimuth angle. + double ths; + //! \brief Scattered radiation azimuth angle step. + double thsstp; + //! \brief Last scattered radiation azimuth angle. + double thslst; + //! \brief First incident radiation elevation angle. + double ph; + //! \brief Incident radiation elevation angle step. + double phstp; + //! \brief Last incident radiation elevation angle. + double phlst; + //! \brief First scattered radiation elevation angle. + double phs; + //! \brief Scattered radiation elevation angle step. + double phsstp; + //! \brief Last scattered radiation elevation angle. + double phslst; + //! \brief Number of directions to be explicitly solved. + int ndirs; + //! \brief Refractive index of external medium. + double exri; + //! \brief Number of scales (wavelengths) + int nxi; + //! \brief Number of scales handled by the current process. + int xi_block_size; + //! \brief Index of the wavelength for T-matrix output. + int jwtm; + //! \brief Vector of scale (wavelength) indices. + int *vec_jxi; + //! \brief Vector of error severities (0 - success, 1 - HJV, 2 - DME). + short *vec_ier; + //! \brief Vector of vacuum wave numbers. + double *vec_vk; + //! \brief Vector of computed scales. + double *vec_xi; + //! \brief Vector of sphere sizes (one for every scale). + double *vec_sphere_sizes; + //! \brief Vector of sphere refractive indices (one for every scale). + dcomplex *vec_sphere_ref_indices; + + /*! \brief `SphereOutputInfo` default instance constructor. + * + * \param sc: `ScattererConfiguration *` Pointer to a `ScattererConfiguration` instance. + * \param gc: `GeometryConfiguration *` Pointer to a `GeometryConfiguration` instance. + * \param mpidata: `const mixMPI*` Pointer to a mixMPI instance. + * \param first_xi: `int` Index of the first scale in output (optional, default is 1). + * \param xi_length: `int` Number of scales tobe included in output (optional, default is 0, meaning all). + */ + SphereOutputInfo( + ScattererConfiguration *sc, GeometryConfiguration *gc, + const mixMPI *mpidata, int first_xi = 1, int xi_length = 0 + ); + + /*! \brief `SphereOutputInfo` constructor from HDF5 input. + * + * \param hdf5_file_name: `const string &` Path to the HDF5 file to be read. + */ + SphereOutputInfo(const std::string &hdf5_file_name); + + /*! \brief `InclusionOutputInfo` instance destroyer. + */ + ~SphereOutputInfo(); + + /*! \brief Estimate the size of the structure that would be built for given input. + * + * \param sc: `ScattererConfiguration *` Pointer to a `ScattererConfiguration` instance. + * \param gc: `GeometryConfiguration *` Pointer to a `GeometryConfiguration` instance. + * \param first_xi: `int` Index of the first scale in output (optional, default is 0). + * \param xi_length: `int` Number of scales tobe included in output (optional, default is all). + * \return size: `long` Estimated instance size in bytes. + */ + static long compute_size( + ScattererConfiguration *sc, GeometryConfiguration *gc, + int first_xi = 0, int xi_length = 0 + ); + + /*! \brief Get the size of a `ClusterOutputInfo` instance in bytes. + * + * \return size: `long` Estimated instance size in bytes. + */ + long compute_size(); + + /*! \brief Insert in the current output data the data of another block. + * + * \param rhs: `const SphereOutputInfo &` Reference to the source data block. + * \return result: `int` Exit code (0 if successful). + */ + int insert(const SphereOutputInfo &rhs); + + /*! \brief Write the output to a file. + * + * \param output: `const string &` Path to the output to be written. + * \param format: `const string &` Output format (one of LEGACY or HDF5). + * \return result: `int` Exit code (0 if successful). + */ + int write(const std::string &output, const std::string &format); + +#ifdef MPI_VERSION + /*! \brief Receive output data from worker processes. + * + * This function is invoked by the MPI rank-0 process to fetch the + * output data produced by higher rank processes. When calling this + * function, process 0 halts until a valid data chunk is transmitted + * by the queried process. + * + * \param mpidata: `const mixMPI*` Pointer to a `mixMPI` instance. + * \param pid: `int` Rank of the process that is transmitting data. + * \return result: `int` An exit code (0 for success). + */ + int mpireceive(const mixMPI* mpidata, int pid); + + /*! \brief Send output data to process 0. + * + * This function is invoked by non-zero ranked MPI processes when + * they are ready to send back the output data. When a process meets + * this function call, it halts until MPI process 0 asks for the + * data transmission. + * + * \param mpidata: `const mixMPI*` Pointer to a `mixMPI` instance. + * \param pid: `int` Rank of the process that is transmitting data. + * \return result: `int` An exit code (0 for success). + */ + int mpisend(const mixMPI *mpidata); +#endif // MPI_VERSION +}; +// >>> END OF OUTPUT FOR SPHERE <<< + #endif // INCLUDE_OUTPUTS_H_ -- GitLab