From 3bb4f9ea7664a5e9ee260370b68c5253a8f88c92 Mon Sep 17 00:00:00 2001 From: HenrikAsmuth <henrik.asmuth@geo.uu.se> Date: Thu, 24 Nov 2022 16:59:31 +0100 Subject: [PATCH] Update ActuatorLine app and reactivate elliptic wing option in ActuatorFarm NOTE: currently not working! --- CMake/cmake_config_files/MULE.config.cmake | 7 +-- apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp | 43 +++++++++++-------- gpu.cmake | 2 +- .../PreCollisionInteractor/ActuatorFarm.cu | 8 ++-- .../PreCollisionInteractor/ActuatorFarm.h | 3 ++ 5 files changed, 35 insertions(+), 28 deletions(-) diff --git a/CMake/cmake_config_files/MULE.config.cmake b/CMake/cmake_config_files/MULE.config.cmake index e5b9987ff..245bc60cc 100644 --- a/CMake/cmake_config_files/MULE.config.cmake +++ b/CMake/cmake_config_files/MULE.config.cmake @@ -1,7 +1,4 @@ SET(CMAKE_CUDA_ARCHITECTURES "75") -# set(GPU_APP "apps/gpu/LBM/") -# list(APPEND USER_APPS -# "${GPU_APP}ActuatorLine" -# "${GPU_APP}BoundaryLayer" -# ) \ No newline at end of file +list(APPEND USER_APPS "apps/gpu/LBM/ActuatorLine") +list(APPEND USER_APPS "apps/gpu/LBM/BoundaryLayer") \ No newline at end of file diff --git a/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp b/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp index bbb560b5b..045e69c17 100644 --- a/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp +++ b/apps/gpu/LBM/ActuatorLine/ActuatorLine.cpp @@ -51,6 +51,7 @@ #include "VirtualFluids_GPU/PreCollisionInteractor/Probes/PlaneProbe.h" #include "VirtualFluids_GPU/Factories/BoundaryConditionFactory.h" #include "VirtualFluids_GPU/TurbulenceModels/TurbulenceModelFactory.h" +#include "VirtualFluids_GPU/Factories/GridScalingFactory.h" #include "VirtualFluids_GPU/GPU/CudaMemoryManager.h" @@ -68,7 +69,7 @@ LbmOrGks lbmOrGks = LBM; const real reference_diameter = 126.0; // diameter in m -const real L_x = 10*reference_diameter; +const real L_x = 16*reference_diameter; const real L_y = 6*reference_diameter; const real L_z = 6*reference_diameter; @@ -78,14 +79,14 @@ const real velocity = 9.0; const real mach = 0.1; -const uint nodes_per_diameter = 32; +const uint nodes_per_diameter = 16; std::string path("."); std::string simulationName("ActuatorLine"); const float tOut = 100; -const float tEnd = 280; // total time of simulation in s +const float tEnd = 300; // total time of simulation in s //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -103,27 +104,33 @@ void multipleLevel(const std::string& configPath) auto gridFactory = GridFactory::make(); auto gridBuilder = MultipleGridBuilder::makeShared(gridFactory); - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + vf::basics::ConfigurationFile config; + config.load(configPath); + + SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNummberOfProcess(), communicator.getPID(), &config); + BoundaryConditionFactory bcFactory = BoundaryConditionFactory(); + GridScalingFactory scalingFactory = GridScalingFactory(); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const real dx = reference_diameter/real(nodes_per_diameter); + real turbPos[3] = {3*reference_diameter, 3*reference_diameter, 3*reference_diameter}; + gridBuilder->addCoarseGrid(0.0, 0.0, 0.0, L_x, L_y, L_z, dx); + // gridBuilder->setNumberOfLayers(4,0); + // gridBuilder->addGrid( new Cuboid( turbPos[0]-1.5*reference_diameter, turbPos[1]-1.5*reference_diameter, turbPos[2]-1.5*reference_diameter, + // turbPos[0]+10.0*reference_diameter, turbPos[1]+1.5*reference_diameter, turbPos[2]+1.5*reference_diameter) , 1 ); + // para->setMaxLevel(2); + // scalingFactory.setScalingFactory(GridScalingFactory::GridScaling::ScaleCompressible); + gridBuilder->setPeriodicBoundaryCondition(false, false, false); gridBuilder->buildGrids(lbmOrGks, false); // buildGrids() has to be called before setting the BCs!!!! - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - vf::basics::ConfigurationFile config; - config.load(configPath); - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////^ - SPtr<Parameter> para = std::make_shared<Parameter>(communicator.getNummberOfProcess(), communicator.getPID(), &config); - BoundaryConditionFactory bcFactory = BoundaryConditionFactory(); - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const real dt = dx * mach / (sqrt(3) * velocity); @@ -163,8 +170,8 @@ void multipleLevel(const std::string& configPath) para->setIsBodyForce( true ); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + gridBuilder->setVelocityBoundaryCondition(SideType::MX, velocityLB, 0.0, 0.0); gridBuilder->setVelocityBoundaryCondition(SideType::MY, velocityLB, 0.0, 0.0); @@ -174,14 +181,13 @@ void multipleLevel(const std::string& configPath) gridBuilder->setPressureBoundaryCondition(SideType::PX, 0.0); bcFactory.setVelocityBoundaryCondition(BoundaryConditionFactory::VelocityBC::VelocityAndPressureCompressible); - bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::OutflowNonReflectivePressureCorrection); + bcFactory.setPressureBoundaryCondition(BoundaryConditionFactory::PressureBC::OutflowNonReflective); SPtr<TurbulenceModelFactory> tmFactory = std::make_shared<TurbulenceModelFactory>(para); tmFactory->readConfigFile(config); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - real turbPos[3] = {3*reference_diameter, 3*reference_diameter, 3*reference_diameter}; real epsilon = 5.f; // width of gaussian smearing real density = 1.225f; int level = 0; @@ -189,11 +195,12 @@ void multipleLevel(const std::string& configPath) uint nBladeNodes = 32; real omega = 1.0f; - SPtr<ActuatorFarm> actuator_farm = std::make_shared<ActuatorFarm>(nBlades, density, nBladeNodes, epsilon, level, dt, dx, false); + SPtr<ActuatorFarm> actuator_farm = std::make_shared<ActuatorFarm>(nBlades, density, nBladeNodes, epsilon, level, dt, dx, true); std::vector<real> bladeRadii; real dr = reference_diameter/nBladeNodes; for(uint node=0; node<nBladeNodes; node++){bladeRadii.emplace_back(dr*(node+1));} actuator_farm->addTurbine(turbPos[0], turbPos[1], turbPos[2], reference_diameter, omega, 0, 0, bladeRadii); + actuator_farm->setUseCalcForcesEllipticWing(true); para->addActuator( actuator_farm ); @@ -218,7 +225,7 @@ void multipleLevel(const std::string& configPath) auto gridGenerator = GridProvider::makeGridGenerator(gridBuilder, para, cudaMemoryManager, communicator); - Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, tmFactory); + Simulation sim(para, cudaMemoryManager, communicator, *gridGenerator, &bcFactory, tmFactory, &scalingFactory); sim.run(); } diff --git a/gpu.cmake b/gpu.cmake index 575c3f0f1..4d7cc9a87 100644 --- a/gpu.cmake +++ b/gpu.cmake @@ -29,7 +29,7 @@ IF (BUILD_VF_GPU) # add_subdirectory(apps/gpu/LBM/DrivenCavityMultiGPU) # add_subdirectory(apps/gpu/LBM/SphereGPU) # add_subdirectory(apps/gpu/LBM/TGV_3D_MultiGPU) - add_subdirectory(apps/gpu/LBM/BoundaryLayer) + # add_subdirectory(apps/gpu/LBM/BoundaryLayer) ELSE() MESSAGE( STATUS "exclude Virtual Fluids GPU." ) ENDIF() diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu index f635c34b1..d14e6ad4f 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.cu @@ -218,7 +218,7 @@ __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* grid rotateFromBladeToGlobal(bladeForcesX[node], bladeForcesY[node], bladeForcesZ[node], forceX_RF, forceY_RF, forceZ_RF, localAzimuth, yaw); - + gridForceX_RF += forceX_RF*eta; gridForceY_RF += forceY_RF*eta; gridForceZ_RF += forceZ_RF*eta; @@ -246,6 +246,7 @@ __global__ void applyBodyForces(real* gridCoordsX, real* gridCoordsY, real* grid gridForceZ_RF += forceZ_RF*eta; } } + gridForcesX[gridIndex] += gridForceX_RF; gridForcesY[gridIndex] += gridForceY_RF; gridForcesZ[gridIndex] += gridForceZ_RF; @@ -341,7 +342,6 @@ void ActuatorFarm::calcForcesEllipticWing() real Cl = c1o1; real Cd = c0o1; real c0 = c1o1; - real c, Cn, Ct; for(uint turbine=0; turbine<this->numberOfTurbines; turbine++) { @@ -361,7 +361,6 @@ void ActuatorFarm::calcForcesEllipticWing() c = c0 * sqrt( c1o1- tmp*tmp ); Cn = Cl*cos(phi)+Cd*sin(phi); Ct = Cl*sin(phi)-Cd*cos(phi); - this->bladeForcesXH[node] = -c1o2*u_rel_sq*c*this->density*Cn; this->bladeForcesYH[node] = -c1o2*u_rel_sq*c*this->density*Ct; this->bladeForcesZH[node] = c0o1; @@ -372,7 +371,8 @@ void ActuatorFarm::calcForcesEllipticWing() void ActuatorFarm::calcBladeForces() { - // this->calcForcesEllipticWing(); + if(this->useCalcForcesEllipticWing) + this->calcForcesEllipticWing(); } void ActuatorFarm::getTaggedFluidNodes(Parameter *para, GridProvider* gridProvider) diff --git a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h index 12b552d23..acdd47096 100644 --- a/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h +++ b/src/gpu/VirtualFluids_GPU/PreCollisionInteractor/ActuatorFarm.h @@ -137,6 +137,8 @@ public: void setTurbineBladeVelocities(uint turbine, real* _bladeVelocitiesX, real* _bladeVelocitiesY, real* _bladeVelocitiesZ); void setTurbineBladeForces(uint turbine, real* _bladeForcesX, real* _bladeForcesY, real* _bladeForcesZ); + void setUseCalcForcesEllipticWing(bool _useCalcForcesEllipticWing){ this->useCalcForcesEllipticWing = _useCalcForcesEllipticWing; } + virtual void calcBladeForces(); private: @@ -179,6 +181,7 @@ private: std::vector<real> preInitPosX, preInitPosY, preInitPosZ, preInitDiameters, preInitOmegas, preInitAzimuths, preInitYaws; std::vector<std::vector<real>> preInitBladeRadii; const bool useHostArrays; + bool useCalcForcesEllipticWing = false; const real density; real deltaT, deltaX; const uint numberOfBladeNodes, numberOfBlades; -- GitLab