VirtualFluids 0.2.0
Parallel CFD LBM Solver
Loading...
Searching...
No Matches
EdgeNodeFinder.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 <vector>
34#include <optional>
35
36#include "EdgeNodeFinder.h"
37#include "Parameter.h"
38
39namespace vf::gpu
40{
42void findEdgeNodesXY(LBMSimulationParameter& parameterLB);
44void findEdgeNodesXZ(LBMSimulationParameter& parameterLB);
46void findEdgeNodesYZ(LBMSimulationParameter& parameterLB);
47void findEdgeNodes(const std::vector<ProcessNeighbor27> &recvProcessNeighbor,
48 const std::vector<ProcessNeighbor27> &sendProcessNeighbor,
49 std::vector<LBMSimulationParameter::EdgeNodePositions> &edgeNodes);
50std::optional<std::pair<uint, uint>> findIndexInSendNodes(uint nodeIndex,
51 const std::vector<ProcessNeighbor27> &sendProcessNeighbor);
52
54{
55 for (int level = 0; level <= parameter.getFine(); level++) {
56 findEdgeNodesXY(*parameter.getParH(level));
57 findEdgeNodesXZ(*parameter.getParH(level));
58 findEdgeNodesYZ(*parameter.getParH(level));
59 }
60}
61
63{
64 findEdgeNodes(parameterLB.recvProcessNeighborsX, parameterLB.sendProcessNeighborsY,
65 parameterLB.edgeNodesXtoY);
66}
67
69{
70 findEdgeNodes(parameterLB.recvProcessNeighborsX, parameterLB.sendProcessNeighborsZ,
71 parameterLB.edgeNodesXtoZ);
72}
73
75{
76 findEdgeNodes(parameterLB.recvProcessNeighborsY, parameterLB.sendProcessNeighborsZ,
77 parameterLB.edgeNodesYtoZ);
78}
79
80void findEdgeNodes(const std::vector<ProcessNeighbor27> &recvProcessNeighbor,
81 const std::vector<ProcessNeighbor27> &sendProcessNeighbor,
82 std::vector<LBMSimulationParameter::EdgeNodePositions> &edgeNodes)
83{
84 for (uint neighbor = 0; neighbor < uint(recvProcessNeighbor.size()); neighbor++) {
85 for (uint index = 0; index < recvProcessNeighbor[neighbor].numberOfNodes; index++) {
86 if (auto sendIndices = findIndexInSendNodes(recvProcessNeighbor[neighbor].index[index], sendProcessNeighbor)) {
87 edgeNodes.emplace_back(neighbor, index, sendIndices->first, sendIndices->second);
88 }
89 }
90 }
91}
92
93std::optional<std::pair<uint, uint>> findIndexInSendNodes(const uint nodeIndex,
94 const std::vector<ProcessNeighbor27> &sendProcessNeighbor)
95{
96 for (uint neighbor = 0; neighbor < uint(sendProcessNeighbor.size()); neighbor++) {
97 for (uint node = 0; node < sendProcessNeighbor[neighbor].numberOfNodes; node++) {
98 if (sendProcessNeighbor[neighbor].index[node] == nodeIndex) {
99 return std::pair<uint, uint>(neighbor, node);
100 }
101 }
102 }
103 return std::nullopt;
104}
105
106} // namespace vf::gpu
107
Class for LBM-parameter management.
Definition Parameter.h:359
std::shared_ptr< LBMSimulationParameter > getParH(int level) const
Pointer to instance of LBMSimulationParameter - stored on Host System.
int getFine() const
std::shared_ptr< T > SPtr
unsigned int uint
Definition DataTypes.h:47
void findEdgeNodes(const std::vector< ProcessNeighbor27 > &recvProcessNeighbor, const std::vector< ProcessNeighbor27 > &sendProcessNeighbor, std::vector< LBMSimulationParameter::EdgeNodePositions > &edgeNodes)
std::optional< std::pair< uint, uint > > findIndexInSendNodes(uint nodeIndex, const std::vector< ProcessNeighbor27 > &sendProcessNeighbor)
void findEdgeNodesCommMultiGPU(Parameter &parameter)
Function for finding edge nodes in the multi-gpu implementation.
void findEdgeNodesXY(LBMSimulationParameter &parameterLB)
Find nodes that are both received in the x-direction and sent in the y-direction.
void findEdgeNodesYZ(LBMSimulationParameter &parameterLB)
Find nodes that are both received in the y-direction and sent in the z-direction.
void findEdgeNodesXZ(LBMSimulationParameter &parameterLB)
Find nodes that are both received in the x-direction and sent in the z-direction.
struct holds and manages the LB-parameter of the simulation
Definition Parameter.h:74