diff --git a/src/include/tfrfme.h b/src/include/tfrfme.h index d6efeedfc84954d267bda64d37e33447e966ae38..25666aa9d8086fdf1c2afc925c2b3545de56908a 100644 --- a/src/include/tfrfme.h +++ b/src/include/tfrfme.h @@ -313,38 +313,37 @@ public: class TFRFME { protected: //! NLMMT = 2 * LM * (LM + 2) - int nlmmt; + int _nlmmt; //! NRVC = NXV * NYV * NZV - int nrvc; - + int _nrvc; //! Field expansion mode identifier. - int lmode; - //! Maximim field expansion order; - int lm; + int _lmode; + //! Maximum field expansion order. + int _lm; //! QUESTION: definition? - int nkv; + int _nkv; //! Number of computed X coordinates. - int nxv; + int _nxv; //! Number of computed Y coordinates. - int nyv; + int _nyv; //! Number of computed Z coordinates. - int nzv; - //! Wave number in scale units - double vk; + int _nzv; + //! Vacuum wave number. + double _vk; //! External medium refractive index - double exri; + double _exri; //! QUESTION: definition? - double an; + double _an; //! QUESTION: definition? - double ff; + double _ff; //! QUESTION: definition? - double tra; + double _tra; //! QUESTION: definition? - double spd; + double _spd; //! QUESTION: definition? - double frsh; + double _frsh; //! QUESTION: definition? - double exril; + double _exril; //! Vector of computed x positions double *xv; //! Vector of computed y positions @@ -352,7 +351,7 @@ protected: //! Vector of computed z positions double *zv; //! QUESTION: definition? - dcomplex **wsum; + dcomplex *vec_wsum; /*! \brief Load a configuration instance from a HDF5 binary file. * @@ -383,18 +382,51 @@ protected: void write_legacy(const std::string& file_name); public: + //! Read-only view on NLMMT. + const int& nlmmt = _nlmmt; + //! Read-only view on NRVC. + const int& nrvc = _nrvc; + //! Read-only view on field expansion mode identifier. + const int& lmode = _lmode; + //! Read-only view on maximum field expansion order. + const int& lm = _lm; + //! QUESTION: definition? + const int& nkv = _nkv; + //! Read-only view on number of computed X coordinates. + const int& nxv = _nxv; + //! Read-only view on number of computed Y coordinates. + const int& nyv = _nyv; + //! Read-only view on number of computed Z coordinates. + const int& nzv = _nzv; + //! Read-only view on vacuum wave number. + const double& vk = _vk; + //! Read-only view on external medium refractive index + const double& exri = _exri; + //! QUESTION: definition? + const double& an = _an; + //! QUESTION: definition? + const double& ff = _ff; + //! QUESTION: definition? + const double& tra = _tra; + //! QUESTION: definition? + const double& spd = _spd; + //! QUESTION: definition? + const double& frsh = _frsh; + //! QUESTION: definition? + const double& exril = _exril; + //! QUESTION: definition? + dcomplex **wsum; + /*! \brief Trapping configuration instance constructor. * - * \param _lmode: `int` Order expansion mode flag. - * \param _lm: `int` Maximum field expansion order. - * \param _nkv: `int` Number of wave vector coordinates. QUESTION: correct? - * \param _nxv: `int` Number of computed X coordinates. - * \param _nyv: `int` Number of computed Y coordinates. - * \param _nzv: `int` Number of computed Z coordinates. + * \param lmode: `int` Order expansion mode flag. + * \param lm: `int` Maximum field expansion order. + * \param nkv: `int` Number of wave vector coordinates. QUESTION: correct? + * \param nxv: `int` Number of computed X coordinates. + * \param nyv: `int` Number of computed Y coordinates. + * \param nzv: `int` Number of computed Z coordinates. */ - TFRFME( - int _lmode, int _lm, int _nkv, int _nxv, int _nyv, int _nzv -); + TFRFME(int lmode, int lm, int nkv, int nxv, int nyv, int nzv); /*! \brief Trapping configuration instance destroyer. */ @@ -408,35 +440,20 @@ public: * \return instance: `TFRFME *` Pointer to a newly created configuration * instance. */ - static TFRFME* from_binary(const std::string& file_name, const std::string& mode="LEGACY"); - - /*! \brief Get the pointer to the WSUM matrix. - * - * \return value: `complex double **` Pointer to the WSUM matrix. - */ - dcomplex **get_matrix() { return wsum; } + static TFRFME* from_binary( + const std::string& file_name, const std::string& mode="LEGACY" +); /*! \brief Calculate the necessary amount of memory to create a new instance. * - * \param _lmode: `int` Order expansion mode flag. - * \param _lm: `int` Maximum field expansion order. - * \param _nkv: `int` Number of radial vector coordinates. QUESTION: correct? - * \param _nxv: `int` Number of computed X coordinates. - * \param _nyv: `int` Number of computed Y coordinates. - * \param _nzv: `int` Number of computed Z coordinates. + * \param lm: `int` Maximum field expansion order. + * \param nkv: `int` Number of radial vector coordinates. QUESTION: correct? + * \param nxv: `int` Number of computed X coordinates. + * \param nyv: `int` Number of computed Y coordinates. + * \param nzv: `int` Number of computed Z coordinates. * \return size: `long` The necessary memory size in bytes. */ - static long get_memory_requirement( - int _lmode, int _lm, int _nkv, int _nxv, - int _nyv, int _nzv - ); - - /*! \brief Get a configuration parameter. - * - * \param param_name: `string` Name of the parameter. - * \return value: `double` The value of the requested parameter. - */ - double get_param(const std::string& param_name); + static long get_size(int lm, int nkv, int nxv, int nyv, int nzv); /*! \brief Get the pointer to the X coordinates vector. * diff --git a/src/libnptm/tfrfme.cpp b/src/libnptm/tfrfme.cpp index f5ea5e2fe2515911fdaadade787afb8b66408e38..fc3651b637e7227028767ad192cd029765e8a2ec 100644 --- a/src/libnptm/tfrfme.cpp +++ b/src/libnptm/tfrfme.cpp @@ -563,37 +563,38 @@ bool Swap2::operator ==(Swap2 &other) { // >>> END OF Swap2 CLASS IMPLEMENTATION <<< // >>> START OF TFRFME CLASS IMPLEMENTATION <<< -TFRFME::TFRFME(int _lmode, int _lm, int _nkv, int _nxv, int _nyv, int _nzv) { - lmode = _lmode; - lm = _lm; - nkv = _nkv; - nxv = _nxv; - nyv = _nyv; - nzv = _nzv; - vk = 0.0; - exri = 0.0; - an = 0.0; - ff = 0.0; - tra = 0.0; - spd = 0.0; - frsh = 0.0; - exril = 0.0; +TFRFME::TFRFME(int lmode, int lm, int nkv, int nxv, int nyv, int nzv) { + _lmode = lmode; + _lm = lm; + _nkv = nkv; + _nxv = nxv; + _nyv = nyv; + _nzv = nzv; + _vk = 0.0; + _exri = 0.0; + _an = 0.0; + _ff = 0.0; + _tra = 0.0; + _spd = 0.0; + _frsh = 0.0; + _exril = 0.0; // Array initialization xv = new double[nxv](); yv = new double[nyv](); zv = new double[nzv](); - nlmmt = lm * (lm + 2) * 2; - nrvc = nxv * nyv * nzv; + _nlmmt = _lm * (_lm + 2) * 2; + _nrvc = _nxv * _nyv * _nzv; + vec_wsum = new dcomplex[nrvc * nlmmt](); wsum = new dcomplex*[nlmmt]; - for (int wi = 0; wi < nlmmt; wi++) wsum[wi] = new dcomplex[nrvc](); + for (int wi = 0; wi < nlmmt; wi++) wsum[wi] = vec_wsum + wi * nrvc; } TFRFME::~TFRFME() { delete[] xv; delete[] yv; delete[] zv; - for (int wi = nlmmt - 1; wi > -1; wi--) delete[] wsum[wi]; + delete[] vec_wsum; delete[] wsum; } @@ -617,9 +618,8 @@ TFRFME* TFRFME::from_hdf5(const std::string& file_name) { herr_t status = hdf_file->get_status(); double *elements; string str_type; - int _nlmmt, _nrvc, num_elements; + int nlmmt, nrvc, num_elements; dcomplex value; - dcomplex **_wsum = NULL; if (status == 0) { int lmode, lm, nkv, nxv, nyv, nzv; double vk, exri, an, ff, tra, spd, frsh, exril; @@ -638,7 +638,6 @@ TFRFME* TFRFME::from_hdf5(const std::string& file_name) { status = hdf_file->read("FRSH", "FLOAT64", &frsh); status = hdf_file->read("EXRIL", "FLOAT64", &exril); instance = new TFRFME(lmode, lm, nkv, nxv, nyv, nzv); - _wsum = instance->get_matrix(); instance->set_param("vk", vk); instance->set_param("exri", exri); instance->set_param("an", an); @@ -653,17 +652,17 @@ TFRFME* TFRFME::from_hdf5(const std::string& file_name) { status = hdf_file->read("YVEC", str_type, instance->yv); str_type = "FLOAT64_(" + to_string(nzv) + ")"; status = hdf_file->read("ZVEC", str_type, instance->zv); - _nlmmt = 2 * lm * (lm + 2); - _nrvc = nxv * nyv * nzv; - num_elements = 2 * _nlmmt * _nrvc; + nlmmt = 2 * lm * (lm + 2); + nrvc = nxv * nyv * nzv; + num_elements = 2 * nlmmt * nrvc; elements = new double[num_elements](); str_type = "FLOAT64_(" + to_string(num_elements) + ")"; status = hdf_file->read("WSUM", str_type, elements); int index = 0; - for (int wj = 0; wj < _nrvc; wj++) { - for (int wi = 0; wi < _nlmmt; wi++) { + for (int wj = 0; wj < nrvc; wj++) { + for (int wi = 0; wi < nlmmt; wi++) { value = elements[index] + elements[index + 1] * I; - _wsum[wi][wj] = value; + instance->wsum[wi][wj] = value; index += 2; } // wi loop } // wj loop @@ -677,7 +676,6 @@ TFRFME* TFRFME::from_hdf5(const std::string& file_name) { TFRFME* TFRFME::from_legacy(const std::string& file_name) { fstream input; TFRFME *instance = NULL; - dcomplex **_wsum = NULL; double *coord_vec = NULL; input.open(file_name.c_str(), ios::in | ios::binary); if (input.is_open()) { @@ -699,7 +697,6 @@ TFRFME* TFRFME::from_legacy(const std::string& file_name) { input.read(reinterpret_cast<char *>(&frsh), sizeof(double)); input.read(reinterpret_cast<char *>(&exril), sizeof(double)); instance = new TFRFME(lmode, lm, nkv, nxv, nyv, nzv); - _wsum = instance->get_matrix(); instance->set_param("vk", vk); instance->set_param("exri", exri); instance->set_param("an", an); @@ -723,14 +720,14 @@ TFRFME* TFRFME::from_legacy(const std::string& file_name) { input.read(reinterpret_cast<char *>(&dval), sizeof(double)); coord_vec[zi] = dval; } - int _nlmmt = 2 * lm * (lm + 2); - int _nrvc = nxv * nyv * nzv; - for (int wj = 0; wj < _nrvc; wj++) { - for (int wi = 0; wi < _nlmmt; wi++) { + int nlmmt = 2 * lm * (lm + 2); + int nrvc = nxv * nyv * nzv; + for (int wj = 0; wj < nrvc; wj++) { + for (int wi = 0; wi < nlmmt; wi++) { input.read(reinterpret_cast<char *>(&rval), sizeof(double)); input.read(reinterpret_cast<char *>(&ival), sizeof(double)); dcomplex value = rval + ival * I; - _wsum[wi][wj] = value; + instance->wsum[wi][wj] = value; } // wi loop } // wj loop input.close(); @@ -740,50 +737,24 @@ TFRFME* TFRFME::from_legacy(const std::string& file_name) { return instance; } -long TFRFME::get_memory_requirement( - int _lmode, int _lm, int _nkv, int _nxv, - int _nyv, int _nzv -) { - int _nlmmt = 2 * _lm * (_lm + 2); - int _nrvc = _nxv * _nyv * _nzv; - long size = (long)(8 * sizeof(int) + 8 * sizeof(double)); - size += (long)((_nxv + _nyv + _nzv) * sizeof(double)); - size += (long)(_nlmmt * _nrvc * sizeof(dcomplex)); +long TFRFME::get_size(int lm, int nkv, int nxv, int nyv, int nzv) { + int nlmmt = 2 * lm * (lm + 2); + int nrvc = nxv * nyv * nzv; + long size = (long)(16 * sizeof(int) + 16 * sizeof(double)); + size += (long)((nxv + nyv + nzv) * sizeof(double)); + size += (long)(nlmmt * nrvc * sizeof(dcomplex)); return size; } -double TFRFME::get_param(const std::string& param_name) { - double value; - if (param_name.compare("vk") == 0) value = vk; - else if (param_name.compare("exri") == 0) value = exri; - else if (param_name.compare("an") == 0) value = an; - else if (param_name.compare("ff") == 0) value = ff; - else if (param_name.compare("tra") == 0) value = tra; - else if (param_name.compare("spd") == 0) value = spd; - else if (param_name.compare("frsh") == 0) value = frsh; - else if (param_name.compare("exril") == 0) value = exril; - else if (param_name.compare("lmode") == 0) value = 1.0 * lmode; - else if (param_name.compare("lm") == 0) value = 1.0 * lm; - else if (param_name.compare("nkv") == 0) value = 1.0 * nkv; - else if (param_name.compare("nxv") == 0) value = 1.0 * nxv; - else if (param_name.compare("nyv") == 0) value = 1.0 * nyv; - else if (param_name.compare("nzv") == 0) value = 1.0 * nzv; - else { - string message = "Unrecognized parameter name \"" + param_name + "\""; - throw UnrecognizedParameterException(message); - } - return value; -} - void TFRFME::set_param(const std::string& param_name, double value) { - if (param_name.compare("vk") == 0) vk = value; - else if (param_name.compare("exri") == 0) exri = value; - else if (param_name.compare("an") == 0) an = value; - else if (param_name.compare("ff") == 0) ff = value; - else if (param_name.compare("tra") == 0) tra = value; - else if (param_name.compare("spd") == 0) spd = value; - else if (param_name.compare("frsh") == 0) frsh = value; - else if (param_name.compare("exril") == 0) exril = value; + if (param_name.compare("vk") == 0) _vk = value; + else if (param_name.compare("exri") == 0) _exri = value; + else if (param_name.compare("an") == 0) _an = value; + else if (param_name.compare("ff") == 0) _ff = value; + else if (param_name.compare("tra") == 0) _tra = value; + else if (param_name.compare("spd") == 0) _spd = value; + else if (param_name.compare("frsh") == 0) _frsh = value; + else if (param_name.compare("exril") == 0) _exril = value; else { string message = "Unrecognized parameter name \"" + param_name + "\""; throw UnrecognizedParameterException(message); @@ -809,46 +780,46 @@ void TFRFME::write_hdf5(const std::string& file_name) { string str_type; rec_name_list.set(0, "LMODE"); rec_type_list.set(0, "INT32_(1)"); - rec_ptr_list.set(0, &lmode); + rec_ptr_list.set(0, &_lmode); rec_name_list.append("LM"); rec_type_list.append("INT32_(1)"); - rec_ptr_list.append(&lm); + rec_ptr_list.append(&_lm); rec_name_list.append("NKV"); rec_type_list.append("INT32_(1)"); - rec_ptr_list.append(&nkv); + rec_ptr_list.append(&_nkv); rec_name_list.append("NXV"); rec_type_list.append("INT32_(1)"); - rec_ptr_list.append(&nxv); + rec_ptr_list.append(&_nxv); rec_name_list.append("NYV"); rec_type_list.append("INT32_(1)"); - rec_ptr_list.append(&nyv); + rec_ptr_list.append(&_nyv); rec_name_list.append("NZV"); rec_type_list.append("INT32_(1)"); - rec_ptr_list.append(&nzv); + rec_ptr_list.append(&_nzv); rec_name_list.append("VK"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&vk); + rec_ptr_list.append(&_vk); rec_name_list.append("EXRI"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&exri); + rec_ptr_list.append(&_exri); rec_name_list.append("AN"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&an); + rec_ptr_list.append(&_an); rec_name_list.append("FF"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&ff); + rec_ptr_list.append(&_ff); rec_name_list.append("TRA"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&tra); + rec_ptr_list.append(&_tra); rec_name_list.append("SPD"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&spd); + rec_ptr_list.append(&_spd); rec_name_list.append("FRSH"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&frsh); + rec_ptr_list.append(&_frsh); rec_name_list.append("EXRIL"); rec_type_list.append("FLOAT64_(1)"); - rec_ptr_list.append(&exril); + rec_ptr_list.append(&_exril); str_type = "FLOAT64_(" + to_string(nxv) + ")"; rec_name_list.append("XVEC"); rec_type_list.append(str_type); @@ -898,28 +869,28 @@ void TFRFME::write_legacy(const std::string& file_name) { fstream output; output.open(file_name.c_str(), ios::out | ios::binary); if (output.is_open()) { - output.write(reinterpret_cast<char *>(&lmode), sizeof(int)); - output.write(reinterpret_cast<char *>(&lm), sizeof(int)); - output.write(reinterpret_cast<char *>(&nkv), sizeof(int)); - output.write(reinterpret_cast<char *>(&nxv), sizeof(int)); - output.write(reinterpret_cast<char *>(&nyv), sizeof(int)); - output.write(reinterpret_cast<char *>(&nzv), sizeof(int)); - output.write(reinterpret_cast<char *>(&vk), sizeof(double)); - output.write(reinterpret_cast<char *>(&exri), sizeof(double)); - output.write(reinterpret_cast<char *>(&an), sizeof(double)); - output.write(reinterpret_cast<char *>(&ff), sizeof(double)); - output.write(reinterpret_cast<char *>(&tra), sizeof(double)); - output.write(reinterpret_cast<char *>(&spd), sizeof(double)); - output.write(reinterpret_cast<char *>(&frsh), sizeof(double)); - output.write(reinterpret_cast<char *>(&exril), sizeof(double)); - for (int xi = 0; xi < nxv; xi++) + output.write(reinterpret_cast<char *>(&_lmode), sizeof(int)); + output.write(reinterpret_cast<char *>(&_lm), sizeof(int)); + output.write(reinterpret_cast<char *>(&_nkv), sizeof(int)); + output.write(reinterpret_cast<char *>(&_nxv), sizeof(int)); + output.write(reinterpret_cast<char *>(&_nyv), sizeof(int)); + output.write(reinterpret_cast<char *>(&_nzv), sizeof(int)); + output.write(reinterpret_cast<char *>(&_vk), sizeof(double)); + output.write(reinterpret_cast<char *>(&_exri), sizeof(double)); + output.write(reinterpret_cast<char *>(&_an), sizeof(double)); + output.write(reinterpret_cast<char *>(&_ff), sizeof(double)); + output.write(reinterpret_cast<char *>(&_tra), sizeof(double)); + output.write(reinterpret_cast<char *>(&_spd), sizeof(double)); + output.write(reinterpret_cast<char *>(&_frsh), sizeof(double)); + output.write(reinterpret_cast<char *>(&_exril), sizeof(double)); + for (int xi = 0; xi < _nxv; xi++) output.write(reinterpret_cast<char *>(&(xv[xi])), sizeof(double)); - for (int yi = 0; yi < nyv; yi++) + for (int yi = 0; yi < _nyv; yi++) output.write(reinterpret_cast<char *>(&(yv[yi])), sizeof(double)); - for (int zi = 0; zi < nzv; zi++) + for (int zi = 0; zi < _nzv; zi++) output.write(reinterpret_cast<char *>(&(zv[zi])), sizeof(double)); - for (int wj = 0; wj < nrvc; wj++) { - for (int wi = 0; wi < nlmmt; wi++) { + for (int wj = 0; wj < _nrvc; wj++) { + for (int wi = 0; wi < _nlmmt; wi++) { double rval = real(wsum[wi][wj]); double ival = imag(wsum[wi][wj]); output.write(reinterpret_cast<char *>(&rval), sizeof(double)); @@ -933,65 +904,65 @@ void TFRFME::write_legacy(const std::string& file_name) { } bool TFRFME::operator ==(const TFRFME& other) { - if (lmode != other.lmode) { + if (_lmode != other._lmode) { return false; } - if (lm != other.lm) { + if (_lm != other._lm) { return false; } - if (nkv != other.nkv) { + if (_nkv != other._nkv) { return false; } - if (nxv != other.nxv) { + if (_nxv != other._nxv) { return false; } - if (nyv != other.nyv) { + if (_nyv != other._nyv) { return false; } - if (nzv != other.nzv) { + if (_nzv != other._nzv) { return false; } - if (vk != other.vk) { + if (_vk != other._vk) { return false; } - if (exri != other.exri) { + if (_exri != other._exri) { return false; } - if (an != other.an) { + if (_an != other._an) { return false; } - if (ff != other.ff) { + if (_ff != other._ff) { return false; } - if (tra != other.tra) { + if (_tra != other._tra) { return false; } - if (spd != other.spd) { + if (_spd != other._spd) { return false; } - if (frsh != other.frsh) { + if (_frsh != other._frsh) { return false; } - if (exril != other.exril) { + if (_exril != other._exril) { return false; } - for (int xi = 0; xi < nxv; xi++) { + for (int xi = 0; xi < _nxv; xi++) { if (xv[xi] != other.xv[xi]) { return false; } } - for (int yi = 0; yi < nyv; yi++) { + for (int yi = 0; yi < _nyv; yi++) { if (yv[yi] != other.yv[yi]) { return false; } } - for (int zi = 0; zi < nzv; zi++) { + for (int zi = 0; zi < _nzv; zi++) { if (zv[zi] != other.zv[zi]) { return false; } } - for (int wi = 0; wi < nlmmt; wi++) { - for (int wj = 0; wj < nrvc; wj++) { + for (int wi = 0; wi < _nlmmt; wi++) { + for (int wj = 0; wj < _nrvc; wj++) { if (wsum[wi][wj] != other.wsum[wi][wj]) { return false; }