From 296626d7b25dd3971a4805a16f9b62eee3390846 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Sch=C3=B6nherr?= <schoen@irmb.tu-bs.de>
Date: Tue, 5 Mar 2019 22:56:04 +0100
Subject: [PATCH] add some classes to get flexible config files

---
 src/Core/Input/ConfigData/ConfigData.h        |  167 +++
 src/Core/Input/ConfigData/ConfigDataImp.cpp   | 1271 +++++++++++++++++
 src/Core/Input/ConfigData/ConfigDataImp.h     |  405 ++++++
 src/Core/Input/ConfigData/package.include     |    0
 .../ConfigFileReader/ConfigFileReader.cpp     |  265 ++++
 .../Input/ConfigFileReader/ConfigFileReader.h |   21 +
 .../Input/ConfigFileReader/package.include    |    0
 src/VirtualFluids_GPU/Parameter/Parameter.cpp |  502 ++++++-
 src/VirtualFluids_GPU/Parameter/Parameter.h   |    9 +-
 targets/apps/LBM/Basel/main.cpp               |  253 +---
 targets/apps/LBM/TGV_3D/TGV_3D.cpp            |  263 +---
 targets/apps/LBM/lbmTest/main.cpp             |    2 +-
 targets/apps/LBM/metisTest/main.cpp           |    2 +-
 13 files changed, 2676 insertions(+), 484 deletions(-)
 create mode 100644 src/Core/Input/ConfigData/ConfigData.h
 create mode 100644 src/Core/Input/ConfigData/ConfigDataImp.cpp
 create mode 100644 src/Core/Input/ConfigData/ConfigDataImp.h
 create mode 100644 src/Core/Input/ConfigData/package.include
 create mode 100644 src/Core/Input/ConfigFileReader/ConfigFileReader.cpp
 create mode 100644 src/Core/Input/ConfigFileReader/ConfigFileReader.h
 create mode 100644 src/Core/Input/ConfigFileReader/package.include

