From 4392d34ae19a673dd760116f8df97a5e820873c7 Mon Sep 17 00:00:00 2001 From: Giovanni La Mura <giovanni.lamura@inaf.it> Date: Wed, 21 Feb 2024 17:33:25 +0100 Subject: [PATCH] Add public methods to read protected parameters and IOGVEC --- src/include/Configuration.h | 38 +++++++++++++++++++++++++++++++++++ src/libnptm/Configuration.cpp | 25 +++++++++++++++++++++-- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/include/Configuration.h b/src/include/Configuration.h index 37338bdf..99dc090c 100644 --- a/src/include/Configuration.h +++ b/src/include/Configuration.h @@ -361,6 +361,44 @@ public: */ static ScattererConfiguration* from_dedfb(std::string file_name); + /*! \brief Get the ID of a sphere by its index. + * + * The proper way to access read-only parameters from outside a class is to define + * public methods that return their values. For arrays, particularly those that + * are accessed multiple times, it is convenient to have specialized methods that + * return the required values based on their index in the array. + * + * \param index: `int` Index of the ID to be retrieved. + * \return id: `int` The desired identifier. + */ + int get_iog(int index) { return iog_vec[index]; } + + /*! \brief Get the value of a parameter by name. + * + * The proper way to access read-only parameters from outside a class is to define + * public methods that return their values. For configuration operations, whose + * optimization is not critical, it is possible to define a single function that + * returns simple scalar values called by name. Access to more complicated data + * structures, on the other hand, require specialized methods which avoid the + * burden of searching the necessary value across the whole arrya every time. + * + * \param param_name: `string` Name of the parameter to be retrieved. + * \return value: `double` Value of the requested parameter. + */ + double get_param(std::string param_name); + + /*! \brief Get the value of a scale by its index. + * + * The proper way to access read-only parameters from outside a class is to define + * public methods that return their values. For arrays, particularly those that + * are accessed multiple times, it is convenient to have specialized methods that + * return the required values based on their index in the array. + * + * \param index: `int` Index of the scale to be retrieved. + * \return scale: `double` The desired scale. + */ + double get_scale(int index) { return scale_vec[index]; } + /*! \brief Print the contents of the configuration object to terminal. * * In case of quick debug testing, `ScattererConfiguration.print()` allows printing diff --git a/src/libnptm/Configuration.cpp b/src/libnptm/Configuration.cpp index 7c0b63d9..399370c4 100644 --- a/src/libnptm/Configuration.cpp +++ b/src/libnptm/Configuration.cpp @@ -535,7 +535,7 @@ ScattererConfiguration* ScattererConfiguration::from_hdf5(string file_name) { herr_t status = hdf_file->get_status(); string str_name, str_type; if (status == 0) { - int nsph; + int nsph, ies; int *iog; double _exdc, _wp, _xip; int _idfc, nxi; @@ -545,6 +545,7 @@ ScattererConfiguration* ScattererConfiguration::from_hdf5(string file_name) { double **rcf_vector; complex<double> ***dc0m; status = hdf_file->read("NSPH", "INT32_(1)", &nsph); + status = hdf_file->read("IES", "INT32_(1)", &ies); status = hdf_file->read("EXDC", "FLOAT64_(1)", &_exdc); status = hdf_file->read("WP", "FLOAT64_(1)", &_wp); status = hdf_file->read("XIP", "FLOAT64_(1)", &_xip); @@ -613,7 +614,7 @@ ScattererConfiguration* ScattererConfiguration::from_hdf5(string file_name) { rcf_vector, _idfc, dc0m, - false, + (ies == 1), _exdc, _wp, _xip @@ -709,6 +710,23 @@ ScattererConfiguration* ScattererConfiguration::from_legacy(string file_name) { return conf; } +double ScattererConfiguration::get_param(string param_name) { + double value; + if (param_name.compare("number_of_spheres") == 0) value = 1.0 * number_of_spheres; + else if (param_name.compare("nsph") == 0) value = 1.0 * number_of_spheres; + else if (param_name.compare("number_of_scales") == 0) value = 1.0 * number_of_scales; + else if (param_name.compare("nxi") == 0) value = 1.0 * number_of_scales; + else if (param_name.compare("idfc") == 0) value = 1.0 * idfc; + else if (param_name.compare("exdc") == 0) value = exdc; + else if (param_name.compare("wp") == 0) value = wp; + else if (param_name.compare("xip") == 0) value = xip; + else { + // TODO: add exception code for unknown parameter. + return 0.0; + } + return value; +} + void ScattererConfiguration::print() { int ies = (use_external_sphere)? 1 : 0; int configurations = 0; @@ -782,6 +800,9 @@ void ScattererConfiguration::write_hdf5(string file_name) { rec_name_list.set(0, "NSPH"); rec_type_list.set(0, "INT32_(1)"); rec_ptr_list.set(0, &number_of_spheres); + rec_name_list.append("IES"); + rec_type_list.append("INT32_(1)"); + rec_ptr_list.append(&ies); rec_name_list.append("IOGVEC"); str_type = "INT32_(" + to_string(number_of_spheres) + ")"; rec_type_list.append(str_type); -- GitLab