VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
GridProvider.cpp
Go to the documentation of this file.
1//=======================================================================================
2// ____ ____ __ ______ __________ __ __ __ __
3// \ \ | | | | | _ \ |___ ___| | | | | / \ | |
4// \ \ | | | | | |_) | | | | | | | / \ | |
5// \ \ | | | | | _ / | | | | | | / /\ \ | |
6// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____
7// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______|
8// \ \ | | ________________________________________________________________
9// \ \ | | | ______________________________________________________________|
10// \ \| | | | __ __ __ __ ______ _______
11// \ | | |_____ | | | | | | | | | _ \ / _____)
12// \ | | _____| | | | | | | | | | | \ \ \_______
13// \ | | | | |_____ | \_/ | | | | |_/ / _____ |
14// \ _____| |__| |________| \_______/ |__| |______/ (_______/
15//
16// This file is part of VirtualFluids. VirtualFluids is free software: you can
17// redistribute it and/or modify it under the terms of the GNU General Public
18// License as published by the Free Software Foundation, either version 3 of
19// the License, or (at your option) any later version.
20//
21// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
22// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24// for more details.
25//
26// SPDX-License-Identifier: GPL-3.0-or-later
27// SPDX-FileCopyrightText: Copyright © VirtualFluids Project contributors, see AUTHORS.md in root folder
28//
32//=======================================================================================
33#include "GridProvider.h"
34
36
39#include <Parameter/Parameter.h>
40
42
44
45using namespace vf::basics::constant;
46
47namespace vf::gpu {
48
49std::shared_ptr<GridProvider> GridProvider::makeGridGenerator(std::shared_ptr<GridBuilder> builder, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager, vf::parallel::Communicator& communicator)
50{
51 return std::shared_ptr<GridProvider>(new GridGenerator(builder, para, cudaMemoryManager, communicator));
52}
53
54std::shared_ptr<GridProvider> GridProvider::makeGridReader(FILEFORMAT format, std::shared_ptr<Parameter> para, std::shared_ptr<CudaMemoryManager> cudaMemoryManager)
55{
56 return std::shared_ptr<GridProvider>(new GridReader(format, para, cudaMemoryManager));
57}
58
59void GridProvider::setNumberOfNodes(uint numberOfNodes, int level) const
60{
61 para->getParH(level)->numberOfNodes = (unsigned long long)numberOfNodes;
62 para->getParD(level)->numberOfNodes = (unsigned long long)numberOfNodes;
63 para->getParH(level)->memSizeRealLBnodes = sizeof(real) * para->getParH(level)->numberOfNodes;
64 para->getParD(level)->memSizeRealLBnodes = sizeof(real) * para->getParD(level)->numberOfNodes;
65 para->getParH(level)->memSizeLonglongLBnodes = sizeof(unsigned long long) * para->getParH(level)->numberOfNodes;
66 para->getParD(level)->memSizeLonglongLBnodes = sizeof(unsigned long long) * para->getParD(level)->numberOfNodes;
67}
68
69void GridProvider::setNumberOfTaggedFluidNodes(uint numberOfNodes, CollisionTemplate tag, int level) const
70{
71 para->getParH(level)->numberOfTaggedFluidNodes[tag] = numberOfNodes;
72 para->getParD(level)->numberOfTaggedFluidNodes[tag] = numberOfNodes;
73}
74
75void GridProvider::setInitialNodeValues(uint numberOfNodes, int level) const
76{
77 for (uint pos = 1; pos <= numberOfNodes; pos++)
78 {
79 const real coordX = para->getParH(level)->coordinateX[pos];
80 const real coordY = para->getParH(level)->coordinateY[pos];
81 const real coordZ = para->getParH(level)->coordinateZ[pos];
82
83 real rho, vx, vy, vz;
84
85 // call functor object with initial condition
86 if( para->getInitialCondition() )
87 {
88 para->getInitialCondition()(coordX,coordY,coordZ,rho,vx,vy,vz);
89 }
90 else
91 {
92 rho = real(0.0);
93 vx = real(0.0);
94 vy = real(0.0);
95 vz = real(0.0);
96 }
97
98 para->getParH(level)->rho[pos] = rho;
99 para->getParH(level)->velocityX[pos] = vx;
100 para->getParH(level)->velocityY[pos] = vy;
101 para->getParH(level)->velocityZ[pos] = vz;
102
104
105 if (para->getCalcMean()) {
106 para->getParH(level)->meanVelocityInXdirection[pos] = 0.0f;
107 para->getParH(level)->meanVelocityInYdirection[pos] = 0.0f;
108 para->getParH(level)->meanVelocityInZdirection[pos] = 0.0f;
109 para->getParH(level)->meanDensity[pos] = 0.0f;
110 para->getParH(level)->meanPressure[pos] = 0.0f;
111 }
112
113 if (para->getIsBodyForce()) {
114 para->getParH(level)->forceX_SP[pos] = 0.0f;
115 para->getParH(level)->forceY_SP[pos] = 0.0f;
116 para->getParH(level)->forceZ_SP[pos] = 0.0f;
117 }
118 }
119}
120
121void GridProvider::setInitialNodeValuesAD(uint numberOfNodes, int level) const
122{
123 using namespace ::vf::basics::constant;
124 auto parH = para->getParH(level);
125 for (uint index = 1; index <= numberOfNodes; index++) {
126 const real coordX = parH->coordinateX[index];
127 const real coordY = parH->coordinateY[index];
128 const real coordZ = parH->coordinateZ[index];
129 parH->concentration[index] = para->getInitialConditionAD() ? para->getInitialConditionAD()(coordX, coordY, coordZ) : c0o1;
130 if (para->getUseTurbulentDiffusivity())
131 parH->turbulentDiffusivity[index] = c0o1;
132 if(para->getBuoyancyEnabled())
133 parH->localReferenceTemperature[index] = para->getInitialLocalReferenceTemperature() ? para->getInitialLocalReferenceTemperature()(coordX, coordY, coordZ) : c0o1;
134 }
135}
136
137
139{
140 para->getParH(level)->pressureBC.numberOfBCnodes = sizePerLevel;
141 para->getParD(level)->pressureBC.numberOfBCnodes = sizePerLevel;
142}
143
144
146{
147 para->getParH(level)->velocityBC.numberOfBCnodes = sizePerLevel;
148 para->getParD(level)->velocityBC.numberOfBCnodes = sizePerLevel;
149}
150
152{
153 para->getParH(level)->outflowBC.numberOfBCnodes = sizePerLevel;
154 para->getParD(level)->outflowBC.numberOfBCnodes = sizePerLevel;
155}
156
158{
159 cudaMemoryManager->cudaAllocForcing();
160 cudaMemoryManager->cudaCopyForcingToDevice();
161
162 for (int level = para->getCoarse(); level <= para->getFine(); level++)
163 {
164 cudaMemoryManager->cudaAllocLevelForcing(level);
165 cudaMemoryManager->cudaCopyLevelForcingToDevice(level);
166 }
167}
168
170{
171 cudaMemoryManager->cudaAllocQuadricLimiters();
172 cudaMemoryManager->cudaCopyQuadricLimitersToDevice();
173}
174
176{
177 for (int level = para->getCoarse(); level <= para->getFine(); level++)
178 {
179 cudaMemoryManager->cudaFreeCoord(level);
180 cudaMemoryManager->cudaFreeSP(level);
181 }
182}
183
185{
186 cudaMemoryManager->cudaCopyDataToHost(level);
187}
188
189}
190
mapping the grid of grid generator to data structure for simulation
std::shared_ptr< Parameter > para
void setOutflowSizePerLevel(int level, int sizePerLevel) const
virtual void allocAndCopyForcing()
void setInitialNodeValuesAD(uint numberOfNodes, int level) const
void setNumberOfTaggedFluidNodes(uint numberOfNodes, CollisionTemplate tag, int level) const
void setVelocitySizePerLevel(int level, int sizePerLevel) const
static std::shared_ptr< GridProvider > makeGridGenerator(std::shared_ptr< GridBuilder > builder, std::shared_ptr< Parameter > para, std::shared_ptr< CudaMemoryManager > cudaMemoryManager, vf::parallel::Communicator &communicator)
void setPressSizePerLevel(int level, int sizePerLevel) const
virtual void setInitialNodeValues(uint numberOfNodes, int level) const
static std::shared_ptr< GridProvider > makeGridReader(FILEFORMAT format, std::shared_ptr< Parameter > para, std::shared_ptr< CudaMemoryManager > cudaMemoryManager)
std::shared_ptr< CudaMemoryManager > cudaMemoryManager
virtual void cudaCopyDataToHost(int level)
void setNumberOfNodes(uint numberOfNodes, int level) const
virtual void freeMemoryOnHost()
virtual void allocAndCopyQuadricLimiters()
An abstract class for communication between processes in parallel computation.
std::shared_ptr< T > SPtr
float real
Definition DataTypes.h:42
unsigned int uint
Definition DataTypes.h:47
CollisionTemplate
An enumeration for selecting a template of the collision kernel (CumulantK17)
Definition Calculation.h:57