diff --git a/src/Core/Input/ConfigData/ConfigData.h b/src/Core/Input/ConfigData/ConfigData.h
new file mode 100644
index 000000000..36351cf75
--- /dev/null
+++ b/src/Core/Input/ConfigData/ConfigData.h
@@ -0,0 +1,167 @@
+#ifndef CONFIGDATA_H
+#define CONFIGDATA_H
+
+#include "../../DataTypes.h"
+
+#include <memory>
+#include <vector>
+
+class ConfigData
+{
+public:
+	virtual real getViscosity() = 0;
+	virtual uint getNumberOfDevices() = 0;
+	virtual std::vector<uint> getDevices() = 0;
+	virtual std::string getOutputPath() = 0;
+	virtual std::string getPrefix() = 0;
+	virtual std::string getGridPath() = 0;
+	virtual bool getPrintOutputFiles() = 0;
+	virtual bool getGeometryValues() = 0;
+	virtual bool getCalc2ndOrderMoments() = 0;
+	virtual bool getCalc3rdOrderMoments() = 0;
+	virtual bool getCalcHighOrderMoments() = 0;
+	virtual bool getReadGeo() = 0;
+	virtual bool getCalcMedian() = 0;
+	virtual bool getConcFile() = 0;
+	virtual bool getUseMeasurePoints() = 0;
+	virtual bool getUseWale() = 0;
+	virtual bool getSimulatePorousMedia() = 0;
+	virtual uint getD3Qxx() = 0;
+	virtual uint getTEnd() = 0;
+	virtual uint getTOut() = 0;
+	virtual uint getTStartOut() = 0;
+	virtual uint getTimeCalcMedStart() = 0;
+	virtual uint getTimeCalcMedEnd() = 0;
+	virtual uint getPressInID() = 0;
+	virtual uint getPressOutID() = 0;
+	virtual uint getPressInZ() = 0;
+	virtual uint getPressOutZ() = 0;
+	virtual bool getDiffOn() = 0;
+	virtual uint getDiffMod() = 0;
+	virtual real getDiffusivity() = 0;
+	virtual real getTemperatureInit() = 0;
+	virtual real getTemperatureBC() = 0;
+	virtual real getVelocity() = 0;
+	virtual real getViscosityRatio() = 0;
+	virtual real getVelocityRatio() = 0;
+	virtual real getDensityRatio() = 0;
+	virtual real getPressRatio() = 0;
+	virtual real getRealX() = 0;
+	virtual real getRealY() = 0;
+	virtual real getFactorPressBC() = 0;
+	virtual std::string getGeometryFileC() = 0;
+	virtual std::string getGeometryFileM() = 0;
+	virtual std::string getGeometryFileF() = 0;
+	virtual uint getClockCycleForMP() = 0;
+	virtual uint getTimestepForMP() = 0;
+	virtual real getForcingX() = 0;
+	virtual real getForcingY() = 0;
+	virtual real getForcingZ() = 0;
+	virtual bool getCalcParticles() = 0;
+	virtual int getParticleBasicLevel() = 0;
+	virtual int getParticleInitLevel() = 0;
+	virtual int getNumberOfParticles() = 0;
+	virtual real getStartXHotWall() = 0;
+	virtual real getEndXHotWall() = 0;
+	virtual std::vector<std::string> getPossNeighborFilesX() = 0;
+	virtual std::vector<std::string> getPossNeighborFilesY() = 0;
+	virtual std::vector<std::string> getPossNeighborFilesZ() = 0;
+	//virtual std::vector<std::string> getPossNeighborFilesX() = 0;
+	//virtual std::vector<std::string> getPossNeighborFilesY() = 0;
+	//virtual std::vector<std::string> getPossNeighborFilesZ() = 0;
+	virtual int getTimeDoCheckPoint() = 0;
+	virtual int getTimeDoRestart() = 0;
+	virtual bool getDoCheckPoint() = 0;
+	virtual bool getDoRestart() = 0;
+	virtual uint getMaxLevel() = 0;
+	virtual std::vector<int> getGridX() = 0;
+	virtual std::vector<int> getGridY() = 0;
+	virtual std::vector<int> getGridZ() = 0;
+	virtual std::vector<int> getDistX() = 0;
+	virtual std::vector<int> getDistY() = 0;
+	virtual std::vector<int> getDistZ() = 0;
+	virtual std::vector<bool> getNeedInterface() = 0;
+	virtual std::string getMainKernel() = 0;
+	virtual bool getMultiKernelOn() = 0;
+	virtual std::vector<int> getMultiKernelLevel() = 0;
+	virtual std::vector<std::string>getMultiKernelName() = 0;
+
+	virtual bool isViscosityInConfigFile() = 0;
+	virtual bool isNumberOfDevicesInConfigFile() = 0;
+	virtual bool isDevicesInConfigFile() = 0;
+	virtual bool isOutputPathInConfigFile() = 0;
+	virtual bool isPrefixInConfigFile() = 0;
+	virtual bool isGridPathInConfigFile() = 0;
+	virtual bool isPrintOutputFilesInConfigFile() = 0;
+	virtual bool isGeometryValuesInConfigFile() = 0;
+	virtual bool isCalc2ndOrderMomentsInConfigFile() = 0;
+	virtual bool isCalc3rdOrderMomentsInConfigFile() = 0;
+	virtual bool isCalcHighOrderMomentsInConfigFile() = 0;
+	virtual bool isReadGeoInConfigFile() = 0;
+	virtual bool isCalcMedianInConfigFile() = 0;
+	virtual bool isConcFileInConfigFile() = 0;
+	virtual bool isUseMeasurePointsInConfigFile() = 0;
+	virtual bool isUseWaleInConfigFile() = 0;
+	virtual bool isSimulatePorousMediaInConfigFile() = 0;
+	virtual bool isD3QxxInConfigFile() = 0;
+	virtual bool isTEndInConfigFile() = 0;
+	virtual bool isTOutInConfigFile() = 0;
+	virtual bool isTStartOutInConfigFile() = 0;
+	virtual bool isTimeCalcMedStartInConfigFile() = 0;
+	virtual bool isTimeCalcMedEndInConfigFile() = 0;
+	virtual bool isPressInIDInConfigFile() = 0;
+	virtual bool isPressOutIDInConfigFile() = 0;
+	virtual bool isPressInZInConfigFile() = 0;
+	virtual bool isPressOutZInConfigFile() = 0;
+	virtual bool isDiffOnInConfigFile() = 0;
+	virtual bool isDiffModInConfigFile() = 0;
+	virtual bool isDiffusivityInConfigFile() = 0;
+	virtual bool isTemperatureInitInConfigFile() = 0;
+	virtual bool isTemperatureBCInConfigFile() = 0;
+	//virtual bool isViscosityInConfigFile() = 0;
+	virtual bool isVelocityInConfigFile() = 0;
+	virtual bool isViscosityRatioInConfigFile() = 0;
+	virtual bool isVelocityRatioInConfigFile() = 0;
+	virtual bool isDensityRatioInConfigFile() = 0;
+	virtual bool isPressRatioInConfigFile() = 0;
+	virtual bool isRealXInConfigFile() = 0;
+	virtual bool isRealYInConfigFile() = 0;
+	virtual bool isFactorPressBCInConfigFile() = 0;
+	virtual bool isGeometryFileCInConfigFile() = 0;
+	virtual bool isGeometryFileMInConfigFile() = 0;
+	virtual bool isGeometryFileFInConfigFile() = 0;
+	virtual bool isClockCycleForMPInConfigFile() = 0;
+	virtual bool isTimestepForMPInConfigFile() = 0;
+	virtual bool isForcingXInConfigFile() = 0;
+	virtual bool isForcingYInConfigFile() = 0;
+	virtual bool isForcingZInConfigFile() = 0;
+	virtual bool isCalcParticlesInConfigFile() = 0;
+	virtual bool isParticleBasicLevelInConfigFile() = 0;
+	virtual bool isParticleInitLevelInConfigFile() = 0;
+	virtual bool isNumberOfParticlesInConfigFile() = 0;
+	virtual bool isNeighborWSBInConfigFile() = 0;
+	virtual bool isStartXHotWallInConfigFile() = 0;
+	virtual bool isEndXHotWallInConfigFile() = 0;
+	virtual bool isPossNeighborFilesXInConfigFile() = 0;
+	virtual bool isPossNeighborFilesYInConfigFile() = 0;
+	virtual bool isPossNeighborFilesZInConfigFile() = 0;
+	virtual bool isTimeDoCheckPointInConfigFile() = 0;
+	virtual bool isTimeDoRestartInConfigFile() = 0;
+	virtual bool isDoCheckPointInConfigFile() = 0;
+	virtual bool isDoRestartInConfigFile() = 0;
+	virtual bool isMaxLevelInConfigFile() = 0;
+	virtual bool isGridXInConfigFile() = 0;
+	virtual bool isGridYInConfigFile() = 0;
+	virtual bool isGridZInConfigFile() = 0;
+	virtual bool isDistXInConfigFile() = 0;
+	virtual bool isDistYInConfigFile() = 0;
+	virtual bool isDistZInConfigFile() = 0;
+	virtual bool isNeedInterfaceInConfigFile() = 0;
+	virtual bool isMainKernelInConfigFile() = 0;
+	virtual bool isMultiKernelOnInConfigFile() = 0;
+	virtual bool isMultiKernelLevelInConfigFile() = 0;
+	virtual bool isMultiKernelNameInConfigFile() = 0;
+
+
+};
+#endif
diff --git a/src/Core/Input/ConfigData/ConfigDataImp.cpp b/src/Core/Input/ConfigData/ConfigDataImp.cpp
new file mode 100644
index 000000000..644230ebc
--- /dev/null
+++ b/src/Core/Input/ConfigData/ConfigDataImp.cpp
@@ -0,0 +1,1271 @@
+#include "ConfigDataImp.h"
+
+
+std::shared_ptr<ConfigDataImp> ConfigDataImp::getNewInstance()
+{
+	return std::shared_ptr<ConfigDataImp>(new ConfigDataImp());
+}
+
+ConfigDataImp::ConfigDataImp()
+{
+	this->isViscosity=false;
+	this->isNumberOfDevices=false;
+	this->isDevices=false;
+	this->isOutputPath=false;
+	this->isPrefix=false;
+	this->isGridPath=false;
+	this->isPrintOutputFiles=false;
+	this->isGeometryValues=false;
+	this->isCalc2ndOrderMoments=false;
+	this->isCalc3rdOrderMoments=false;
+	this->isCalcHighOrderMoments=false;
+	this->isReadGeo=false;
+	this->isCalcMedian=false;
+	this->isConcFile=false;
+	this->isUseMeasurePoints=false;
+	this->isUseWale=false;
+	this->isSimulatePorousMedia=false;
+	this->isD3Qxx=false;
+	this->isTEnd=false;
+	this->isTOut=false;
+	this->isTStartOut=false;
+	this->isTimeCalcMedStart=false;
+	this->isTimeCalcMedEnd=false;
+	this->isPressInID=false;
+	this->isPressOutID=false;
+	this->isPressInZ=false;
+	this->isPressOutZ=false;
+	this->isDiffOn=false;
+	this->isDiffMod=false;
+	this->isDiffusivity=false;
+	this->isTemperatureInit=false;
+	this->isTemperatureBC=false;
+	this->isVelocity=false;
+	this->isViscosityRatio=false;
+	this->isVelocityRatio=false;
+	this->isDensityRatio=false;
+	this->isPressRatio=false;
+	this->isRealX=false;
+	this->isRealY=false;
+	this->isFactorPressBC=false;
+	this->isGeometryFileC=false;
+	this->isGeometryFileM=false;
+	this->isGeometryFileF=false;
+	this->isClockCycleForMP=false;
+	this->isTimestepForMP=false;
+	this->isForcingX=false;
+	this->isForcingY=false;
+	this->isForcingZ=false;
+	this->isCalcParticles=false;
+	this->isParticleBasicLevel=false;
+	this->isParticleInitLevel=false;
+	this->isNumberOfParticles=false;
+	this->isNeighborWSB=false;
+	this->isStartXHotWall=false;
+	this->isEndXHotWall=false;
+	this->isPossNeighborFilesX=false;
+	this->isPossNeighborFilesY=false;
+	this->isPossNeighborFilesZ=false;
+	this->isTimeDoCheckPoint=false;
+	this->isTimeDoRestart=false;
+	this->isDoCheckPoint=false;
+	this->isDoRestart=false;
+	this->isMaxLevel=false;
+	this->isGridX=false;
+	this->isGridY=false;
+	this->isGridZ=false;
+	this->isDistX=false;
+	this->isDistY=false;
+	this->isDistZ=false;
+	this->isNeedInterface=false;
+	this->isMainKernel=false;
+	this->isMultiKernelOn=false;
+	this->isMultiKernelLevel=false;
+	this->isMultiKernelName=false;
+
+}
+
+ConfigDataImp::~ConfigDataImp(void)
+{
+}
+
+real ConfigDataImp::getViscosity()
+{
+	return this->viscosity;
+}
+
+uint ConfigDataImp::getNumberOfDevices()
+{
+	return this->numberOfDevices;
+}
+
+std::vector<uint> ConfigDataImp::getDevices()
+{
+	return this->devices;
+}
+
+std::string ConfigDataImp::getOutputPath()
+{
+	return this->outputPath;
+}
+
+std::string ConfigDataImp::getPrefix()
+{
+	return this->prefix;
+}
+
+std::string ConfigDataImp::getGridPath()
+{
+	return this->gridPath;
+}
+
+bool ConfigDataImp::getPrintOutputFiles()
+{
+	return this->printOutputFiles;
+}
+
+bool ConfigDataImp::getGeometryValues()
+{
+	return this->geometryValues;
+}
+
+bool ConfigDataImp::getCalc2ndOrderMoments()
+{
+	return this->calc2ndOrderMoments;
+}
+
+bool ConfigDataImp::getCalc3rdOrderMoments()
+{
+	return this->calc3rdOrderMoments;
+}
+
+bool ConfigDataImp::getCalcHighOrderMoments()
+{
+	return this->calcHighOrderMoments;
+}
+
+bool ConfigDataImp::getReadGeo()
+{
+	return this->readGeo;
+}
+
+bool ConfigDataImp::getCalcMedian()
+{
+	return this->calcMedian;
+}
+
+bool ConfigDataImp::getConcFile()
+{
+	return this->concFile;
+}
+
+bool ConfigDataImp::getUseMeasurePoints()
+{
+	return this->useMeasurePoints;
+}
+
+bool ConfigDataImp::getUseWale()
+{
+	return this->useWale;
+}
+
+bool ConfigDataImp::getSimulatePorousMedia()
+{
+	return this->simulatePorousMedia;
+}
+
+uint ConfigDataImp::getD3Qxx()
+{
+	return this->d3Qxx;
+}
+
+uint ConfigDataImp::getTEnd()
+{
+	return this->tEnd;
+}
+
+uint ConfigDataImp::getTOut()
+{
+	return this->tOut;
+}
+
+uint ConfigDataImp::getTStartOut()
+{
+	return this->tStartOut;
+}
+
+uint ConfigDataImp::getTimeCalcMedStart()
+{
+	return this->timeCalcMedStart;
+}
+
+uint ConfigDataImp::getTimeCalcMedEnd()
+{
+	return this->timeCalcMedEnd;
+}
+
+uint ConfigDataImp::getPressInID()
+{
+	return this->pressInID;
+}
+
+uint ConfigDataImp::getPressOutID()
+{
+	return this->pressOutID;
+}
+
+uint ConfigDataImp::getPressInZ()
+{
+	return this->pressInZ;
+}
+
+uint ConfigDataImp::getPressOutZ()
+{
+	return this->pressOutZ;
+}
+
+bool ConfigDataImp::getDiffOn()
+{
+	return this->diffOn;
+}
+
+uint ConfigDataImp::getDiffMod()
+{
+	return this->diffMod;
+}
+
+real ConfigDataImp::getDiffusivity()
+{
+	return this->diffusivity;
+}
+
+real ConfigDataImp::getTemperatureInit()
+{
+	return this->temperatureInit;
+}
+
+real ConfigDataImp::getTemperatureBC()
+{
+	return this->temperatureBC;
+}
+
+real ConfigDataImp::getVelocity()
+{
+	return this->velocity;
+}
+
+real ConfigDataImp::getViscosityRatio()
+{
+	return this->viscosityRatio;
+}
+
+real ConfigDataImp::getVelocityRatio()
+{
+	return this->velocityRatio;
+}
+
+real ConfigDataImp::getDensityRatio()
+{
+	return this->densityRatio;
+}
+
+real ConfigDataImp::getPressRatio()
+{
+	return this->pressRatio;
+}
+
+real ConfigDataImp::getRealX()
+{
+	return this->realX;
+}
+
+real ConfigDataImp::getRealY()
+{
+	return this->realY;
+}
+
+real ConfigDataImp::getFactorPressBC()
+{
+	return this->factorPressBC;
+}
+
+std::string ConfigDataImp::getGeometryFileC()
+{
+	return this->geometryFileC;
+}
+
+std::string ConfigDataImp::getGeometryFileM()
+{
+	return this->geometryFileM;
+}
+
+std::string ConfigDataImp::getGeometryFileF()
+{
+	return this->geometryFileF;
+}
+
+uint ConfigDataImp::getClockCycleForMP()
+{
+	return this->clockCycleForMP;
+}
+
+uint ConfigDataImp::getTimestepForMP()
+{
+	return this->timestepForMP;
+}
+
+real ConfigDataImp::getForcingX()
+{
+	return this->forcingX;
+}
+
+real ConfigDataImp::getForcingY()
+{
+	return this->forcingY;
+}
+
+real ConfigDataImp::getForcingZ()
+{
+	return this->forcingZ;
+}
+
+bool ConfigDataImp::getCalcParticles()
+{
+	return this->calcParticles;
+}
+
+int ConfigDataImp::getParticleBasicLevel()
+{
+	return this->particleBasicLevel;
+}
+
+int ConfigDataImp::getParticleInitLevel()
+{
+	return this->particleInitLevel;
+}
+
+int ConfigDataImp::getNumberOfParticles()
+{
+	return this->numberOfParticles;
+}
+
+real ConfigDataImp::getStartXHotWall()
+{
+	return this->startXHotWall;
+}
+
+real ConfigDataImp::getEndXHotWall()
+{
+	return this->endXHotWall;
+}
+
+std::vector<std::string> ConfigDataImp::getPossNeighborFilesX()
+{
+	return this->possNeighborFilesX;
+}
+
+std::vector<std::string> ConfigDataImp::getPossNeighborFilesY()
+{
+	return this->possNeighborFilesY;
+}
+
+std::vector<std::string> ConfigDataImp::getPossNeighborFilesZ()
+{
+	return this->possNeighborFilesZ;
+}
+
+int ConfigDataImp::getTimeDoCheckPoint()
+{
+	return this->timeDoCheckPoint;
+}
+
+int ConfigDataImp::getTimeDoRestart()
+{
+	return this->timeDoRestart;
+}
+
+bool ConfigDataImp::getDoCheckPoint()
+{
+	return this->doCheckPoint;
+}
+
+bool ConfigDataImp::getDoRestart()
+{
+	return this->doRestart;
+}
+
+uint ConfigDataImp::getMaxLevel()
+{
+	return this->maxLevel;
+}
+
+std::vector<int> ConfigDataImp::getGridX()
+{
+	return this->gridX;
+}
+
+std::vector<int> ConfigDataImp::getGridY()
+{
+	return this->gridY;
+}
+
+std::vector<int> ConfigDataImp::getGridZ()
+{
+	return this->gridZ;
+}
+
+std::vector<int> ConfigDataImp::getDistX()
+{
+	return this->distX;
+}
+
+std::vector<int> ConfigDataImp::getDistY()
+{
+	return this->distY;
+}
+
+std::vector<int> ConfigDataImp::getDistZ()
+{
+	return this->distZ;
+}
+
+std::vector<bool> ConfigDataImp::getNeedInterface()
+{
+	return this->needInterface;
+}
+
+std::string ConfigDataImp::getMainKernel()
+{
+	return this->mainKernel;
+}
+
+bool ConfigDataImp::getMultiKernelOn()
+{
+	return this->multiKernelOn;
+}
+
+std::vector<int> ConfigDataImp::getMultiKernelLevel()
+{
+	return this->multiKernelLevel;
+}
+
+std::vector<std::string> ConfigDataImp::getMultiKernelName()
+{
+	return this->multiKernelName;
+}
+
+void ConfigDataImp::setViscosity(real viscosity)
+{
+	this->viscosity = viscosity;
+	this->isViscosity = true;
+}
+
+void ConfigDataImp::setNumberOfDevices(uint numberOfDevices)
+{
+	this->numberOfDevices = numberOfDevices;
+	this->isNumberOfDevices = true;
+}
+
+void ConfigDataImp::setDevices(std::vector<uint> devices)
+{
+	this->devices = devices;
+	this->isDevices = true;
+}
+
+void ConfigDataImp::setOutputPath(std::string outputPath)
+{
+	this->outputPath = outputPath;
+	this->isOutputPath = true;
+}
+
+void ConfigDataImp::setPrefix(std::string prefix)
+{
+	this->prefix = prefix;
+	this->isPrefix = true;
+}
+
+void ConfigDataImp::setGridPath(std::string gridPath)
+{
+	this->gridPath = gridPath;
+	this->isGridPath = true;
+}
+
+void ConfigDataImp::setPrintOutputFiles(bool printOutputFiles)
+{
+	this->printOutputFiles = printOutputFiles;
+	this->isPrintOutputFiles = true;
+}
+
+void ConfigDataImp::setGeometryValues(bool geometryValues)
+{
+	this->geometryValues = geometryValues;
+	this->isGeometryValues = true;
+}
+
+void ConfigDataImp::setCalc2ndOrderMoments(bool calc2ndOrderMoments)
+{
+	this->calc2ndOrderMoments = calc2ndOrderMoments;
+	this->isCalc2ndOrderMoments = true;
+}
+
+void ConfigDataImp::setCalc3rdOrderMoments(bool calc3rdOrderMoments)
+{
+	this->calc3rdOrderMoments = calc3rdOrderMoments;
+	this->isCalc3rdOrderMoments = true;
+}
+
+void ConfigDataImp::setCalcHighOrderMoments(bool calcHighOrderMoments)
+{
+	this->calcHighOrderMoments = calcHighOrderMoments;
+	this->isCalcHighOrderMoments = true;
+}
+
+void ConfigDataImp::setReadGeo(bool readGeo)
+{
+	this->readGeo = readGeo;
+	this->isReadGeo = true;
+}
+
+void ConfigDataImp::setCalcMedian(bool calcMedian)
+{
+	this->calcMedian = calcMedian;
+	this->isCalcMedian = true;
+}
+
+void ConfigDataImp::setConcFile(bool concFile)
+{
+	this->concFile = concFile;
+	this->isConcFile = true;
+}
+
+void ConfigDataImp::setUseMeasurePoints(bool useMeasurePoints)
+{
+	this->useMeasurePoints = useMeasurePoints;
+	this->isUseMeasurePoints = true;
+}
+
+void ConfigDataImp::setUseWale(bool useWale)
+{
+	this->useWale = useWale;
+	this->isUseWale = true;
+}
+
+void ConfigDataImp::setSimulatePorousMedia(bool simulatePorousMedia)
+{
+	this->simulatePorousMedia = simulatePorousMedia;
+	this->isSimulatePorousMedia = true;
+}
+
+void ConfigDataImp::setD3Qxx(uint d3Qxx)
+{
+	this->d3Qxx = d3Qxx;
+	this->isD3Qxx = true;
+}
+
+void ConfigDataImp::setTEnd(uint tEnd)
+{
+	this->tEnd = tEnd;
+	this->isTEnd = true;
+}
+
+void ConfigDataImp::setTOut(uint tOut)
+{
+	this->tOut = tOut;
+	this->isTOut = true;
+}
+
+void ConfigDataImp::setTStartOut(uint tStartOut)
+{
+	this->tStartOut = tStartOut;
+	this->isTStartOut = true;
+}
+
+void ConfigDataImp::setTimeCalcMedStart(uint timeCalcMedStart)
+{
+	this->timeCalcMedStart = timeCalcMedStart;
+	this->isTimeCalcMedStart = true;
+}
+
+void ConfigDataImp::setTimeCalcMedEnd(uint timeCalcMedEnd)
+{
+	this->timeCalcMedEnd = timeCalcMedEnd;
+	this->isTimeCalcMedEnd = true;
+}
+
+void ConfigDataImp::setPressInID(uint pressInID)
+{
+	this->pressInID = pressInID;
+	this->isPressInID = true;
+}
+
+void ConfigDataImp::setPressOutID(uint pressOutID)
+{
+	this->pressOutID = pressOutID;
+	this->isPressOutID = true;
+}
+
+void ConfigDataImp::setPressInZ(uint pressInZ)
+{
+	this->pressInZ = pressInZ;
+	this->isPressInZ = true;
+}
+
+void ConfigDataImp::setPressOutZ(uint pressOutZ)
+{
+	this->pressOutZ = pressOutZ;
+	this->isPressOutZ = true;
+}
+
+void ConfigDataImp::setDiffOn(bool diffOn)
+{
+	this->diffOn = diffOn;
+	this->isDiffOn = true;
+}
+
+void ConfigDataImp::setDiffMod(uint diffMod)
+{
+	this->diffMod = diffMod;
+	this->isDiffMod = true;
+}
+
+void ConfigDataImp::setDiffusivity(real diffusivity)
+{
+	this->diffusivity = diffusivity;
+	this->isDiffusivity = true;
+}
+
+void ConfigDataImp::setTemperatureInit(real temperatureInit)
+{
+	this->temperatureInit = temperatureInit;
+	this->isTemperatureInit = true;
+}
+
+void ConfigDataImp::setTemperatureBC(real temperatureBC)
+{
+	this->temperatureBC = temperatureBC;
+	this->isTemperatureBC = true;
+}
+
+//void ConfigDataImp::setViscosity(real viscosity)
+//{
+//	this->viscosity = viscosity;
+//	this->isViscosity = true;
+//}
+
+void ConfigDataImp::setVelocity(real velocity)
+{
+	this->velocity = velocity;
+	this->isVelocity = true;
+}
+
+void ConfigDataImp::setViscosityRatio(real viscosityRatio)
+{
+	this->viscosityRatio = viscosityRatio;
+	this->isViscosityRatio = true;
+}
+
+void ConfigDataImp::setVelocityRatio(real velocityRatio)
+{
+	this->velocityRatio = velocityRatio;
+	this->isVelocityRatio = true;
+}
+
+void ConfigDataImp::setDensityRatio(real densityRatio)
+{
+	this->densityRatio = densityRatio;
+	this->isDensityRatio = true;
+}
+
+void ConfigDataImp::setPressRatio(real pressRatio)
+{
+	this->pressRatio = pressRatio;
+	this->isPressRatio = true;
+}
+
+void ConfigDataImp::setRealX(real realX)
+{
+	this->realX = realX;
+	this->isRealX = true;
+}
+
+void ConfigDataImp::setRealY(real realY)
+{
+	this->realY = realY;
+	this->isRealY = true;
+}
+
+void ConfigDataImp::setFactorPressBC(real factorPressBC)
+{
+	this->factorPressBC = factorPressBC;
+	this->isFactorPressBC = true;
+}
+
+void ConfigDataImp::setGeometryFileC(std::string geometryFileC)
+{
+	this->geometryFileC = geometryFileC;
+	this->isGeometryFileC = true;
+}
+
+void ConfigDataImp::setGeometryFileM(std::string geometryFileM)
+{
+	this->geometryFileM = geometryFileM;
+	this->isGeometryFileM = true;
+}
+
+void ConfigDataImp::setGeometryFileF(std::string geometryFileF)
+{
+	this->geometryFileF = geometryFileF;
+	this->isGeometryFileF = true;
+}
+
+void ConfigDataImp::setClockCycleForMP(uint clockCycleForMP)
+{
+	this->clockCycleForMP = clockCycleForMP;
+	this->isClockCycleForMP = true;
+}
+
+void ConfigDataImp::setTimestepForMP(uint timestepForMP)
+{
+	this->timestepForMP = timestepForMP;
+	this->isTimestepForMP = true;
+}
+
+void ConfigDataImp::setForcingX(real forcingX)
+{
+	this->forcingX = forcingX;
+	this->isForcingX = true;
+}
+
+void ConfigDataImp::setForcingY(real forcingY)
+{
+	this->forcingY = forcingY;
+	this->isForcingY = true;
+}
+
+void ConfigDataImp::setForcingZ(real forcingZ)
+{
+	this->forcingZ = forcingZ;
+	this->isForcingZ = true;
+}
+
+void ConfigDataImp::setCalcParticles(bool calcParticles)
+{
+	this->calcParticles = calcParticles;
+	this->isCalcParticles = true;
+}
+
+void ConfigDataImp::setParticleBasicLevel(int particleBasicLevel)
+{
+	this->particleBasicLevel = particleBasicLevel;
+	this->isParticleBasicLevel = true;
+}
+
+void ConfigDataImp::setParticleInitLevel(int particleInitLevel)
+{
+	this->particleInitLevel = particleInitLevel;
+	this->isParticleInitLevel = true;
+}
+
+void ConfigDataImp::setNumberOfParticles(int numberOfParticles)
+{
+	this->numberOfParticles = numberOfParticles;
+	this->isNumberOfParticles = true;
+}
+
+void ConfigDataImp::setStartXHotWall(real startXHotWall)
+{
+	this->startXHotWall = startXHotWall;
+	this->isStartXHotWall = true;
+}
+
+void ConfigDataImp::setEndXHotWall(real endXHotWall)
+{
+	this->endXHotWall = endXHotWall;
+	this->isEndXHotWall = true;
+}
+
+void ConfigDataImp::setPossNeighborFilesX(std::vector<std::string> possNeighborFilesX)
+{
+	this->possNeighborFilesX = possNeighborFilesX;
+	this->isPossNeighborFilesX = true;
+}
+
+void ConfigDataImp::setPossNeighborFilesY(std::vector<std::string> possNeighborFilesY)
+{
+	this->possNeighborFilesY = possNeighborFilesY;
+	this->isPossNeighborFilesY = true;
+}
+
+void ConfigDataImp::setPossNeighborFilesZ(std::vector<std::string> possNeighborFilesZ)
+{
+	this->possNeighborFilesZ = possNeighborFilesZ;
+	this->isPossNeighborFilesZ = true;
+}
+
+void ConfigDataImp::setTimeDoCheckPoint(int timeDoCheckPoint)
+{
+	this->timeDoCheckPoint = timeDoCheckPoint;
+	this->isTimeDoCheckPoint = true;
+}
+
+void ConfigDataImp::setTimeDoRestart(int timeDoRestart)
+{
+	this->timeDoRestart = timeDoRestart;
+	this->isTimeDoRestart = true;
+}
+
+void ConfigDataImp::setDoCheckPoint(bool doCheckPoint)
+{
+	this->doCheckPoint = doCheckPoint;
+	this->isDoCheckPoint = true;
+}
+
+void ConfigDataImp::setDoRestart(bool doRestart)
+{
+	this->doRestart = doRestart;
+	this->isDoRestart = true;
+}
+
+void ConfigDataImp::setMaxLevel(uint maxLevel)
+{
+	this->maxLevel = maxLevel;
+	this->isMaxLevel = true;
+}
+
+void ConfigDataImp::setGridX(std::vector<int> gridX)
+{
+	this->gridX = gridX;
+	this->isGridX = true;
+}
+
+void ConfigDataImp::setGridY(std::vector<int> gridY)
+{
+	this->gridY = gridY;
+	this->isGridY = true;
+}
+
+void ConfigDataImp::setGridZ(std::vector<int> gridZ)
+{
+	this->gridZ = gridZ;
+	this->isGridZ = true;
+}
+
+void ConfigDataImp::setDistX(std::vector<int> distX)
+{
+	this->distX = distX;
+	this->isDistX = true;
+}
+
+void ConfigDataImp::setDistY(std::vector<int> distY)
+{
+	this->distY = distY;
+	this->isDistY = true;
+}
+
+void ConfigDataImp::setDistZ(std::vector<int> distZ)
+{
+	this->distZ = distZ;
+	this->isDistZ = true;
+}
+
+void ConfigDataImp::setNeedInterface(std::vector<bool> needInterface)
+{
+	this->needInterface = needInterface;
+	this->isNeedInterface = true;
+}
+
+void ConfigDataImp::setMainKernel(std::string mainKernel)
+{
+	this->mainKernel = mainKernel;
+	this->isMainKernel = true;
+}
+
+void ConfigDataImp::setMultiKernelOn(bool multiKernelOn)
+{
+	this->multiKernelOn = multiKernelOn;
+	this->isMultiKernelOn = true;
+}
+
+void ConfigDataImp::setMultiKernelLevel(std::vector<int> multiKernelLevel)
+{
+	this->multiKernelLevel = multiKernelLevel;
+	this->isMultiKernelLevel = true;
+}
+
+void ConfigDataImp::setMultiKernelName(std::vector<std::string> multiKernelName)
+{
+	this->multiKernelName = multiKernelName;
+	this->isMultiKernelName = true;
+}
+
+bool ConfigDataImp::isCalc2ndOrderMomentsInConfigFile()
+{
+	return this->isCalc2ndOrderMoments;
+}
+
+bool ConfigDataImp::isCalc3rdOrderMomentsInConfigFile()
+{
+	return this->isCalc2ndOrderMoments;
+}
+
+bool ConfigDataImp::isCalcHighOrderMomentsInConfigFile()
+{
+	return this->isCalcHighOrderMoments;
+}
+
+bool ConfigDataImp::isReadGeoInConfigFile()
+{
+	return this->isReadGeo;
+}
+
+bool ConfigDataImp::isCalcMedianInConfigFile()
+{
+	return this->isCalcMedian;
+}
+
+bool ConfigDataImp::isConcFileInConfigFile()
+{
+	return this->isConcFile;
+}
+
+bool ConfigDataImp::isUseMeasurePointsInConfigFile()
+{
+	return this->isUseMeasurePoints;
+}
+
+bool ConfigDataImp::isUseWaleInConfigFile()
+{
+	return this->isUseWale;
+}
+
+bool ConfigDataImp::isSimulatePorousMediaInConfigFile()
+{
+	return this->isSimulatePorousMedia;
+}
+
+bool ConfigDataImp::isD3QxxInConfigFile()
+{
+	return this->isD3Qxx;
+}
+
+bool ConfigDataImp::isTEndInConfigFile()
+{
+	return this->isTEnd;
+}
+
+bool ConfigDataImp::isTOutInConfigFile()
+{
+	return this->isTOut;
+}
+
+bool ConfigDataImp::isTStartOutInConfigFile()
+{
+	return this->isTStartOut;
+}
+
+bool ConfigDataImp::isTimeCalcMedStartInConfigFile()
+{
+	return this->isTimeCalcMedStart;
+}
+
+bool ConfigDataImp::isTimeCalcMedEndInConfigFile()
+{
+	return this->isTimeCalcMedEnd;
+}
+
+bool ConfigDataImp::isPressInIDInConfigFile()
+{
+	return this->isPressInID;
+}
+
+bool ConfigDataImp::isPressOutIDInConfigFile()
+{
+	return this->isPressOutID;
+}
+
+bool ConfigDataImp::isPressInZInConfigFile()
+{
+	return this->isPressInZ;
+}
+
+bool ConfigDataImp::isPressOutZInConfigFile()
+{
+	return this->isPressOutZ;
+}
+
+bool ConfigDataImp::isDiffOnInConfigFile()
+{
+	return this->isDiffOn;
+}
+
+bool ConfigDataImp::isDiffModInConfigFile()
+{
+	return this->isDiffMod;
+}
+
+bool ConfigDataImp::isDiffusivityInConfigFile()
+{
+	return this->isDiffusivity;
+}
+
+bool ConfigDataImp::isTemperatureInitInConfigFile()
+{
+	return this->isTemperatureInit;
+}
+
+bool ConfigDataImp::isTemperatureBCInConfigFile()
+{
+	return this->isTemperatureBC;
+}
+
+bool ConfigDataImp::isViscosityInConfigFile()
+{
+	return this->isViscosity;
+}
+
+bool ConfigDataImp::isNumberOfDevicesInConfigFile()
+{
+	return this->isNumberOfDevices;
+}
+
+bool ConfigDataImp::isDevicesInConfigFile()
+{
+	return this->isDevices;
+}
+
+bool ConfigDataImp::isOutputPathInConfigFile()
+{
+	return this->isOutputPath;
+}
+
+bool ConfigDataImp::isPrefixInConfigFile()
+{
+	return this->isPrefix;
+}
+
+bool ConfigDataImp::isGridPathInConfigFile()
+{
+	return this->isGridPath;
+}
+
+bool ConfigDataImp::isPrintOutputFilesInConfigFile()
+{
+	return this->isPrintOutputFiles;
+}
+
+bool ConfigDataImp::isGeometryValuesInConfigFile()
+{
+	return this->isGeometryValues;
+}
+
+bool ConfigDataImp::isVelocityInConfigFile()
+{
+	return this->isVelocity;
+}
+
+bool ConfigDataImp::isViscosityRatioInConfigFile()
+{
+	return this->isViscosityRatio;
+}
+
+bool ConfigDataImp::isVelocityRatioInConfigFile()
+{
+	return this->isVelocityRatio;
+}
+
+bool ConfigDataImp::isDensityRatioInConfigFile()
+{
+	return this->isDensityRatio;
+}
+
+bool ConfigDataImp::isPressRatioInConfigFile()
+{
+	return this->isPressRatio;
+}
+
+bool ConfigDataImp::isRealXInConfigFile()
+{
+	return this->isRealX;
+}
+
+bool ConfigDataImp::isRealYInConfigFile()
+{
+	return this->isRealY;
+}
+
+bool ConfigDataImp::isFactorPressBCInConfigFile()
+{
+	return this->isFactorPressBC;
+}
+
+bool ConfigDataImp::isGeometryFileCInConfigFile()
+{
+	return this->isGeometryFileC;
+}
+
+bool ConfigDataImp::isGeometryFileMInConfigFile()
+{
+	return this->isGeometryFileM;
+}
+
+bool ConfigDataImp::isGeometryFileFInConfigFile()
+{
+	return this->isGeometryFileF;
+}
+
+bool ConfigDataImp::isClockCycleForMPInConfigFile()
+{
+	return this->isClockCycleForMP;
+}
+
+bool ConfigDataImp::isTimestepForMPInConfigFile()
+{
+	return this->isTimestepForMP;
+}
+
+bool ConfigDataImp::isForcingXInConfigFile()
+{
+	return this->isForcingX;
+}
+
+bool ConfigDataImp::isForcingYInConfigFile()
+{
+	return this->isForcingY;
+}
+
+bool ConfigDataImp::isForcingZInConfigFile()
+{
+	return this->isForcingZ;
+}
+
+bool ConfigDataImp::isCalcParticlesInConfigFile()
+{
+	return this->isCalcParticles;
+}
+
+bool ConfigDataImp::isParticleBasicLevelInConfigFile()
+{
+	return this->isParticleBasicLevel;
+}
+
+bool ConfigDataImp::isParticleInitLevelInConfigFile()
+{
+	return this->isParticleInitLevel;
+}
+
+bool ConfigDataImp::isNumberOfParticlesInConfigFile()
+{
+	return this->isNumberOfParticles;
+}
+
+bool ConfigDataImp::isNeighborWSBInConfigFile()
+{
+	return this->isNeighborWSB;
+}
+
+bool ConfigDataImp::isStartXHotWallInConfigFile()
+{
+	return this->isStartXHotWall;
+}
+
+bool ConfigDataImp::isEndXHotWallInConfigFile()
+{
+	return this->isEndXHotWall;
+}
+
+bool ConfigDataImp::isPossNeighborFilesXInConfigFile()
+{
+	return this->isPossNeighborFilesX;
+}
+
+bool ConfigDataImp::isPossNeighborFilesYInConfigFile()
+{
+	return this->isPossNeighborFilesY;
+}
+
+bool ConfigDataImp::isPossNeighborFilesZInConfigFile()
+{
+	return this->isPossNeighborFilesZ;
+}
+
+bool ConfigDataImp::isTimeDoCheckPointInConfigFile()
+{
+	return this->isTimeDoCheckPoint;
+}
+
+bool ConfigDataImp::isTimeDoRestartInConfigFile()
+{
+	return this->isTimeDoCheckPoint;
+}
+
+bool ConfigDataImp::isDoCheckPointInConfigFile()
+{
+	return this->isDoCheckPoint;
+}
+
+bool ConfigDataImp::isDoRestartInConfigFile()
+{
+	return this->isDoRestart;
+}
+
+bool ConfigDataImp::isMaxLevelInConfigFile()
+{
+	return this->isMaxLevel;
+}
+
+bool ConfigDataImp::isGridXInConfigFile()
+{
+	return this->isGridX;
+}
+
+bool ConfigDataImp::isGridYInConfigFile()
+{
+	return this->isGridY;
+}
+
+bool ConfigDataImp::isGridZInConfigFile()
+{
+	return this->isGridZ;
+}
+
+bool ConfigDataImp::isDistXInConfigFile()
+{
+	return this->isDistX;
+}
+
+bool ConfigDataImp::isDistYInConfigFile()
+{
+	return this->isDistY;
+}
+
+bool ConfigDataImp::isDistZInConfigFile()
+{
+	return this->isDistZ;
+}
+
+bool ConfigDataImp::isNeedInterfaceInConfigFile()
+{
+	return this->isNeedInterface;
+}
+
+bool ConfigDataImp::isMainKernelInConfigFile()
+{
+	return this->isMainKernel;
+}
+
+bool ConfigDataImp::isMultiKernelOnInConfigFile()
+{
+	return this->isMultiKernelOn;
+}
+
+bool ConfigDataImp::isMultiKernelLevelInConfigFile()
+{
+	return this->isMultiKernelLevel;
+}
+
+bool ConfigDataImp::isMultiKernelNameInConfigFile()
+{
+	return this->isMultiKernelName;
+}
+
+
diff --git a/src/Core/Input/ConfigData/ConfigDataImp.h b/src/Core/Input/ConfigData/ConfigDataImp.h
new file mode 100644
index 000000000..2628e1869
--- /dev/null
+++ b/src/Core/Input/ConfigData/ConfigDataImp.h
@@ -0,0 +1,405 @@
+#ifndef CONFIGDATAIMP_H
+#define CONFIGDATAIMP_H
+
+#include "ConfigData.h"
+
+#include <memory>
+#include <string>
+
+class  ConfigDataImp : public ConfigData
+{
+public:
+    static std::shared_ptr<ConfigDataImp> getNewInstance();
+    virtual ~ConfigDataImp(void);
+
+	real getViscosity();
+	uint getNumberOfDevices();
+	std::vector<uint> getDevices();
+	std::string getOutputPath();
+	std::string getPrefix();
+	std::string getGridPath();
+	bool getPrintOutputFiles();
+	bool getGeometryValues();
+	bool getCalc2ndOrderMoments();
+	bool getCalc3rdOrderMoments();
+	bool getCalcHighOrderMoments();
+	bool getReadGeo();
+	bool getCalcMedian();
+	bool getConcFile();
+	bool getUseMeasurePoints();
+	bool getUseWale();
+	bool getSimulatePorousMedia();
+	uint getD3Qxx();
+	uint getTEnd();
+	uint getTOut();
+	uint getTStartOut();
+	uint getTimeCalcMedStart();
+	uint getTimeCalcMedEnd();
+	uint getPressInID();
+	uint getPressOutID();
+	uint getPressInZ();
+	uint getPressOutZ();
+	bool getDiffOn();
+	uint getDiffMod();
+	real getDiffusivity();
+	real getTemperatureInit();
+	real getTemperatureBC();
+	real getVelocity();
+	real getViscosityRatio();
+	real getVelocityRatio();
+	real getDensityRatio();
+	real getPressRatio();
+	real getRealX();
+	real getRealY();
+	real getFactorPressBC();
+	std::string getGeometryFileC();
+	std::string getGeometryFileM();
+	std::string getGeometryFileF();
+	uint getClockCycleForMP();
+	uint getTimestepForMP();
+	real getForcingX();
+	real getForcingY();
+	real getForcingZ();
+	bool getCalcParticles();
+	int getParticleBasicLevel();
+	int getParticleInitLevel();
+	int getNumberOfParticles();
+	real getStartXHotWall();
+	real getEndXHotWall();
+	std::vector<std::string> getPossNeighborFilesX();
+	std::vector<std::string> getPossNeighborFilesY();
+	std::vector<std::string> getPossNeighborFilesZ();
+	//std::vector<std::string> getPossNeighborFilesX();
+	//std::vector<std::string> getPossNeighborFilesY();
+	//std::vector<std::string> getPossNeighborFilesZ();
+	int getTimeDoCheckPoint();
+	int getTimeDoRestart();
+	bool getDoCheckPoint();
+	bool getDoRestart();
+	uint getMaxLevel();
+	std::vector<int> getGridX();
+	std::vector<int> getGridY();
+	std::vector<int> getGridZ();
+	std::vector<int> getDistX();
+	std::vector<int> getDistY();
+	std::vector<int> getDistZ();
+	std::vector<bool> getNeedInterface();
+	std::string getMainKernel();
+	bool getMultiKernelOn();
+	std::vector<int> getMultiKernelLevel();
+	std::vector<std::string> getMultiKernelName();
+
+	void setViscosity(real viscosity);
+	void setNumberOfDevices(uint numberOfDevices);
+	void setDevices(std::vector<uint> devices);
+	void setOutputPath(std::string outputPath);
+	void setPrefix(std::string prefix);
+	void setGridPath(std::string gridPath);
+	void setPrintOutputFiles(bool printOutputFiles);
+	void setGeometryValues(bool geometryValues);
+	void setCalc2ndOrderMoments(bool calc2ndOrderMoments);
+	void setCalc3rdOrderMoments(bool calc3rdOrderMoments);
+	void setCalcHighOrderMoments(bool calcHighOrderMoment);
+	void setReadGeo(bool readGeo);
+	void setCalcMedian(bool calcMedian);   
+	void setConcFile(bool concFile);
+	void setUseMeasurePoints(bool useMeasurePoints);
+	void setUseWale(bool useWale);
+	void setSimulatePorousMedia(bool simulatePorousMedia);
+	void setD3Qxx(uint d3Qxx);
+	void setTEnd(uint tEnd);
+	void setTOut(uint tOut);
+	void setTStartOut(uint tStartOut);
+	void setTimeCalcMedStart(uint timeCalcMedStart);
+	void setTimeCalcMedEnd(uint timeCalcMedEnd);   
+	void setPressInID(uint pressInID);
+	void setPressOutID(uint pressOutID);   
+	void setPressInZ(uint pressInZ);
+	void setPressOutZ(uint pressOutZ);
+	void setDiffOn(bool diffOn);	
+	void setDiffMod(uint diffMod);		
+	void setDiffusivity(real diffusivity);	
+	void setTemperatureInit(real temperatureInit);	
+	void setTemperatureBC(real temperatureBC);	
+	//void setViscosity(real viscosity);	
+	void setVelocity(real velocity);	
+	void setViscosityRatio(real viscosityRatio);	
+	void setVelocityRatio(real velocityRatio);	
+	void setDensityRatio(real fensityRatio);	
+	void setPressRatio(real pressRatio);	
+	void setRealX(real realX);	
+	void setRealY(real realY);	
+	void setFactorPressBC(real factorPressBC);	
+	void setGeometryFileC(std::string geometryFileC);
+	void setGeometryFileM(std::string geometryFileM);
+	void setGeometryFileF(std::string geometryFileF); 
+	void setClockCycleForMP(uint clockCycleForMP);
+	void setTimestepForMP(uint timestepForMP);
+	void setForcingX(real forcingX);
+	void setForcingY(real forcingY);
+	void setForcingZ(real forcingZ);
+	void setCalcParticles(bool calcParticles);
+	void setParticleBasicLevel(int particleBasicLevel);
+	void setParticleInitLevel(int particleInitLevel);
+	void setNumberOfParticles(int numberOfParticles);
+	void setStartXHotWall(real startXHotWall);
+	void setEndXHotWall(real endXHotWall);
+	void setPossNeighborFilesX(std::vector<std::string> possNeighborFilesX);
+	void setPossNeighborFilesY(std::vector<std::string> possNeighborFilesY);
+	void setPossNeighborFilesZ(std::vector<std::string> possNeighborFilesZ);
+	//void setPossNeighborFilesX(std::vector<std::string> possNeighborFilesX);
+	//void setPossNeighborFilesY(std::vector<std::string> possNeighborFilesY);
+	//void setPossNeighborFilesZ(std::vector<std::string> possNeighborFilesZ);
+	void setTimeDoCheckPoint(int timeDoCheckPoint);
+	void setTimeDoRestart(int timeDoRestart);
+	void setDoCheckPoint(bool doCheckPoint);
+	void setDoRestart(bool doRestart);
+	void setMaxLevel(uint maxLevel);
+	void setGridX(std::vector<int> gridX);
+	void setGridY(std::vector<int> gridY);
+	void setGridZ(std::vector<int> gridZ);
+	void setDistX(std::vector<int> distX);
+	void setDistY(std::vector<int> distY);
+	void setDistZ(std::vector<int> distZ);
+	void setNeedInterface(std::vector<bool> needInterface);
+	void setMainKernel(std::string mainKernel);
+	void setMultiKernelOn(bool multiKernelOn);
+	void setMultiKernelLevel(std::vector<int> multiKernelLevel);
+	void setMultiKernelName(std::vector<std::string> multiKernelName);
+
+	bool isViscosityInConfigFile();
+	bool isNumberOfDevicesInConfigFile();
+	bool isDevicesInConfigFile();
+	bool isOutputPathInConfigFile();
+	bool isPrefixInConfigFile();
+	bool isGridPathInConfigFile();
+	bool isPrintOutputFilesInConfigFile();
+	bool isGeometryValuesInConfigFile();
+	bool isCalc2ndOrderMomentsInConfigFile();
+	bool isCalc3rdOrderMomentsInConfigFile();
+	bool isCalcHighOrderMomentsInConfigFile();
+	bool isReadGeoInConfigFile();
+	bool isCalcMedianInConfigFile();
+	bool isConcFileInConfigFile();
+	bool isUseMeasurePointsInConfigFile();
+	bool isUseWaleInConfigFile();
+	bool isSimulatePorousMediaInConfigFile();
+	bool isD3QxxInConfigFile();
+	bool isTEndInConfigFile();
+	bool isTOutInConfigFile();
+	bool isTStartOutInConfigFile();
+	bool isTimeCalcMedStartInConfigFile();
+	bool isTimeCalcMedEndInConfigFile();
+	bool isPressInIDInConfigFile();
+	bool isPressOutIDInConfigFile();
+	bool isPressInZInConfigFile();
+	bool isPressOutZInConfigFile();
+	bool isDiffOnInConfigFile();
+	bool isDiffModInConfigFile();
+	bool isDiffusivityInConfigFile();
+	bool isTemperatureInitInConfigFile();
+	bool isTemperatureBCInConfigFile();
+	//bool isViscosityInConfigFile();
+	bool isVelocityInConfigFile();
+	bool isViscosityRatioInConfigFile();
+	bool isVelocityRatioInConfigFile();
+	bool isDensityRatioInConfigFile();
+	bool isPressRatioInConfigFile();
+	bool isRealXInConfigFile();
+	bool isRealYInConfigFile();
+	bool isFactorPressBCInConfigFile();
+	bool isGeometryFileCInConfigFile();
+	bool isGeometryFileMInConfigFile();
+	bool isGeometryFileFInConfigFile();
+	bool isClockCycleForMPInConfigFile();
+	bool isTimestepForMPInConfigFile();
+	bool isForcingXInConfigFile();
+	bool isForcingYInConfigFile();
+	bool isForcingZInConfigFile();
+	bool isCalcParticlesInConfigFile();
+	bool isParticleBasicLevelInConfigFile();
+	bool isParticleInitLevelInConfigFile();
+	bool isNumberOfParticlesInConfigFile();
+	bool isNeighborWSBInConfigFile();
+	bool isStartXHotWallInConfigFile();
+	bool isEndXHotWallInConfigFile();
+	bool isPossNeighborFilesXInConfigFile();
+	bool isPossNeighborFilesYInConfigFile();
+	bool isPossNeighborFilesZInConfigFile();
+	bool isTimeDoCheckPointInConfigFile();
+	bool isTimeDoRestartInConfigFile();
+	bool isDoCheckPointInConfigFile();
+	bool isDoRestartInConfigFile();
+	bool isMaxLevelInConfigFile();
+	bool isGridXInConfigFile();
+	bool isGridYInConfigFile();
+	bool isGridZInConfigFile();
+	bool isDistXInConfigFile();
+	bool isDistYInConfigFile();
+	bool isDistZInConfigFile();
+	bool isNeedInterfaceInConfigFile();
+	bool isMainKernelInConfigFile();
+	bool isMultiKernelOnInConfigFile();
+	bool isMultiKernelLevelInConfigFile();
+	bool isMultiKernelNameInConfigFile();
+
+
+private:
+	ConfigDataImp();
+
+	real viscosity;
+	uint numberOfDevices;
+	std::vector<uint> devices;
+	std::string outputPath;
+	std::string prefix;
+	std::string gridPath;
+	bool printOutputFiles;
+	bool geometryValues;
+	bool calc2ndOrderMoments;
+	bool calc3rdOrderMoments;
+	bool calcHighOrderMoments;
+	bool readGeo;
+	bool calcMedian;
+	bool concFile;
+	bool useMeasurePoints;
+	bool useWale;
+	bool simulatePorousMedia;
+	uint d3Qxx;
+	uint tEnd;
+	uint tOut;
+	uint tStartOut;
+	uint timeCalcMedStart;
+	uint timeCalcMedEnd;
+	uint pressInID;
+	uint pressOutID;
+	uint pressInZ;
+	uint pressOutZ;
+	bool diffOn;
+	uint diffMod;
+	real diffusivity;
+	real temperatureInit;
+	real temperatureBC;
+	//real viscosity;
+	real velocity;
+	real viscosityRatio;
+	real velocityRatio;
+	real densityRatio;
+	real pressRatio;
+	real realX;
+	real realY;
+	real factorPressBC;
+	std::string geometryFileC;
+	std::string geometryFileM;
+	std::string geometryFileF;
+	uint clockCycleForMP;
+	uint timestepForMP;
+	real forcingX;
+	real forcingY;
+	real forcingZ;
+	bool calcParticles;
+	int particleBasicLevel;
+	int particleInitLevel;
+	int numberOfParticles;
+	real startXHotWall;
+	real endXHotWall;
+	std::vector<std::string> possNeighborFilesX;
+	std::vector<std::string> possNeighborFilesY;
+	std::vector<std::string> possNeighborFilesZ;
+	//std::vector<std::string> possNeighborFilesX;
+	//std::vector<std::string> possNeighborFilesY;
+	//std::vector<std::string> possNeighborFilesZ;
+	int timeDoCheckPoint;
+	int timeDoRestart;
+	bool doCheckPoint;
+	bool doRestart;
+	int maxLevel;
+	std::vector<int> gridX;
+	std::vector<int> gridY;
+	std::vector<int> gridZ;
+	std::vector<int> distX;
+	std::vector<int> distY;
+	std::vector<int> distZ;
+	std::vector<bool> needInterface;
+	std::string mainKernel;
+	bool multiKernelOn;
+	std::vector<int> multiKernelLevel;
+	std::vector<std::string> multiKernelName;
+
+	bool isViscosity;
+	bool isNumberOfDevices;
+	bool isDevices;
+	bool isOutputPath;
+	bool isPrefix;
+	bool isGridPath;
+	bool isPrintOutputFiles;
+	bool isGeometryValues;
+	bool isCalc2ndOrderMoments;
+	bool isCalc3rdOrderMoments;
+	bool isCalcHighOrderMoments;
+	bool isReadGeo;
+	bool isCalcMedian;
+	bool isConcFile;
+	bool isUseMeasurePoints;
+	bool isUseWale;
+	bool isSimulatePorousMedia;
+	bool isD3Qxx;
+	bool isTEnd;
+	bool isTOut;
+	bool isTStartOut;
+	bool isTimeCalcMedStart;
+	bool isTimeCalcMedEnd;
+	bool isPressInID;
+	bool isPressOutID;
+	bool isPressInZ;
+	bool isPressOutZ;
+	bool isDiffOn;
+	bool isDiffMod;
+	bool isDiffusivity;
+	bool isTemperatureInit;
+	bool isTemperatureBC;
+	//bool isViscosity;
+	bool isVelocity;
+	bool isViscosityRatio;
+	bool isVelocityRatio;
+	bool isDensityRatio;
+	bool isPressRatio;
+	bool isRealX;
+	bool isRealY;
+	bool isFactorPressBC;
+	bool isGeometryFileC;
+	bool isGeometryFileM;
+	bool isGeometryFileF;
+	bool isClockCycleForMP;
+	bool isTimestepForMP;
+	bool isForcingX;
+	bool isForcingY;
+	bool isForcingZ;
+	bool isCalcParticles;
+	bool isParticleBasicLevel;
+	bool isParticleInitLevel;
+	bool isNumberOfParticles;
+	bool isNeighborWSB;
+	bool isStartXHotWall;
+	bool isEndXHotWall;
+	bool isPossNeighborFilesX;
+	bool isPossNeighborFilesY;
+	bool isPossNeighborFilesZ;
+	bool isTimeDoCheckPoint;
+	bool isTimeDoRestart;
+	bool isDoCheckPoint;
+	bool isDoRestart;
+	bool isMaxLevel;
+	bool isGridX;
+	bool isGridY;
+	bool isGridZ;
+	bool isDistX;
+	bool isDistY;
+	bool isDistZ;
+	bool isNeedInterface;
+	bool isMainKernel;
+	bool isMultiKernelOn;
+	bool isMultiKernelLevel;
+	bool isMultiKernelName;
+
+};
+#endif
diff --git a/src/Core/Input/ConfigData/package.include b/src/Core/Input/ConfigData/package.include
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/Core/Input/ConfigFileReader/ConfigFileReader.cpp b/src/Core/Input/ConfigFileReader/ConfigFileReader.cpp
new file mode 100644
index 000000000..483856e5c
--- /dev/null
+++ b/src/Core/Input/ConfigFileReader/ConfigFileReader.cpp
@@ -0,0 +1,265 @@
+#include "ConfigFileReader.h"
+#include "../ConfigData/ConfigDataImp.h"
+#include "../Input.h"
+#include "../../StringUtilities/StringUtil.h"
+
+#include <iostream>
+#include <fstream>
+
+
+VF_PUBLIC std::shared_ptr<ConfigFileReader> ConfigFileReader::getNewInstance()
+{
+	return std::shared_ptr<ConfigFileReader>(new ConfigFileReader());
+}
+
+ConfigFileReader::ConfigFileReader()
+{
+
+}
+
+VF_PUBLIC ConfigFileReader::~ConfigFileReader()
+{
+
+}
+
+VF_PUBLIC std::shared_ptr<ConfigData> ConfigFileReader::readConfigFile(const std::string &filePath) const
+{
+	std::shared_ptr<ConfigDataImp> data = ConfigDataImp::getNewInstance();
+	std::ifstream stream;
+	stream.open(filePath.c_str(), std::ios::in);
+	if (stream.fail())
+		throw std::runtime_error("can not open config file!"); 
+	std::unique_ptr<input::Input> input = input::Input::makeInput(stream, "config");
+
+	if (input->getValue("NumberOfDevices") != "")
+		data->setNumberOfDevices(StringUtil::toInt(input->getValue("NumberOfDevices")));
+
+	if (input->getValue("Devices") != "")
+		data->setDevices(StringUtil::toUintVector(input->getValue("Devices")));
+
+	if (input->getValue("Path") != "")
+		data->setOutputPath(input->getValue("Path"));
+
+	if (input->getValue("Prefix") != "")
+		data->setPrefix(input->getValue("Prefix"));
+
+	if (input->getValue("GridPath") != "")
+		data->setGridPath(input->getValue("GridPath"));
+	else
+	{
+		std::cout << "GridPath has to be defined!" << std::endl;
+		exit(1);
+	}
+
+
+	if (input->getValue("WriteGrid") != "")
+		data->setPrintOutputFiles(StringUtil::toBool(input->getValue("WriteGrid")));
+
+	if (input->getValue("GeometryValues") != "")
+		data->setGeometryValues(StringUtil::toBool(input->getValue("GeometryValues")));
+
+	if (input->getValue("calc2ndOrderMoments") != "")
+		data->setCalc2ndOrderMoments(StringUtil::toBool(input->getValue("calc2ndOrderMoments")));
+
+	if (input->getValue("calc3rdOrderMoments") != "")
+		data->setCalc3rdOrderMoments(StringUtil::toBool(input->getValue("calc3rdOrderMoments")));
+
+	if (input->getValue("calcHigherOrderMoments") != "")
+		data->setCalcHighOrderMoments(StringUtil::toBool(input->getValue("calcHigherOrderMoments")));
+
+	if (input->getValue("ReadGeometry") != "")
+		data->setReadGeo(StringUtil::toBool(input->getValue("ReadGeometry")));
+
+	if (input->getValue("calcMedian") != "")
+		data->setCalcMedian(StringUtil::toBool(input->getValue("calcMedian")));
+
+	if (input->getValue("UseConcFile") != "")
+		data->setConcFile(StringUtil::toBool(input->getValue("UseConcFile")));
+
+	if (input->getValue("UseMeasurePoints") != "")
+		data->setUseMeasurePoints(StringUtil::toBool(input->getValue("UseMeasurePoints")));
+
+	if (input->getValue("UseWale") != "")
+		data->setUseWale(StringUtil::toBool(input->getValue("UseWale")));
+
+	if (input->getValue("SimulatePorousMedia") != "")
+		data->setSimulatePorousMedia(StringUtil::toBool(input->getValue("SimulatePorousMedia")));
+
+	if (input->getValue("D3Qxx") != "")
+		data->setD3Qxx(StringUtil::toInt(input->getValue("D3Qxx")));
+
+	if (input->getValue("TimeEnd") != "")
+		data->setTEnd(StringUtil::toInt(input->getValue("TimeEnd")));
+
+	if (input->getValue("TimeOut") != "")
+		data->setTOut(StringUtil::toInt(input->getValue("TimeOut")));
+	
+	if (input->getValue("TimeStartOut") != "")
+		data->setTStartOut(StringUtil::toInt(input->getValue("TimeStartOut")));
+
+	if (input->getValue("TimeStartCalcMedian") != "")
+		data->setTimeCalcMedStart(StringUtil::toInt(input->getValue("TimeStartCalcMedian")));
+
+	if (input->getValue("TimeEndCalcMedian") != "")
+		data->setTimeCalcMedEnd(StringUtil::toInt(input->getValue("TimeEndCalcMedian")));
+
+	if (input->getValue("PressInID") != "")
+		data->setPressInID(StringUtil::toInt(input->getValue("PressInID")));
+
+	if (input->getValue("PressOutID") != "")
+		data->setPressOutID(StringUtil::toInt(input->getValue("PressOutID")));
+
+	if (input->getValue("PressInZ") != "")
+		data->setPressInZ(StringUtil::toInt(input->getValue("PressInZ")));
+
+	if (input->getValue("PressOutZ") != "")
+		data->setPressOutZ(StringUtil::toInt(input->getValue("PressOutZ")));
+	//////////////////////////////////////////////////////////////////////////
+	if (input->getValue("DiffOn") != "")
+		data->setDiffOn(StringUtil::toBool(input->getValue("DiffOn")));
+
+	if (input->getValue("DiffMod") != "")
+		data->setDiffMod(StringUtil::toInt(input->getValue("DiffMod")));
+
+	if (input->getValue("Diffusivity") != "")
+		data->setDiffusivity(StringUtil::toFloat(input->getValue("Diffusivity")));
+
+	if (input->getValue("Temp") != "")
+		data->setTemperatureInit(StringUtil::toFloat(input->getValue("Temp")));
+
+	if (input->getValue("TempBC") != "")
+		data->setTemperatureBC(StringUtil::toFloat(input->getValue("TempBC")));
+	//////////////////////////////////////////////////////////////////////////
+	if (input->getValue("Viscosity_LB") != "")
+		data->setViscosity(StringUtil::toFloat(input->getValue("Viscosity_LB")));
+
+	if (input->getValue("Velocity_LB") != "")
+		data->setVelocity(StringUtil::toFloat(input->getValue("Velocity_LB")));
+
+	if (input->getValue("Viscosity_Ratio_World_to_LB") != "")
+		data->setViscosityRatio(StringUtil::toFloat(input->getValue("Viscosity_Ratio_World_to_LB")));
+
+	if (input->getValue("Velocity_Ratio_World_to_LB") != "")
+		data->setVelocityRatio(StringUtil::toFloat(input->getValue("Velocity_Ratio_World_to_LB")));
+
+	if (input->getValue("Density_Ratio_World_to_LB") != "")
+		data->setDensityRatio(StringUtil::toFloat(input->getValue("Density_Ratio_World_to_LB")));
+
+	if (input->getValue("Delta_Press") != "")
+		data->setPressRatio(StringUtil::toFloat(input->getValue("Delta_Press")));
+
+	if (input->getValue("SliceRealX") != "")
+		data->setRealX(StringUtil::toFloat(input->getValue("SliceRealX")));
+
+	if (input->getValue("SliceRealY") != "")
+		data->setRealY(StringUtil::toFloat(input->getValue("SliceRealY")));
+
+	if (input->getValue("FactorPressBC") != "")
+		data->setFactorPressBC(StringUtil::toFloat(input->getValue("FactorPressBC")));
+
+	if (input->getValue("GeometryC") != "")
+		data->setGeometryFileC(input->getValue("GeometryC"));
+
+	if (input->getValue("GeometryM") != "")
+		data->setGeometryFileM(input->getValue("GeometryM"));
+
+	if (input->getValue("GeometryF") != "")
+		data->setGeometryFileF(input->getValue("GeometryF"));
+	//////////////////////////////////////////////////////////////////////////
+	if (input->getValue("measureClockCycle") != "")
+		data->setClockCycleForMP(StringUtil::toFloat(input->getValue("measureClockCycle")));
+
+	if (input->getValue("measureTimestep") != "")
+		data->setTimestepForMP(StringUtil::toInt(input->getValue("measureTimestep")));
+	//////////////////////////////////////////////////////////////////////////
+	//Forcing
+	if (input->getValue("ForcingX") != "")
+		data->setForcingX(StringUtil::toFloat(input->getValue("ForcingX")));
+	if (input->getValue("ForcingY") != "")
+		data->setForcingY(StringUtil::toFloat(input->getValue("ForcingY")));
+	if (input->getValue("ForcingZ") != "")
+		data->setForcingZ(StringUtil::toFloat(input->getValue("ForcingZ")));
+	//////////////////////////////////////////////////////////////////////////
+	//Particles
+	if (input->getValue("calcParticles") != "")
+		data->setCalcParticles(StringUtil::toBool(input->getValue("calcParticles")));
+
+	if (input->getValue("baseLevel") != "")
+		data->setParticleBasicLevel(StringUtil::toInt(input->getValue("baseLevel")));
+
+	if (input->getValue("initLevel") != "")
+		data->setParticleInitLevel(StringUtil::toInt(input->getValue("initLevel")));
+
+	if (input->getValue("numberOfParticles") != "")
+		data->setNumberOfParticles(StringUtil::toInt(input->getValue("numberOfParticles")));
+
+	if (input->getValue("startXHotWall") != "")
+		data->setStartXHotWall(StringUtil::toDouble(input->getValue("startXHotWall")));
+
+	if (input->getValue("endXHotWall") != "")
+		data->setEndXHotWall(StringUtil::toDouble(input->getValue("endXHotWall")));
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	//Restart
+	if (input->getValue("TimeDoCheckPoint") != "")
+		data->setTimeDoCheckPoint(StringUtil::toInt(input->getValue("TimeDoCheckPoint")));
+
+	if (input->getValue("TimeDoRestart") != "")
+		data->setTimeDoRestart(StringUtil::toInt(input->getValue("TimeDoRestart")));
+
+	if (input->getValue("DoCheckPoint") != "")
+		data->setDoCheckPoint(StringUtil::toBool(input->getValue("DoCheckPoint")));
+
+	if (input->getValue("DoRestart") != "")
+		data->setDoRestart(StringUtil::toBool(input->getValue("DoRestart")));
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	if (input->getValue("NOGL") != "")
+		data->setMaxLevel(StringUtil::toInt(input->getValue("NOGL")));
+
+	if (input->getValue("GridX") != "")
+		data->setGridX(StringUtil::toIntVector(input->getValue("GridX")));
+
+	if (input->getValue("GridY") != "")
+		data->setGridY(StringUtil::toIntVector(input->getValue("GridY")));
+
+	if (input->getValue("GridZ") != "")
+		data->setGridZ(StringUtil::toIntVector(input->getValue("GridZ")));
+
+	if (input->getValue("DistX") != "")
+		data->setDistX(StringUtil::toIntVector(input->getValue("DistX")));
+
+	if (input->getValue("DistY") != "")
+		data->setDistY(StringUtil::toIntVector(input->getValue("DistY")));
+
+	if (input->getValue("DistZ") != "")
+		data->setDistZ(StringUtil::toIntVector(input->getValue("DistZ")));
+
+	if (input->getValue("NeedInterface") != "")
+		data->setNeedInterface(StringUtil::toBoolVector(input->getValue("NeedInterface")));
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	// Kernel
+	if (input->getValue("MainKernelName") != "")
+		data->setMainKernel(input->getValue("MainKernelName"));
+
+	if (input->getValue("MultiKernelOn") != "")
+		data->setMultiKernelOn(StringUtil::toBool(input->getValue("MultiKernelOn")));
+
+	if (input->getValue("MultiKernelLevel") != "")
+		data->setMultiKernelLevel(StringUtil::toIntVector(input->getValue("MultiKernelLevel")));
+
+	if (input->getValue("MultiKernelName") != "")
+		data->setMultiKernelName(StringUtil::toStringVector(input->getValue("MultiKernelName")));
+
+	if (StringUtil::toStringVector(input->getValue("MultiKernelName")).size() != StringUtil::toIntVector(input->getValue("MultiKernelLevel")).size())
+	{
+		std::cout << "MultiKernelName and MultiKernelLevel has to be of same size!" << std::endl;
+		exit(1);
+	}
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+	return data;
+
+}
+
+
+
+
diff --git a/src/Core/Input/ConfigFileReader/ConfigFileReader.h b/src/Core/Input/ConfigFileReader/ConfigFileReader.h
new file mode 100644
index 000000000..42bb1b29b
--- /dev/null
+++ b/src/Core/Input/ConfigFileReader/ConfigFileReader.h
@@ -0,0 +1,21 @@
+#ifndef CONFIGFILEREADER_H
+#define CONFIGFILEREADER_H
+
+#include "../Input.h"
+
+#include <memory>
+
+class ConfigData;
+
+class  ConfigFileReader
+{
+public:
+    VF_PUBLIC static std::shared_ptr<ConfigFileReader> getNewInstance();
+    VF_PUBLIC virtual ~ConfigFileReader(void);
+
+    VF_PUBLIC std::shared_ptr<ConfigData> readConfigFile(const std::string &filePath) const;
+
+private:
+	ConfigFileReader();
+};
+#endif
diff --git a/src/Core/Input/ConfigFileReader/package.include b/src/Core/Input/ConfigFileReader/package.include
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/VirtualFluids_GPU/Parameter/Parameter.cpp
index 88ab57701..6826c5369 100644
--- a/src/VirtualFluids_GPU/Parameter/Parameter.cpp
+++ b/src/VirtualFluids_GPU/Parameter/Parameter.cpp
@@ -7,19 +7,509 @@
 #include <stdlib.h>
 #include <math.h>
 
