Skip to content
Snippets Groups Projects
Commit d6582a4c authored by mkirsz's avatar mkirsz
Browse files

Consistent class names and tests for .geom reader

parent d90138d4
No related branches found
No related tags found
1 merge request!7Develop
Pipeline #48151 passed
Showing
with 2459 additions and 52 deletions
#ifndef OUTCAR_READER_H #ifndef VASP_OUTCAR_READER_H
#define OUTCAR_READER_H #define VASP_OUTCAR_READER_H
#include <tadah/mlip/structure_db.h> #include <tadah/mlip/structure_db.h>
#include <tadah/mlip/dataset_readers/dataset_reader.h> #include <tadah/mlip/dataset_readers/dataset_reader.h>
#include <string> #include <string>
/** /**
* @class OutcarReader * @class VaspOutcarReader
* @brief Concrete class for reading and parsing VASP OUTCAR files. * @brief Concrete class for reading and parsing VASP OUTCAR files.
* *
* This class implements the DatasetReader interface for handling * This class implements the DatasetReader interface for handling
...@@ -16,24 +16,24 @@ ...@@ -16,24 +16,24 @@
* @code * @code
* StructureDB my_db; * StructureDB my_db;
* // Using the basic constructor * // Using the basic constructor
* OutcarReader reader1(my_db); * VaspOutcarReader reader1(my_db);
* reader1.read_data("OUTCAR"); * reader1.read_data("OUTCAR");
* reader1.parse_data(); * reader1.parse_data();
* reader1.print_summary(); * reader1.print_summary();
* *
* // Using the constructor with filename * // Using the constructor with filename
* OutcarReader reader2(my_db, "OUTCAR"); * VaspOutcarReader reader2(my_db, "OUTCAR");
* reader2.print_summary(); * reader2.print_summary();
* @endcode * @endcode
*/ */
class OutcarReader : public DatasetReader { class VaspOutcarReader : public DatasetReader {
public: public:
/** /**
* @brief Constructor initializing base class reference. * @brief Constructor initializing base class reference.
* *
* @param db Reference to a StructureDB object to store parsed data. * @param db Reference to a StructureDB object to store parsed data.
*/ */
OutcarReader(StructureDB& db); VaspOutcarReader(StructureDB& db);
/** /**
* @brief Constructor that initializes and reads from a file. * @brief Constructor that initializes and reads from a file.
...@@ -43,7 +43,7 @@ public: ...@@ -43,7 +43,7 @@ public:
* @param db Reference to a StructureDB object to store parsed data. * @param db Reference to a StructureDB object to store parsed data.
* @param filename The name of the OUTCAR file to read data from. * @param filename The name of the OUTCAR file to read data from.
*/ */
OutcarReader(StructureDB& db, const std::string& filename); VaspOutcarReader(StructureDB& db, const std::string& filename);
/** /**
* @brief Reads data from the specified OUTCAR file. * @brief Reads data from the specified OUTCAR file.
...@@ -74,4 +74,4 @@ private: ...@@ -74,4 +74,4 @@ private:
std::string raw_data_; // Stores raw file data std::string raw_data_; // Stores raw file data
}; };
#endif // OUTCAR_READER_H #endif // VASP_OUTCAR_READER_H
#ifndef VASPRUN_READER_H #ifndef VASP_VASPRUN_READER_H
#define VASPRUN_READER_H #define VASP_VASPRUN_READER_H
#include <tadah/mlip/structure_db.h> #include <tadah/mlip/structure_db.h>
#include <tadah/mlip/dataset_readers/dataset_reader.h> #include <tadah/mlip/dataset_readers/dataset_reader.h>
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
namespace rx = rapidxml; namespace rx = rapidxml;
/** /**
* @class VasprunReader * @class VaspVasprunReader
* @brief Concrete class for reading and parsing VASP vasprun.xml files. * @brief Concrete class for reading and parsing VASP vasprun.xml files.
* *
* This class implements the DatasetReader interface for handling * This class implements the DatasetReader interface for handling
...@@ -22,24 +22,24 @@ namespace rx = rapidxml; ...@@ -22,24 +22,24 @@ namespace rx = rapidxml;
* @code * @code
* StructureDB my_db; * StructureDB my_db;
* // Using the basic constructor * // Using the basic constructor
* VasprunReader reader1(my_db); * VaspVasprunReader reader1(my_db);
* reader1.read_data("vasprun.xml"); * reader1.read_data("vasprun.xml");
* reader1.parse_data(); * reader1.parse_data();
* reader1.print_summary(); * reader1.print_summary();
* *
* // Using the constructor with filename * // Using the constructor with filename
* VasprunReader reader2(my_db, "vasprun.xml"); * VaspVasprunReader reader2(my_db, "vasprun.xml");
* reader2.print_summary(); * reader2.print_summary();
* @endcode * @endcode
*/ */
class VasprunReader : public DatasetReader { class VaspVasprunReader : public DatasetReader {
public: public:
/** /**
* @brief Constructor initializing with a StructureDB reference. * @brief Constructor initializing with a StructureDB reference.
* *
* @param stdb Reference to a StructureDB object for storing parsed data. * @param stdb Reference to a StructureDB object for storing parsed data.
*/ */
VasprunReader(StructureDB& stdb); VaspVasprunReader(StructureDB& stdb);
/** /**
* @brief Constructor that initializes and reads from a file. * @brief Constructor that initializes and reads from a file.
...@@ -49,19 +49,19 @@ public: ...@@ -49,19 +49,19 @@ public:
* @param stdb Reference to a StructureDB object. * @param stdb Reference to a StructureDB object.
* @param filename Name of the vasprun.xml file to read. * @param filename Name of the vasprun.xml file to read.
*/ */
VasprunReader(StructureDB& stdb, const std::string& filename); VaspVasprunReader(StructureDB& stdb, const std::string& filename);
/** /**
* @brief Destructor for VasprunReader. * @brief Destructor for VaspVasprunReader.
* *
* Cleans up dynamically allocated resources, if any. * Cleans up dynamically allocated resources, if any.
*/ */
// Delete copy constructor // Delete copy constructor
VasprunReader(const VasprunReader& other) = delete; VaspVasprunReader(const VaspVasprunReader& other) = delete;
// Delete copy assignment operator // Delete copy assignment operator
VasprunReader& operator=(const VasprunReader& other) = delete; ~VasprunReader(); VaspVasprunReader& operator=(const VaspVasprunReader& other) = delete; ~VaspVasprunReader();
/** /**
* @brief Reads data from the specified vasprun.xml file. * @brief Reads data from the specified vasprun.xml file.
...@@ -161,4 +161,4 @@ private: ...@@ -161,4 +161,4 @@ private:
bool stress_tensor_bool = false; ///< Flag indicating stress tensor presence. bool stress_tensor_bool = false; ///< Flag indicating stress tensor presence.
}; };
#endif // VASPRUN_READER_H #endif // VASP_VASPRUN_READER_H
#include <tadah/mlip/atom.h> #include <tadah/mlip/atom.h>
#include <tadah/mlip/structure.h> #include <tadah/mlip/structure.h>
#include <tadah/mlip/structure.h> #include <tadah/mlip/structure.h>
#include <tadah/mlip/dataset_readers/outcar_reader.h> #include <tadah/mlip/dataset_readers/vasp_outcar_reader.h>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>
OutcarReader::OutcarReader(StructureDB& db) : DatasetReader(db) {} VaspOutcarReader::VaspOutcarReader(StructureDB& db) : DatasetReader(db) {}
OutcarReader::OutcarReader(StructureDB& db, const std::string& filename) VaspOutcarReader::VaspOutcarReader(StructureDB& db, const std::string& filename)
: DatasetReader(db, filename) { : DatasetReader(db, filename) {
read_data(filename); read_data(filename);
parse_data(); parse_data();
} }
void OutcarReader::read_data(const std::string& filename) { void VaspOutcarReader::read_data(const std::string& filename) {
std::ifstream file(filename); std::ifstream file(filename);
if (!file.is_open()) { if (!file.is_open()) {
throw std::runtime_error("Could not open the file: " + filename); throw std::runtime_error("Could not open the file: " + filename);
...@@ -29,7 +29,7 @@ void OutcarReader::read_data(const std::string& filename) { ...@@ -29,7 +29,7 @@ void OutcarReader::read_data(const std::string& filename) {
file.close(); file.close();
} }
void OutcarReader::parse_data() { void VaspOutcarReader::parse_data() {
// order in OUTCAR is: VRHFIN, NIONS,... // order in OUTCAR is: VRHFIN, NIONS,...
std::istringstream stream(raw_data_); std::istringstream stream(raw_data_);
std::string line; std::string line;
...@@ -182,6 +182,6 @@ void OutcarReader::parse_data() { ...@@ -182,6 +182,6 @@ void OutcarReader::parse_data() {
} }
} }
void OutcarReader::print_summary() const { void VaspOutcarReader::print_summary() const {
std::cout << stdb; std::cout << stdb;
} }
#include <tadah/mlip/dataset_readers/vasprun_reader.h> #include <tadah/mlip/dataset_readers/vasp_vasprun_reader.h>
VasprunReader::VasprunReader(StructureDB& stdb) VaspVasprunReader::VaspVasprunReader(StructureDB& stdb)
: DatasetReader(stdb), stdb(stdb) {} : DatasetReader(stdb), stdb(stdb) {}
VasprunReader::VasprunReader(StructureDB& stdb, const std::string& filename) VaspVasprunReader::VaspVasprunReader(StructureDB& stdb, const std::string& filename)
: DatasetReader(stdb, filename), stdb(stdb) { : DatasetReader(stdb, filename), stdb(stdb) {
read_data(filename); read_data(filename);
parse_data(); parse_data();
} }
VasprunReader::~VasprunReader() { VaspVasprunReader::~VaspVasprunReader() {
delete xmlFile; delete xmlFile;
} }
void VasprunReader::read_data(const std::string& filename) { void VaspVasprunReader::read_data(const std::string& filename) {
std::ifstream infile(filename); std::ifstream infile(filename);
if (!infile.good()) { if (!infile.good()) {
std::cerr << "Error: File " << filename << " cannot be opened or read." << std::endl; std::cerr << "Error: File " << filename << " cannot be opened or read." << std::endl;
...@@ -28,7 +28,7 @@ void VasprunReader::read_data(const std::string& filename) { ...@@ -28,7 +28,7 @@ void VasprunReader::read_data(const std::string& filename) {
} }
} }
void VasprunReader::parse_data() { void VaspVasprunReader::parse_data() {
rx::xml_node<> *root_node = doc.first_node("modeling"); rx::xml_node<> *root_node = doc.first_node("modeling");
if (!root_node) { if (!root_node) {
std::cerr << "Root node not found." << std::endl; std::cerr << "Root node not found." << std::endl;
...@@ -39,7 +39,7 @@ void VasprunReader::parse_data() { ...@@ -39,7 +39,7 @@ void VasprunReader::parse_data() {
extract_calculations(root_node); extract_calculations(root_node);
} }
int VasprunReader::get_number_of_atoms() const { int VaspVasprunReader::get_number_of_atoms() const {
auto root_node = doc.first_node("modeling"); auto root_node = doc.first_node("modeling");
if (!root_node) { if (!root_node) {
std::cerr << "Root node not found." << std::endl; std::cerr << "Root node not found." << std::endl;
...@@ -65,7 +65,7 @@ int VasprunReader::get_number_of_atoms() const { ...@@ -65,7 +65,7 @@ int VasprunReader::get_number_of_atoms() const {
return count; return count;
} }
void VasprunReader::extract_atom_types(rx::xml_node<> *root_node) { void VaspVasprunReader::extract_atom_types(rx::xml_node<> *root_node) {
auto atominfo_node = root_node->first_node("atominfo"); auto atominfo_node = root_node->first_node("atominfo");
if (atominfo_node) { if (atominfo_node) {
auto array_node = atominfo_node->first_node("array"); auto array_node = atominfo_node->first_node("array");
...@@ -83,7 +83,7 @@ void VasprunReader::extract_atom_types(rx::xml_node<> *root_node) { ...@@ -83,7 +83,7 @@ void VasprunReader::extract_atom_types(rx::xml_node<> *root_node) {
} }
} }
void VasprunReader::extract_calculations(rx::xml_node<> *root_node) { void VaspVasprunReader::extract_calculations(rx::xml_node<> *root_node) {
for (auto calculation_node = root_node->first_node("calculation"); for (auto calculation_node = root_node->first_node("calculation");
calculation_node; calculation_node = calculation_node->next_sibling("calculation")) { calculation_node; calculation_node = calculation_node->next_sibling("calculation")) {
...@@ -108,7 +108,7 @@ void VasprunReader::extract_calculations(rx::xml_node<> *root_node) { ...@@ -108,7 +108,7 @@ void VasprunReader::extract_calculations(rx::xml_node<> *root_node) {
} }
} }
void VasprunReader::extract_total_energy(rx::xml_node<> *calculation_node) { void VaspVasprunReader::extract_total_energy(rx::xml_node<> *calculation_node) {
auto energy_node = calculation_node->first_node("energy"); auto energy_node = calculation_node->first_node("energy");
if (energy_node) { if (energy_node) {
for (auto energy_val_node = energy_node->first_node("i"); for (auto energy_val_node = energy_node->first_node("i");
...@@ -126,7 +126,7 @@ void VasprunReader::extract_total_energy(rx::xml_node<> *calculation_node) { ...@@ -126,7 +126,7 @@ void VasprunReader::extract_total_energy(rx::xml_node<> *calculation_node) {
} }
} }
void VasprunReader::extract_stress_tensor(rx::xml_node<> *calculation_node) { void VaspVasprunReader::extract_stress_tensor(rx::xml_node<> *calculation_node) {
auto varray_node = calculation_node->first_node("varray"); auto varray_node = calculation_node->first_node("varray");
while (varray_node) { while (varray_node) {
auto attribute = varray_node->first_attribute("name"); auto attribute = varray_node->first_attribute("name");
...@@ -152,7 +152,7 @@ void VasprunReader::extract_stress_tensor(rx::xml_node<> *calculation_node) { ...@@ -152,7 +152,7 @@ void VasprunReader::extract_stress_tensor(rx::xml_node<> *calculation_node) {
} }
} }
void VasprunReader::extract_basis_vectors_and_positions(rx::xml_node<> *structure_node) { void VaspVasprunReader::extract_basis_vectors_and_positions(rx::xml_node<> *structure_node) {
auto crystal_node = structure_node->first_node("crystal"); auto crystal_node = structure_node->first_node("crystal");
if (crystal_node) { if (crystal_node) {
auto basis_node = crystal_node->first_node("varray"); auto basis_node = crystal_node->first_node("varray");
...@@ -204,7 +204,7 @@ void VasprunReader::extract_basis_vectors_and_positions(rx::xml_node<> *structur ...@@ -204,7 +204,7 @@ void VasprunReader::extract_basis_vectors_and_positions(rx::xml_node<> *structur
} }
} }
void VasprunReader::extract_forces(rx::xml_node<> *calculation_node) { void VaspVasprunReader::extract_forces(rx::xml_node<> *calculation_node) {
auto forces_node = calculation_node->first_node("varray"); auto forces_node = calculation_node->first_node("varray");
while (forces_node) { while (forces_node) {
auto attribute = forces_node->first_attribute("name"); auto attribute = forces_node->first_attribute("name");
...@@ -229,7 +229,7 @@ void VasprunReader::extract_forces(rx::xml_node<> *calculation_node) { ...@@ -229,7 +229,7 @@ void VasprunReader::extract_forces(rx::xml_node<> *calculation_node) {
} }
} }
void VasprunReader::print_summary() const { void VaspVasprunReader::print_summary() const {
std::cout << stdb; std::cout << stdb;
} }
#include "catch2/catch.hpp" #include "catch2/catch.hpp"
#include "tadah/mlip/dataset_readers/castep_md_reader.h"
#include <tadah/mlip/structure_db.h> #include <tadah/mlip/structure_db.h>
#include <tadah/mlip/dataset_readers/outcar_reader.h> #include "tadah/mlip/dataset_readers/castep_md_reader.h"
#include <tadah/mlip/dataset_readers/vasprun_reader.h> #include "tadah/mlip/dataset_readers/castep_geom_reader.h"
#include <tadah/mlip/dataset_readers/vasp_outcar_reader.h>
#include <tadah/mlip/dataset_readers/vasp_vasprun_reader.h>
#include <filesystem> #include <filesystem>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -25,16 +26,18 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]") ...@@ -25,16 +26,18 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]")
std::string valid_outcar_dir = "./tests_data/valid_outcars"; std::string valid_outcar_dir = "./tests_data/valid_outcars";
std::string valid_vasprun_dir = "./tests_data/valid_vaspruns"; std::string valid_vasprun_dir = "./tests_data/valid_vaspruns";
std::string valid_castep_md_dir = "./tests_data/valid_castep_md"; std::string valid_castep_md_dir = "./tests_data/valid_castep_md";
std::string valid_castep_geom_dir = "./tests_data/valid_castep_geom";
std::vector<std::string> valid_outcar_files = get_all_files(valid_outcar_dir); std::vector<std::string> valid_outcar_files = get_all_files(valid_outcar_dir);
std::vector<std::string> valid_vasprun_files = get_all_files(valid_vasprun_dir); std::vector<std::string> valid_vasprun_files = get_all_files(valid_vasprun_dir);
std::vector<std::string> valid_castep_md_files = get_all_files(valid_castep_md_dir); std::vector<std::string> valid_castep_md_files = get_all_files(valid_castep_md_dir);
std::vector<std::string> valid_castep_geom_files = get_all_files(valid_castep_geom_dir);
SECTION("Valid OUTCAR datasets - Constructor 1") { SECTION("Valid OUTCAR datasets - Constructor 1") {
for (const auto& filename : valid_outcar_files) { for (const auto& filename : valid_outcar_files) {
StructureDB db; StructureDB db;
REQUIRE_NOTHROW(OutcarReader(db)); REQUIRE_NOTHROW(VaspOutcarReader(db));
OutcarReader reader(db); VaspOutcarReader reader(db);
REQUIRE_NOTHROW(reader.read_data(filename)); REQUIRE_NOTHROW(reader.read_data(filename));
REQUIRE_NOTHROW(reader.parse_data()); REQUIRE_NOTHROW(reader.parse_data());
...@@ -45,8 +48,8 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]") ...@@ -45,8 +48,8 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]")
SECTION("Valid OUTCAR datasets - Constructor 2") { SECTION("Valid OUTCAR datasets - Constructor 2") {
for (const auto& filename : valid_outcar_files) { for (const auto& filename : valid_outcar_files) {
StructureDB db; StructureDB db;
REQUIRE_NOTHROW(OutcarReader(db, filename)); REQUIRE_NOTHROW(VaspOutcarReader(db, filename));
OutcarReader reader(db, filename); VaspOutcarReader reader(db, filename);
REQUIRE_NOTHROW(reader.print_summary()); REQUIRE_NOTHROW(reader.print_summary());
// Additional checks to confirm data validity // Additional checks to confirm data validity
...@@ -56,8 +59,8 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]") ...@@ -56,8 +59,8 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]")
SECTION("Valid vasprun.xml datasets - Constructor 1") { SECTION("Valid vasprun.xml datasets - Constructor 1") {
for (const auto& filename : valid_vasprun_files) { for (const auto& filename : valid_vasprun_files) {
StructureDB db; StructureDB db;
REQUIRE_NOTHROW(VasprunReader(db)); REQUIRE_NOTHROW(VaspVasprunReader(db));
VasprunReader reader(db); VaspVasprunReader reader(db);
REQUIRE_NOTHROW(reader.read_data(filename)); REQUIRE_NOTHROW(reader.read_data(filename));
REQUIRE_NOTHROW(reader.parse_data()); REQUIRE_NOTHROW(reader.parse_data());
...@@ -69,8 +72,8 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]") ...@@ -69,8 +72,8 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]")
SECTION("Valid vasprun.xml datasets - Constructor 2") { SECTION("Valid vasprun.xml datasets - Constructor 2") {
for (const auto& filename : valid_vasprun_files) { for (const auto& filename : valid_vasprun_files) {
StructureDB db; StructureDB db;
REQUIRE_NOTHROW(VasprunReader(db,filename)); REQUIRE_NOTHROW(VaspVasprunReader(db,filename));
VasprunReader reader(db, filename); VaspVasprunReader reader(db, filename);
REQUIRE_NOTHROW(reader.print_summary()); REQUIRE_NOTHROW(reader.print_summary());
// Additional checks to confirm data validity // Additional checks to confirm data validity
...@@ -99,4 +102,27 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]") ...@@ -99,4 +102,27 @@ TEST_CASE("Dataset Readers process datasets in directories", "[DatasetReaders]")
// Additional checks to confirm data validity // Additional checks to confirm data validity
} }
} }
SECTION("Valid CASTEP .geom datasets - Constructor 1") {
for (const auto& filename : valid_castep_geom_files) {
StructureDB db;
REQUIRE_NOTHROW(CastepGeomReader(db));
CastepGeomReader reader(db);
REQUIRE_NOTHROW(reader.read_data(filename));
REQUIRE_NOTHROW(reader.parse_data());
REQUIRE_NOTHROW(reader.print_summary());
// Additional checks to confirm data validity
}
}
SECTION("Valid CASTEP .geom datasets - Constructor 2") {
for (const auto& filename : valid_castep_geom_files) {
StructureDB db;
REQUIRE_NOTHROW(CastepGeomReader(db, filename));
CastepGeomReader reader(db, filename);
REQUIRE_NOTHROW(reader.print_summary());
// Additional checks to confirm data validity
}
}
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment