60 #if defined(__CUDACC__) || defined(USE_CUDA) 81 cuSetConstants(
sizeof(
Vortex2D)/
sizeof(
double), Vortex2D::offsPos /
sizeof(
double), Vortex2D::offsGam /
sizeof(
double) );
95 #if defined(__CUDACC__) || defined(USE_CUDA) 96 ReleaseDevMem(
W.
getWake().devVtxPtr, 1);
97 ReleaseDevMem(
W.
getWake().devVelPtr, 2);
98 ReleaseDevMem(
W.
getWake().devRadPtr, 3);
99 ReleaseDevMem(
W.
getWake().devI0Ptr, 4);
100 ReleaseDevMem(
W.
getWake().devI1Ptr, 5);
101 ReleaseDevMem(
W.
getWake().devI2Ptr, 6);
102 ReleaseDevMem(
W.
getWake().devI3Ptr, 7);
104 ReleaseDevMem(
W.
getWake().devMeshPtr, 8);
105 ReleaseDevMem(
W.
getWake().devNeiPtr, 9);
110 for (
size_t s = 0; s < 1; ++s)
134 ReleaseDevMem(dev_ptr_nPanels, 25);
135 ReleaseDevMem(dev_ptr_nVortices, 26);
137 ReleaseDevMem(dev_ptr_ptr_vtx, 27);
138 ReleaseDevMem(dev_ptr_ptr_vel, 28);
139 ReleaseDevMem(dev_ptr_ptr_rad, 29);
140 ReleaseDevMem(dev_ptr_ptr_i0, 30);
141 ReleaseDevMem(dev_ptr_ptr_i1, 31);
142 ReleaseDevMem(dev_ptr_ptr_i2, 32);
143 ReleaseDevMem(dev_ptr_ptr_i3, 33);
145 ReleaseDevMem(dev_ptr_ptr_r, 34);
146 ReleaseDevMem(dev_ptr_ptr_rhs, 35);
148 ReleaseDevMem(dev_ptr_ptr_freeVortexSheet, 36);
149 ReleaseDevMem(dev_ptr_ptr_attachedVortexSheet, 37);
150 ReleaseDevMem(dev_ptr_ptr_attachedSourceSheet, 38);
152 ReleaseDevMem(dev_ptr_ptr_meanEpsOverPanel, 39);
154 ReleaseDevMem(dev_ptr_ptr_viscousStresses, 40);
166 #if defined(__CUDACC__) || defined(USE_CUDA) 170 void Gpu::RefreshWake(
int code)
177 size_t curLength = n_CUDA_wake;
182 ReleaseDevMem(
W.
getWake().devVtxPtr, 44);
183 ReleaseDevMem(
W.
getWake().devVelPtr, 45);
184 ReleaseDevMem(
W.
getWake().devRadPtr, 46);
185 ReleaseDevMem(
W.
getWake().devI0Ptr, 47);
186 ReleaseDevMem(
W.
getWake().devI1Ptr, 48);
187 ReleaseDevMem(
W.
getWake().devI2Ptr, 49);
188 ReleaseDevMem(
W.
getWake().devI3Ptr, 50);
190 ReleaseDevMem(
W.
getWake().devMeshPtr, 51);
191 ReleaseDevMem(
W.
getWake().devNeiPtr, 52);
194 size_t sz = curLength;
199 W.
getWake().devVtxPtr = ReserveDevMem<double,
sizeof(
Vortex2D) /
sizeof(
double)>(sz, n_CUDA_wake);
201 W.
getWake().devVelPtr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
202 W.
getWake().devRadPtr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
204 W.
getWake().devI0Ptr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
205 W.
getWake().devI1Ptr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
206 W.
getWake().devI2Ptr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
207 W.
getWake().devI3Ptr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
209 W.
getWake().devMeshPtr = ReserveDevMem<int, 2>(sz, n_CUDA_wake);
210 W.
getWake().devNeiPtr = ReserveDevMem<int, 1>(sz, n_CUDA_wake);
214 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << n_CUDA_wake <<
" vortices" << std::endl;
233 size_t curLength = n_CUDA_source;
239 size_t sz = curLength;
244 W.
getSource().devVtxPtr = ReserveDevMem<double,
sizeof(
Vortex2D) /
sizeof(
double)>(sz, n_CUDA_source);
247 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << sz <<
" sources" << std::endl;
264 void Gpu::RefreshVP(
int code)
271 size_t curLength = n_CUDA_velVP;
281 size_t sz = curLength;
290 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << n_CUDA_velVP <<
" points_VP" << std::endl;
304 void Gpu::RefreshAfls(
int code)
316 for (
size_t s = 0; s < 1; ++s)
332 ReleaseDevMem(dev_ptr_nPanels, 64);
333 ReleaseDevMem(dev_ptr_ptr_r, 65);
334 ReleaseDevMem(dev_ptr_ptr_rhs, 66);
336 ReleaseDevMem(dev_ptr_ptr_freeVortexSheet, 67);
337 ReleaseDevMem(dev_ptr_ptr_attachedVortexSheet, 68);
338 ReleaseDevMem(dev_ptr_ptr_attachedSourceSheet, 69);
340 ReleaseDevMem(dev_ptr_nVortices, 70);
341 ReleaseDevMem(dev_ptr_ptr_vtx, 71);
342 ReleaseDevMem(dev_ptr_ptr_rad, 72);
343 ReleaseDevMem(dev_ptr_ptr_vel, 73);
344 ReleaseDevMem(dev_ptr_ptr_i0, 74);
345 ReleaseDevMem(dev_ptr_ptr_i1, 75);
346 ReleaseDevMem(dev_ptr_ptr_i2, 76);
347 ReleaseDevMem(dev_ptr_ptr_i3, 77);
351 std::vector<size_t> host_nPanels(0);
353 size_t totnPanels = 0, totnPanelsUP;
357 host_nPanels.push_back(nps);
364 W.
getBoundary(0).
afl.devRPtr = ReserveDevMem<double, 4>(totnPanels, totnPanelsUP);
365 W.
getBoundary(0).
afl.devRhsPtr = ReserveDevMem<double, 1>(totnPanels, totnPanelsUP);
366 W.
getBoundary(0).
afl.devRhsLinPtr = ReserveDevMem<double, 1>(totnPanels, totnPanelsUP);
367 W.
getBoundary(0).
afl.devMeanEpsOverPanelPtr = ReserveDevMem<double, 1>(totnPanels, totnPanelsUP);
369 W.
getBoundary(0).
afl.devFreeVortexSheetPtr = ReserveDevMem<double, 1>(totNVars, totnPanelsUP);
370 W.
getBoundary(0).
afl.devAttachedVortexSheetPtr = ReserveDevMem<double, 1>(totNVars, totnPanelsUP);
371 W.
getBoundary(0).
afl.devAttachedSourceSheetPtr = ReserveDevMem<double, 1>(totNVars, totnPanelsUP);
373 W.
getBoundary(0).
afl.devViscousStressesPtr = ReserveDevMem<double, 1>(totnPanels, totnPanelsUP);
396 std::vector<double*> host_ptr_r;
397 std::vector<double*> host_ptr_rhs;
398 std::vector<double*> host_ptr_rhsLin;
400 std::vector<double*> host_ptr_freeVortexSheet;
401 std::vector<double*> host_ptr_attachedVortexSheet;
402 std::vector<double*> host_ptr_attachedSourceSheet;
404 std::vector<double*> host_ptr_meanEpsOverPanel;
406 std::vector<double*> host_ptr_viscousStresses;
414 host_ptr_freeVortexSheet.push_back(
W.
getBoundary(q).
afl.devFreeVortexSheetPtr);
415 host_ptr_attachedVortexSheet.push_back(
W.
getBoundary(q).
afl.devAttachedVortexSheetPtr);
416 host_ptr_attachedSourceSheet.push_back(
W.
getBoundary(q).
afl.devAttachedSourceSheetPtr);
418 host_ptr_meanEpsOverPanel.push_back(
W.
getBoundary(q).
afl.devMeanEpsOverPanelPtr);
420 host_ptr_viscousStresses.push_back(
W.
getBoundary(q).
afl.devViscousStressesPtr);
426 dev_ptr_ptr_freeVortexSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_freeVortexSheet.data());
427 dev_ptr_ptr_attachedVortexSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_attachedVortexSheet.data());
428 dev_ptr_ptr_attachedSourceSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_attachedSourceSheet.data());
430 dev_ptr_ptr_viscousStresses = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_viscousStresses.data());
432 dev_ptr_ptr_meanEpsOverPanel = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_meanEpsOverPanel.data());
456 std::vector<double> rbegend(4 * np);
457 for (
size_t q = 0; q < np; ++q)
468 std::vector<double> host_freeVortexSheet(nv);
469 std::vector<double> host_attachedVortexSheet(nv);
470 std::vector<double> host_attachedSourceSheet(nv);
476 for (
size_t p = 0; p < np; ++p)
485 for (
size_t p = 0; p < np; ++p)
493 cuCopyFixedArray(
W.
getBoundary(s).
afl.devFreeVortexSheetPtr, host_freeVortexSheet.data(),
sizeof(double) * host_freeVortexSheet.size());
494 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedVortexSheetPtr, host_attachedVortexSheet.data(),
sizeof(double)* host_attachedVortexSheet.size());
495 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedSourceSheetPtr, host_attachedSourceSheet.data(),
sizeof(double)* host_attachedSourceSheet.size());
503 void Gpu::RefreshVirtualWakes(
int code)
505 if (n_CUDA_virtWake.size() == 0)
508 n_CUDA_totalVirtWake = 0;
511 size_t totnVirt = 0, totnPan = 0;
521 if (szVtx > n_CUDA_totalVirtWake)
523 if (n_CUDA_totalVirtWake > 0)
524 for (
size_t s = 0; s < 1; ++s)
541 std::cout <<
"szVtx = " << szVtx <<
", n_CUDA_totalVirtWake = " << n_CUDA_totalVirtWake << std::endl;
562 std::vector<size_t> host_nVortices(0);
568 cuCopyFixedArray(dev_ptr_nVortices, host_nVortices.data(),
W.
getNumberOfBoundary()*
sizeof(size_t));
573 std::vector<double*> host_ptr_vtx;
574 std::vector<double*> host_ptr_vel;
575 std::vector<double*> host_ptr_rad;
576 std::vector<double*> host_ptr_i0;
577 std::vector<double*> host_ptr_i1;
578 std::vector<double*> host_ptr_i2;
579 std::vector<double*> host_ptr_i3;
593 cuCopyFixedArray(dev_ptr_ptr_vtx, host_ptr_vtx.data(), nBytes);
594 cuCopyFixedArray(dev_ptr_ptr_rad, host_ptr_rad.data(), nBytes);
595 cuCopyFixedArray(dev_ptr_ptr_vel, host_ptr_vel.data(), nBytes);
596 cuCopyFixedArray(dev_ptr_ptr_i0, host_ptr_i0.data(), nBytes);
597 cuCopyFixedArray(dev_ptr_ptr_i1, host_ptr_i1.data(), nBytes);
598 cuCopyFixedArray(dev_ptr_ptr_i2, host_ptr_i2.data(), nBytes);
599 cuCopyFixedArray(dev_ptr_ptr_i3, host_ptr_i3.data(), nBytes);
const double & freeVortexSheet(size_t n, size_t moment) const
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
const double & attachedVortexSheet(size_t n, size_t moment) const
Заголовочный файл с описанием класса Wake.
std::pair< std::string, int > boundaryCondition
Метод аппроксимации граничных условий
Заголовочный файл с описанием класса World2D.
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
Заголовочный файл с описанием класса Airfoil.
const Wake & getWake() const
Возврат константной ссылки на вихревой след
Заголовочный файл с описанием класса Mechanics.
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
const WakeDataBase & getSource() const
Возврат константной ссылки на источники в области течения
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Класс, опеделяющий слои на поверхности обтекаемого профиля
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
const MeasureVP & getMeasureVP() const
Возврат константной ссылки на measureVP.
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
Класс, опеделяющий двумерный вектор
const World2D & W
Константная ссылка на решаемую задачу
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода ...
Sheet sheets
Слои на профиле
Заголовочный файл с описанием класса MeasureVP.
const double & attachedSourceSheet(size_t n, size_t moment) const
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Класс, опеделяющий двумерный вихревой элемент
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
Класс, опеделяющий текущую решаемую задачу
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
Заголовочный файл с описанием класса Velocity.
const WakeDataBase & getWakeVP() const
Возврат wakeVP.
Заголовочный файл с описанием класса Gpu.
Gpu(const World2D &W_)
Конструктор
Заголовочный файл с описанием класса Boundary.
size_t GetUnknownsSize() const
Возврат размерности вектора решения