+
+#include "Core/Input/ConfigData/ConfigData.h"
+#include "Core/StringUtilities/StringUtil.h"
+#include "VirtualFluids_GPU/Communication/Communicator.h"
 //#ifdef WIN32
 //   #include <Winsock2.h>
 //#endif
 //lib for windows Ws2_32.lib
 
+
 SPtr<Parameter> Parameter::make()
 {
     return SPtr<Parameter>(new Parameter());
 }
 
+SPtr<Parameter> Parameter::make(SPtr<ConfigData> configData, Communicator* comm)
+{
+	return SPtr<Parameter>(new Parameter(configData, comm));
+}
+
 Parameter::Parameter()
 {
 }
+Parameter::Parameter(SPtr<ConfigData> configData, Communicator* comm)
+{
+	//////////////////////////////////////////////////////////////////////////
+	this->setNumprocs(comm->getNummberOfProcess());
+	this->setMyID(comm->getPID());
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isNumberOfDevicesInConfigFile())
+		this->setMaxDev(configData->getNumberOfDevices());
+	else
+		this->setMaxDev((int)1);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isDevicesInConfigFile())
+		this->setDevices(configData->getDevices());
+	else
+		this->setDevices(std::vector<uint>{(uint)0});
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isOutputPathInConfigFile())
+		this->setOutputPath(configData->getOutputPath());
+	else
+		this->setOutputPath("C:/Output/");
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isPrefixInConfigFile())
+		this->setOutputPrefix(configData->getPrefix());
+	else
+		this->setOutputPrefix("MyFile");
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isPrintOutputFilesInConfigFile())
+		this->setPrintFiles(configData->getPrintOutputFiles());
+	else
+		this->setPrintFiles(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isGeometryValuesInConfigFile())
+		this->setGeometryValues(configData->getGeometryValues());
+	else
+		this->setGeometryValues(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isCalc2ndOrderMomentsInConfigFile())
+		this->setCalc2ndOrderMoments(configData->getCalc2ndOrderMoments());
+	else
+		this->setCalc2ndOrderMoments(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isCalc3rdOrderMomentsInConfigFile())
+		this->setCalc3rdOrderMoments(configData->getCalc3rdOrderMoments());
+	else
+		this->setCalc3rdOrderMoments(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isCalcHighOrderMomentsInConfigFile())
+		this->setCalcHighOrderMoments(configData->getCalcHighOrderMoments());
+	else
+		this->setCalcHighOrderMoments(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isCalcMedianInConfigFile())
+		this->setCalcMedian(configData->getCalcMedian());
+	else
+		this->setCalcMedian(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isConcFileInConfigFile())
+		this->setConcFile(configData->getConcFile());
+	else
+		this->setConcFile(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isUseMeasurePointsInConfigFile())
+		this->setUseMeasurePoints(configData->getUseMeasurePoints());
+	else
+		this->setUseMeasurePoints(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isUseWaleInConfigFile())
+		this->setUseWale(configData->getUseWale());
+	else
+		this->setUseWale(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isSimulatePorousMediaInConfigFile())
+		this->setSimulatePorousMedia(configData->getSimulatePorousMedia());
+	else
+		this->setSimulatePorousMedia(false);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isD3QxxInConfigFile())
+		this->setD3Qxx(configData->getD3Qxx());
+	else
+		this->setD3Qxx((int)27);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isTEndInConfigFile())
+		this->setTEnd(configData->getTEnd());
+	else
+		this->setTEnd((uint)10);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isTOutInConfigFile())
+		this->setTOut(configData->getTOut());
+	else
+		this->setTOut((uint)1);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isTStartOutInConfigFile())
+		this->setTStartOut(configData->getTStartOut());
+	else
+		this->setTStartOut((uint)0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isTimeCalcMedStartInConfigFile())
+		this->setTimeCalcMedStart(configData->getTimeCalcMedStart());
+	else
+		this->setTimeCalcMedStart((int)0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isTimeCalcMedEndInConfigFile())
+		this->setTimeCalcMedEnd(configData->getTimeCalcMedEnd());
+	else
+		this->setTimeCalcMedEnd((int)10);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isPressInIDInConfigFile())
+		this->setPressInID(configData->getPressInID());
+	else
+		this->setPressInID((uint)0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isPressOutIDInConfigFile())
+		this->setPressOutID(configData->getPressOutID());
+	else
+		this->setPressOutID((uint)0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isPressInZInConfigFile())
+		this->setPressInZ(configData->getPressInZ());
+	else
+		this->setPressInZ((uint)1);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isPressOutZInConfigFile())
+		this->setPressOutZ(configData->getPressOutZ());
+	else
+		this->setPressOutZ((uint)2);
+	//////////////////////////////////////////////////////////////////////////
+	//second component
+	if (configData->isDiffOnInConfigFile())
+		this->setDiffOn(configData->getDiffOn());
+	else
+		this->setDiffOn(false);
+
+	if (configData->isDiffModInConfigFile())
+		this->setDiffMod(configData->getDiffMod());
+	else
+		this->setDiffMod((int)27);
+
+	if (configData->isDiffusivityInConfigFile())
+		this->setDiffusivity(configData->getDiffusivity());
+	else
+		this->setDiffusivity((real)0.001);
+
+	if (configData->isTemperatureInitInConfigFile())
+		this->setTemperatureInit(configData->getTemperatureInit());
+	else
+		this->setTemperatureInit((real)0.0);
+
+	if (configData->isTemperatureBCInConfigFile())
+		this->setTemperatureBC(configData->getTemperatureBC());
+	else
+		this->setTemperatureBC((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isViscosityInConfigFile())
+		this->setViscosity(configData->getViscosity());
+	else
+		this->setViscosity((real)0.001);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isVelocityInConfigFile())
+		this->setVelocity(configData->getVelocity());
+	else
+		this->setVelocity((real)0.01);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isViscosityRatioInConfigFile())
+		this->setViscosityRatio(configData->getViscosityRatio());
+	else
+		this->setViscosityRatio((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isVelocityRatioInConfigFile())
+		this->setVelocityRatio(configData->getVelocityRatio());
+	else
+		this->setVelocityRatio((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isDensityRatioInConfigFile())
+		this->setDensityRatio(configData->getDensityRatio());
+	else
+		this->setDensityRatio((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isPressRatioInConfigFile())
+		this->setPressRatio(configData->getPressRatio());
+	else
+		this->setPressRatio((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isRealXInConfigFile())
+		this->setRealX(configData->getRealX());
+	else
+		this->setRealX((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isRealYInConfigFile())
+		this->setRealY(configData->getRealY());
+	else
+		this->setRealY((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isFactorPressBCInConfigFile())
+		this->setFactorPressBC(configData->getFactorPressBC());
+	else
+		this->setFactorPressBC((real)1.0);
+	//////////////////////////////////////////////////////////////////////////
+	//read Geometry (STL)
+	if (configData->isReadGeoInConfigFile())
+		this->setReadGeo(configData->getReadGeo());
+	else
+		this->setReadGeo(false);
+
+	if (configData->isGeometryFileCInConfigFile())
+		this->setGeometryFileC(configData->getGeometryFileC());
+	else if (this->getReadGeo())
+	{
+		std::cout << "GeometryFileC has to be defined!" << std::endl;
+		exit(1);
+	}
+	else
+		this->setGeometryFileC("");
+
+	if (configData->isGeometryFileMInConfigFile())
+		this->setGeometryFileM(configData->getGeometryFileM());
+	else if (this->getReadGeo())
+	{
+		std::cout << "GeometryFileM has to be defined!" << std::endl;
+		exit(1);
+	}
+	else
+		this->setGeometryFileM("");
+
+	if (configData->isGeometryFileFInConfigFile())
+		this->setGeometryFileF(configData->getGeometryFileF());
+	else if (this->getReadGeo())
+	{
+		std::cout << "GeometryFileF has to be defined!" << std::endl;
+		exit(1);
+	}
+	else
+		this->setGeometryFileF("");
+	//////////////////////////////////////////////////////////////////////////
+	if (configData->isClockCycleForMPInConfigFile())
+		this->setclockCycleForMP(configData->getClockCycleForMP());
+	else
+		this->setclockCycleForMP((real)1.0);
+
+	if (configData->isTimestepForMPInConfigFile())
+		this->settimestepForMP(configData->getTimestepForMP());
+	else
+		this->settimestepForMP((uint)10);
+	//////////////////////////////////////////////////////////////////////////
+	std::string gridPath = "";
+	if (configData->isGridPathInConfigFile())
+		gridPath = configData->getGridPath();
+	else
+	{
+		std::cout << "GridPath has to be defined!" << std::endl;
+		exit(1);
+	}
+
+	if (this->getNumprocs() == 1)
+		gridPath += "/";
+	else
+		gridPath += "/" + StringUtil::toString(this->getMyID()) + "/";
+	//////////////////////////////////////////////////////////////////////////
+	this->setFName(this->getOutputPath() + "/" + this->getOutputPrefix());
+	//////////////////////////////////////////////////////////////////////////
+	this->setgeoVec(				gridPath + "geoVec.dat");
+	this->setcoordX(				gridPath + "coordX.dat");
+	this->setcoordY(				gridPath + "coordY.dat");
+	this->setcoordZ(				gridPath + "coordZ.dat");
+	this->setneighborX(				gridPath + "neighborX.dat");
+	this->setneighborY(				gridPath + "neighborY.dat");
+	this->setneighborZ(				gridPath + "neighborZ.dat");
+	this->setneighborWSB(			gridPath + "neighborWSB.dat");
+	this->setscaleCFC(				gridPath + "scaleCFC.dat");
+	this->setscaleCFF(				gridPath + "scaleCFF.dat");
+	this->setscaleFCC(				gridPath + "scaleFCC.dat");
+	this->setscaleFCF(				gridPath + "scaleFCF.dat");
+	this->setscaleOffsetCF(			gridPath + "offsetVecCF.dat");
+	this->setscaleOffsetFC(			gridPath + "offsetVecFC.dat");
+	this->setgeomBoundaryBcQs(		gridPath + "geomBoundaryQs.dat");
+	this->setgeomBoundaryBcValues(	gridPath + "geomBoundaryValues.dat");
+	this->setinletBcQs(				gridPath + "inletBoundaryQs.dat");
+	this->setinletBcValues(			gridPath + "inletBoundaryValues.dat");
+	this->setoutletBcQs(			gridPath + "outletBoundaryQs.dat");
+	this->setoutletBcValues(		gridPath + "outletBoundaryValues.dat");
+	this->settopBcQs(				gridPath + "topBoundaryQs.dat");
+	this->settopBcValues(			gridPath + "topBoundaryValues.dat");
+	this->setbottomBcQs(			gridPath + "bottomBoundaryQs.dat");
+	this->setbottomBcValues(		gridPath + "bottomBoundaryValues.dat");
+	this->setfrontBcQs(				gridPath + "frontBoundaryQs.dat");
+	this->setfrontBcValues(			gridPath + "frontBoundaryValues.dat");
+	this->setbackBcQs(				gridPath + "backBoundaryQs.dat");
+	this->setbackBcValues(			gridPath + "backBoundaryValues.dat");
+	this->setnumberNodes(			gridPath + "numberNodes.dat");
+	this->setLBMvsSI(				gridPath + "LBMvsSI.dat");
+	this->setmeasurePoints(			gridPath + "measurePoints.dat");
+	this->setpropellerValues(		gridPath + "propellerValues.dat");
+	this->setcpTop(					gridPath + "cpTop.dat");
+	this->setcpBottom(				gridPath + "cpBottom.dat");
+	this->setcpBottom2(				gridPath + "cpBottom2.dat");
+	this->setConcentration(			gridPath + "conc.dat");
+	//////////////////////////////////////////////////////////////////////////
+	//Normals - Geometry
+	this->setgeomBoundaryNormalX(gridPath + "geomBoundaryNormalX.dat");
+	this->setgeomBoundaryNormalY(gridPath + "geomBoundaryNormalY.dat");
+	this->setgeomBoundaryNormalZ(gridPath + "geomBoundaryNormalZ.dat");
+	//Normals - Inlet
+	this->setInflowBoundaryNormalX(gridPath + "inletBoundaryNormalX.dat");
+	this->setInflowBoundaryNormalY(gridPath + "inletBoundaryNormalY.dat");
+	this->setInflowBoundaryNormalZ(gridPath + "inletBoundaryNormalZ.dat");
+	//Normals - Outlet
+	this->setOutflowBoundaryNormalX(gridPath + "outletBoundaryNormalX.dat");
+	this->setOutflowBoundaryNormalY(gridPath + "outletBoundaryNormalY.dat");
+	this->setOutflowBoundaryNormalZ(gridPath + "outletBoundaryNormalZ.dat");
+	//////////////////////////////////////////////////////////////////////////
+	//Forcing
+	real forcingX = 0.0;
+	real forcingY = 0.0;
+	real forcingZ = 0.0;
+
+	if (configData->isForcingXInConfigFile())
+		forcingX = configData->getForcingX();
+	if (configData->isForcingYInConfigFile())
+		forcingY = configData->getForcingY();
+	if (configData->isForcingZInConfigFile())
+		forcingZ = configData->getForcingZ();
+
+	this->setForcing(forcingX, forcingY, forcingZ);
+	//////////////////////////////////////////////////////////////////////////
+	//Particles
+	if (configData->isCalcParticlesInConfigFile())
+		this->setCalcParticles(configData->getCalcParticles());
+	else
+		this->setCalcParticles(false);
+
+	if (configData->isParticleBasicLevelInConfigFile())
+		this->setParticleBasicLevel(configData->getParticleBasicLevel());
+	else
+		this->setParticleBasicLevel((int)0);
+
+	if (configData->isParticleInitLevelInConfigFile())
+		this->setParticleInitLevel(configData->getParticleInitLevel());
+	else
+		this->setParticleInitLevel((int)0);
+
+	if (configData->isNumberOfParticlesInConfigFile())
+		this->setNumberOfParticles(configData->getNumberOfParticles());
+	else
+		this->setNumberOfParticles((int)0);
+
+	if (configData->isStartXHotWallInConfigFile())
+		this->setStartXHotWall(configData->getStartXHotWall());
+	else
+		this->setStartXHotWall((real)0);
+
+	if (configData->isEndXHotWallInConfigFile())
+		this->setEndXHotWall(configData->getEndXHotWall());
+	else
+		this->setEndXHotWall((real)0);
+	//////////////////////////////////////////////////////////////////////////
+	//for Multi GPU
+	if (this->getNumprocs() > 1)
+	{
+		//////////////////////////////////////////////////////////////////////////
+		//3D domain decomposition
+		std::vector<std::string> sendProcNeighborsX, sendProcNeighborsY, sendProcNeighborsZ;
+		std::vector<std::string> recvProcNeighborsX, recvProcNeighborsY, recvProcNeighborsZ;
+		for (int i = 0; i < this->getNumprocs(); i++)
+		{
+			sendProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xs.dat");
+			sendProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Ys.dat");
+			sendProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zs.dat");
+			recvProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xr.dat");
+			recvProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Yr.dat");
+			recvProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zr.dat");
+		}
+		this->setPossNeighborFilesX(sendProcNeighborsX, "send");
+		this->setPossNeighborFilesY(sendProcNeighborsY, "send");
+		this->setPossNeighborFilesZ(sendProcNeighborsZ, "send");
+		this->setPossNeighborFilesX(recvProcNeighborsX, "recv");
+		this->setPossNeighborFilesY(recvProcNeighborsY, "recv");
+		this->setPossNeighborFilesZ(recvProcNeighborsZ, "recv");
+	}
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	//Restart
+	if (configData->isTimeDoCheckPointInConfigFile())
+		this->setTimeDoCheckPoint(configData->getTimeDoCheckPoint());
+	else
+		this->setTimeDoCheckPoint((uint)0);
+
+	if (configData->isTimeDoRestartInConfigFile())
+		this->setTimeDoRestart(configData->getTimeDoRestart());
+	else
+		this->setTimeDoRestart((uint)0);
+
+	if (configData->isDoCheckPointInConfigFile())
+		this->setDoCheckPoint(configData->getDoCheckPoint());
+	else
+		this->setDoCheckPoint(false);
+
+	if (configData->isDoRestartInConfigFile())
+		this->setDoRestart(configData->getDoRestart());
+	else
+		this->setDoRestart(false);
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	if (configData->isMaxLevelInConfigFile())
+		this->setMaxLevel(configData->getMaxLevel());
+	else
+		this->setMaxLevel((int)1);
+
+	if (configData->isGridXInConfigFile())
+		this->setGridX(configData->getGridX());
+	else
+		this->setGridX(std::vector<int>(this->getMaxLevel()+1, 32));
+
+	if (configData->isGridYInConfigFile())
+		this->setGridY(configData->getGridY());
+	else
+		this->setGridY(std::vector<int>(this->getMaxLevel()+1, 32));
+
+	if (configData->isGridZInConfigFile())
+		this->setGridZ(configData->getGridZ());
+	else
+		this->setGridZ(std::vector<int>(this->getMaxLevel()+1, 32));
+
+	if (configData->isDistXInConfigFile())
+		this->setDistX(configData->getDistX());
+	else
+		this->setDistX(std::vector<int>(this->getMaxLevel()+1, 32));
+
+	if (configData->isDistYInConfigFile())
+		this->setDistY(configData->getDistY());
+	else
+		this->setDistY(std::vector<int>(this->getMaxLevel()+1, 32));
+
+	if (configData->isDistZInConfigFile())
+		this->setDistZ(configData->getDistZ());
+	else
+		this->setDistZ(std::vector<int>(this->getMaxLevel()+1, 32));
+
+	if (configData->isNeedInterfaceInConfigFile())
+		this->setNeedInterface(configData->getNeedInterface());
+	else
+		this->setNeedInterface(std::vector<bool>(6, true));
+
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+	// Kernel
+	if (configData->isMainKernelInConfigFile())
+		this->setMainKernel(configData->getMainKernel());
+	else
+		this->setMainKernel("CumulantOneCompSP27");
+
+	if (configData->isMultiKernelOnInConfigFile())
+		this->setMultiKernelOn(configData->getMultiKernelOn());
+	else
+		this->setMultiKernelOn(false);
+
+	if (configData->isMultiKernelLevelInConfigFile())
+		this->setMultiKernelLevel(configData->getMultiKernelLevel());
+	else if (this->getMultiKernelOn())
+	{
+		std::vector<int> tmp;
+		for (int i = 0; i < this->getMaxLevel()+1; i++)
+		{
+			tmp.push_back(i);
+		}
+		this->setMultiKernelLevel(tmp);
+	} 
+	else
+		this->setMultiKernelLevel(std::vector<int>(0));
+
+	if (configData->isMultiKernelNameInConfigFile())
+		this->setMultiKernelName(configData->getMultiKernelName());
+	else if (this->getMultiKernelOn())
+	{
+		std::vector<std::string> tmp;
+		for (int i = 0; i < this->getMaxLevel()+1; i++)
+		{
+			tmp.push_back("CumulantOneCompSP27");
+		}
+		this->setMultiKernelName(tmp);
+	}
+	else
+		this->setMultiKernelName(std::vector<std::string>(0));
+	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+}
 Parameter::~Parameter()
 {
 }
@@ -59,10 +549,10 @@ void Parameter::initParameter()
 		parH[i]->sizePlaneXY           = parH[i]->nx * parH[i]->ny;
 		parH[i]->sizePlaneYZ           = parH[i]->ny * parH[i]->nz;
 		parH[i]->sizePlaneXZ           = parH[i]->nx * parH[i]->nz;
-		parH[i]->mem_size_real      = sizeof(real     ) * parH[i]->size_Mat;
+		parH[i]->mem_size_real         = sizeof(real     ) * parH[i]->size_Mat;
 		parH[i]->mem_size_int          = sizeof(unsigned int) * parH[i]->size_Mat;
 		parH[i]->mem_size_bool         = sizeof(bool        ) * parH[i]->size_Mat;
-		parH[i]->mem_size_real_yz   = sizeof(real     ) * parH[i]->ny * parH[i]->nz;
+		parH[i]->mem_size_real_yz      = sizeof(real     ) * parH[i]->ny * parH[i]->nz;
 		parH[i]->evenOrOdd             = true;
 		parH[i]->startz                = parH[i]->gridNZ * ic.myid;
 		parH[i]->endz                  = parH[i]->gridNZ * ic.myid + parH[i]->gridNZ;
@@ -137,10 +627,10 @@ void Parameter::initParameter()
 		parD[i]->sizePlaneXY           = parH[i]->sizePlaneXY;
 		parD[i]->sizePlaneYZ           = parH[i]->sizePlaneYZ;
 		parD[i]->sizePlaneXZ           = parH[i]->sizePlaneXZ;
-		parD[i]->mem_size_real      = sizeof(real     ) * parD[i]->size_Mat;
+		parD[i]->mem_size_real         = sizeof(real     ) * parD[i]->size_Mat;
 		parD[i]->mem_size_int          = sizeof(unsigned int) * parD[i]->size_Mat;
 		parD[i]->mem_size_bool         = sizeof(bool        ) * parD[i]->size_Mat;
-		parD[i]->mem_size_real_yz   = sizeof(real     ) * parD[i]->ny * parD[i]->nz;
+		parD[i]->mem_size_real_yz      = sizeof(real     ) * parD[i]->ny * parD[i]->nz;
 		parD[i]->evenOrOdd             = parH[i]->evenOrOdd;
 		parD[i]->startz                = parH[i]->startz;
 		parD[i]->endz                  = parH[i]->endz;
@@ -2891,7 +3381,7 @@ void Parameter::setNumprocs(int numprocs)
 {
 	ic.numprocs = numprocs;
 }
-void Parameter::setDevices(std::vector<int> devices)
+void Parameter::setDevices(std::vector<uint> devices)
 {
 	ic.devices = devices;
 }
@@ -3840,7 +4330,7 @@ int Parameter::getNumprocs()
 {
 	return ic.numprocs;
 }
-std::vector<int> Parameter::getDevices()
+std::vector<uint> Parameter::getDevices()
 {
 	return ic.devices;
 }
diff --git a/src/VirtualFluids_GPU/Parameter/Parameter.h b/src/VirtualFluids_GPU/Parameter/Parameter.h
index 0d993f700..d99494434 100644
--- a/src/VirtualFluids_GPU/Parameter/Parameter.h
+++ b/src/VirtualFluids_GPU/Parameter/Parameter.h
@@ -17,6 +17,9 @@
 #include "Core/PointerDefinitions.h"
 #include "VirtualFluidsDefinitions.h"
 
+class ConfigData;
+class Communicator;
+
 //struct
 struct ParameterStruct{
 	bool evenOrOdd;
@@ -275,6 +278,7 @@ public:
 	//Parameter();
 	////////////////////////////////////////////////////////////////////////////
     static SPtr<Parameter> make();
+	static SPtr<Parameter> make(SPtr<ConfigData> configData, Communicator* comm);
 
 
 	static Parameter* getInstanz();
@@ -670,7 +674,7 @@ public:
 	void setUseWale(bool useWale);
 	void setSimulatePorousMedia(bool simulatePorousMedia);
 	void setclockCycleForMP(real clockCycleForMP);
-	void setDevices(std::vector<int> devices);
+	void setDevices(std::vector<uint> devices);
 	void setGridX(std::vector<int> GridX);
 	void setGridY(std::vector<int> GridY);
 	void setGridZ(std::vector<int> GridZ);
@@ -863,7 +867,7 @@ public:
 	real getRe();
 	real getFactorPressBC();
 	real getclockCycleForMP();
-	std::vector<int> getDevices();
+	std::vector<uint> getDevices();
 	std::vector<int> getGridX();
 	std::vector<int> getGridY();
 	std::vector<int> getGridZ();
@@ -995,6 +999,7 @@ private:
 	//LogWriter output;
 
 	Parameter();
+	Parameter(SPtr<ConfigData> configData, Communicator* comm);
 	Parameter(const Parameter&);
 	void initInterfaceParameter(int level);
 	real TrafoXtoWorld(int CoordX, int level);
diff --git a/targets/apps/LBM/Basel/main.cpp b/targets/apps/LBM/Basel/main.cpp
index ef6711f45..43aab9e01 100644
--- a/targets/apps/LBM/Basel/main.cpp
+++ b/targets/apps/LBM/Basel/main.cpp
@@ -19,6 +19,7 @@
 #include "Core/LbmOrGks.h"
 #include "Core/Input/Input.h"
 #include "Core/StringUtilities/StringUtil.h"
+#include "Core/Input/ConfigFileReader/ConfigFileReader.h"
 
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Communication/Communicator.h"
@@ -54,222 +55,6 @@
 #include "utilities/communication.h"
 #include "utilities/transformator/TransformatorImp.h"
 
-std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
-{
-    if (para->getNumprocs() == 1)
-        return Gridpath + "/";
-    
-    return Gridpath + "/" + StringUtil::toString(para->getMyID()) + "/";
-}
-
-void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input> &input)
-{
-	Communicator* comm = Communicator::getInstanz();
-
-	para->setMaxDev(StringUtil::toInt(input->getValue("NumberOfDevices")));
-	para->setNumprocs(comm->getNummberOfProcess());
-	para->setDevices(StringUtil::toIntVector(input->getValue("Devices")));
-	para->setMyID(comm->getPID());
-	
-	std::string _path = input->getValue("Path");
-    std::string _prefix = input->getValue("Prefix");
-    std::string _gridpath = input->getValue("GridPath");
-    std::string gridPath = getGridPath(para, _gridpath);
-    para->setOutputPath(_path);
-    para->setOutputPrefix(_prefix);
-    para->setFName(_path + "/" + _prefix);
-    para->setPrintFiles(false);
-    para->setPrintFiles(StringUtil::toBool(input->getValue("WriteGrid")));
-    para->setGeometryValues(StringUtil::toBool(input->getValue("GeometryValues")));
-    para->setCalc2ndOrderMoments(StringUtil::toBool(input->getValue("calc2ndOrderMoments")));
-    para->setCalc3rdOrderMoments(StringUtil::toBool(input->getValue("calc3rdOrderMoments")));
-    para->setCalcHighOrderMoments(StringUtil::toBool(input->getValue("calcHigherOrderMoments")));
-    para->setReadGeo(StringUtil::toBool(input->getValue("ReadGeometry")));
-    para->setCalcMedian(StringUtil::toBool(input->getValue("calcMedian")));
-    para->setConcFile(StringUtil::toBool(input->getValue("UseConcFile")));
-    para->setUseMeasurePoints(StringUtil::toBool(input->getValue("UseMeasurePoints")));
-    para->setUseWale(StringUtil::toBool(input->getValue("UseWale")));
-    para->setSimulatePorousMedia(StringUtil::toBool(input->getValue("SimulatePorousMedia")));
-    para->setD3Qxx(StringUtil::toInt(input->getValue("D3Qxx")));
-    para->setTEnd(StringUtil::toInt(input->getValue("TimeEnd")));
-    para->setTOut(StringUtil::toInt(input->getValue("TimeOut")));
-    para->setTStartOut(StringUtil::toInt(input->getValue("TimeStartOut")));
-    para->setTimeCalcMedStart(StringUtil::toInt(input->getValue("TimeStartCalcMedian")));
-    para->setTimeCalcMedEnd(StringUtil::toInt(input->getValue("TimeEndCalcMedian")));
-    para->setPressInID(StringUtil::toInt(input->getValue("PressInID")));
-    para->setPressOutID(StringUtil::toInt(input->getValue("PressOutID")));
-    para->setPressInZ(StringUtil::toInt(input->getValue("PressInZ")));
-    para->setPressOutZ(StringUtil::toInt(input->getValue("PressOutZ")));
-    //////////////////////////////////////////////////////////////////////////
-	para->setCompOn(StringUtil::toBool(input->getValue("CompOn")));
-	para->setDiffOn(StringUtil::toBool(input->getValue("DiffOn")));
-    para->setDiffMod(StringUtil::toInt(input->getValue("DiffMod")));
-    para->setDiffusivity(StringUtil::toFloat(input->getValue("Diffusivity")));
-    para->setTemperatureInit(StringUtil::toFloat(input->getValue("Temp")));
-    para->setTemperatureBC(StringUtil::toFloat(input->getValue("TempBC")));
-    //////////////////////////////////////////////////////////////////////////
-    para->setViscosity(StringUtil::toFloat(input->getValue("Viscosity_LB")));
-    para->setVelocity(StringUtil::toFloat(input->getValue("Velocity_LB")));
-    para->setViscosityRatio(StringUtil::toFloat(input->getValue("Viscosity_Ratio_World_to_LB")));
-    para->setVelocityRatio(StringUtil::toFloat(input->getValue("Velocity_Ratio_World_to_LB")));
-    para->setDensityRatio(StringUtil::toFloat(input->getValue("Density_Ratio_World_to_LB")));
-    para->setPressRatio(StringUtil::toFloat(input->getValue("Delta_Press")));
-    para->setRealX(StringUtil::toFloat(input->getValue("SliceRealX")));
-    para->setRealY(StringUtil::toFloat(input->getValue("SliceRealY")));
-    para->setFactorPressBC(StringUtil::toFloat(input->getValue("dfpbc")));
-    para->setGeometryFileC(input->getValue("GeometryC"));
-    para->setGeometryFileM(input->getValue("GeometryM"));
-    para->setGeometryFileF(input->getValue("GeometryF"));
-    //////////////////////////////////////////////////////////////////////////
-    para->setgeoVec(gridPath + input->getValue("geoVec"));
-    para->setcoordX(gridPath + input->getValue("coordX"));
-    para->setcoordY(gridPath + input->getValue("coordY"));
-    para->setcoordZ(gridPath + input->getValue("coordZ"));
-    para->setneighborX(gridPath + input->getValue("neighborX"));
-    para->setneighborY(gridPath + input->getValue("neighborY"));
-    para->setneighborZ(gridPath + input->getValue("neighborZ"));
-    para->setscaleCFC(gridPath + input->getValue("scaleCFC"));
-    para->setscaleCFF(gridPath + input->getValue("scaleCFF"));
-    para->setscaleFCC(gridPath + input->getValue("scaleFCC"));
-    para->setscaleFCF(gridPath + input->getValue("scaleFCF"));
-    para->setscaleOffsetCF(gridPath + input->getValue("scaleOffsetCF"));
-    para->setscaleOffsetFC(gridPath + input->getValue("scaleOffsetFC"));
-    para->setgeomBoundaryBcQs(gridPath + input->getValue("geomBoundaryBcQs"));
-    para->setgeomBoundaryBcValues(gridPath + input->getValue("geomBoundaryBcValues"));
-    para->setinletBcQs(gridPath + input->getValue("inletBcQs"));
-    para->setinletBcValues(gridPath + input->getValue("inletBcValues"));
-    para->setoutletBcQs(gridPath + input->getValue("outletBcQs"));
-    para->setoutletBcValues(gridPath + input->getValue("outletBcValues"));
-    para->settopBcQs(gridPath + input->getValue("topBcQs"));
-    para->settopBcValues(gridPath + input->getValue("topBcValues"));
-    para->setbottomBcQs(gridPath + input->getValue("bottomBcQs"));
-    para->setbottomBcValues(gridPath + input->getValue("bottomBcValues"));
-    para->setfrontBcQs(gridPath + input->getValue("frontBcQs"));
-    para->setfrontBcValues(gridPath + input->getValue("frontBcValues"));
-    para->setbackBcQs(gridPath + input->getValue("backBcQs"));
-    para->setbackBcValues(gridPath + input->getValue("backBcValues"));
-    para->setnumberNodes(gridPath + input->getValue("numberNodes"));
-    para->setLBMvsSI(gridPath + input->getValue("LBMvsSI"));
-    //////////////////////////////gridPath + ////////////////////////////////////////////
-    para->setmeasurePoints(gridPath + input->getValue("measurePoints"));
-    para->setpropellerValues(gridPath + input->getValue("propellerValues"));
-    para->setclockCycleForMP(StringUtil::toFloat(input->getValue("measureClockCycle")));
-    para->settimestepForMP(StringUtil::toInt(input->getValue("measureTimestep")));
-    para->setcpTop(gridPath + input->getValue("cpTop"));
-    para->setcpBottom(gridPath + input->getValue("cpBottom"));
-    para->setcpBottom2(gridPath + input->getValue("cpBottom2"));
-    para->setConcentration(gridPath + input->getValue("Concentration"));
-    //////////////////////////////////////////////////////////////////////////
-    //Normals - Geometry
-    para->setgeomBoundaryNormalX(gridPath + input->getValue("geomBoundaryNormalX"));
-    para->setgeomBoundaryNormalY(gridPath + input->getValue("geomBoundaryNormalY"));
-    para->setgeomBoundaryNormalZ(gridPath + input->getValue("geomBoundaryNormalZ"));
-    //Normals - Inlet
-    para->setInflowBoundaryNormalX(gridPath + input->getValue("inletBoundaryNormalX"));
-    para->setInflowBoundaryNormalY(gridPath + input->getValue("inletBoundaryNormalY"));
-    para->setInflowBoundaryNormalZ(gridPath + input->getValue("inletBoundaryNormalZ"));
-    //Normals - Outlet
-    para->setOutflowBoundaryNormalX(gridPath + input->getValue("outletBoundaryNormalX"));
-    para->setOutflowBoundaryNormalY(gridPath + input->getValue("outletBoundaryNormalY"));
-    para->setOutflowBoundaryNormalZ(gridPath + input->getValue("outletBoundaryNormalZ"));
-    //////////////////////////////////////////////////////////////////////////
-    //Forcing
-    para->setForcing(StringUtil::toFloat(input->getValue("ForcingX")), StringUtil::toFloat(input->getValue("ForcingY")), StringUtil::toFloat(input->getValue("ForcingZ")));
-    //////////////////////////////////////////////////////////////////////////
-    //Particles
-    para->setCalcParticles(StringUtil::toBool(input->getValue("calcParticles")));
-    para->setParticleBasicLevel(StringUtil::toInt(input->getValue("baseLevel")));
-    para->setParticleInitLevel(StringUtil::toInt(input->getValue("initLevel")));
-    para->setNumberOfParticles(StringUtil::toInt(input->getValue("numberOfParticles")));
-    para->setneighborWSB(gridPath + input->getValue("neighborWSB"));
-    para->setStartXHotWall(StringUtil::toDouble(input->getValue("startXHotWall")));
-    para->setEndXHotWall(StringUtil::toDouble(input->getValue("endXHotWall")));
-    //////////////////////////////////////////////////////////////////////////
-    //for Multi GPU
-    if (para->getNumprocs() > 1)
-    {
-        ////////////////////////////////////////////////////////////////////////////
-        ////1D domain decomposition
-        //std::vector<std::string> sendProcNeighbors;
-        //std::vector<std::string> recvProcNeighbors;
-        //for (int i = 0; i<para->getNumprocs();i++)
-        //{
-        // sendProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "s.dat");
-        // recvProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "r.dat");
-        //}
-        //para->setPossNeighborFiles(sendProcNeighbors, "send");
-        //para->setPossNeighborFiles(recvProcNeighbors, "recv");
-        //////////////////////////////////////////////////////////////////////////
-        //3D domain decomposition
-        std::vector<std::string> sendProcNeighborsX, sendProcNeighborsY, sendProcNeighborsZ;
-        std::vector<std::string> recvProcNeighborsX, recvProcNeighborsY, recvProcNeighborsZ;
-        for (int i = 0; i < para->getNumprocs(); i++)
-        {
-            sendProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xs.dat");
-            sendProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Ys.dat");
-            sendProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zs.dat");
-            recvProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xr.dat");
-            recvProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Yr.dat");
-            recvProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zr.dat");
-        }
-        para->setPossNeighborFilesX(sendProcNeighborsX, "send");
-        para->setPossNeighborFilesY(sendProcNeighborsY, "send");
-        para->setPossNeighborFilesZ(sendProcNeighborsZ, "send");
-        para->setPossNeighborFilesX(recvProcNeighborsX, "recv");
-        para->setPossNeighborFilesY(recvProcNeighborsY, "recv");
-        para->setPossNeighborFilesZ(recvProcNeighborsZ, "recv");
-    }
-    //////////////////////////////////////////////////////////////////////////
-    //para->setkFull(             input->getValue( "kFull" ));
-    //para->setgeoFull(           input->getValue( "geoFull" ));
-    //para->setnoSlipBcPos(       input->getValue( "noSlipBcPos" ));
-    //para->setnoSlipBcQs(          input->getValue( "noSlipBcQs" ));
-    //para->setnoSlipBcValues(      input->getValue( "noSlipBcValues" ));
-    //para->setnoSlipBcValue(     input->getValue( "noSlipBcValue" ));
-    //para->setslipBcPos(         input->getValue( "slipBcPos" ));
-    //para->setslipBcQs(          input->getValue( "slipBcQs" ));
-    //para->setslipBcValue(       input->getValue( "slipBcValue" ));
-    //para->setpressBcPos(        input->getValue( "pressBcPos" ));
-    //para->setpressBcQs(           input->getValue( "pressBcQs" ));
-    //para->setpressBcValues(       input->getValue( "pressBcValues" ));
-    //para->setpressBcValue(      input->getValue( "pressBcValue" ));
-    //para->setvelBcQs(             input->getValue( "velBcQs" ));
-    //para->setvelBcValues(         input->getValue( "velBcValues" ));
-    //para->setpropellerCylinder( input->getValue( "propellerCylinder" ));
-    //para->setpropellerQs(		 input->getValue( "propellerQs"      ));
-    //para->setwallBcQs(            input->getValue( "wallBcQs"         ));
-    //para->setwallBcValues(        input->getValue( "wallBcValues"     ));
-    //para->setperiodicBcQs(        input->getValue( "periodicBcQs"     ));
-    //para->setperiodicBcValues(    input->getValue( "periodicBcValues" ));
-    //cout << "Try this: " << para->getgeomBoundaryBcValues() << endl;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    //Restart
-    para->setTimeDoCheckPoint(StringUtil::toInt(input->getValue("TimeDoCheckPoint")));
-    para->setTimeDoRestart(StringUtil::toInt(input->getValue("TimeDoRestart")));
-    para->setDoCheckPoint(StringUtil::toBool(input->getValue("DoCheckPoint")));
-    para->setDoRestart(StringUtil::toBool(input->getValue("DoRestart")));
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    para->setMaxLevel(StringUtil::toInt(input->getValue("NOGL")));
-    para->setGridX(StringUtil::toIntVector(input->getValue("GridX")));                           
-    para->setGridY(StringUtil::toIntVector(input->getValue("GridY")));                           
-    para->setGridZ(StringUtil::toIntVector(input->getValue("GridZ")));                  
-    para->setDistX(StringUtil::toIntVector(input->getValue("DistX")));                  
-    para->setDistY(StringUtil::toIntVector(input->getValue("DistY")));                  
-    para->setDistZ(StringUtil::toIntVector(input->getValue("DistZ")));                
-
-    para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
-
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-	// Kernel
-	para->setMainKernel(input->getValue("MainKernelName"));
-	para->setMultiKernelOn(StringUtil::toBool(input->getValue("multiKernelOn")));
-	para->setMultiKernelLevel(StringUtil::toIntVector(input->getValue("multiKernelLevel")));
-	para->setMultiKernelName(StringUtil::toStringVector(input->getValue("multiKernelName")));
-	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-}
-
-
 
 void multipleLevel(const std::string& configPath)
 {
@@ -291,8 +76,12 @@ void multipleLevel(const std::string& configPath)
     //gridFactory->setTriangularMeshDiscretizationMethod(TriangularMeshDiscretizationMethod::POINT_UNDER_TRIANGLE);
 
     auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
-    
-    SPtr<Parameter> para = Parameter::make();
+
+	SPtr<ConfigFileReader> configReader = ConfigFileReader::getNewInstance();
+	SPtr<ConfigData> configData = configReader->readConfigFile(configPath);
+	Communicator* comm = Communicator::getInstanz();
+
+    SPtr<Parameter> para = Parameter::make(configData, comm);
     SPtr<GridProvider> gridGenerator;
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -306,7 +95,7 @@ void multipleLevel(const std::string& configPath)
             real dx = 1.2;
             real vx = 0.05;
 
-            TriangularMesh* BaselSTL = TriangularMesh::make("M:/Basel2019/stl/BaselUrbanProfile_066_deg_bridge_All_CLOSED.stl");
+            TriangularMesh* BaselSTL = TriangularMesh::make("E:/temp/Basel2019/stl/BaselUrbanProfile_066_deg_bridge_All_CLOSED.stl");
 
             gridBuilder->addCoarseGrid(-256.0, -256.0, -  8.0,
                                         256.0,  256.0,  160.0, dx);  
@@ -326,23 +115,23 @@ void multipleLevel(const std::string& configPath)
 
             //////////////////////////////////////////////////////////////////////////
 
-            gridBuilder->writeGridsToVtk("M:/Basel2019/grids/BaselUni/Basel_Grid");
+            gridBuilder->writeGridsToVtk("E:/temp/Basel2019/grids/BaselUni/Basel_Grid");
 
-            SimulationFileWriter::write("M:/Basel2019/grids/BaselUni/", gridBuilder, FILEFORMAT::BINARY);
+            SimulationFileWriter::write("E:/temp/Basel2019/grids/BaselUni/", gridBuilder, FILEFORMAT::BINARY);
 
 			////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 			StreetPointFinder finder;
 
-			finder.readStreets("C:/Users/schoen/Desktop/git/MS2/git/targets/apps/LBM/streetTest/resources/ExampleStreets.txt");
+			finder.readStreets("C:/Users/schoen/Desktop/git/MS/git/targets/apps/LBM/streetTest/resources/ExampleStreets.txt");
 
-			finder.writeVTK("F:/Work/Computations/NagelSchreckenberg/ExampleStreets.vtk");
+			finder.writeVTK("E:/temp/Basel2019/results/ExampleStreets.vtk");
 
 			finder.findIndicesLB(gridBuilder->getGrid(0));
 
-			finder.writeConnectionVTK("M:/Basel2019/grids/BaselUni/Basel_Grid/ExampleStreetsConnection.vtk", gridBuilder->getGrid(0));
+			finder.writeConnectionVTK("E:/temp/Basel2019/grids/BaselUni/Basel_Grid/ExampleStreetsConnection.vtk", gridBuilder->getGrid(0));
 
-			finder.writeSimulationFile("M:/Basel2019/grids/BaselUni/", 1.0, gridBuilder->getNumberOfLevels(), 0);
+			finder.writeSimulationFile("E:/temp/Basel2019/grids/BaselUni/", 1.0, gridBuilder->getNumberOfLevels(), 0);
 
 			////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -366,14 +155,12 @@ void multipleLevel(const std::string& configPath)
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
-    std::ifstream stream;
-    stream.open(configPath.c_str(), std::ios::in);
-    if (stream.fail())
-        throw std::runtime_error("can not open config file!");
-
-    UPtr<input::Input> input = input::Input::makeInput(stream, "config");
+    //std::ifstream stream;
+    //stream.open(configPath.c_str(), std::ios::in);
+    //if (stream.fail())
+    //    throw std::runtime_error("can not open config file!");
 
-    setParameters(para, input);
+    //UPtr<input::Input> input = input::Input::makeInput(stream, "config");
 
     Simulation sim;
     SPtr<FileWriter> fileWriter = SPtr<FileWriter>(new FileWriter());
@@ -411,7 +198,7 @@ int main( int argc, char* argv[])
         {
             try
             {
-				multipleLevel("C:/Users/schoen/Desktop/bin/ReleaseBasel/configBasel.txt");
+				multipleLevel("E:/temp/Basel2019/config/configBasel.txt");
 				//multipleLevel("F:/Work/Computations/gridGenerator/inp/configTest.txt");
             }
             catch (const std::exception& e)
diff --git a/targets/apps/LBM/TGV_3D/TGV_3D.cpp b/targets/apps/LBM/TGV_3D/TGV_3D.cpp
index 4f5386486..7d28afa55 100644
--- a/targets/apps/LBM/TGV_3D/TGV_3D.cpp
+++ b/targets/apps/LBM/TGV_3D/TGV_3D.cpp
@@ -20,6 +20,7 @@
 #include "Core/LbmOrGks.h"
 #include "Core/Input/Input.h"
 #include "Core/StringUtilities/StringUtil.h"
+#include "Core/Input/ConfigFileReader/ConfigFileReader.h"
 
 #include "VirtualFluids_GPU/LBM/Simulation.h"
 #include "VirtualFluids_GPU/Communication/Communicator.h"
@@ -53,215 +54,7 @@
 #include "utilities/communication.h"
 #include "utilities/transformator/TransformatorImp.h"
 
-std::string getGridPath(std::shared_ptr<Parameter> para, std::string Gridpath)
-{
-    if (para->getNumprocs() == 1)
-        return Gridpath + "/";
-    
-    return Gridpath + "/" + StringUtil::toString(para->getMyID()) + "/";
-}
-
-void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input> &input)
-{
-	Communicator* comm = Communicator::getInstanz();
-
-	para->setMaxDev(StringUtil::toInt(input->getValue("NumberOfDevices")));
-	para->setNumprocs(comm->getNummberOfProcess());
-	para->setDevices(StringUtil::toIntVector(input->getValue("Devices")));
-	para->setMyID(comm->getPID());
-	
-	std::string _path = input->getValue("Path");
-    std::string _prefix = input->getValue("Prefix");
-    std::string _gridpath = input->getValue("GridPath");
-    std::string gridPath = getGridPath(para, _gridpath);
-    para->setOutputPath(_path);
-    para->setOutputPrefix(_prefix);
-    para->setFName(_path + "/" + _prefix);
-    para->setPrintFiles(false);
-    para->setPrintFiles(StringUtil::toBool(input->getValue("WriteGrid")));
-    para->setGeometryValues(StringUtil::toBool(input->getValue("GeometryValues")));
-    para->setCalc2ndOrderMoments(StringUtil::toBool(input->getValue("calc2ndOrderMoments")));
-    para->setCalc3rdOrderMoments(StringUtil::toBool(input->getValue("calc3rdOrderMoments")));
-    para->setCalcHighOrderMoments(StringUtil::toBool(input->getValue("calcHigherOrderMoments")));
-    para->setReadGeo(StringUtil::toBool(input->getValue("ReadGeometry")));
-    para->setCalcMedian(StringUtil::toBool(input->getValue("calcMedian")));
-    para->setConcFile(StringUtil::toBool(input->getValue("UseConcFile")));
-    para->setUseMeasurePoints(StringUtil::toBool(input->getValue("UseMeasurePoints")));
-    para->setUseWale(StringUtil::toBool(input->getValue("UseWale")));
-    para->setSimulatePorousMedia(StringUtil::toBool(input->getValue("SimulatePorousMedia")));
-    para->setD3Qxx(StringUtil::toInt(input->getValue("D3Qxx")));
-    para->setTEnd(StringUtil::toInt(input->getValue("TimeEnd")));
-    para->setTOut(StringUtil::toInt(input->getValue("TimeOut")));
-    para->setTStartOut(StringUtil::toInt(input->getValue("TimeStartOut")));
-    para->setTimeCalcMedStart(StringUtil::toInt(input->getValue("TimeStartCalcMedian")));
-    para->setTimeCalcMedEnd(StringUtil::toInt(input->getValue("TimeEndCalcMedian")));
-    para->setPressInID(StringUtil::toInt(input->getValue("PressInID")));
-    para->setPressOutID(StringUtil::toInt(input->getValue("PressOutID")));
-    para->setPressInZ(StringUtil::toInt(input->getValue("PressInZ")));
-    para->setPressOutZ(StringUtil::toInt(input->getValue("PressOutZ")));
-    //////////////////////////////////////////////////////////////////////////
-    para->setDiffOn(StringUtil::toBool(input->getValue("DiffOn")));
-    para->setDiffMod(StringUtil::toInt(input->getValue("DiffMod")));
-    para->setDiffusivity(StringUtil::toFloat(input->getValue("Diffusivity")));
-    para->setTemperatureInit(StringUtil::toFloat(input->getValue("Temp")));
-    para->setTemperatureBC(StringUtil::toFloat(input->getValue("TempBC")));
-    //////////////////////////////////////////////////////////////////////////
-    para->setViscosity(StringUtil::toFloat(input->getValue("Viscosity_LB")));
-    para->setVelocity(StringUtil::toFloat(input->getValue("Velocity_LB")));
-    para->setViscosityRatio(StringUtil::toFloat(input->getValue("Viscosity_Ratio_World_to_LB")));
-    para->setVelocityRatio(StringUtil::toFloat(input->getValue("Velocity_Ratio_World_to_LB")));
-    para->setDensityRatio(StringUtil::toFloat(input->getValue("Density_Ratio_World_to_LB")));
-    para->setPressRatio(StringUtil::toFloat(input->getValue("Delta_Press")));
-    para->setRealX(StringUtil::toFloat(input->getValue("SliceRealX")));
-    para->setRealY(StringUtil::toFloat(input->getValue("SliceRealY")));
-    para->setFactorPressBC(StringUtil::toFloat(input->getValue("dfpbc")));
-    para->setGeometryFileC(input->getValue("GeometryC"));
-    para->setGeometryFileM(input->getValue("GeometryM"));
-    para->setGeometryFileF(input->getValue("GeometryF"));
-    //////////////////////////////////////////////////////////////////////////
-    para->setgeoVec(gridPath + input->getValue("geoVec"));
-    para->setcoordX(gridPath + input->getValue("coordX"));
-    para->setcoordY(gridPath + input->getValue("coordY"));
-    para->setcoordZ(gridPath + input->getValue("coordZ"));
-    para->setneighborX(gridPath + input->getValue("neighborX"));
-    para->setneighborY(gridPath + input->getValue("neighborY"));
-    para->setneighborZ(gridPath + input->getValue("neighborZ"));
-    para->setscaleCFC(gridPath + input->getValue("scaleCFC"));
-    para->setscaleCFF(gridPath + input->getValue("scaleCFF"));
-    para->setscaleFCC(gridPath + input->getValue("scaleFCC"));
-    para->setscaleFCF(gridPath + input->getValue("scaleFCF"));
-    para->setscaleOffsetCF(gridPath + input->getValue("scaleOffsetCF"));
-    para->setscaleOffsetFC(gridPath + input->getValue("scaleOffsetFC"));
-    para->setgeomBoundaryBcQs(gridPath + input->getValue("geomBoundaryBcQs"));
-    para->setgeomBoundaryBcValues(gridPath + input->getValue("geomBoundaryBcValues"));
-    para->setinletBcQs(gridPath + input->getValue("inletBcQs"));
-    para->setinletBcValues(gridPath + input->getValue("inletBcValues"));
-    para->setoutletBcQs(gridPath + input->getValue("outletBcQs"));
-    para->setoutletBcValues(gridPath + input->getValue("outletBcValues"));
-    para->settopBcQs(gridPath + input->getValue("topBcQs"));
-    para->settopBcValues(gridPath + input->getValue("topBcValues"));
-    para->setbottomBcQs(gridPath + input->getValue("bottomBcQs"));
-    para->setbottomBcValues(gridPath + input->getValue("bottomBcValues"));
-    para->setfrontBcQs(gridPath + input->getValue("frontBcQs"));
-    para->setfrontBcValues(gridPath + input->getValue("frontBcValues"));
-    para->setbackBcQs(gridPath + input->getValue("backBcQs"));
-    para->setbackBcValues(gridPath + input->getValue("backBcValues"));
-    para->setnumberNodes(gridPath + input->getValue("numberNodes"));
-    para->setLBMvsSI(gridPath + input->getValue("LBMvsSI"));
-    //////////////////////////////gridPath + ////////////////////////////////////////////
-    para->setmeasurePoints(gridPath + input->getValue("measurePoints"));
-    para->setpropellerValues(gridPath + input->getValue("propellerValues"));
-    para->setclockCycleForMP(StringUtil::toFloat(input->getValue("measureClockCycle")));
-    para->settimestepForMP(StringUtil::toInt(input->getValue("measureTimestep")));
-    para->setcpTop(gridPath + input->getValue("cpTop"));
-    para->setcpBottom(gridPath + input->getValue("cpBottom"));
-    para->setcpBottom2(gridPath + input->getValue("cpBottom2"));
-    para->setConcentration(gridPath + input->getValue("Concentration"));
-    //////////////////////////////////////////////////////////////////////////
-    //Normals - Geometry
-    para->setgeomBoundaryNormalX(gridPath + input->getValue("geomBoundaryNormalX"));
-    para->setgeomBoundaryNormalY(gridPath + input->getValue("geomBoundaryNormalY"));
-    para->setgeomBoundaryNormalZ(gridPath + input->getValue("geomBoundaryNormalZ"));
-    //Normals - Inlet
-    para->setInflowBoundaryNormalX(gridPath + input->getValue("inletBoundaryNormalX"));
-    para->setInflowBoundaryNormalY(gridPath + input->getValue("inletBoundaryNormalY"));
-    para->setInflowBoundaryNormalZ(gridPath + input->getValue("inletBoundaryNormalZ"));
-    //Normals - Outlet
-    para->setOutflowBoundaryNormalX(gridPath + input->getValue("outletBoundaryNormalX"));
-    para->setOutflowBoundaryNormalY(gridPath + input->getValue("outletBoundaryNormalY"));
-    para->setOutflowBoundaryNormalZ(gridPath + input->getValue("outletBoundaryNormalZ"));
-    //////////////////////////////////////////////////////////////////////////
-    //Forcing
-    para->setForcing(StringUtil::toFloat(input->getValue("ForcingX")), StringUtil::toFloat(input->getValue("ForcingY")), StringUtil::toFloat(input->getValue("ForcingZ")));
-    //////////////////////////////////////////////////////////////////////////
-    //Particles
-    para->setCalcParticles(StringUtil::toBool(input->getValue("calcParticles")));
-    para->setParticleBasicLevel(StringUtil::toInt(input->getValue("baseLevel")));
-    para->setParticleInitLevel(StringUtil::toInt(input->getValue("initLevel")));
-    para->setNumberOfParticles(StringUtil::toInt(input->getValue("numberOfParticles")));
-    para->setneighborWSB(gridPath + input->getValue("neighborWSB"));
-    para->setStartXHotWall(StringUtil::toDouble(input->getValue("startXHotWall")));
-    para->setEndXHotWall(StringUtil::toDouble(input->getValue("endXHotWall")));
-    //////////////////////////////////////////////////////////////////////////
-    //for Multi GPU
-    if (para->getNumprocs() > 1)
-    {
-        ////////////////////////////////////////////////////////////////////////////
-        ////1D domain decomposition
-        //std::vector<std::string> sendProcNeighbors;
-        //std::vector<std::string> recvProcNeighbors;
-        //for (int i = 0; i<para->getNumprocs();i++)
-        //{
-        // sendProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "s.dat");
-        // recvProcNeighbors.push_back(gridPath + StringUtil::toString(i) + "r.dat");
-        //}
-        //para->setPossNeighborFiles(sendProcNeighbors, "send");
-        //para->setPossNeighborFiles(recvProcNeighbors, "recv");
-        //////////////////////////////////////////////////////////////////////////
-        //3D domain decomposition
-        std::vector<std::string> sendProcNeighborsX, sendProcNeighborsY, sendProcNeighborsZ;
-        std::vector<std::string> recvProcNeighborsX, recvProcNeighborsY, recvProcNeighborsZ;
-        for (int i = 0; i < para->getNumprocs(); i++)
-        {
-            sendProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xs.dat");
-            sendProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Ys.dat");
-            sendProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zs.dat");
-            recvProcNeighborsX.push_back(gridPath + StringUtil::toString(i) + "Xr.dat");
-            recvProcNeighborsY.push_back(gridPath + StringUtil::toString(i) + "Yr.dat");
-            recvProcNeighborsZ.push_back(gridPath + StringUtil::toString(i) + "Zr.dat");
-        }
-        para->setPossNeighborFilesX(sendProcNeighborsX, "send");
-        para->setPossNeighborFilesY(sendProcNeighborsY, "send");
-        para->setPossNeighborFilesZ(sendProcNeighborsZ, "send");
-        para->setPossNeighborFilesX(recvProcNeighborsX, "recv");
-        para->setPossNeighborFilesY(recvProcNeighborsY, "recv");
-        para->setPossNeighborFilesZ(recvProcNeighborsZ, "recv");
-    }
-    //////////////////////////////////////////////////////////////////////////
-    //para->setkFull(             input->getValue( "kFull" ));
-    //para->setgeoFull(           input->getValue( "geoFull" ));
-    //para->setnoSlipBcPos(       input->getValue( "noSlipBcPos" ));
-    //para->setnoSlipBcQs(          input->getValue( "noSlipBcQs" ));
-    //para->setnoSlipBcValues(      input->getValue( "noSlipBcValues" ));
-    //para->setnoSlipBcValue(     input->getValue( "noSlipBcValue" ));
-    //para->setslipBcPos(         input->getValue( "slipBcPos" ));
-    //para->setslipBcQs(          input->getValue( "slipBcQs" ));
-    //para->setslipBcValue(       input->getValue( "slipBcValue" ));
-    //para->setpressBcPos(        input->getValue( "pressBcPos" ));
-    //para->setpressBcQs(           input->getValue( "pressBcQs" ));
-    //para->setpressBcValues(       input->getValue( "pressBcValues" ));
-    //para->setpressBcValue(      input->getValue( "pressBcValue" ));
-    //para->setvelBcQs(             input->getValue( "velBcQs" ));
-    //para->setvelBcValues(         input->getValue( "velBcValues" ));
-    //para->setpropellerCylinder( input->getValue( "propellerCylinder" ));
-    //para->setpropellerQs(		 input->getValue( "propellerQs"      ));
-    //para->setwallBcQs(            input->getValue( "wallBcQs"         ));
-    //para->setwallBcValues(        input->getValue( "wallBcValues"     ));
-    //para->setperiodicBcQs(        input->getValue( "periodicBcQs"     ));
-    //para->setperiodicBcValues(    input->getValue( "periodicBcValues" ));
-    //cout << "Try this: " << para->getgeomBoundaryBcValues() << endl;
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    //Restart
-    para->setTimeDoCheckPoint(StringUtil::toInt(input->getValue("TimeDoCheckPoint")));
-    para->setTimeDoRestart(StringUtil::toInt(input->getValue("TimeDoRestart")));
-    para->setDoCheckPoint(StringUtil::toBool(input->getValue("DoCheckPoint")));
-    para->setDoRestart(StringUtil::toBool(input->getValue("DoRestart")));
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    para->setMaxLevel(StringUtil::toInt(input->getValue("NOGL")));
-    para->setGridX(StringUtil::toIntVector(input->getValue("GridX")));                           
-    para->setGridY(StringUtil::toIntVector(input->getValue("GridY")));                           
-    para->setGridZ(StringUtil::toIntVector(input->getValue("GridZ")));                  
-    para->setDistX(StringUtil::toIntVector(input->getValue("DistX")));                  
-    para->setDistY(StringUtil::toIntVector(input->getValue("DistY")));                  
-    para->setDistZ(StringUtil::toIntVector(input->getValue("DistZ")));                
-
-    para->setNeedInterface(std::vector<bool>{true, true, true, true, true, true});
-}
-
-
-
-void multipleLevel(const std::string& configPath, uint nx, int gpuIndex)
+void multipleLevel(const std::string& configPath, uint nx, uint gpuIndex)
 {
     //std::ofstream logFile( "F:/Work/Computations/gridGenerator/grid/gridGeneratorLog.txt" );
     //std::ofstream logFile( "grid/gridGeneratorLog.txt" );
@@ -282,7 +75,10 @@ void multipleLevel(const std::string& configPath, uint nx, int gpuIndex)
 
     auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory);
     
-    SPtr<Parameter> para = Parameter::make();
+	SPtr<ConfigFileReader> configReader = ConfigFileReader::getNewInstance();
+	SPtr<ConfigData> configData = configReader->readConfigFile(configPath);
+	Communicator* comm = Communicator::getInstanz();
+    SPtr<Parameter> para = Parameter::make(configData, comm);
     SPtr<GridProvider> gridGenerator;
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -323,39 +119,25 @@ void multipleLevel(const std::string& configPath, uint nx, int gpuIndex)
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+  
+	//std::stringstream _path;
+ //   std::stringstream _prefix;
 
+ //   //_path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/" << nx << "_Re_1.6e4";
+ //   //_path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/" << nx << "_neqInit";
+ //   _path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/Re_1600/AA2016/" << nx << "_FD_O8";
 
-    std::ifstream stream;
-    stream.open(configPath.c_str(), std::ios::in);
-    if (stream.fail())
-        throw std::runtime_error("can not open config file!");
-
-    UPtr<input::Input> input = input::Input::makeInput(stream, "config");
-
-    setParameters(para, input);
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    
-	std::stringstream _path;
-    std::stringstream _prefix;
-
-    //_path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/" << nx << "_Re_1.6e4";
-    //_path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/" << nx << "_neqInit";
-    _path << "F:/Work/Computations/TaylorGreenVortex_3D/TGV_LBM/Re_1600/AA2016/" << nx << "_FD_O8";
-
-    //_path << "./results/AA2016/" << nx;
-    //_path << "./results/CumOne/" << nx;
-    //_path << "./results/F3_2018/" << nx;
+ //   //_path << "./results/AA2016/" << nx;
+ //   //_path << "./results/CumOne/" << nx;
+ //   //_path << "./results/F3_2018/" << nx;
 
-    _prefix << "TGV_3D_" << nx << "_" ;
+ //   _prefix << "TGV_3D_" << nx << "_" ;
 
-    para->setOutputPath(_path.str());
-    para->setOutputPrefix(_prefix.str());
-    para->setFName(_path.str() + "/" + _prefix.str());
+ //   para->setOutputPath(_path.str());
+ //   para->setOutputPrefix(_prefix.str());
+ //   para->setFName(_path.str() + "/" + _prefix.str());
 
-    para->setDevices({gpuIndex});
+ //   para->setDevices(std::vector<uint>{gpuIndex});
 
     //////////////////////////////////////////////////////////////////////////
 
@@ -391,7 +173,7 @@ int main( int argc, char* argv[])
         {
             //////////////////////////////////////////////////////////////////////////
             
-            uint gpuIndex = 0;
+            uint gpuIndex = 2;
     
             uint nx = 64;
 
@@ -399,8 +181,7 @@ int main( int argc, char* argv[])
 
             if( argc > 2 ) nx = atoi( argv[2] );
 
-			multipleLevel("F:/Work/Computations/inp/configTGV3D.txt", nx, gpuIndex);
-			//multipleLevel("./inp/configTGV3D.txt", nx, gpuIndex);
+			multipleLevel("C:/Users/schoen/Desktop/bin/3D/VirtualFluidsGpuCodes/TGV3D/configTGV3D.txt", nx, gpuIndex);
 
             //////////////////////////////////////////////////////////////////////////
 		}
diff --git a/targets/apps/LBM/lbmTest/main.cpp b/targets/apps/LBM/lbmTest/main.cpp
index f55e5b908..56c36c395 100644
--- a/targets/apps/LBM/lbmTest/main.cpp
+++ b/targets/apps/LBM/lbmTest/main.cpp
@@ -66,7 +66,7 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input
 
 	para->setMaxDev(StringUtil::toInt(input->getValue("NumberOfDevices")));
 	para->setNumprocs(comm->getNummberOfProcess());
-	para->setDevices(StringUtil::toIntVector(input->getValue("Devices")));
+	para->setDevices(StringUtil::toUintVector(input->getValue("Devices")));
 	para->setMyID(comm->getPID());
 	
 	std::string _path = input->getValue("Path");
diff --git a/targets/apps/LBM/metisTest/main.cpp b/targets/apps/LBM/metisTest/main.cpp
index 498f1c8ea..fb5116d5d 100644
--- a/targets/apps/LBM/metisTest/main.cpp
+++ b/targets/apps/LBM/metisTest/main.cpp
@@ -65,7 +65,7 @@ void setParameters(std::shared_ptr<Parameter> para, std::unique_ptr<input::Input
 
 	para->setMaxDev(StringUtil::toInt(input->getValue("NumberOfDevices")));
 	para->setNumprocs(comm->getNummberOfProcess());
-	para->setDevices(StringUtil::toIntVector(input->getValue("Devices")));
+	para->setDevices(StringUtil::toUintVector(input->getValue("Devices")));
 	para->setMyID(comm->getPID());
 	
 	std::string _path = input->getValue("Path");
-- 
GitLab