diff --git a/src/basics/config/ConfigurationFile.cpp b/src/basics/config/ConfigurationFile.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eae1a92269723b71c09922b50af7364424a57b61 --- /dev/null +++ b/src/basics/config/ConfigurationFile.cpp @@ -0,0 +1,125 @@ +#include "ConfigurationFile.h" + + +#include <map> +#include <vector> +#include <sstream> +#include <string> +#include <fstream> +#include <iostream> +#include <stdlib.h> + +#include <basics/basics/utilities/UbException.h> + + +namespace vf::basics +{ + +void ConfigurationFile::clear() +{ + data.clear(); +} +////////////////////////////////////////////////////////////////////////// +bool ConfigurationFile::load(const std::string& file) +{ + std::ifstream inFile(file.c_str()); + + if (!inFile.good()) + { + UB_THROW(UbException(UB_EXARGS, "Cannot read configuration file "+file+"!")); + } + + while (inFile.good() && ! inFile.eof()) + { + std::string line; + getline(inFile, line); + + // filter out comments + if (!line.empty()) + { + size_t pos = line.find('#'); + + if (pos != std::string::npos) + { + line = line.substr(0, pos); + } + } + + // split line into key and value + if (!line.empty()) + { + size_t pos = line.find('='); + + if (pos != std::string::npos) + { + std::string key = trim(line.substr(0, pos)); + std::string value = trim(line.substr(pos + 1)); + + if (!key.empty() && !value.empty()) + { + data[key] = value; + } + } + } + } + + return true; +} +////////////////////////////////////////////////////////////////////////// +bool ConfigurationFile::contains(const std::string& key) const +{ + return data.find(key) != data.end(); +} +////////////////////////////////////////////////////////////////////////// +std::string ConfigurationFile::getString(const std::string& key) const +{ + std::map<std::string, std::string>::const_iterator iter = data.find(key); + + if (iter != data.end()) + { + std::string value = iter->second; + return value; + } + else + { + UB_THROW(UbException(UB_EXARGS, "The parameter \"" + key + "\" is missing!")); + } +} +////////////////////////////////////////////////////////////////////////// +std::string ConfigurationFile::trim(const std::string& str) +{ + size_t first = str.find_first_not_of(" \t\n\r"); + + if (first != std::string::npos) + { + size_t last = str.find_last_not_of(" \t\n\r"); + + return str.substr(first, last - first + 1); + } + else + { + return ""; + } +} +////////////////////////////////////////////////////////////////////////// +void ConfigurationFile::split(std::vector<std::string>& lst, const std::string& input, const std::string& separators, bool remove_empty) const +{ + std::ostringstream word; + for (size_t n = 0; n < input.size(); ++n) + { + if (std::string::npos == separators.find(input[n])) + word << input[n]; + else + { + if (!word.str().empty() || !remove_empty) + lst.push_back(word.str()); + word.str(""); + } + } + if (!word.str().empty() || !remove_empty) + lst.push_back(word.str()); +} +////////////////////////////////////////////////////////////////////////// + + +} diff --git a/src/basics/config/ConfigurationFile.hpp b/src/basics/config/ConfigurationFile.h similarity index 58% rename from src/basics/config/ConfigurationFile.hpp rename to src/basics/config/ConfigurationFile.h index f48161557fd16b9131162511ed8c447f844d50be..4f608faab7404357e325744f6bde596254a2a27a 100644 --- a/src/basics/config/ConfigurationFile.hpp +++ b/src/basics/config/ConfigurationFile.h @@ -82,96 +82,6 @@ private: }; -// ---------------------------------- -// method implementations -// ---------------------------------- - -void ConfigurationFile::clear() -{ - data.clear(); -} -////////////////////////////////////////////////////////////////////////// -bool ConfigurationFile::load(const std::string& file) -{ - std::ifstream inFile(file.c_str()); - - if (!inFile.good()) - { - UB_THROW(UbException(UB_EXARGS, "Cannot read configuration file "+file+"!")); - } - - while (inFile.good() && ! inFile.eof()) - { - std::string line; - getline(inFile, line); - - // filter out comments - if (!line.empty()) - { - size_t pos = line.find('#'); - - if (pos != std::string::npos) - { - line = line.substr(0, pos); - } - } - - // split line into key and value - if (!line.empty()) - { - size_t pos = line.find('='); - - if (pos != std::string::npos) - { - std::string key = trim(line.substr(0, pos)); - std::string value = trim(line.substr(pos + 1)); - - if (!key.empty() && !value.empty()) - { - data[key] = value; - } - } - } - } - - return true; -} -////////////////////////////////////////////////////////////////////////// -bool ConfigurationFile::contains(const std::string& key) const -{ - return data.find(key) != data.end(); -} -////////////////////////////////////////////////////////////////////////// -std::string ConfigurationFile::getString(const std::string& key) const -{ - std::map<std::string, std::string>::const_iterator iter = data.find(key); - - if (iter != data.end()) - { - std::string value = iter->second; - return value; - } - else - { - UB_THROW(UbException(UB_EXARGS, "The parameter \"" + key + "\" is missing!")); - } -} -////////////////////////////////////////////////////////////////////////// -std::string ConfigurationFile::trim(const std::string& str) -{ - size_t first = str.find_first_not_of(" \t\n\r"); - - if (first != std::string::npos) - { - size_t last = str.find_last_not_of(" \t\n\r"); - - return str.substr(first, last - first + 1); - } - else - { - return ""; - } -} ////////////////////////////////////////////////////////////////////////// template<class T> std::vector<T> ConfigurationFile::getVector(const std::string& key) const @@ -190,24 +100,6 @@ std::vector<T> ConfigurationFile::getVector(const std::string& key) const return v; } ////////////////////////////////////////////////////////////////////////// -void ConfigurationFile::split(std::vector<std::string>& lst, const std::string& input, const std::string& separators, bool remove_empty) const -{ - std::ostringstream word; - for (size_t n = 0; n < input.size(); ++n) - { - if (std::string::npos == separators.find(input[n])) - word << input[n]; - else - { - if (!word.str().empty() || !remove_empty) - lst.push_back(word.str()); - word.str(""); - } - } - if (!word.str().empty() || !remove_empty) - lst.push_back(word.str()); -} -////////////////////////////////////////////////////////////////////////// template<class T> T ConfigurationFile::fromString(const std::string& str) const { diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h index 64c8382cded3e48e343127f207259368a89e71fc..f5064398a6a2953c20f844be3db5865a16620e93 100644 --- a/src/cpu/VirtualFluids.h +++ b/src/cpu/VirtualFluids.h @@ -42,7 +42,7 @@ #include <basics/PointerDefinitions.h> -#include <basics/config/ConfigurationFile.hpp> +#include <basics/config/ConfigurationFile.h> #include <basics/container/CbArray2D.h> #include <basics/container/CbArray3D.h> diff --git a/src/gpu/VirtualFluids_GPU/Communication/Communicator.cpp b/src/gpu/VirtualFluids_GPU/Communication/Communicator.cpp index 7beae77cf8e8d6e8757df4b4e39160965c9052a6..32fd45109538101a35e253caff102c4f4df1a4a5 100644 --- a/src/gpu/VirtualFluids_GPU/Communication/Communicator.cpp +++ b/src/gpu/VirtualFluids_GPU/Communication/Communicator.cpp @@ -155,8 +155,8 @@ void Communicator::exchngDataGeo(int *sbuf_t, int *rbuf_t, int *sbuf_b, int *rbu MPI_Isend(sbuf_b, count, MPI_INT, nbrbottom, 0, comm1d, &request[3]); MPI_Waitall(4, request, status); } -int Communicator::getPID() { return PID; } -int Communicator::getNummberOfProcess() { return numprocs; } +int Communicator::getPID() const { return PID; } +int Communicator::getNummberOfProcess() const { return numprocs; } int Communicator::getNeighbourTop() { return nbrtop; } int Communicator::getNeighbourBottom() { return nbrbottom; } MPI_Comm Communicator::getCommunicator() { return comm1d; } diff --git a/src/gpu/VirtualFluids_GPU/Communication/Communicator.h b/src/gpu/VirtualFluids_GPU/Communication/Communicator.h index b67cdf264dd6fc9a1af9b9cbad708f47ea5feaf3..72c4a136ece03098c10ea65493ba02a0109ed95d 100644 --- a/src/gpu/VirtualFluids_GPU/Communication/Communicator.h +++ b/src/gpu/VirtualFluids_GPU/Communication/Communicator.h @@ -36,8 +36,8 @@ public: void exchngTopToBottom(float* sbuf, float* rbuf, int count); void waitAll(); void distributeGeometry(unsigned int* dataRoot, unsigned int* dataNode, int dataSizePerNode); - int getPID(); - int getNummberOfProcess(); + int getPID() const; + int getNummberOfProcess() const; int getNeighbourTop(); int getNeighbourBottom(); void exchngData(float* sbuf_t, float* rbuf_t, float* sbuf_b, float* rbuf_b, int count); diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp index 0446608cfc5d200efd21e95deac5a5eaf395d102..5c9cccec373d67163ebd4fcd6fe2735c4b4b7779 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp @@ -23,6 +23,8 @@ //#endif //lib for windows Ws2_32.lib +#include <basics/config/ConfigurationFile.h> + SPtr<Parameter> Parameter::make() { @@ -37,6 +39,24 @@ SPtr<Parameter> Parameter::make(SPtr<ConfigData> configData, vf::gpu::Communicat Parameter::Parameter() { } + +Parameter::Parameter(const vf::gpu::Communicator& comm) +{ + ic.numprocs = comm.getNummberOfProcess(); + ic.myid = comm.getPID(); +} + +Parameter::Parameter(const vf::basics::ConfigurationFile& configData, + const vf::gpu::Communicator& comm) : + Parameter(comm) + +{ + if (configData.contains("NumberOfDevices")) + ic.maxdev = configData.getValue<int>("NumberOfDevices"); + else + ic.maxdev = 1; +} + Parameter::Parameter(SPtr<ConfigData> configData, vf::gpu::Communicator* comm) { ////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h index ccb13e83bcc68b9c9d85725666a02ea1c23ec293..e3ddb717c3e82769d2094c6103d7f16260133594 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h @@ -32,10 +32,16 @@ namespace gpu { class Communicator; } + +namespace basics +{ +class ConfigurationFile; +} } //struct -struct ParameterStruct{ +struct ParameterStruct +{ bool evenOrOdd; unsigned int numberofthreads; @@ -290,6 +296,8 @@ struct ParameterStruct{ class VIRTUALFLUIDS_GPU_EXPORT Parameter { public: + Parameter(const vf::gpu::Communicator& comm); + Parameter(const vf::basics::ConfigurationFile& configData, const vf::gpu::Communicator& comm); //////////////////////////////////////////////////////////////////////////// ////really ugly...should be in private... //Parameter();