diff --git a/runtime/pairs.hpp b/runtime/pairs.hpp new file mode 100644 index 0000000000000000000000000000000000000000..6a356cb30566e4a284774d51726ff3c0bdf63c48 --- /dev/null +++ b/runtime/pairs.hpp @@ -0,0 +1,68 @@ +#include <iostream> +#include <vector> + +#define PAIRS_ASSERT(a) + +namespace pairs { + +typedef int property_t; +typedef int layout_t; + +class PairsSim { + PairsSim() : {} + +public: + Property getProperty(property_t id) { + return std::find_if(properties.begin(), properties.end(), [id](Property p) { return p.getId() == id; }); + } + + Property getPropertyByName(std::string name) { + return std::find_if(properties.begin(), properties.end(), [name](Property p) { return p.getName() == name; }); + } + + VectorPtr getFloatPropertyMutablePtr(property_t property) { + return static_cast<VectorPtr>(getProperty(property).getPointer()); + } + + int *getIntegerPropertyMutablePtr(property_t property) { + return static_cast<int *>(getProperty(property).getPointer()); + } + + double *getFloatPropertyMutablePtr(property_t property) { + return static_cast<double *>(getProperty(property).getPointer()); + } + +private: + std::vector<Property> properties; +}; + +class Property { + Property(property_t id_, std::string name_) : id(id_), name(name_), layout(-1), ptr(nullptr) {} + Property(property_t id_, std::string name_, layout_t layout_) : id(id_), name(name_), layout(layout_), ptr(nullptr) {} + Property(property_t id_, std::string name_, void *ptr_) : id(id_), name(name_), layout(-1), ptr(ptr_) {} + Property(property_t id_, std::string name_, layout_t layout_, void *ptr_) : id(id_), name(name_), layout(layout_), ptr(ptr_) {} + +public: + property_t getId() { return id; } + std::string getName() { return name; } + void *getPointer() { return ptr; } + void setPointer(void *ptr_) { ptr = ptr_; } + +private: + property_t id; + layout_t layout; + std::string name; + void *ptr; +}; + +template<typename real_t> +class Vector3 { + Vector3() : x((real_t) 0.0), y((real_t) 0.0), z((real_t) 0.0) : {} + Vector3(real_t v) : x(v), y(v), z(v) : {} + Vector3(real_t x_, real_t y_, real_t z_) : x(x_), y(y_), z(z_) {} + +private: + real_t x, y, z; +}; + +} diff --git a/runtime/read_from_file.hpp b/runtime/read_from_file.hpp new file mode 100644 index 0000000000000000000000000000000000000000..b1bb7e7745d03e9ea297195bdecc2619839a4b94 --- /dev/null +++ b/runtime/read_from_file.hpp @@ -0,0 +1,58 @@ +#include <stdio.h> +//--- +#include "pairs.hpp" + +namespace pairs { + +size_t read_particle_data(PairsSim *ps, const char *filename, property_t properties[], size_t nprops) { + std::ifstream in_file(filename); + std::string line; + size_t n = 0; + + if(in_file.is_open()) { + while(getline(in_file, line)) { + int p = 0; + char *in0 = strtok(line, ","); + while(in0 != NULL) { + PAIRS_ASSERT(p < nprops); + prop_type = ps->getPropertyType(p); + + switch(prop_type) { + case PROPERTY_TYPE_VECTOR: + auto vector_ptr = ps->getVectorPropertyMutablePtr(p); + char *in1 = strtok(NULL, ","); + PAIRS_ASSERT(in1 != NULL); + char *in2 = strtok(NULL, ","); + PAIRS_ASSERT(in2 != NULL); + vector_ptr[n] = Vector3(std::stod(in0), std::stod(in1), std::stod(in2)); + break; + + case PROPERTY_TYPE_INTEGER: + auto int_ptr = ps->getIntegerPropertyMutablePtr(p); + int_ptr[n] = std::stoi(in0); + break; + + case PROPERTY_TYPE_FLOAT: + auto float_ptr = ps->getFloatPropertyMutablePtr(p); + float_ptr[n] = std::stod(in0); + break; + + default: + fprintf(stderr, "read_particle_data(): Invalid property type!"); + return -1; + } + + in0 = strtok(NULL, ","); + p++; + } + + n++; + } + + in_file.close(); + } + + return n; +} + +}