From 6298206323142e4160efcc71a2be9ddb742e1c13 Mon Sep 17 00:00:00 2001
From: peters <peters@irmb.tu-bs.de>
Date: Fri, 11 Jun 2021 12:15:14 +0200
Subject: [PATCH] Add new constrcutor to parameter. WIP

---
 src/basics/config/ConfigurationFile.cpp       | 125 ++++++++++++++++++
 ...figurationFile.hpp => ConfigurationFile.h} | 108 ---------------
 src/cpu/VirtualFluids.h                       |   2 +-
 .../Communication/Communicator.cpp            |   4 +-
 .../Communication/Communicator.h              |   4 +-
 .../VirtualFluids_GPU/Parameter/Parameter.cpp |  20 +++
 .../VirtualFluids_GPU/Parameter/Parameter.h   |  10 +-
 7 files changed, 159 insertions(+), 114 deletions(-)
 create mode 100644 src/basics/config/ConfigurationFile.cpp
 rename src/basics/config/{ConfigurationFile.hpp => ConfigurationFile.h} (58%)

diff --git a/src/basics/config/ConfigurationFile.cpp b/src/basics/config/ConfigurationFile.cpp
new file mode 100644
index 000000000..eae1a9226
--- /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 f48161557..4f608faab 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 64c8382cd..f5064398a 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 7beae77cf..32fd45109 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 b67cdf264..72c4a136e 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 0446608cf..5c9cccec3 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 ccb13e83b..e3ddb717c 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();
-- 
GitLab