diff --git a/CMake/cmake_config_files/ARAGORN.config.cmake b/CMake/cmake_config_files/ARAGORN.config.cmake index 7fc74bbcbf39890ebc26d328b4916575c8471a33..5af2b3809558ae9caab753e43f6082c753607086 100644 --- a/CMake/cmake_config_files/ARAGORN.config.cmake +++ b/CMake/cmake_config_files/ARAGORN.config.cmake @@ -9,8 +9,8 @@ set(CMAKE_CUDA_ARCHITECTURES 86) # Nvidia GeForce RTX 3060 # add invidual apps here set(GPU_APP "apps/gpu/") list(APPEND USER_APPS - "${GPU_APP}DrivenCavityMultiGPU" - "${GPU_APP}SphereScaling" + # "${GPU_APP}DrivenCavityMultiGPU" + # "${GPU_APP}SphereScaling" # "${GPU_APP}MusselOyster" "${GPU_APP}RotatingGrid" ) diff --git a/apps/gpu/RotatingGrid/RotatingGrid.cpp b/apps/gpu/RotatingGrid/RotatingGrid.cpp index 3310f13e5aefe564955732538046369b55a7866a..59d0cd83ec1e33d2b60f1b569a6b41c50f3590ef 100644 --- a/apps/gpu/RotatingGrid/RotatingGrid.cpp +++ b/apps/gpu/RotatingGrid/RotatingGrid.cpp @@ -92,7 +92,7 @@ int main() const uint nx = 64; const uint timeStepOut = 1; - const uint timeStepEnd = 1; + const uint timeStepEnd = 10; ////////////////////////////////////////////////////////////////////////// // compute parameters in lattice units @@ -110,7 +110,7 @@ int main() gridBuilder->addCoarseGrid(-1.5 * L, -0.5 * L, -0.5 * L, 1.5 * L, 0.5 * L, 0.5 * L, dx); - if (rotOrInt == Rot) gridBuilder->addGridRotatingGrid(std::make_shared<Cylinder>(0.0, 0.0, 0.0, 0.3 * L, 1. * L, Axis::x)); + if (rotOrInt == Rot) gridBuilder->addGridRotatingGrid(std::make_shared<Cylinder>(0.1, 0.1, 0.1, 0.25 * L, 1. * L, Axis::x)); if (rotOrInt == Int) gridBuilder->addGrid(std::make_shared<Cylinder>(0.0, 0.0, 0.0, 0.3 * L, 1. * L, Axis::x), 1); GridScalingFactory scalingFactory = GridScalingFactory(); @@ -205,7 +205,6 @@ int main() // NeighborDebugWriter::writeNeighborLinkLinesDebug(para.get()); SPtr<ParameterRotatingGrid> paraRot = para->getRotatingGridParameter(); - paraRot->transformNestedToBase({para->getParH(1)->coordinateX, para->getParH(1)->coordinateY, para->getParH(1)->coordinateZ}); sim.run(); } catch (const spdlog::spdlog_ex &ex) { diff --git a/src/gpu/GridGenerator/grid/GridImp.cpp b/src/gpu/GridGenerator/grid/GridImp.cpp index 62e2c95c1811a76487a490c81ca028288bc0a4bc..ab5a3ac21efd68f82f9fe345cc7f41637c838340 100644 --- a/src/gpu/GridGenerator/grid/GridImp.cpp +++ b/src/gpu/GridGenerator/grid/GridImp.cpp @@ -1165,15 +1165,15 @@ void GridImp::findGridInterfaceForRotatingGrid(SPtr<Grid> rotatingGrid) for (uint indexOnStaticGrid = 0; indexOnStaticGrid < this->getSize(); indexOnStaticGrid++) this->findOverlapStopper(indexOnStaticGrid, *rotatingGridImp); - // // change interface gap nodes to fluid nodes on static grid - // for (uint indexOnStaticGrid = 0; indexOnStaticGrid < this->getSize(); indexOnStaticGrid++) - // if (this->getField().isInterpolationGapNode(indexOnStaticGrid)) - // this->getField().setFieldEntry(indexOnStaticGrid, FLUID); + // change interface gap nodes to fluid nodes on static grid + for (uint indexOnStaticGrid = 0; indexOnStaticGrid < this->getSize(); indexOnStaticGrid++) + if (this->getField().isInterpolationGapNode(indexOnStaticGrid)) + this->getField().setFieldEntry(indexOnStaticGrid, FLUID); - // // change interface gap nodes to fluid nodes on rotating grid - // for (uint indexOnRotatingGrid = 0; indexOnRotatingGrid < rotatingGridImp->getSize(); indexOnRotatingGrid++) - // if (rotatingGridImp->getField().isInterpolationGapNode(indexOnRotatingGrid)) - // rotatingGridImp->getField().setFieldEntry(indexOnRotatingGrid, FLUID); + // change interface gap nodes to fluid nodes on rotating grid + for (uint indexOnRotatingGrid = 0; indexOnRotatingGrid < rotatingGridImp->getSize(); indexOnRotatingGrid++) + if (rotatingGridImp->getField().isInterpolationGapNode(indexOnRotatingGrid)) + rotatingGridImp->getField().setFieldEntry(indexOnRotatingGrid, FLUID); VF_LOG_TRACE(" ... done."); } @@ -1185,6 +1185,8 @@ void GridImp::repairGridInterfaceOnMultiGPU(SPtr<Grid> fineGrid) void GridImp::limitToSubDomain(SPtr<BoundingBox> subDomainBox) { + VF_LOG_TRACE("Limit to subdomain box."); + for( uint index = 0; index < this->size; index++ ){ real x, y, z; diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp index cf1aaa3988e0809dd0995a18139ab7dcef75989f..9e36a27f2aac54d669327298a24e6b8e4244be61 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp +++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.cpp @@ -9,6 +9,7 @@ #include "KernelManager/GridScalingKernelManager.h" #include "TurbulenceModels/TurbulenceModelFactory.h" #include "Kernel/Kernel.h" +#include "Parameter/ParameterRotatingGrid.h" #include "CollisionStrategy.h" #include "RefinementStrategy.h" @@ -52,9 +53,21 @@ void UpdateGrid27::updateGrid(int level, unsigned int t) this->preCollisionBC(level, t); ////////////////////////////////////////////////////////////////////////// - if( level != para->getFine() ) - { - refinement(this, para.get(), level); + if (level != para->getFine()) { + SPtr<ParameterRotatingGrid> paraRot = para->getRotatingGridParameter(); + if ( paraRot != nullptr) { + // rotation + paraRot->parameterRotHost->gridAngle[0] += paraRot->parameterRotHost->angularVelocity[0]; + paraRot->parameterRotHost->gridAngle[1] += paraRot->parameterRotHost->angularVelocity[1]; + paraRot->parameterRotHost->gridAngle[2] += paraRot->parameterRotHost->angularVelocity[2]; + paraRot->parameterRotDevice->gridAngle[0] += paraRot->parameterRotDevice->angularVelocity[0]; + paraRot->parameterRotDevice->gridAngle[1] += paraRot->parameterRotDevice->angularVelocity[1]; + paraRot->parameterRotDevice->gridAngle[2] += paraRot->parameterRotDevice->angularVelocity[2]; + VF_LOG_DEBUG("gridAngleX = {}", paraRot->parameterRotDevice->gridAngle[0]); + rotationInterpolation(level); + } else { + refinement(this, para.get(), level); + } } ////////////////////////////////////////////////////////////////////////// @@ -63,6 +76,19 @@ void UpdateGrid27::updateGrid(int level, unsigned int t) } +void UpdateGrid27::rotationInterpolation(int level) +{ + VF_LOG_WARNING("Interpolation"); + // base to nested + InterpolateStaticToRotating( + para->getParD(level).get(), + para->getParD(level+1).get(), + para->getRotatingGridParameter()->parameterRotDevice.get(), + ¶->getParD(level)->coarseToFine, + para->getParD(level)->neighborCoarseToFine); + // nested to base +} + void UpdateGrid27::collisionAllNodes(int level, unsigned int t) { kernels.at(level)->run(); diff --git a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h index 9de7e73ec03a0f00542dd5b718ed6f210399a18a..5218fdf8081e98592673efb0b78bdaf9f1faa46b 100644 --- a/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h +++ b/src/gpu/VirtualFluids_GPU/Calculation/UpdateGrid27.h @@ -59,6 +59,8 @@ private: void interactWithActuators(int level, unsigned int t); void interactWithProbes(int level, unsigned int t); + void rotationInterpolation(int level); + private: CollisionStrategy collision; friend class CollisionAndExchange_noStreams_indexKernel; diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp index e96c96ec2f38c4d27f7c51177e4a3c21f37579e8..4336928e8b0dbeedcc864ac892d6e60ac0e3a785 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridProvider.cpp @@ -149,6 +149,7 @@ void GridProvider::freeMemoryOnHost() cudaMemoryManager->cudaFreeCoord(level); cudaMemoryManager->cudaFreeSP(level); } + cudaMemoryManager->cudaFreeCoordRotation(1); } void GridProvider::cudaCopyDataToHost(int level) diff --git a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp index 19d9890e9fa124ad8125bbb4f136bdce3f456118..ee7aa332a90c77784f076f3ede8cc9a1472e8876 100644 --- a/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp +++ b/src/gpu/VirtualFluids_GPU/DataStructureInitializer/GridReaderGenerator/GridGenerator.cpp @@ -50,9 +50,9 @@ void GridGenerator::initalGridInformations() builder->findFluidNodes(para->getUseStreams()); std::vector<int> gridX, gridY, gridZ; std::vector<int> distX, distY, distZ; - const int numberOfGridLevels = builder->getNumberOfGridLevels(); + const uint numberOfGridLevels = builder->getNumberOfGridLevels(); builder->getGridInformations(gridX, gridY, gridZ, distX, distY, distZ); - para->setMaxLevel(numberOfGridLevels); + para->setMaxLevel((int) numberOfGridLevels); para->setGridX(gridX); para->setGridY(gridY); para->setGridZ(gridZ); @@ -108,12 +108,23 @@ void GridGenerator::allocArrays_CoordNeighborGeo() cudaMemoryManager->cudaCopyBodyForce(level); } + if (builder->getUseRotatingGrid()) { + VF_LOG_INFO("Init parameters for rotating grid."); SPtr<const Object> cylinder = builder->getGrid(1)->getObject(); const std::array<real, 3> centerPointOfCylinder = { (real)cylinder->getX1Centroid(), (real)cylinder->getX2Centroid(), (real)cylinder->getX3Centroid() }; - auto parameterRotatingGrid = std::make_shared<ParameterRotatingGrid>(centerPointOfCylinder, Axis::x); - para->setRotatingGridParameter(std::move(parameterRotatingGrid)); + para->setRotatingGridParameter( + std::make_shared<ParameterRotatingGrid>(centerPointOfCylinder, Axis::x, para->getParH(1)->numberOfNodes)); + cudaMemoryManager->cudaAllocCoordRotation(1); + para->fillCoordinateVectorsForRotatingGrid(1); + cudaMemoryManager->cudaCopyCoordRotation(1); + } + + for (int i = 0; i <= para->getMaxLevel(); i++) { + para->getParH(i)->gridSpacing = builder->getGrid(i)->getDelta(); + para->getParD(i)->gridSpacing = builder->getGrid(i)->getDelta(); + VF_LOG_WARNING("{}", builder->getGrid(i)->getDelta()); } VF_LOG_INFO("Number of Nodes: {}", numberOfNodesGlobal); diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp index 64943d19ff54bfaa174d0728a96c517f6605d565..c2dfc7512b21cf54ab7da7aaeb74ccc6c4563f00 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp +++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.cpp @@ -5,6 +5,7 @@ #include <math.h> #include <Parameter/Parameter.h> +#include <Parameter/ParameterRotatingGrid.h> #include "Parameter/CudaStreamManager.h" #include "PreCollisionInteractor/ActuatorFarm.h" @@ -46,31 +47,74 @@ void CudaMemoryManager::cudaCopyMedianPrint(int lev) } void CudaMemoryManager::cudaAllocCoord(int lev) { - //Host - checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateX ), parameter->getParH(lev)->memSizeRealLBnodes )); - checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateY ), parameter->getParH(lev)->memSizeRealLBnodes )); - checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateZ ), parameter->getParH(lev)->memSizeRealLBnodes )); - //Device (spinning ship + uppsala) - checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateX ), parameter->getParH(lev)->memSizeRealLBnodes )); - checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateY ), parameter->getParH(lev)->memSizeRealLBnodes )); - checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateZ ), parameter->getParH(lev)->memSizeRealLBnodes )); - ////////////////////////////////////////////////////////////////////////// - double tmp = 3. * (double)parameter->getParH(lev)->memSizeRealLBnodes; - setMemsizeGPU(tmp, false); + //Host + checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateX ), parameter->getParH(lev)->memSizeRealLBnodes )); + checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateY ), parameter->getParH(lev)->memSizeRealLBnodes )); + checkCudaErrors( cudaMallocHost((void**) &(parameter->getParH(lev)->coordinateZ ), parameter->getParH(lev)->memSizeRealLBnodes )); + //Device (spinning ship + uppsala) + checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateX ), parameter->getParH(lev)->memSizeRealLBnodes )); + checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateY ), parameter->getParH(lev)->memSizeRealLBnodes )); + checkCudaErrors( cudaMalloc((void**) &(parameter->getParD(lev)->coordinateZ ), parameter->getParH(lev)->memSizeRealLBnodes )); + ////////////////////////////////////////////////////////////////////////// + double tmp = 3. * (double)parameter->getParH(lev)->memSizeRealLBnodes; + setMemsizeGPU(tmp, false); } void CudaMemoryManager::cudaCopyCoord(int lev) { - //copy host to device - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateX, parameter->getParH(lev)->coordinateX, parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateY, parameter->getParH(lev)->coordinateY, parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice)); - checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateZ, parameter->getParH(lev)->coordinateZ, parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice)); + //copy host to device + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateX, parameter->getParH(lev)->coordinateX, parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateY, parameter->getParH(lev)->coordinateY, parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getParD(lev)->coordinateZ, parameter->getParH(lev)->coordinateZ, parameter->getParH(lev)->memSizeRealLBnodes , cudaMemcpyHostToDevice)); +} +void CudaMemoryManager::cudaCopyCoordDeviceToHost(int lev) +{ + //copy device to host + checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->coordinateX, parameter->getParD(lev)->coordinateX, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyDeviceToHost)); + checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->coordinateY, parameter->getParD(lev)->coordinateY, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyDeviceToHost)); + checkCudaErrors( cudaMemcpy(parameter->getParH(lev)->coordinateZ, parameter->getParD(lev)->coordinateZ, parameter->getParH(lev)->memSizeRealLBnodes, cudaMemcpyDeviceToHost)); } void CudaMemoryManager::cudaFreeCoord(int lev) { - checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coordinateX )); - checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coordinateY )); - checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coordinateZ )); + checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coordinateX )); + checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coordinateY )); + checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coordinateZ )); } +void CudaMemoryManager::cudaAllocCoordRotation(int lev) +{ +//Host + unsigned long long memSize = parameter->getRotatingGridParameter()->parameterRotHost->memorySizeOfNestedCoordinates; + checkCudaErrors( cudaMallocHost((void**) &(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesX), memSize )); + checkCudaErrors( cudaMallocHost((void**) &(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesY), memSize )); + checkCudaErrors( cudaMallocHost((void**) &(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesZ), memSize )); + checkCudaErrors( cudaMalloc((void**) &(parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesX), memSize )); + checkCudaErrors( cudaMalloc((void**) &(parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesY), memSize )); + checkCudaErrors( cudaMalloc((void**) &(parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesZ), memSize )); + ////////////////////////////////////////////////////////////////////////// + setMemsizeGPU(3. * memSize, false); +} +void CudaMemoryManager::cudaCopyCoordRotation(int lev) +{ + //copy host to device + unsigned long long memSize = parameter->getRotatingGridParameter()->parameterRotHost->memorySizeOfNestedCoordinates; + checkCudaErrors( cudaMemcpy(parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesX, parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesX, memSize , cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesY, parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesY, memSize , cudaMemcpyHostToDevice)); + checkCudaErrors( cudaMemcpy(parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesZ, parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesZ, memSize , cudaMemcpyHostToDevice)); +} +void CudaMemoryManager::cudaCopyCoordRotationDeviceToHost(int lev) +{ + //copy device to host + unsigned long long memSize = parameter->getRotatingGridParameter()->parameterRotHost->memorySizeOfNestedCoordinates; + checkCudaErrors( cudaMemcpy(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesX, parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesX, memSize, cudaMemcpyDeviceToHost)); + checkCudaErrors( cudaMemcpy(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesY, parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesY, memSize, cudaMemcpyDeviceToHost)); + checkCudaErrors( cudaMemcpy(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesZ, parameter->getRotatingGridParameter()->parameterRotDevice->nestedCoordinatesZ, memSize, cudaMemcpyDeviceToHost)); +} +void CudaMemoryManager::cudaFreeCoordRotation(int lev) +{ + checkCudaErrors( cudaFreeHost(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesX )); + checkCudaErrors( cudaFreeHost(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesY )); + checkCudaErrors( cudaFreeHost(parameter->getRotatingGridParameter()->parameterRotHost->nestedCoordinatesZ )); +} + void CudaMemoryManager::cudaAllocBodyForce(int lev) { //Host @@ -84,7 +128,6 @@ void CudaMemoryManager::cudaAllocBodyForce(int lev) ////////////////////////////////////////////////////////////////////////// double tmp = 3. * (double)parameter->getParH(lev)->memSizeRealLBnodes; setMemsizeGPU(tmp, false); - } void CudaMemoryManager::cudaCopyBodyForce(int lev) { @@ -1124,6 +1167,13 @@ void CudaMemoryManager::cudaCopyInterfaceCF(int lev) checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->coarseToFine.coarseCellIndices, parameter->getParH(lev)->coarseToFine.coarseCellIndices, mem_size_kCF, cudaMemcpyHostToDevice)); checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->coarseToFine.fineCellIndices, parameter->getParH(lev)->coarseToFine.fineCellIndices, mem_size_kCF, cudaMemcpyHostToDevice)); } +void CudaMemoryManager::cudaCopyInterfaceCFDeviceToHost(int lev) +{ + uint mem_size_kCF = sizeof(uint) * parameter->getParH(lev)->coarseToFine.numberOfCells; + + checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->coarseToFine.coarseCellIndices, parameter->getParD(lev)->coarseToFine.coarseCellIndices, mem_size_kCF, cudaMemcpyDeviceToHost)); + checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->coarseToFine.fineCellIndices , parameter->getParD(lev)->coarseToFine.fineCellIndices, mem_size_kCF, cudaMemcpyDeviceToHost)); +} void CudaMemoryManager::cudaFreeInterfaceCF(int lev) { checkCudaErrors( cudaFreeHost(parameter->getParH(lev)->coarseToFine.coarseCellIndices)); @@ -1151,6 +1201,12 @@ void CudaMemoryManager::cudaCopyInterfaceFC(int lev) checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->fineToCoarse.fineCellIndices, parameter->getParH(lev)->fineToCoarse.fineCellIndices, mem_size_kFC, cudaMemcpyHostToDevice)); checkCudaErrors(cudaMemcpy(parameter->getParD(lev)->fineToCoarse.coarseCellIndices, parameter->getParH(lev)->fineToCoarse.coarseCellIndices, mem_size_kFC, cudaMemcpyHostToDevice)); } +void CudaMemoryManager::cudaCopyInterfaceFCDeviceToHost(int lev){ + uint mem_size_kFC = sizeof(uint) * parameter->getParH(lev)->fineToCoarse.numberOfCells; + + checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->fineToCoarse.fineCellIndices , parameter->getParD(lev)->fineToCoarse.fineCellIndices , mem_size_kFC, cudaMemcpyDeviceToHost)); + checkCudaErrors(cudaMemcpy(parameter->getParH(lev)->fineToCoarse.coarseCellIndices, parameter->getParD(lev)->fineToCoarse.coarseCellIndices, mem_size_kFC, cudaMemcpyDeviceToHost)); +} void CudaMemoryManager::cudaCheckInterfaceFCBulk(int lev) { // only use for testing! diff --git a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h index 1d01c227e780ec564b9eb1506f1a0183769d64b9..20c5a1145c6002803d54302e976cc22ddf4e3e10 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h +++ b/src/gpu/VirtualFluids_GPU/GPU/CudaMemoryManager.h @@ -49,6 +49,12 @@ public: void cudaAllocCoord(int lev); void cudaCopyCoord(int lev); void cudaFreeCoord(int lev); + void cudaCopyCoordDeviceToHost(int lev); + + void cudaAllocCoordRotation(int lev); + void cudaCopyCoordRotation(int lev); + void cudaFreeCoordRotation(int lev); + void cudaCopyCoordRotationDeviceToHost(int lev); void cudaAllocBodyForce(int lev); void cudaCopyBodyForce(int lev); @@ -164,10 +170,12 @@ public: void cudaAllocInterfaceCF(int lev); void cudaCopyInterfaceCF(int lev); + void cudaCopyInterfaceCFDeviceToHost(int lev); void cudaFreeInterfaceCF(int lev); void cudaAllocInterfaceFC(int lev); void cudaCopyInterfaceFC(int lev); + void cudaCopyInterfaceFCDeviceToHost(int lev); void cudaCheckInterfaceFCBulk(int lev); void cudaFreeInterfaceFC(int lev); diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h index b449bcca404b54469b52f7b383f0615632c4d06d..f33013fe9bb6777522c388c6158d0929b37cfc5c 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h +++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h @@ -25,6 +25,7 @@ #endif struct LBMSimulationParameter; +struct ParameterRotatingGridSimulation; class Parameter; ////////////////////////////////////////////////////////////////////////// @@ -1622,6 +1623,17 @@ void ScaleCF_RhoSq_comp_27(LBMSimulationParameter * parameterDeviceC, LBMSimulat template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * interpolationCellsCoarseToFine, ICellNeigh &neighborCoarseToFine, CUstream_st *stream); +void InterpolateStaticToRotating( + LBMSimulationParameter *parameterDeviceS, + LBMSimulationParameter *parameterDeviceR, + ParameterRotatingGridSimulation *paraRotDevice, + ICells *baseToNested, + ICellNeigh &neighborBaseToNested); + +void UpdateGlobalCoordinates( + LBMSimulationParameter *parameterDeviceR, + ParameterRotatingGridSimulation *paraRotDevice +); void ScaleCF_RhoSq_3rdMom_comp_27( real* DC, real* DF, unsigned int* neighborCX, diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh index 74ebf3bea73c221207d3dda7a6a2f29de083ffde..5b43dabe4db102e3e47e3fe07699835b9f58d9aa 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh +++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh @@ -1868,6 +1868,46 @@ template<bool hasTurbulentViscosity> __global__ void scaleCF_compressible( real* turbulentViscosityFine, ICellNeigh offsetCF); +__global__ void interpolateStaticToRotating( + unsigned int numberOfInterfaceNodes, + unsigned int *indicesStaticMMM, + unsigned int *indicesRotating, + const real *coordDestinationX, + const real *coordDestinationY, + const real *coordDestinationZ, + const real *coordSourceX, + const real *coordSourceY, + const real *coordSourceZ, + const uint *neighborXstatic, + const uint *neighborYstatic, + const uint *neighborZstatic, + const uint *neighborMMMstatic, + real centerCoordX, + real centerCoordY, + real centerCoordZ, + real angleX, + real angleY, + real angleZ, + real angularVelocityX, + real angularVelocityY, + real angularVelocityZ, + real dx); + +__global__ void updateGlobalCoordinates( + unsigned int numberOfNodes, + real *globalX, + real *globalY, + real *globalZ, + const real *localX, + const real *localY, + const real *localZ, + real centerCoordX, + real centerCoordY, + real centerCoordZ, + real angleX, + real angleY, + real angleZ); + __global__ void scaleCF_RhoSq_3rdMom_comp_27(real* DC, real* DF, unsigned int* neighborCX, diff --git a/src/gpu/VirtualFluids_GPU/GPU/GridScaling/interpolateStaticRotating.cu b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/interpolateStaticRotating.cu new file mode 100644 index 0000000000000000000000000000000000000000..2714f2324b342cb0171d8940011b364d59a6c984 --- /dev/null +++ b/src/gpu/VirtualFluids_GPU/GPU/GridScaling/interpolateStaticRotating.cu @@ -0,0 +1,129 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// This file is part of VirtualFluids. VirtualFluids is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file scaleCF_compressible.cu +//! \ingroup GPU/GridScaling +//! \author Martin Schoenherr, Anna Wellmann +//======================================================================================= + +#include "DataTypes.h" +#include "LBM/GPUHelperFunctions/KernelUtilities.h" +#include "LBM/GPUHelperFunctions/ChimeraTransformation.h" +#include "LBM/GPUHelperFunctions/ScalingUtilities.h" +#include "LBM/GPUHelperFunctions/GridTraversion.h" +#include "LBM/GPUHelperFunctions/CoordinateTransformation.h" + +#include <lbm/refinement/Coefficients.h> +#include <lbm/refinement/InterpolationCF.h> + +__global__ void interpolateStaticToRotating( + unsigned int numberOfInterfaceNodes, + unsigned int * indicesStaticCell, + unsigned int *indicesRotating, + const real *coordDestinationX, + const real *coordDestinationY, + const real *coordDestinationZ, + const real *coordSourceX, + const real *coordSourceY, + const real *coordSourceZ, + const uint *neighborXstatic, + const uint *neighborYstatic, + const uint *neighborZstatic, + const uint *neighborMMMstatic, + real centerCoordX, + real centerCoordY, + real centerCoordZ, + real angleX, + real angleY, + real angleZ, + real angularVelocityX, + real angularVelocityY, + real angularVelocityZ, + real dx) +{ + const unsigned listIndex = vf::gpu::getNodeIndex(); + + if (listIndex >= numberOfInterfaceNodes) return; + + uint destinationIndex = indicesRotating[listIndex]; + uint sourceIndex = indicesStaticCell[listIndex]; + uint indexNeighborMMMsource = neighborMMMstatic[sourceIndex]; + + real globalX; + real globalY; + real globalZ; + + transformRotatingToGlobal(globalX, globalY, globalZ, coordDestinationX[destinationIndex], + coordDestinationY[destinationIndex], coordDestinationZ[destinationIndex], centerCoordX, + centerCoordY, centerCoordZ, angleX, angleY, angleZ); + + // printf("coordDestinationX %.4f, coordSourceX %.4f, d-s %.4f \n", globalX, coordSourceX[sourceIndex], + // globalX - coordSourceX[sourceIndex]); + + indicesStaticCell[listIndex] = traverseSourceCell( + globalX, globalY, globalZ, + indexNeighborMMMsource, coordSourceX[indexNeighborMMMsource], coordSourceY[indexNeighborMMMsource], + coordSourceZ[indexNeighborMMMsource], neighborXstatic, neighborYstatic, neighborZstatic, dx); + + // if (sourceIndex != indicesStaticCell[listIndex]) { + // printf("sourceIndex: old = %d, new = %d\t", indicesStaticCell[listIndex], sourceIndex); + // } +} + +__global__ void updateGlobalCoordinates( + unsigned int numberOfNodes, + real *globalX, + real *globalY, + real *globalZ, + const real *localX, + const real *localY, + const real *localZ, + real centerCoordX, + real centerCoordY, + real centerCoordZ, + real angleX, + real angleY, + real angleZ) +{ + const unsigned nodeIndex = vf::gpu::getNodeIndex(); + + if (nodeIndex >= numberOfNodes) return; + + real globalXtemp; + real globalYtemp; + real globalZtemp; + + transformRotatingToGlobal(globalXtemp, globalYtemp, globalZtemp, localX[nodeIndex], localY[nodeIndex], localZ[nodeIndex], centerCoordX, + centerCoordY, centerCoordZ, angleX, angleY, angleZ); + + // printf("%.3f\t", localY[nodeIndex]); + + globalX[nodeIndex] = globalXtemp; + globalY[nodeIndex] = globalYtemp; + globalZ[nodeIndex] = globalZtemp; +} \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu index e9bd3ea551e93cb82baa85bf759d93b7a7d4dde0..cd126f27f0a96372c78ed527fb429ff095a1b3a0 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu +++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu @@ -17,6 +17,8 @@ #include "GPU/GPU_Kernels.cuh" #include "Parameter/Parameter.h" +#include "Parameter/ParameterRotatingGrid.h" + ////////////////////////////////////////////////////////////////////////// void KernelCas27( unsigned int grid_nx, @@ -4052,6 +4054,70 @@ template<bool hasTurbulentViscosity> void ScaleCF_compressible(LBMSimulationPara template void ScaleCF_compressible<true>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * coarseToFine, ICellNeigh& neighborCoarseToFine, CUstream_st *stream); template void ScaleCF_compressible<false>(LBMSimulationParameter * parameterDeviceC, LBMSimulationParameter* parameterDeviceF, ICells * coarseToFine, ICellNeigh& neighborCoarseToFine, CUstream_st *stream); +void InterpolateStaticToRotating( + LBMSimulationParameter *parameterDeviceS, + LBMSimulationParameter *parameterDeviceR, + ParameterRotatingGridSimulation *paraRotDevice, + ICells *baseToNested, + ICellNeigh &neighborBaseToNested) +{ + dim3 grid = vf::cuda::getCudaGrid(parameterDeviceS->numberofthreads, baseToNested->numberOfCells); + dim3 threads(parameterDeviceS->numberofthreads, 1, 1); + + interpolateStaticToRotating<<<grid, threads, 0, CU_STREAM_LEGACY>>>( + baseToNested->numberOfCells, + baseToNested->coarseCellIndices, + baseToNested->fineCellIndices, + paraRotDevice->nestedCoordinatesX, + paraRotDevice->nestedCoordinatesY, + paraRotDevice->nestedCoordinatesZ, + parameterDeviceS->coordinateX, + parameterDeviceS->coordinateY, + parameterDeviceS->coordinateZ, + parameterDeviceS->neighborX, + parameterDeviceS->neighborY, + parameterDeviceS->neighborZ, + parameterDeviceS->neighborInverse, + paraRotDevice->centerPoint[0], + paraRotDevice->centerPoint[1], + paraRotDevice->centerPoint[2], + paraRotDevice->gridAngle[0], + paraRotDevice->gridAngle[1], + paraRotDevice->gridAngle[2], + paraRotDevice->angularVelocity[0], + paraRotDevice->angularVelocity[1], + paraRotDevice->angularVelocity[2], + parameterDeviceS->gridSpacing + ); + + getLastCudaError("interpolateStaticToRotating execution failed"); +} + +void UpdateGlobalCoordinates( + LBMSimulationParameter *parameterDeviceR, + ParameterRotatingGridSimulation *paraRotDevice +) +{ + dim3 grid = vf::cuda::getCudaGrid(parameterDeviceR->numberofthreads, parameterDeviceR->numberOfNodes); + dim3 threads(parameterDeviceR->numberofthreads, 1, 1); + + updateGlobalCoordinates<<<grid, threads, 0, CU_STREAM_LEGACY>>>( + parameterDeviceR->numberOfNodes, + parameterDeviceR->coordinateX, + parameterDeviceR->coordinateY, + parameterDeviceR->coordinateZ, + paraRotDevice->nestedCoordinatesX, + paraRotDevice->nestedCoordinatesY, + paraRotDevice->nestedCoordinatesZ, + paraRotDevice->centerPoint[0], + paraRotDevice->centerPoint[1], + paraRotDevice->centerPoint[2], + paraRotDevice->gridAngle[0], + paraRotDevice->gridAngle[1], + paraRotDevice->gridAngle[2] + ); + getLastCudaError("updateGlobalCoordinates execution failed"); +} ////////////////////////////////////////////////////////////////////////// void ScaleCF_RhoSq_3rdMom_comp_27( real* DC, diff --git a/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h index 3c231bd2258bd09efa43e0a2300d176a7aa2916d..37967c012da12d2d4fdaf0c4a64ca6de8a3a7803 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h +++ b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/CoordinateTransformation.h @@ -4,7 +4,7 @@ #include <basics/DataTypes.h> #include <math.h> -__inline__ void transformRotatingToGlobal(real &globalX, real &globalY, real &globalZ, real localX, +__inline__ __device__ void transformRotatingToGlobal(real &globalX, real &globalY, real &globalZ, real localX, real localY, real localZ, real centerCoordX, real centerCoordY, real centerCoordZ, real angleX, real angleY, real angleZ) { diff --git a/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/GridTraversion.h b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/GridTraversion.h new file mode 100644 index 0000000000000000000000000000000000000000..09a9fb5999bdb38f576792a2722e7a87b93173c8 --- /dev/null +++ b/src/gpu/VirtualFluids_GPU/LBM/GPUHelperFunctions/GridTraversion.h @@ -0,0 +1,30 @@ +#ifndef GRID_TRAVERSION +#define GRID_TRAVERSION + +#include <basics/DataTypes.h> +#include <math.h> + +__inline__ __host__ __device__ uint traverseSourceCell(real coordDestinationX, real coordDestinationY, real coordDestinationZ, + uint indexOfInverseNeighborOfSourceCell, real coordInvNeighborCellX, real coordInvNeighborCellY, + real coordInvNeighborCellZ, const uint *neighborX, const uint *neighborY, const uint *neighborZ, real dx) +{ + uint xTraverse = (uint)floor((coordDestinationX - coordInvNeighborCellX) / dx); + uint yTraverse = (uint)floor((coordDestinationY - coordInvNeighborCellY) / dx); + uint zTraverse = (uint)floor((coordDestinationZ - coordInvNeighborCellZ) / dx); + + printf("s %.4f, d %.4f, delta %.4f, dx %.4f, xTraverse %d\n", coordInvNeighborCellX, coordDestinationX, coordDestinationX - coordInvNeighborCellX, dx, xTraverse); + + uint newIndexOfSourceCell = indexOfInverseNeighborOfSourceCell; + for (uint ix = 1; ix <= xTraverse; ix++) { + newIndexOfSourceCell = neighborX[newIndexOfSourceCell]; + } + for (uint iy = 1; iy <= yTraverse; iy++) { + newIndexOfSourceCell = neighborY[newIndexOfSourceCell]; + } + for (uint iz = 1; iz <= zTraverse; iz++) { + newIndexOfSourceCell = neighborZ[newIndexOfSourceCell]; + } + return newIndexOfSourceCell; +} + +#endif \ No newline at end of file diff --git a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp index b9d469d0e39d15413ff397faaadd400f3aa6f480..ac5cd5c6d2079a4c19adb082cd182ead10a526ad 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp +++ b/src/gpu/VirtualFluids_GPU/LBM/Simulation.cpp @@ -10,6 +10,7 @@ #include "Parameter/Parameter.h" #include "Parameter/CudaStreamManager.h" #include "Parameter/EdgeNodeFinder.h" +#include "Parameter/ParameterRotatingGrid.h" #include "GPU/GPU_Interface.h" #include "GPU/KineticEnergyAnalyzer.h" #include "GPU/EnstrophyAnalyzer.h" @@ -371,6 +372,7 @@ void Simulation::init(GridProvider &gridProvider, BoundaryConditionFactory *bcFa dataWriter->writeInit(para, cudaMemoryManager); if (para->getCalcParticles()) copyAndPrintParticles(para.get(), cudaMemoryManager.get(), 0, true); + VF_LOG_INFO("... done."); ////////////////////////////////////////////////////////////////////////// @@ -381,8 +383,8 @@ void Simulation::init(GridProvider &gridProvider, BoundaryConditionFactory *bcFa // NeighborDebugWriter::writeNeighborLinkLinesDebug(para.get()); - // InterfaceDebugWriter::writeInterfaceLinesDebugCF(para.get()); - // InterfaceDebugWriter::writeInterfaceLinesDebugFC(para.get()); + InterfaceDebugWriter::writeInterfaceLinesDebugCF(para.get(), 0); + InterfaceDebugWriter::writeInterfaceLinesDebugFC(para.get(), 0); // writers for version with communication hiding // if(para->getNumprocs() > 1 && para->getUseStreams()){ @@ -965,6 +967,18 @@ void Simulation::readAndWriteFiles(uint timestep) //writeAllTiDatafToFile(para.get(), t); } //////////////////////////////////////////////////////////////////////// + // rotating grid + + UpdateGlobalCoordinates(para->getParD(1).get(), para->getRotatingGridParameter()->parameterRotDevice.get()); + cudaMemoryManager->cudaCopyCoordDeviceToHost(1); + // cudaMemoryManager->cudaCopyCoordRotationDeviceToHost(1); + cudaMemoryManager->cudaCopyInterfaceCFDeviceToHost(0); + cudaMemoryManager->cudaCopyInterfaceFCDeviceToHost(0); + InterfaceDebugWriter::writeInterfaceLinesDebugCF(para.get(), timestep); + InterfaceDebugWriter::writeInterfaceLinesDebugFC(para.get(), timestep); + + //////////////////////////////////////////////////////////////////////// + dataWriter->writeTimestep(para, timestep); //////////////////////////////////////////////////////////////////////// if (para->getCalcTurbulenceIntensity()) { diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.cpp b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.cpp index 5e96db99e17a0908ed9549af3c89ee48cf9db8d3..ffebe4053b0d05c35498e33917028cf65a0b15c0 100644 --- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.cpp +++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.cpp @@ -39,18 +39,18 @@ void writeGridInterfaceLines(Parameter *para, int level, const uint *coarse, con WbWriterVtkXmlBinary::getInstance()->writeLines(name, nodes, cells); } -void writeInterfaceLinesDebugCF(Parameter *para) +void writeInterfaceLinesDebugCF(Parameter *para, uint timeStep) { for (int level = 0; level < para->getMaxLevel(); level++) { - const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_OffDebugCF.vtk"; + const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_OffDebugCF_" + StringUtil::toString<int>(timeStep) + ".vtk"; writeGridInterfaceLines(para, level, para->getParH(level)->coarseToFine.coarseCellIndices, para->getParH(level)->coarseToFine.fineCellIndices, para->getParH(level)->coarseToFine.numberOfCells, fileName); } } -void writeInterfaceLinesDebugFC(Parameter *para) +void writeInterfaceLinesDebugFC(Parameter *para, uint timeStep) { for (int level = 0; level < para->getMaxLevel(); level++) { - const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_OffDebugFC.vtk"; + const std::string fileName = para->getFName() + "_" + StringUtil::toString<int>(level) + "_OffDebugFC_" + StringUtil::toString<int>(timeStep) + ".vtk"; writeGridInterfaceLines(para, level, para->getParH(level)->fineToCoarse.coarseCellIndices, para->getParH(level)->fineToCoarse.fineCellIndices, para->getParH(level)->fineToCoarse.numberOfCells, fileName); } } diff --git a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.h b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.h index 6a13f9bb48f5db7aced0009f58c87d773422f9c1..db1d0c44f09e2222a8695ba6fcf8755f0b3cde1b 100644 --- a/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.h +++ b/src/gpu/VirtualFluids_GPU/Output/InterfaceDebugWriter.h @@ -1,12 +1,14 @@ #ifndef INTERFACEDEBUG_HPP #define INTERFACEDEBUG_HPP +#include <basics/DataTypes.h> + class Parameter; namespace InterfaceDebugWriter { -void writeInterfaceLinesDebugCF(Parameter *para); -void writeInterfaceLinesDebugFC(Parameter *para); +void writeInterfaceLinesDebugCF(Parameter *para, uint timeStep=0); +void writeInterfaceLinesDebugFC(Parameter *para, uint timeStep=0); void writeInterfaceLinesDebugCFCneighbor(Parameter *para); void writeInterfaceLinesDebugCFFneighbor(Parameter *para); diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp index 3b4a3bc25fe059c0a8149d3de97141a2c708490d..5c9f9b3411272b34e4544287eba416a38689067a 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.cpp @@ -518,7 +518,7 @@ void Parameter::initLBMSimulationParameter() parH[i]->Lx = ((real)1.0 * parH[i]->gridNX - (real)1.0) / (pow((real)2.0, i)); parH[i]->Ly = ((real)1.0 * parH[i]->gridNY - (real)1.0) / (pow((real)2.0, i)); parH[i]->Lz = ((real)1.0 * parH[i]->gridNZ - (real)1.0) / (pow((real)2.0, i)); - parH[i]->dx = (real)1.0 / pow((real)2.0, i); + parH[i]->scalingFactorOfGridSpacing = (real)1.0 / pow((real)2.0, i); parH[i]->XdistKn = getDistX().at(i); parH[i]->YdistKn = getDistY().at(i); parH[i]->ZdistKn = getDistZ().at(i); @@ -539,9 +539,9 @@ void Parameter::initLBMSimulationParameter() //////////////////////////////////////////////////////////////////////////// } else { // Geller - parH[i]->distX = ((real)getDistX().at(i) + (real)0.25) * parH[i - 1]->dx; - parH[i]->distY = ((real)getDistY().at(i) + (real)0.25) * parH[i - 1]->dx; - parH[i]->distZ = ((real)getDistZ().at(i) + (real)0.25) * parH[i - 1]->dx; + parH[i]->distX = ((real)getDistX().at(i) + (real)0.25) * parH[i - 1]->scalingFactorOfGridSpacing; + parH[i]->distY = ((real)getDistY().at(i) + (real)0.25) * parH[i - 1]->scalingFactorOfGridSpacing; + parH[i]->distZ = ((real)getDistZ().at(i) + (real)0.25) * parH[i - 1]->scalingFactorOfGridSpacing; // parH[i]->distX = ((real)getDistX().at(i) + 0.25f) * parH[i-1]->dx + parH[i-1]->distX; // parH[i]->distY = ((real)getDistY().at(i) + 0.25f) * parH[i-1]->dx + parH[i-1]->distY; // parH[i]->distZ = ((real)getDistZ().at(i) + 0.25f) * parH[i-1]->dx + parH[i-1]->distZ; @@ -586,7 +586,7 @@ void Parameter::initLBMSimulationParameter() parD[i]->Lx = parH[i]->Lx; parD[i]->Ly = parH[i]->Ly; parD[i]->Lz = parH[i]->Lz; - parD[i]->dx = parH[i]->dx; + parD[i]->scalingFactorOfGridSpacing = parH[i]->scalingFactorOfGridSpacing; parD[i]->XdistKn = parH[i]->XdistKn; parD[i]->YdistKn = parH[i]->YdistKn; parD[i]->ZdistKn = parH[i]->ZdistKn; @@ -1661,9 +1661,12 @@ void Parameter::setADKernel(std::string adKernel) void Parameter::setRotatingGridParameter(std::shared_ptr<ParameterRotatingGrid> parameterRotatingGrid) { this->parameterRotatingGrid = std::move(parameterRotatingGrid); - this->parameterRotatingGrid->initializeNestedCoordinates( - { this->parH[1]->coordinateX, this->parH[1]->coordinateY, this->parH[1]->coordinateZ }, - this->parH[1]->numberOfNodes); +} + + void Parameter::fillCoordinateVectorsForRotatingGrid(uint level) +{ + this->parameterRotatingGrid->fillNestedCoordinateVectorsOnHost( + { this->parH[level]->coordinateX, this->parH[level]->coordinateY, this->parH[level]->coordinateZ }); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -2669,27 +2672,27 @@ real Parameter::TrafoXtoMGsWorld(int CoordX, int level) { real temp = 0; for (int i = 0; i <= level; i++) { - temp += (parH[i]->XdistKn + 0.25f) * 2.f * parH[i]->dx; + temp += (parH[i]->XdistKn + 0.25f) * 2.f * parH[i]->scalingFactorOfGridSpacing; } - temp += (real)((CoordX)*parH[level]->dx); + temp += (real)((CoordX)*parH[level]->scalingFactorOfGridSpacing); return temp; } real Parameter::TrafoYtoMGsWorld(int CoordY, int level) { real temp = 0; for (int i = 0; i <= level; i++) { - temp += (parH[i]->YdistKn + 0.25f) * 2.f * parH[i]->dx; + temp += (parH[i]->YdistKn + 0.25f) * 2.f * parH[i]->scalingFactorOfGridSpacing; } - temp += (real)((CoordY)*parH[level]->dx); + temp += (real)((CoordY)*parH[level]->scalingFactorOfGridSpacing); return temp; } real Parameter::TrafoZtoMGsWorld(int CoordZ, int level) { real temp = 0; for (int i = 0; i <= level; i++) { - temp += (parH[i]->ZdistKn + 0.25f) * 2.f * parH[i]->dx; + temp += (parH[i]->ZdistKn + 0.25f) * 2.f * parH[i]->scalingFactorOfGridSpacing; } - temp += (real)((CoordZ)*parH[level]->dx); + temp += (real)((CoordZ)*parH[level]->scalingFactorOfGridSpacing); return temp; } diff --git a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h index 9aba51d982f730abf86662f5c02ba4307ff1dd1b..82debe0aa1e9f11b3466ff969a2d7826c78c7d5d 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/Parameter.h @@ -441,13 +441,13 @@ struct LBMSimulationParameter { // print/////////////////// unsigned int startz, endz; - real Lx, Ly, Lz, dx; + real Lx, Ly, Lz, scalingFactorOfGridSpacing; real distX, distY, distZ; // testRoundoffError Distributions27 kDistTestRE; - + real gridSpacing; ////////////////////////////////////////////////////////////////////////// }; @@ -686,6 +686,7 @@ public: void setADKernel(std::string adKernel); // rotating grid void setRotatingGridParameter(std::shared_ptr<ParameterRotatingGrid> parameterRotatingGrid); + void fillCoordinateVectorsForRotatingGrid(uint level); // adder void addActuator(SPtr<PreCollisionInteractor> actuator); diff --git a/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.cpp b/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.cpp index dca388592516994ac2b5e7c80034b4bd30167cd5..5031aeb145d4338ee4de8b195dd892de2f36dfa0 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.cpp +++ b/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.cpp @@ -1,33 +1,40 @@ #include "ParameterRotatingGrid.h" -#include "LBM/GPUHelperFunctions/CoordinateTransformation.h" +#include "Logger.h" +#include <iostream> -ParameterRotatingGrid::ParameterRotatingGrid(const std::array<real, 3> ¢erPoint, const Axis &rotationalAxis) - : centerPoint(centerPoint), rotationalAxis(rotationalAxis) +ParameterRotatingGrid::ParameterRotatingGrid(const std::array<real, 3> ¢erPoint, const Axis &rotationalAxis, + uint sizeOfNestedCoordinates) + : rotationalAxis(rotationalAxis) { + parameterRotHost->centerPoint = centerPoint; + parameterRotHost->sizeOfNestedCoordinates = sizeOfNestedCoordinates; + parameterRotHost->memorySizeOfNestedCoordinates = sizeOfNestedCoordinates * sizeof(real); + + parameterRotDevice->centerPoint = centerPoint; + parameterRotDevice->sizeOfNestedCoordinates = sizeOfNestedCoordinates; + parameterRotDevice->memorySizeOfNestedCoordinates = sizeOfNestedCoordinates * sizeof(real); } -void ParameterRotatingGrid::initializeNestedCoordinates(const std::array<real *, 3> &globalCoordinates, uint numberOfNodes) +void ParameterRotatingGrid::fillNestedCoordinateVectorsOnHost(const std::array<real *, 3> &globalCoordinates) { - this->nestedCoordinatesX.resize(numberOfNodes); - this->nestedCoordinatesY.resize(numberOfNodes); - this->nestedCoordinatesZ.resize(numberOfNodes); + if (parameterRotHost->nestedCoordinatesX == nullptr || parameterRotHost->nestedCoordinatesY == nullptr || + parameterRotHost->nestedCoordinatesZ == nullptr) + throw std::runtime_error("Allocate host pointers of nestedCoordinates before filing them!"); -// #pragma omp parallel for - for (uint index = 0; index < numberOfNodes; index++) { - this->nestedCoordinatesX[index] = globalCoordinates[0][index] - centerPoint[0]; - this->nestedCoordinatesY[index] = globalCoordinates[1][index] - centerPoint[1]; - this->nestedCoordinatesZ[index] = globalCoordinates[2][index] - centerPoint[2]; + // #pragma omp parallel for + for (uint index = 0; index < parameterRotHost->sizeOfNestedCoordinates; index++) { + this->parameterRotHost->nestedCoordinatesX[index] = globalCoordinates[0][index] - parameterRotHost->centerPoint[0]; + this->parameterRotHost->nestedCoordinatesY[index] = globalCoordinates[1][index] - parameterRotHost->centerPoint[1]; + this->parameterRotHost->nestedCoordinatesZ[index] = globalCoordinates[2][index] - parameterRotHost->centerPoint[2]; } } -void ParameterRotatingGrid::transformNestedToBase(const std::array<real *, 3> &globalCoordinates) -{ -// #pragma omp parallel for - for (uint index = 0; index < nestedCoordinatesX.size(); index++) { - transformRotatingToGlobal( - globalCoordinates[0][index], globalCoordinates[1][index], globalCoordinates[2][index], nestedCoordinatesX[index], - nestedCoordinatesY[index], nestedCoordinatesZ[index], centerPoint[0], centerPoint[1], centerPoint[2], - gridAngle * unitVectors.at(this->rotationalAxis)[0], gridAngle * unitVectors.at(this->rotationalAxis)[1], - gridAngle * unitVectors.at(this->rotationalAxis)[2]); - } -} +// void ParameterRotatingGrid::transformNestedToBase(const std::array<real *, 3> &globalCoordinates) +// { +// // #pragma omp parallel for +// for (uint index = 0; index < nestedCoordinatesX.size(); index++) { +// transformRotatingToGlobal(globalCoordinates[0][index], globalCoordinates[1][index], globalCoordinates[2][index], +// nestedCoordinatesX[index], nestedCoordinatesY[index], nestedCoordinatesZ[index], +// centerPoint[0], centerPoint[1], centerPoint[2], gridAngle[0], gridAngle[1], gridAngle[2]); +// } +// } diff --git a/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.h b/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.h index 573c975e7df7acdef6e949aa96a3b13e8fa5be22..ac78941f87564936acca189f8d3f3ae81716ca0c 100644 --- a/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.h +++ b/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGrid.h @@ -1,28 +1,32 @@ #ifndef PARAMETER_ROTATING_GRID #define PARAMETER_ROTATING_GRID +#include "PointerDefinitions.h" #include <array> #include <vector> #include <basics/DataTypes.h> #include <basics/geometry3d/Axis.h> +struct ParameterRotatingGridSimulation { + std::array<real, 3> centerPoint; + real *nestedCoordinatesX = nullptr; // in local coordinate system of rotating grid + real *nestedCoordinatesY = nullptr; + real *nestedCoordinatesZ = nullptr; + uint sizeOfNestedCoordinates; + uint memorySizeOfNestedCoordinates; + std::array<real, 3> gridAngle = { 0.0, 0.0, 0.0 }; + std::array<real, 3> angularVelocity = { 0.02, 0.0, 0.0 }; +}; + struct ParameterRotatingGrid { public: - ParameterRotatingGrid(const std::array<real, 3> ¢erPoint, const Axis &rotationalAxis); - void initializeNestedCoordinates(const std::array<real *, 3> &globalCoordinates, uint numberOfNodes); - void transformNestedToBase(const std::array<real *, 3> &globalCoordinates); + ParameterRotatingGrid(const std::array<real, 3> ¢erPoint, const Axis &rotationalAxis, uint sizeOfNestedCoordinates); + void fillNestedCoordinateVectorsOnHost(const std::array<real *, 3> &globalCoordinates); -public: - const std::array<real, 3> centerPoint; const Axis rotationalAxis; - - std::vector<real> nestedCoordinatesX; - std::vector<real> nestedCoordinatesY; - std::vector<real> nestedCoordinatesZ; - - real gridAngle = 1.0; - std::array<real, 3> angularVelocity; + SPtr<ParameterRotatingGridSimulation> parameterRotHost = std::make_shared<ParameterRotatingGridSimulation>(); + SPtr<ParameterRotatingGridSimulation> parameterRotDevice = std::make_shared<ParameterRotatingGridSimulation>(); }; #endif diff --git a/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGridTest.cpp b/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGridTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bdd77dd6386a46d1477bc80f3211d75c2c6111af --- /dev/null +++ b/src/gpu/VirtualFluids_GPU/Parameter/ParameterRotatingGridTest.cpp @@ -0,0 +1,6 @@ +#include <gmock/gmock.h> + +// TEST(ParameterRotatingGrid, arrayForCoordinatesHostNotAllocated_fillWithCoordinates_Throws) +// { +// CudaMemoryManager cuda +// } \ No newline at end of file