VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
VM2D::Gpu Class Reference

Класс, обеспечивающий возможность выполнения вычислений на GPU по технологии Nvidia CUDA. More...

#include <Gpu2D.h>

Collaboration diagram for VM2D::Gpu:

Public Member Functions

 Gpu (const World2D &W_)
 Конструктор
 
 ~Gpu ()
 
void setAccelCoeff (double cft_)
 Установка коэффициента разгона потока
 
void setCollapseCoeff (double pos_, double refLength_)
 Установка правой границы самого правого профиля (для организации увеличения радиуса коллапса)
 
void setMaxGamma (double gam_)
 Установка максимально допустимой циркуляции вихря
 
void setSchemeSwitcher (int schemeSwitcher_)
 Установка переключателя расчетных схем
 

Private Attributes

const World2DW
 Константная ссылка на решаемую задачу
 

Detailed Description

Класс, обеспечивающий возможность выполнения вычислений на GPU по технологии Nvidia CUDA.

Author
Марчевский Илья Константинович
Сокол Ксения Сергеевна
Рятина Евгения Павловна
Колганова Александра Олеговна
Version
1.14
Date
6 марта 2026 г.

Definition at line 70 of file Gpu2D.h.

Constructor & Destructor Documentation

◆ Gpu()

Gpu::Gpu ( const World2D W_)

Конструктор

Parameters
[in]W_константная ссылка на решаемую задачу

Definition at line 57 of file Gpu2D.cpp.

58 : W(W_)
59{
60#if defined(__CUDACC__) || defined(USE_CUDA)
61
62
63// Откомментировать следующую строку, если запускается счет на кластере, каждый узел которого
64// имеет несколько видеокарт, при этом хочется одновременно решать несколько задач --- каждую на своей видеокарте ---
65// каждая задача по своему номеру, деленному по модулю числа видеокарт на узле будет привязана к своей видеокарте;
66// на каждый узел при этом отправлять СТОЛЬКО MPI-нитей, СКОЛЬКО ТАМ ВИДЕОКАРТ;
67// число задач НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ ВЫБИРАТЬ ТОЧНО РАВНЫМ СУММАРНОМУ ЧИСЛУ ВИДЕОКАРТ,
68// т.е. чтобы все задачи стартовали сразу же.
69//
70// Uncomment the following string if the program runs on the computer cluster with several graphic cards on every node
71// and you want to solve several tasks simultaneously --- EVERY TASK ON ITS OWN GRAPHIC CARD;
72// every task will be associated with separate graphic card;
73// send THE SAME AMOUNT OF MPI-THREADS for the node as THE NUMBER OF GRAPHIC CARDS on this node;
74// IT IS STRONGLY RECOMMENDED TO CHOOSE THE NUMBER OF TASKS EXACTLY EQUAL TO TOTAL VIDEO CARDs NUMBERS,
75// i.e. to start all the tasks simultaneously.
76
77
78// blocks = cuSelect(W.getPassport().problemNumber % 4); //The index of the used video card will be equal to the task number
79 // in the task list (to modulo 4 --- number of graphic cards on each node)
80
81 blocks = cuSelect(0); //The index of the used video card will be equal to the task number
82 cuReserveDevMem((void*&)dev_blocks, sizeof(int), 0);
83 cuCopyFixedArray(dev_blocks, &blocks, sizeof(int), 0);
84
85 cuSetConstants(sizeof(Vortex2D)/sizeof(double), Vortex2D::offsPos / sizeof(double), Vortex2D::offsGam / sizeof(double), Vortex2D::offsSgm / sizeof(double));
86
87 n_CUDA_wake = 0;
88 inflTreeWake.reset(new BHcu::CudaTreeInfo(blocks, tree_T::vortex, object_T::point4, scheme_T::noScheme, true));
89 cntrTreeWake.reset(new BHcu::CudaTreeInfo(blocks, tree_T::contr, object_T::point4, scheme_T::noScheme, false));
90#ifdef TURB
91 cntrTreeNut.reset(new BHcu::CudaTreeInfo(blocks, tree_T::contr, object_T::point4, scheme_T::noScheme, false));
92#endif
93
94 scheme_T sch;
96 {
97 case 1:
99 break;
100 case 2:
102 break;
103 }
104 cntrTreePnl.reset(new BHcu::CudaTreeInfo(blocks, tree_T::contr, object_T::panel, sch, false));
105 inflTreePnlVortex.reset(new BHcu::CudaTreeInfo(blocks, tree_T::vortex, object_T::panel, sch, false));
106 inflTreePnlSource.reset(new BHcu::CudaTreeInfo(blocks, tree_T::source, object_T::panel, sch, false));
107
108 n_CUDA_velVP = 0;
109 cntrTreeVP.reset(new BHcu::CudaTreeInfo(blocks, tree_T::contr, object_T::point2, scheme_T::noScheme, false));
110
111 //вспомогательное дерево панелей для контроля протыкания
112 auxTreePnl.reset(new BHcu::CudaTreeInfo(blocks, tree_T::aux, object_T::panel, scheme_T::noScheme, false));
113 cntrTreePoint.reset(new BHcu::CudaTreeInfo(blocks, tree_T::contr, object_T::point2, scheme_T::noScheme, false));
114 cntrTreeSegment.reset(new BHcu::CudaTreeInfo(blocks, tree_T::contr, object_T::panel, scheme_T::noScheme, false));
115
116
117 n_CUDA_source = 0;
118 n_CUDA_afls = 0;
119 n_CUDA_pnls = 0;
120
121#endif
122}
scheme_T
Definition Gpudefs.h:158
const World2D & W
Константная ссылка на решаемую задачу
Definition Gpu2D.h:74
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
Definition Passport2D.h:307
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:263
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59
std::pair< std::string, int > boundaryCondition
Метод аппроксимации граничных условий
Definition Passport2D.h:190
Here is the call graph for this function:

