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 68 of file Gpu2D.h.

Constructor & Destructor Documentation

◆ Gpu()

Gpu::Gpu ( const World2D W_)

Конструктор

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

Definition at line 56 of file Gpu2D.cpp.

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

◆ ~Gpu()

Gpu::~Gpu ( )

Definition at line 120 of file Gpu2D.cpp.

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

273 {
274#if defined(__CUDACC__) || defined(USE_CUDA)
275 cuSetAccelCoeff(cft_);
276#endif
277 }
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 284 of file Gpu2D.h.

285 {
286#if defined(__CUDACC__) || defined(USE_CUDA)
287 cuSetCollapseCoeff(pos_, refLength_);
288#endif
289 }
Here is the caller graph for this function:

◆ setMaxGamma()

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

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

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

Definition at line 295 of file Gpu2D.h.

296 {
297#if defined(__CUDACC__) || defined(USE_CUDA)
298 cuSetMaxGamma(gam_);
299#endif
300 }
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 309 of file Gpu2D.h.

310 {
311#if defined(__CUDACC__) || defined(USE_CUDA)
312 cuSetSchemeSwitcher(schemeSwitcher_, 1);
313#endif
314 }
Here is the caller graph for this function:

Member Data Documentation

◆ W

const World2D& VM2D::Gpu::W
private

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

Definition at line 72 of file Gpu2D.h.


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