diff --git a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp index cb5e96fa28f65a499cd7d95be87796e81a02085c..991025b649d69305c030fe2f1dd1763a2137af9b 100644 --- a/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp +++ b/apps/gpu/LBM/BoundaryLayer/BoundaryLayer.cpp @@ -8,7 +8,6 @@ #include <fstream> #include <exception> #include <memory> -#include <numeric> ////////////////////////////////////////////////////////////////////////// @@ -20,7 +19,6 @@ #include "Core/VectorTypes.h" #include <basics/config/ConfigurationFile.h> -#include "lbm/constants/NumericConstants.h" #include <logger/Logger.h> @@ -30,15 +28,12 @@ #include "GridGenerator/grid/GridBuilder/LevelGridBuilder.h" #include "GridGenerator/grid/GridBuilder/MultipleGridBuilder.h" #include "GridGenerator/grid/BoundaryConditions/Side.h" -#include "GridGenerator/grid/BoundaryConditions/BoundaryCondition.h" - #include "GridGenerator/grid/GridFactory.h" -#include "geometries/Cuboid/Cuboid.h" -#include "geometries/TriangularMesh/TriangularMesh.h" - #include "GridGenerator/io/SimulationFileWriter/SimulationFileWriter.h" #include "GridGenerator/io/GridVTKWriter/GridVTKWriter.h" +#include "GridGenerator/io/STLReaderWriter/STLReader.h" +#include "GridGenerator/io/STLReaderWriter/STLWriter.h" ////////////////////////////////////////////////////////////////////////// @@ -49,28 +44,24 @@ #include "VirtualFluids_GPU/DataStructureInitializer/GridReaderFiles/GridReader.h" #include "VirtualFluids_GPU/Parameter/Parameter.h" #include "VirtualFluids_GPU/Output/FileWriter.h" +#include "VirtualFluids_GPU/PreCollisionInteractor/ActuatorLine.h" #include "VirtualFluids_GPU/PreCollisionInteractor/Probes/PointProbe.h" #include "VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.h" #include "VirtualFluids_GPU/PreCollisionInteractor/Probes/PlanarAverageProbe.h" #include "VirtualFluids_GPU/PreCollisionInteractor/Probes/WallModelProbe.h" - #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h" -#include "VirtualFluids_GPU/Factories/GridScalingFactory.h" #include "VirtualFluids_GPU/TurbulenceModels/TurbulenceModelFactory.h" #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h" -#include "utilities/communication.h" - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// std::string path("."); -std::string simulationName("BoundaryLayer"); +std::string simulationName("BoundayLayer"); -using namespace vf::lbm::constant; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -96,16 +87,8 @@ void multipleLevel(const std::string& configPath) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////^ SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNummberOfProcess(), communicator.getPID(), &config); BoundaryConditionFactory bcFactory = BoundaryConditionFactory(); - GridScalingFactory scalingFactory = GridScalingFactory(); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - const int nProcs = communicator.getNummberOfProcess(); - const uint procID = vf::gpu::Communicator::getInstance().getPID(); - std::vector<uint> devices(10); - std::iota(devices.begin(), devices.end(), 0); - para->setDevices(devices); - para->setMaxDev(nProcs); - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // @@ -121,19 +104,19 @@ void multipleLevel(const std::string& configPath) const real L_x = 6*H; const real L_y = 4*H; - const real L_z = H; + const real L_z = 1*H; - const real z0 = 0.1f; // roughness length in m - const real u_star = 0.4f; //friction velocity in m/s - const real kappa = 0.4f; // von Karman constant + const real z0 = 0.1; // roughness length in m + const real u_star = 0.4; //friction velocity in m/s + const real kappa = 0.4; // von Karman constant - const real viscosity = 1.56e-5f; + const real viscosity = 1.56e-5; - const real velocity = 0.5f*u_star/kappa*log(H/z0+1.f); //0.5 times max mean velocity at the top in m/s + const real velocity = 0.5*u_star/kappa*log(L_z/z0); //0.5 times max mean velocity at the top in m/s - const real mach =0.1; + const real mach = config.contains("Ma")? config.getValue<real>("Ma"): 0.1; - const uint nodes_per_H = 64; + const uint nodes_per_H = config.contains("nz")? config.getValue<uint>("nz"): 64; // all in s const float tStartOut = config.getValue<real>("tStartOut"); @@ -147,7 +130,7 @@ void multipleLevel(const std::string& configPath) const float tOutProbe = config.getValue<real>("tOutProbe"); - const real dx = H/real(nodes_per_H); + const real dx = L_z/real(nodes_per_H); const real dt = dx * mach / (sqrt(3) * velocity); @@ -158,13 +141,13 @@ void multipleLevel(const std::string& configPath) const real pressureGradient = u_star * u_star / H ; const real pressureGradientLB = pressureGradient * (dt*dt)/dx; // LB units - // VF_LOG_INFO("velocity [dx/dt] = {}", velocityLB); - // VF_LOG_INFO("dt = {}", dt); - // VF_LOG_INFO("dx = {}", dx); - // VF_LOG_INFO("viscosity [10^8 dx^2/dt] = {}", viscosityLB*1e8); - // VF_LOG_INFO("u* /(dx/dt) = {}", u_star*dt/dx); - // VF_LOG_INFO("dpdx = {}", pressureGradient); - // VF_LOG_INFO("dpdx /(dx/dt^2) = {}", pressureGradientLB); + VF_LOG_INFO("velocity [dx/dt] = {}", velocityLB); + VF_LOG_INFO("dt = {}", dt); + VF_LOG_INFO("dx = {}", dx); + VF_LOG_INFO("viscosity [10^8 dx^2/dt] = {}", viscosityLB*1e8); + VF_LOG_INFO("u* /(dx/dt) = {}", u_star*dt/dx); + VF_LOG_INFO("dpdx = {}", pressureGradient); + VF_LOG_INFO("dpdx /(dx/dt^2) = {}", pressureGradientLB); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -179,184 +162,74 @@ void multipleLevel(const std::string& configPath) para->setViscosityRatio( dx*dx/dt ); para->setDensityRatio( 1.0 ); - bool useStreams = (nProcs > 1 ? true: false); - para->setUseStreams(true); - para->useReducedCommunicationAfterFtoC = true; - para->setMainKernel("CumulantK17CompChimRedesigned"); + para->setMainKernel("TurbulentViscosityCumulantK17CompChim"); + para->setIsBodyForce( config.getValue<bool>("bodyForce") ); + para->setTimestepStartOut(uint(tStartOut/dt) ); para->setTimestepOut( uint(tOut/dt) ); para->setTimestepEnd( uint(tEnd/dt) ); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - SPtr<TurbulenceModelFactory> tmFactory = std::make_shared<TurbulenceModelFactory>(para); + SPtr<TurbulenceModelFactory> tmFactory = SPtr<TurbulenceModelFactory>( new TurbulenceModelFactory(para) ); tmFactory->readConfigFile( config ); - tmFactory->setTurbulenceModel(TurbulenceModel::QR); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - const real xSplit = L_x/nProcs; - const real overlap = 8.0*dx; - - real xMin = procID * xSplit; - real xMax = (procID+1) * xSplit; - real xGridMin = procID * xSplit; - real xGridMax = (procID+1) * xSplit; - - real yMin = 0.0; - real yMax = L_y; - real zMin = 0.0; - real zMax = L_z; - - bool isFirstSubDomain = (procID == 0 && nProcs > 1)? true: false; - bool isLastSubDomain = (procID == nProcs-1 && nProcs > 1)? true: false; - bool isMidSubDomain = (!isFirstSubDomain && !isLastSubDomain && nProcs > 1)? true: false; - if(isFirstSubDomain || isMidSubDomain) - { - xGridMax += overlap; - xGridMin -= overlap; - } - if(isLastSubDomain || isMidSubDomain) - { - xGridMax += overlap; - xGridMin -= overlap; - } + // tmFactory->setTurbulenceModel(TurbulenceModel::AMD); + // tmFactory->setModelConstant(config.getValue<real>("SGSconstant")); - gridBuilder->addCoarseGrid( xGridMin, 0.0, 0.0, - xGridMax, L_y, L_z, dx); - if(true)// Add refinement - { - gridBuilder->setNumberOfLayers(12, 8); - gridBuilder->addGrid( new Cuboid( 0.3*L_x, 0.2*L_y, 0.1*L_z, L_x*0.7, 0.8*L_y, L_z*0.2) , 1 ); - para->setMaxLevel(2); - scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible); - } - - if(nProcs > 1) - { - gridBuilder->setSubDomainBox( - std::make_shared<BoundingBox>(xMin, xMax, yMin, yMax, zMin, zMax)); - gridBuilder->setPeriodicBoundaryCondition(false, true, false); - } - else - { - gridBuilder->setPeriodicBoundaryCondition(true, true, false); - } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - gridBuilder->buildGrids(lbmOrGks, true); // buildGrids() has to be called before setting the BCs!!!! + gridBuilder->addCoarseGrid(0.0, 0.0, 0.0, + L_x, L_y, L_z, dx); + // gridBuilder->setNumberOfLayers(12, 8); - std::cout << "nProcs: "<< nProcs << "Proc: " << procID << " isFirstSubDomain: " << isFirstSubDomain << " isLastSubDomain: " << isLastSubDomain << " isMidSubDomain: " << isMidSubDomain << std::endl; - - if(nProcs > 1){ - if (isFirstSubDomain || isMidSubDomain) { - gridBuilder->findCommunicationIndices(CommunicationDirections::PX, lbmOrGks); - gridBuilder->setCommunicationProcess(CommunicationDirections::PX, procID+1); - } + // gridBuilder->addGrid( new Cuboid( 0.0, 0.0, 0.0, L_x, L_y, 0.3*L_z) , 1 ); + // para->setMaxLevel(2); - if (isLastSubDomain || isMidSubDomain) { - gridBuilder->findCommunicationIndices(CommunicationDirections::MX, lbmOrGks); - gridBuilder->setCommunicationProcess(CommunicationDirections::MX, procID-1); - } + gridBuilder->setPeriodicBoundaryCondition(true, true, false); - if (isFirstSubDomain) { - gridBuilder->findCommunicationIndices(CommunicationDirections::MX, lbmOrGks); - gridBuilder->setCommunicationProcess(CommunicationDirections::MX, nProcs-1); - } + gridBuilder->buildGrids(lbmOrGks, false); // buildGrids() has to be called before setting the BCs!!!! - if (isLastSubDomain) { - gridBuilder->findCommunicationIndices(CommunicationDirections::PX, lbmOrGks); - gridBuilder->setCommunicationProcess(CommunicationDirections::PX, 0); - } - } uint samplingOffset = 2; - - gridBuilder->setSlipBoundaryCondition(SideType::PZ, 0.0, 0.0, -1.0); - + // gridBuilder->setVelocityBoundaryCondition(SideType::MZ, 0.0, 0.0, 0.0); gridBuilder->setStressBoundaryCondition(SideType::MZ, 0.0, 0.0, 1.0, // wall normals samplingOffset, z0/dx); // wall model settinng - para->setHasWallModelMonitor(true); - - // if(isLastSubDomain){ gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.f); } - // if(isFirstSubDomain){ gridBuilder->setVelocityBoundaryCondition(SideType::MX, 8.0f*dt/dx, 0.0, 0.0);} - // bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityAndPressureCompressible); - + para->setHasWallModelMonitor(true); bcFactory.setStressBoundaryCondition(BoundaryConditionFactory::StressBC::StressPressureBounceBack); + + gridBuilder->setSlipBoundaryCondition(SideType::PZ, 0.0, 0.0, 0.0); bcFactory.setSlipBoundaryCondition(BoundaryConditionFactory::SlipBC::SlipBounceBack); - bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::OutflowNonReflective); + + real cPi = 3.1415926535897932384626433832795; para->setInitialCondition([&](real coordX, real coordY, real coordZ, real &rho, real &vx, real &vy, real &vz) { rho = (real)0.0; - vx = rho = c0o1; - vx = (u_star/0.4f * log(coordZ/z0+c1o1) + c2o1*sin(cPi*c16o1*coordX/L_x)*sin(cPi*c8o1*coordZ/H)/(pow(coordZ/H,c2o1)+c1o1)) * dt/dx; - vy = c2o1*sin(cPi*c16o1*coordX/L_x)*sin(cPi*c8o1*coordZ/H)/(pow(coordZ/H,c2o1)+c1o1) * dt/dx; - vz = c8o1*u_star/0.4f*(sin(cPi*c8o1*coordY/H)*sin(cPi*c8o1*coordZ/H)+sin(cPi*c8o1*coordX/L_x))/(pow(c1o2*L_z-coordZ, c2o1)+c1o1) * dt/dx; + vx = (u_star/0.4 * log(coordZ/z0) + 2.0*sin(cPi*16.0f*coordX/L_x)*sin(cPi*8.0f*coordZ/H)/(pow(coordZ/H,c2o1)+c1o1)) * dt / dx; + vy = 2.0*sin(cPi*16.0f*coordX/L_x)*sin(cPi*8.0f*coordZ/H)/(pow(coordZ/H,c2o1)+c1o1) * dt / dx; + vz = 8.0*u_star/0.4*(sin(cPi*8.0*coordY/H)*sin(cPi*8.0*coordZ/H)+sin(cPi*8.0*coordX/L_x))/(pow(L_z/2.0-coordZ, c2o1)+c1o1) * dt / dx; }); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + SPtr<PlanarAverageProbe> planarAverageProbe = SPtr<PlanarAverageProbe>( new PlanarAverageProbe("planeProbe", para->getOutputPath(), tStartAveraging/dt, tStartTmpAveraging/dt, tAveraging/dt , tStartOutProbe/dt, tOutProbe/dt, 'z') ); + planarAverageProbe->addAllAvailableStatistics(); + planarAverageProbe->setFileNameToNOut(); + para->addProbe( planarAverageProbe ); - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // if(isFirstSubDomain || nProcs == 1) - // { - // SPtr<PlanarAverageProbe> planarAverageProbe = SPtr<PlanarAverageProbe>( new PlanarAverageProbe("planeProbe", para->getOutputPath(), tStartAveraging/dt, tStartTmpAveraging/dt, tAveraging/dt , tStartOutProbe/dt, tOutProbe/dt, 'z') ); - // planarAverageProbe->addAllAvailableStatistics(); - // planarAverageProbe->setFileNameToNOut(); - // para->addProbe( planarAverageProbe ); - - // para->setHasWallModelMonitor(true); - // SPtr<WallModelProbe> wallModelProbe = SPtr<WallModelProbe>( new WallModelProbe("wallModelProbe", para->getOutputPath(), tStartAveraging/dt, tStartTmpAveraging/dt, tAveraging/dt/4.0 , tStartOutProbe/dt, tOutProbe/dt) ); - // wallModelProbe->addAllAvailableStatistics(); - // wallModelProbe->setFileNameToNOut(); - // wallModelProbe->setForceOutputToStress(true); - // if(para->getIsBodyForce()) - // wallModelProbe->setEvaluatePressureGradient(true); - // para->addProbe( wallModelProbe ); - // } - - // SPtr<PlaneProbe> planeProbe1 = SPtr<PlaneProbe>( new PlaneProbe("planeProbe_1", para->getOutputPath(), tStartAveraging/dt, 10, tStartOutProbe/dt, tOutProbe/dt) ); - // planeProbe1->setProbePlane(100.0, 0.0, 0, dx, L_y, L_z); - // planeProbe1->addAllAvailableStatistics(); - // para->addProbe( planeProbe1 ); - - // if(readPrecursor) - // { - // SPtr<PlaneProbe> planeProbe2 = SPtr<PlaneProbe>( new PlaneProbe("planeProbe_2", para->getOutputPath(), tStartAveraging/dt, 10, tStartOutProbe/dt, tOutProbe/dt) ); - // planeProbe2->setProbePlane(1000.0, 0.0, 0, dx, L_y, L_z); - // planeProbe2->addAllAvailableStatistics(); - // para->addProbe( planeProbe2 ); - - // SPtr<PlaneProbe> planeProbe3 = SPtr<PlaneProbe>( new PlaneProbe("planeProbe_3", para->getOutputPath(), tStartAveraging/dt, 10, tStartOutProbe/dt, tOutProbe/dt) ); - // planeProbe3->setProbePlane(1500.0, 0.0, 0, dx, L_y, L_z); - // planeProbe3->addAllAvailableStatistics(); - // para->addProbe( planeProbe3 ); - - // SPtr<PlaneProbe> planeProbe4 = SPtr<PlaneProbe>( new PlaneProbe("planeProbe_4", para->getOutputPath(), tStartAveraging/dt, 10, tStartOutProbe/dt, tOutProbe/dt) ); - // planeProbe4->setProbePlane(2000.0, 0.0, 0, dx, L_y, L_z); - // planeProbe4->addAllAvailableStatistics(); - // para->addProbe( planeProbe4 ); - - // SPtr<PlaneProbe> planeProbe5 = SPtr<PlaneProbe>( new PlaneProbe("planeProbe_5", para->getOutputPath(), tStartAveraging/dt, 10, tStartOutProbe/dt, tOutProbe/dt) ); - // planeProbe5->setProbePlane(2500.0, 0.0, 0, dx, L_y, L_z); - // planeProbe5->addAllAvailableStatistics(); - // para->addProbe( planeProbe5 ); - - // SPtr<PlaneProbe> planeProbe6 = SPtr<PlaneProbe>( new PlaneProbe("planeProbe_6", para->getOutputPath(), tStartAveraging/dt, 10, tStartOutProbe/dt, tOutProbe/dt) ); - // planeProbe6->setProbePlane(0.0, L_y/2.0, 0, L_x, dx, L_z); - // planeProbe6->addAllAvailableStatistics(); - // para->addProbe( planeProbe6 ); - // } - - - // if(writePrecursor) - // { - // SPtr<PrecursorWriter> precursorWriter = std::make_shared<PrecursorWriter>("precursor", para->getOutputPath()+precursorDirectory, posXPrecursor, 0, L_y, 0, L_z, tStartPrecursor/dt, nTWritePrecursor, useDistributions? OutputVariable::Distributions: OutputVariable::Velocities); - // para->addProbe(precursorWriter); - // } + para->setHasWallModelMonitor(true); + SPtr<WallModelProbe> wallModelProbe = SPtr<WallModelProbe>( new WallModelProbe("wallModelProbe", para->getOutputPath(), tStartAveraging/dt, tStartTmpAveraging/dt, tAveraging/dt/4.0 , tStartOutProbe/dt, tOutProbe/dt) ); + wallModelProbe->addAllAvailableStatistics(); + wallModelProbe->setFileNameToNOut(); + wallModelProbe->setForceOutputToStress(true); + if(para->getIsBodyForce()) + wallModelProbe->setEvaluatePressureGradient(true); + para->addProbe( wallModelProbe ); auto cudaMemoryManager = std::make_shared<CudaMemoryManager>(para); auto gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator); - Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, tmFactory, &scalingFactory); + Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, tmFactory); sim.run(); }