◆ ~Gpu()

Gpu::~Gpu ( )

Definition at line 125 of file Gpu2D.cpp.

126{
127#if defined(__CUDACC__) || defined(USE_CUDA)
128 inflTreePnlVortex->MemoryFreeForGMRES();
129
130 ReleaseDevMem(W.getWake().devVtxPtr, 1);
131 ReleaseDevMem(W.getWake().devVelPtr, 2);
132 ReleaseDevMem(W.getWake().devRadPtr, 3);
133 ReleaseDevMem(W.getWake().devI0Ptr, 4);
134 ReleaseDevMem(W.getWake().devI0fPtr, 4);
135 ReleaseDevMem(W.getWake().devI1Ptr, 5);
136 ReleaseDevMem(W.getWake().devI2Ptr, 6);
137 ReleaseDevMem(W.getWake().devI3Ptr, 7);
138 ReleaseDevMem(W.getWake().devI3fPtr, 7);
139
140 ReleaseDevMem(W.getWake().devMeshPtr, 8);
141 ReleaseDevMem(W.getWake().devNeiPtr, 9);
142 ReleaseDevMem(W.getWake().devNearestPanelPtr, 9);
143
144 if (W.getSource().vtx.size() > 0)
145 ReleaseDevMem(W.getSource().devVtxPtr, 10);
146
147 if (W.getNumberOfAirfoil() > 0)
148 for (size_t s = 0; s < 1/*n_CUDA_afls*/; ++s)
149 {
150 ReleaseDevMem(W.getBoundary(s).virtualWake.devVtxPtr, 11);
151 ReleaseDevMem(W.getBoundary(s).virtualWake.devVelPtr, 12);
152 ReleaseDevMem(W.getBoundary(s).virtualWake.devRadPtr, 13);
153 ReleaseDevMem(W.getBoundary(s).virtualWake.devI0Ptr, 14);
154 ReleaseDevMem(W.getBoundary(s).virtualWake.devI0fPtr, 14);
155 ReleaseDevMem(W.getBoundary(s).virtualWake.devI1Ptr, 15);
156 ReleaseDevMem(W.getBoundary(s).virtualWake.devI2Ptr, 16);
157 ReleaseDevMem(W.getBoundary(s).virtualWake.devI3Ptr, 17);
158 ReleaseDevMem(W.getBoundary(s).virtualWake.devI3fPtr, 17);
159
160 ReleaseDevMem(W.getBoundary(s).afl.devRPtr, 18);
161 ReleaseDevMem(W.getBoundary(s).afl.devPsnPtr, 181);
162 ReleaseDevMem(W.getBoundary(s).afl.devRhsPtr, 19);
163 ReleaseDevMem(W.getBoundary(s).afl.devRhsLinPtr, 191);
164
165 ReleaseDevMem(W.getBoundary(s).afl.devFreeVortexSheetPtr, 20);
166 ReleaseDevMem(W.getBoundary(s).afl.devAttachedVortexSheetPtr, 21);
167 ReleaseDevMem(W.getBoundary(s).afl.devAttachedSourceSheetPtr, 22);
168
169 ReleaseDevMem(W.getBoundary(s).afl.devFreeVortexSheetLinPtr, 20);
170 ReleaseDevMem(W.getBoundary(s).afl.devAttachedVortexSheetLinPtr, 21);
171 ReleaseDevMem(W.getBoundary(s).afl.devAttachedSourceSheetLinPtr, 22);
172
173 ReleaseDevMem(W.getBoundary(s).afl.devMeanEpsOverPanelPtr, 23);
174 ReleaseDevMem(W.getBoundary(s).afl.devViscousStressesPtr, 24);
175 }
176
177 if (n_CUDA_afls)
178 {
179 ReleaseDevMem(dev_ptr_nPanels, 25);
180 ReleaseDevMem(dev_ptr_nVortices, 26);
181
182 ReleaseDevMem(dev_ptr_ptr_vtx, 27);
183 ReleaseDevMem(dev_ptr_ptr_vel, 28);
184 ReleaseDevMem(dev_ptr_ptr_rad, 29);
185 ReleaseDevMem(dev_ptr_ptr_i0, 30);
186 ReleaseDevMem(dev_ptr_ptr_i0f, 30);
187 ReleaseDevMem(dev_ptr_ptr_i1, 31);
188 ReleaseDevMem(dev_ptr_ptr_i2, 32);
189 ReleaseDevMem(dev_ptr_ptr_i3, 33);
190 ReleaseDevMem(dev_ptr_ptr_i3f, 33);
191
192 ReleaseDevMem(dev_ptr_ptr_r, 34);
193 ReleaseDevMem(dev_ptr_ptr_rhs, 35);
194
195 ReleaseDevMem(dev_ptr_ptr_freeVortexSheet, 36);
196 ReleaseDevMem(dev_ptr_ptr_attachedVortexSheet, 37);
197 ReleaseDevMem(dev_ptr_ptr_attachedSourceSheet, 38);
198
199 ReleaseDevMem(dev_ptr_ptr_meanEpsOverPanel, 39);
200
201 ReleaseDevMem(dev_ptr_ptr_viscousStresses, 40);
202 }
203
204 if (W.getMeasureVP().getWakeVP().vtx.size())
205 {
206 ReleaseDevMem(W.getMeasureVP().getWakeVP().devVtxPtr, 41);
207 ReleaseDevMem(W.getMeasureVP().getWakeVP().devVelPtr, 42);
208 ReleaseDevMem(W.getMeasureVP().getWakeVP().devRadPtr, 43);
209 ReleaseDevMem(W.getMeasureVP().devPressurePtr, 43);
210
211 }
212
213 ReleaseDevMem(dev_blocks, 44);
214#endif
215}
const Airfoil & afl
Definition Boundary2D.h:77
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
Definition Boundary2D.h:86
const WakeDataBase & getWakeVP() const
Возврат wakeVP.
std::vector< Vortex2D > vtx
Список вихревых элементов
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
Definition World2D.h:180
const Wake & getWake() const
Возврат константной ссылки на вихревой след
Definition World2D.h:232
const WakeDataBase & getSource() const
Возврат константной ссылки на источники в области течения
Definition World2D.h:248
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
Definition World2D.h:186
const MeasureVP & getMeasureVP() const
Возврат константной ссылки на measureVP.
Definition World2D.h:208
Here is the call graph for this function:

