diff --git a/apps/gpu/FlowAroundSphere/FlowAroundSphere.cpp b/apps/gpu/FlowAroundSphere/FlowAroundSphere.cpp index 4cc501260f954a9e57ddc4a47cfa68ede8a50bdd..cdc1c07be09d0b2b0cf790676d092cb697c33a9f 100644 --- a/apps/gpu/FlowAroundSphere/FlowAroundSphere.cpp +++ b/apps/gpu/FlowAroundSphere/FlowAroundSphere.cpp @@ -32,6 +32,7 @@ //======================================================================================= #define _USE_MATH_DEFINES #include <exception> +#include <filesystem> #include <fstream> #include <iostream> #include <math.h> @@ -46,8 +47,8 @@ #include "Core/LbmOrGks.h" #include "Core/Logger/Logger.h" #include "Core/VectorTypes.h" -#include "config/ConfigurationFile.h" #include "PointerDefinitions.h" +#include "config/ConfigurationFile.h" ////////////////////////////////////////////////////////////////////////// @@ -75,8 +76,7 @@ int main(int argc, char *argv[]) ////////////////////////////////////////////////////////////////////////// // Simulation parameters ////////////////////////////////////////////////////////////////////////// - std::string outputPath("./output/Sphere"); - std::string simulationName("Sphere"); + const bool useConfigFile = true; const real L = 1.0; const real Re = 1000.0; @@ -95,6 +95,34 @@ int main(int argc, char *argv[]) logging::Logger::setDebugLevel(logging::Logger::Level::INFO_LOW); logging::Logger::timeStamp(logging::Logger::ENABLE); logging::Logger::enablePrintedRankNumbers(logging::Logger::ENABLE); + + ////////////////////////////////////////////////////////////////////////// + // setup simulation parameters + ////////////////////////////////////////////////////////////////////////// + SPtr<Parameter> para; + if (useConfigFile) { + ////////////////////////////////////////////////////////////////////////// + // read simulation parameters from config file + ////////////////////////////////////////////////////////////////////////// + + // assuming that a config files is stored parallel to this file. + std::filesystem::path configPath = __FILE__; + + // the config file's default name can be replaced by passing a command line argument + std::string configName("config.txt"); + if (argc == 2) { + configName = argv[1]; + std::cout << "Using configFile command line argument: " << configName << std::endl; + } + + configPath.replace_filename(configName); + vf::basics::ConfigurationFile config; + config.load(configPath); + + para = std::make_shared<Parameter>(config); + } else { + para = std::make_shared<Parameter>(); + } ////////////////////////////////////////////////////////////////////////// // setup gridGenerator @@ -120,12 +148,6 @@ int main(int argc, char *argv[]) gridBuilder->buildGrids(LBM, false); - ////////////////////////////////////////////////////////////////////////// - // setup simulation parameters - ////////////////////////////////////////////////////////////////////////// - - SPtr<Parameter> para =std::make_shared<Parameter>(); - ////////////////////////////////////////////////////////////////////////// // compute parameters in lattice units ////////////////////////////////////////////////////////////////////////// @@ -143,11 +165,6 @@ int main(int argc, char *argv[]) // set parameters ////////////////////////////////////////////////////////////////////////// - para->setOutputPath(outputPath); - para->setOutputPrefix(simulationName); - - para->setPathAndFilename(para->getOutputPath() + "/" + para->getOutputPrefix()); - para->setPrintFiles(true); para->setVelocityLB(velocityLB); diff --git a/apps/gpu/FlowAroundSphere/config.txt b/apps/gpu/FlowAroundSphere/config.txt new file mode 100644 index 0000000000000000000000000000000000000000..c70c0813f8747274e3323ea2ecb6ab3a0621b599 --- /dev/null +++ b/apps/gpu/FlowAroundSphere/config.txt @@ -0,0 +1,11 @@ +################################################## +# informations for Writing +################################################## +OutputPath = output/Sphere/ +OutputPrefix = Sphere + +################################################## +# simulation time +################################################## +# TimeEnd=100000 +# TimeOut=1000 \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp index 1e79d5cf5be4b277ccd1816110dbed72a7884429..8aeaea97901266c222ee3a292a9379c4de2b90ff 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp @@ -35,10 +35,11 @@ #include <stdio.h> #include <stdlib.h> #include <math.h> +#include "Core/Logger/Logger.h" Parameter::Parameter() { - this->setOutputPath("C:/Output/"); + this->setOutputPath("output/"); this->setOutputPrefix("MyFile"); @@ -68,7 +69,7 @@ Parameter::Parameter() this->setPressureRatio((real)1.0); - this->setPathAndFilename(this->getOutputPath() + "/" + this->getOutputPrefix()); + this->setPathAndFilename(this->getOutputPath() + this->getOutputPrefix()); this->setlimitOfNodesForVTK((uint)30000000); @@ -77,6 +78,41 @@ Parameter::Parameter() this->setIsADcalculationOn(false); } +Parameter::Parameter(const vf::basics::ConfigurationFile &configData) : Parameter() +{ + readConfigData(configData); +} + +void Parameter::readConfigData(const vf::basics::ConfigurationFile &configData){ + + if (configData.contains("OutputPath")) + this->setOutputPath(configData.getValue<std::string>("OutputPath")); + + // deprecated, this is only in here for backward compatibility + if (configData.contains("Path")){ + *logging::out << logging::Logger::INFO_INTERMEDIATE << "The config option \"Path\" is deprecated, please use \"OutputPath\" instead." << "\n"; + this->setOutputPath(configData.getValue<std::string>("Path")); + } + + if (configData.contains("OutputPrefix")) + this->setOutputPrefix(configData.getValue<std::string>("OutputPrefix")); + + // deprecated, this is only in here for backward compatibility + if (configData.contains("Prefix")){ + *logging::out << logging::Logger::INFO_INTERMEDIATE << "The config option \"Prefix\" is deprecated, please use \"OutputPrefix\" instead." << "\n"; + this->setOutputPath(configData.getValue<std::string>("Prefix")); + } + + // overwrite PathAndFilename when OutputPath or OutputPrefix are set in the config file + this->setPathAndFilename(this->getOutputPath() + this->getOutputPrefix()); + + if (configData.contains("TimeEnd")) + this->setTimestepEnd(configData.getValue<int>("TimeEnd")); + + if (configData.contains("TimeOut")) + this->setTimestepOut(configData.getValue<int>("TimeOut")); +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //init-method //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -125,6 +161,10 @@ void Parameter::setTimestepStartOut(uint timestepStartOut) } void Parameter::setOutputPath(std::string outputPath) { + // add missing slash to outputPath + if (outputPath.back() != '/') + outputPath += "/"; + this->outputPath = outputPath; } void Parameter::setOutputPrefix(std::string outputPrefix) diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h index 776ba8382d75b63117f13a9613ae4aaaefbb65e3..908099dc7732b69d95963cdfad9341f7c207400b 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h @@ -114,6 +114,9 @@ public: //////////////////////////////////////////////////////////////////////////// //! \brief generate a new instance of parameter object, sets some defaults Parameter(); + //! \brief generate a new instance of parameter object using a config file + //! \details calls Parameter(): Variables which are not set in the config files use the defaults + Parameter(const vf::basics::ConfigurationFile &configData); ~Parameter() = default; @@ -151,8 +154,10 @@ public: //! \param string "oPrefix" represents the file-name-prefix void setOutputPrefix(std::string outputPrefix); //! \brief sets the complete string for the vtk-files with results - //! \param string "fname" represents the combination of path and prefix + //! \param string "pathAndFilename" represents the combination of path and prefix void setPathAndFilename(std::string pathAndFilename); + //! \brief sets the path for reading and writing the grid + void setGridPath(std::string gridPath); //! \brief sets the status, if Advection Diffusion should be calculated //! \param if calcAD is true, the Advection Diffusion will be calculated void setIsADcalculationOn(bool calcAD); @@ -257,6 +262,9 @@ public: void setInitialConditionAD(std::function<void(real, real, real, real &)> initialConditionAD); std::function<void(real, real, real, real &)> &getInitialConditionAD(); +private: + //! read configuration data from a config file + void readConfigData(const vf::basics::ConfigurationFile &configData); private: //! \brief stencil for the LB simulation, number of node neighbors int D3Qxx;