diff --git a/src/include/tfrfme.h b/src/include/tfrfme.h index 9ebac454f7dfc6f0f92ebf285a79d16686fd775d..e9efff3ea1a8afb9cca52b1ea252acbce8f33430 100644 --- a/src/include/tfrfme.h +++ b/src/include/tfrfme.h @@ -225,5 +225,14 @@ class TFRFME { * or "LGEACY". Default is "LEGACY"). */ void write_binary(std::string file_name, std::string mode="LEGACY"); + + /*! \brief Test whether two instances of configuration are equal. + * + * \param other: `TFRFME &` Reference to the instance to be compared + * with. + * \return result: `bool` True, if the two instances are equal, + * false otherwise. + */ + bool operator ==(TFRFME &other); }; #endif diff --git a/src/libnptm/tfrfme.cpp b/src/libnptm/tfrfme.cpp index d39791a6f3f4d3839b64464dd0ec48bde2f0e00a..c15dd33fb0fe441f3420b1aa825e40c491b9d325 100644 --- a/src/libnptm/tfrfme.cpp +++ b/src/libnptm/tfrfme.cpp @@ -75,6 +75,10 @@ TFRFME* TFRFME::from_hdf5(string file_name) { unsigned int flags = H5F_ACC_RDONLY; HDFFile *hdf_file = new HDFFile(file_name, flags); herr_t status = hdf_file->get_status(); + double *coord_vec, *elements; + string str_type; + int _nlmmt, _nrvc, num_elements; + complex<double> value; if (status == 0) { int lmode, lm, nkv, nxv, nyv, nzv; double vk, exri, an, ff, tra, spd, frsh, exril; @@ -101,7 +105,42 @@ TFRFME* TFRFME::from_hdf5(string file_name) { instance->set_param("spd", spd); instance->set_param("frsh", frsh); instance->set_param("exril", exril); - // DA QUI: aggiungere lettura di vettori e matrice. + // Vectors and matrix need to be copied element-wise and + // subsequently deleted. + coord_vec = new double[nxv](); + str_type = "FLOAT64_(" + to_string(nxv) + ")"; + status = hdf_file->read("XVEC", str_type, coord_vec); + for (int xi = 0; xi < nxv; xi++) + instance->set_x(xi, coord_vec[xi]); + delete[] coord_vec; + coord_vec = new double[nyv](); + str_type = "FLOAT64_(" + to_string(nyv) + ")"; + status = hdf_file->read("YVEC", str_type, coord_vec); + for (int yi = 0; yi < nyv; yi++) + instance->set_y(yi, coord_vec[yi]); + delete[] coord_vec; + coord_vec = new double[nzv](); + str_type = "FLOAT64_(" + to_string(nzv) + ")"; + status = hdf_file->read("ZVEC", str_type, coord_vec); + for (int zi = 0; zi < nzv; zi++) + instance->set_z(zi, coord_vec[zi]); + delete[] coord_vec; + _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); + for (int wi = 0; wi < _nlmmt; wi++) { + for (int wj = 0; wj < _nrvc; wj++) { + int index = (2 * _nrvc) * wi + 2 * wj; + value = complex<double>(elements[index], elements[index + 1]); + instance->set_matrix_element(wi, wj, value); + } // wj loop + } // wi loop + delete[] elements; + status = hdf_file->close(); + delete hdf_file; } return instance; } @@ -222,6 +261,7 @@ void TFRFME::write_hdf5(string file_name) { List<string> rec_name_list(1); List<string> rec_type_list(1); List<void *> rec_ptr_list(1); + herr_t status; string str_type; rec_name_list.set(0, "LMODE"); rec_type_list.set(0, "INT32_(1)"); @@ -283,7 +323,7 @@ void TFRFME::write_hdf5(string file_name) { // The (N x M) matrix of complex is converted to a (N x 2M) matrix of double, // where REAL(E_i,j) -> E_i,(2 j) and IMAG(E_i,j) -> E_i,(2 j + 1) int num_elements = 2 * nlmmt * nrvc; - double * ptr_elements = new double[num_elements](); + double *ptr_elements = new double[num_elements](); for (int wi = 0; wi < nlmmt; wi++) { for (int wj = 0; wj < nrvc; wj++) { int index = (2 * nrvc) * wi + 2 * wj; @@ -300,8 +340,8 @@ void TFRFME::write_hdf5(string file_name) { FileSchema schema(rec_num, rec_types, rec_names); HDFFile *hdf_file = HDFFile::from_schema(schema, file_name, H5F_ACC_TRUNC); for (int ri = 0; ri < rec_num; ri++) - hdf_file->write(rec_names[ri], rec_types[ri], rec_pointers[ri]); - hdf_file->close(); + status = hdf_file->write(rec_names[ri], rec_types[ri], rec_pointers[ri]); + status = hdf_file->close(); delete[] ptr_elements; delete[] rec_names; @@ -346,3 +386,71 @@ void TFRFME::write_legacy(string file_name) { printf("ERROR: could not open output file \"%s\"\n", file_name.c_str()); } } + +bool TFRFME::operator ==(TFRFME &other) { + if (lmode != other.lmode) { + return false; + } + if (lm != other.lm) { + return false; + } + if (nkv != other.nkv) { + return false; + } + if (nxv != other.nxv) { + return false; + } + if (nyv != other.nyv) { + return false; + } + if (nzv != other.nzv) { + return false; + } + if (vk != other.vk) { + return false; + } + if (exri != other.exri) { + return false; + } + if (an != other.an) { + return false; + } + if (ff != other.ff) { + return false; + } + if (tra != other.tra) { + return false; + } + if (spd != other.spd) { + return false; + } + if (frsh != other.frsh) { + return false; + } + if (exril != other.exril) { + return false; + } + for (int xi = 0; xi < nxv; xi++) { + if (xv[xi] != other.xv[xi]) { + return false; + } + } + for (int yi = 0; yi < nyv; yi++) { + if (yv[yi] != other.yv[yi]) { + return false; + } + } + 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++) { + if (wsum[wi][wj] != other.wsum[wi][wj]) { + return false; + } + } // wj loop + } // wi loop + return true; +}