Member Function Documentation

◆ setAccelCoeff()

void VM2D::Gpu::setAccelCoeff ( double  cft_)
inline

Установка коэффициента разгона потока

Parameters
[in]cft_множитель, соответствующий степени разгона потока

Definition at line 281 of file Gpu2D.h.

282 {
283#if defined(__CUDACC__) || defined(USE_CUDA)
284 cuSetAccelCoeff(cft_);
285#endif
286 }
Here is the caller graph for this function:

◆ setCollapseCoeff()

void VM2D::Gpu::setCollapseCoeff ( double  pos_,
double  refLength_ 
)
inline

Установка правой границы самого правого профиля (для организации увеличения радиуса коллапса)

Parameters
[in]pos_абсцисса правой границы самого правого профиля
[in]refLength_характерная длина, на которой происходит увеличение радиуса коллапса

Definition at line 293 of file Gpu2D.h.

294 {
295#if defined(__CUDACC__) || defined(USE_CUDA)
296 cuSetCollapseCoeff(pos_, refLength_);
297#endif
298 }
Here is the caller graph for this function:

◆ setMaxGamma()

void VM2D::Gpu::setMaxGamma ( double  gam_)
inline

Установка максимально допустимой циркуляции вихря

Parameters
[in]gam_максимально допустимая циркуляция вихря

Definition at line 304 of file Gpu2D.h.

305 {
306#if defined(__CUDACC__) || defined(USE_CUDA)
307 cuSetMaxGamma(gam_);
308#endif
309 }
Here is the caller graph for this function:

◆ setSchemeSwitcher()

void VM2D::Gpu::setSchemeSwitcher ( int  schemeSwitcher_)
inline

Установка переключателя расчетных схем

Parameters
[in]schemeSwitcher_тип схемы
  • schemeSwitcher = 0 – схема типа МДВ
  • schemeSwitcher = 1 – кусочно-постоянная схема
  • schemeSwitcher = 2 – кусочно-линейная схема

Definition at line 318 of file Gpu2D.h.

319 {
320#if defined(__CUDACC__) || defined(USE_CUDA)
321 cuSetSchemeSwitcher(schemeSwitcher_, 1);
322#endif
323 }
Here is the caller graph for this function:

Member Data Documentation

◆ W

const World2D& VM2D::Gpu::W
private

Константная ссылка на решаемую задачу

Definition at line 74 of file Gpu2D.h.


The documentation for this class was generated from the following files: