VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
cpuTreeInfo.h
Go to the documentation of this file.
1/*--------------------------------*- VM2D -*-----------------*---------------*\
2| ## ## ## ## #### ##### | | Version 1.14 |
3| ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2026/03/06 |
4| ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5| #### ## ## ## ## ## | Open Source Code |
6| ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7| |
8| Copyright (C) 2017-2026 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9*-----------------------------------------------------------------------------*
10| File name: cpuTreeInfo.h |
11| Info: Source code of VM2D |
12| |
13| This file is part of VM2D. |
14| VM2D is free software: you can redistribute it and/or modify it |
15| under the terms of the GNU General Public License as published by |
16| the Free Software Foundation, either version 3 of the License, or |
17| (at your option) any later version. |
18| |
19| VM2D is distributed in the hope that it will be useful, but WITHOUT |
20| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21| FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22| for more details. |
23| |
24| You should have received a copy of the GNU General Public License |
25| along with VM2D. If not, see <http://www.gnu.org/licenses/>. |
26\*---------------------------------------------------------------------------*/
27
39#ifndef CPUTREEINFO_H
40#define CPUTREEINFO_H
41
42#include "Vortex2D.h"
43#include "Gpudefs.h"
44#include "cpuRadixSorter.h"
45
46namespace VM2D
47{
49 //\brief Структура, хранящая данные и указатели на массивы на GPU для оптимизации итерационного решения СЛАУ на GPU
50 //
51 //\author Марчевский Илья Константинович
52 //\author Сокол Ксения Сергеевна
53 //\author Рятина Евгения Павловна
54 //\author Колганова Александра Олеговна
55 //
56 //\Version 1.14
57 //\date 6 марта 2026 г.
58 //*/
59 //struct infoForMatVecMul
60 //{
61 // std::vector<int> nClosePanels; ///количество листьев дерева (панелей), находящихся в ближней зоне
62 // std::vector<int> nFarCells; ///количество ячеек, находящихся в дальней зоне
63
64 // std::vector<int> closePrefixSum; ///префиксная сумма для ближней зоны
65 // std::vector<int> farPrefixSum; ///префиксная сумма для дальней зоны
66
67 // Point2D* i00D; ///указатель на GPU, хранящий влияние панелей из ближней зоны
68 // Point2D* i01D; ///аналог i00D, но используется для кусочно-линейной схемы
69 // Point2D* i10D; ///аналог i00D, но используется для кусочно-линейной схемы
70 // Point2D* i11D; ///аналог i00D, но используется для кусочно-линейной схемы
71
72 // int* nClosePanelsD; ///количество листьев дерева (панелей), находящихся в ближней зоне
73 // int* nFarCellsD; ///количество ячеек, находящихся в дальней зоне
74
75 // int* closeCellsIdxD; ///индексы ячеек ближней зоны
76 // int* farCellsIdxD; ///индексы ячеек дальней зоны
77
78 // int* closePrefixSumD; ///префиксная сумма для ближней зоны
79 // int* farPrefixSumD; ///префиксная сумма для дальней зоны
80 //};
81
82
96 {
97 public:
99
100 std::vector<Point2D> object;
101 std::vector<double> gamma;
102 std::vector<double> sigma;
103
107
108 std::vector<int> mass; //массы (единица для точечного вихря, число вихрей для ячейки)
109
110 Point2D maxr, minr; //габаритный прямоугольник
111 std::vector<Point2D> moms;//мультипольные моменты всех ячеек; хранятся в виде <mom_0x, mom_0y=0, mom_1x, mom_1y, ..., mom_px, mom_py>, <для второй ячейки> ...
112 std::vector<Point2D> ED; //к-ты локальных разложений
113
114 //For Morton tree
115 std::vector<unsigned int> mortonCodesKeyUnsort;
116 std::vector<unsigned int> mortonCodesKey;
117
118 std::vector<int> mortonCodesIdxUnsort; //0 1 2 3 ... nbodies-1
119 std::vector<int> mortonCodesIdx;
120
121 std::vector<int> levelUnsort;
122 std::vector<int> levelSort;
123
124 std::vector<int> indexUnsort; //0 1 2 3 ... nbodies-2
125 std::vector<int> indexSort;
126 std::vector<int> indexSortT;
127
128 std::vector<int> indexControlCells;
129
130 std::vector<Point2D> center; //Положения внутренних узлов в дерева Карраса
131 std::vector<Point4D> lowerupper; //Левый нижний и правый верхний углы ячейки
132 std::vector<Point4D> gabForLeaves; //Левый нижний и правый верхний углы листа
133
134 std::vector<int> parent; //Номер ячейки-родителя
135 std::vector<std::pair<int, int>> child; //Потомки внутренних ячеек (в одной ячейке храним сразу два целых числа)
136 std::vector<std::pair<int, int>> range; //Диапазон частиц во внутренней ячейке (в одной ячейке храним сразу два целых числа)
137
138 //infoForMatVecMul matVecMulInfo;
139
142
143 CpuTreeInfo(tree_T treeType_, object_T objectType_, scheme_T schemeType_);
144 ~CpuTreeInfo();
145
146
147 float Update(const std::vector<Vortex2D>& vtx, int cntrLev = 0);
148
149 float UpdatePanelGeometry(const std::vector<std::pair<Point2D, Point2D>>& panels, int cntrLev);
150
151// void UpdatePanelFreeVortexIntensity(const double* dev_ptr_freeVortexSheet, const double* dev_ptr_freeVortexSheetLin);//функция нулит attached vortex sheet
152// void UpdatePanelAttachedVortexIntensity(const double* dev_ptr_attachedVortexSheet, const double* dev_ptr_attachedVortexSheetLin);//функция нулит free vortex sheet
153// void UpdatePanelAttachedSourceIntensity(const double* dev_ptr_attachedSourceSheet, const double* dev_ptr_attachedSourceSheetLin);
154// void UpdatePanelFreeAndAttachedVortexIntensity(const double* dev_ptr_freeVortexSheet, const double* dev_ptr_freeVortexSheetLin, const double* dev_ptr_attachedVortexSheet, const double* dev_ptr_attachedVortexSheetLin);
155
156// void MemoryAllocateForGMRES();
157// void MemoryFreeForGMRES();
158
159// void MemoryAllocate(int nCudaObject);
160
161// bool IsInitialized() const;
164
165 int Delta(int i, int j) const;
166 //void Summ12();
167#include <SummHeader.h>
168
169 void CalcAABB();
170 float Build();
171 float UpwardTraversal(int order);
172
173 float DownwardTraversalVorticesToPoints(CpuTreeInfo& cntrTree, std::vector<Point2D>& vel, std::vector<double>& epsast, double theta, int order, bool calcRadius);
174 float DownwardTraversalClosestPanelToPoints(CpuTreeInfo& cntrTree, std::vector<std::pair<int, double>>& indexPnlDist, bool findOnlyInside, double* pseudonormals);
175
176 float DownwardTraversalVorticesToPanels(CpuTreeInfo& cntrTree, std::vector<double>& rhs, std::vector<double>& rhsLin, double theta, int order);
177
178
179
180
181// float DownwardTraversalVorticesToPoints(CudaTreeInfo& cntrTree, Point2D* velD, double* epsastD, double eps2, double theta, int order, bool calcRadius);
182// float DownwardTraversalVorticesToPanels(CudaTreeInfo& cntrTree, double* rhsD, double* rhsLinD, double theta, int order);
183// float DownwardTraversalPanelsToPoints(CudaTreeInfo& cntrTree, Point2D* velD, double eps2, double theta, int order);
184// float DownwardTraversalGMRES(double* resD, double* resLinD, double theta, int order, int iter);
185
186// float I1I2CalculationWrapper(double minRd, double* __restrict I1D, Point2D* __restrict I2D, double* __restrict epsastD);
187// float I0I3CalculationWrapper(double minRd, float* __restrict I0D, Point2Df* __restrict I3D, double* __restrict epsastD, const double* __restrict meanEpsD, int nPan, double* __restrict panD, double* __restrict visstrD);
188// void RadixSortMortonCodes(int beginBit = 0, int endBit = 2 * codeLength);
189// void RadixSortInternalCells(int beginBit = 0, int endBit = 2 * codeLength);
190 };
191
192}
193
194
195#endif
Описание констант и параметров для взаимодействия с графическим ускорителем
object_T
Definition Gpudefs.h:153
tree_T
Definition Gpudefs.h:146
scheme_T
Definition Gpudefs.h:158
Заголовочный файл с описанием класса Vortex2D.
Структура, хранящая данные и указатели на массивы на GPU для оптимизации итерационного решения СЛАУ н...
Definition cpuTreeInfo.h:96
std::vector< std::pair< int, int > > range
std::vector< Point2D > moms
std::vector< int > indexControlCells
float UpdatePanelGeometry(const std::vector< std::pair< Point2D, Point2D > > &panels, int cntrLev)
std::vector< int > levelUnsort
float Update(const std::vector< Vortex2D > &vtx, int cntrLev=0)
std::vector< unsigned int > mortonCodesKeyUnsort
float DownwardTraversalVorticesToPanels(CpuTreeInfo &cntrTree, std::vector< double > &rhs, std::vector< double > &rhsLin, double theta, int order)
float DownwardTraversalClosestPanelToPoints(CpuTreeInfo &cntrTree, std::vector< std::pair< int, double > > &indexPnlDist, bool findOnlyInside, double *pseudonormals)
std::vector< int > parent
std::vector< int > indexSort
std::vector< unsigned int > mortonCodesKey
std::vector< Point2D > object
float UpwardTraversal(int order)
std::vector< int > mortonCodesIdx
std::vector< double > gamma
void RadixSortInternalCells()
std::vector< Point2D > center
OptimizedRadixSorter< int > levelSorter
std::vector< Point4D > gabForLeaves
std::vector< Point2D > ED
std::vector< int > levelSort
std::vector< int > indexSortT
std::vector< Point4D > lowerupper
OptimizedRadixSorter< int > codesSorter
std::vector< int > mass
std::vector< double > sigma
std::vector< int > indexUnsort
std::vector< int > mortonCodesIdxUnsort
int Delta(int i, int j) const
float DownwardTraversalVorticesToPoints(CpuTreeInfo &cntrTree, std::vector< Point2D > &vel, std::vector< double > &epsast, double theta, int order, bool calcRadius)
std::vector< std::pair< int, int > > child
(RadixSort) CPU.