59#if defined(__CUDACC__) || defined(USE_CUDA)
81 cuReserveDevMem((
void*&)dev_blocks,
sizeof(
int), 0);
82 cuCopyFixedArray(dev_blocks, &blocks,
sizeof(
int), 0);
84 cuSetConstants(
sizeof(
Vortex2D)/
sizeof(
double), Vortex2D::offsPos /
sizeof(
double), Vortex2D::offsGam /
sizeof(
double) );
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);
133 ReleaseDevMem(
W.
getWake().devMeshPtr, 8);
134 ReleaseDevMem(
W.
getWake().devNeiPtr, 9);
135 ReleaseDevMem(
W.
getWake().devNearestPanelPtr, 9);
141 for (
size_t s = 0; s < 1; ++s)
172 ReleaseDevMem(dev_ptr_nPanels, 25);
173 ReleaseDevMem(dev_ptr_nVortices, 26);
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);
185 ReleaseDevMem(dev_ptr_ptr_r, 34);
186 ReleaseDevMem(dev_ptr_ptr_rhs, 35);
188 ReleaseDevMem(dev_ptr_ptr_freeVortexSheet, 36);
189 ReleaseDevMem(dev_ptr_ptr_attachedVortexSheet, 37);
190 ReleaseDevMem(dev_ptr_ptr_attachedSourceSheet, 38);
192 ReleaseDevMem(dev_ptr_ptr_meanEpsOverPanel, 39);
194 ReleaseDevMem(dev_ptr_ptr_viscousStresses, 40);
204 ReleaseDevMem(dev_blocks, 44);
208#if defined(__CUDACC__) || defined(USE_CUDA)
212void Gpu::RefreshWake(
int code)
219 size_t curLength = n_CUDA_wake;
224 ReleaseDevMem(
W.
getWake().devVtxPtr, 44);
225 ReleaseDevMem(
W.
getWake().devVelPtr, 45);
226 ReleaseDevMem(
W.
getWake().devRadPtr, 46);
227 ReleaseDevMem(
W.
getWake().devI0Ptr, 47);
228 ReleaseDevMem(
W.
getWake().devI0fPtr, 47);
229 ReleaseDevMem(
W.
getWake().devI1Ptr, 48);
230 ReleaseDevMem(
W.
getWake().devI2Ptr, 49);
231 ReleaseDevMem(
W.
getWake().devI3Ptr, 50);
232 ReleaseDevMem(
W.
getWake().devI3fPtr, 50);
234 ReleaseDevMem(
W.
getWake().devMeshPtr, 51);
235 ReleaseDevMem(
W.
getWake().devNeiPtr, 52);
236 ReleaseDevMem(
W.
getWake().devNearestPanelPtr, 52);
239 size_t sz = curLength;
244 W.
getWake().devVtxPtr = ReserveDevMem<double,
sizeof(
Vortex2D) /
sizeof(
double)>(sz, n_CUDA_wake);
246 W.
getWake().devVelPtr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
247 W.
getWake().devRadPtr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
249 W.
getWake().devI0Ptr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
250 W.
getWake().devI0fPtr = ReserveDevMem<float, 1>(sz, n_CUDA_wake);
251 W.
getWake().devI1Ptr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
252 W.
getWake().devI2Ptr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
253 W.
getWake().devI3Ptr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
254 W.
getWake().devI3fPtr = ReserveDevMem<float, 2>(sz, n_CUDA_wake);
256 W.
getWake().devMeshPtr = ReserveDevMem<int, 2>(sz, n_CUDA_wake);
257 W.
getWake().devNeiPtr = ReserveDevMem<int, 1>(sz, n_CUDA_wake);
258 W.
getWake().devNearestPanelPtr = ReserveDevMem<int, 1>(sz, n_CUDA_wake);
262 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << n_CUDA_wake <<
" vortices" << std::endl;
281 size_t curLength = n_CUDA_source;
287 size_t sz = curLength;
292 W.
getSource().devVtxPtr = ReserveDevMem<double,
sizeof(
Vortex2D) /
sizeof(
double)>(sz, n_CUDA_source);
295 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << sz <<
" sources" << std::endl;
312void Gpu::RefreshVP(
int code)
319 size_t curLength = n_CUDA_velVP;
329 size_t sz = curLength;
338 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << n_CUDA_velVP <<
" points_VP" << std::endl;
349void Gpu::AllocateSolution(
double*& dev_sol,
size_t n)
352 dev_sol = ReserveDevMem<double, 1>(n, new_n);
355void Gpu::SetSolution(
double* sol,
double* dev_sol,
size_t n)
357 CopyMemToDev<double,1>(n, sol, dev_sol);
361void Gpu::ReleaseSolution(
double* dev_sol)
363 ReleaseDevMem(dev_sol, 100);
367void Gpu::RefreshAfls(
int code)
376 for (
size_t s = 0; s < 1; ++s)
397 ReleaseDevMem(dev_ptr_nPanels, 64);
398 ReleaseDevMem(dev_ptr_ptr_r, 65);
399 ReleaseDevMem(dev_ptr_ptr_rhs, 66);
401 ReleaseDevMem(dev_ptr_ptr_freeVortexSheet, 67);
402 ReleaseDevMem(dev_ptr_ptr_attachedVortexSheet, 68);
403 ReleaseDevMem(dev_ptr_ptr_attachedSourceSheet, 69);
405 ReleaseDevMem(dev_ptr_nVortices, 70);
406 ReleaseDevMem(dev_ptr_ptr_vtx, 71);
407 ReleaseDevMem(dev_ptr_ptr_rad, 72);
408 ReleaseDevMem(dev_ptr_ptr_vel, 73);
409 ReleaseDevMem(dev_ptr_ptr_i0, 74);
410 ReleaseDevMem(dev_ptr_ptr_i0f, 74);
411 ReleaseDevMem(dev_ptr_ptr_i1, 75);
412 ReleaseDevMem(dev_ptr_ptr_i2, 76);
413 ReleaseDevMem(dev_ptr_ptr_i3, 77);
414 ReleaseDevMem(dev_ptr_ptr_i3f, 77);
418 std::vector<size_t> host_nPanels(0);
420 size_t totnPanels = 0;
425 host_nPanels.push_back(nps);
432 W.
getBoundary(0).
afl.devRPtr = ReserveDevMem<double, 4>(totnPanels, n_CUDA_pnls);
433 W.
getBoundary(0).
afl.devPsnPtr = ReserveDevMem<double, 6>(totnPanels, n_CUDA_pnls);
434 W.
getBoundary(0).
afl.devRhsPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
435 W.
getBoundary(0).
afl.devRhsLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
436 W.
getBoundary(0).
afl.devMeanEpsOverPanelPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
438 W.
getBoundary(0).
afl.devFreeVortexSheetPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
439 W.
getBoundary(0).
afl.devAttachedVortexSheetPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
440 W.
getBoundary(0).
afl.devAttachedSourceSheetPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
444 W.
getBoundary(0).
afl.devFreeVortexSheetLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
445 W.
getBoundary(0).
afl.devAttachedVortexSheetLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
446 W.
getBoundary(0).
afl.devAttachedSourceSheetLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
455 W.
getBoundary(0).
afl.devViscousStressesPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
493 std::vector<double*> host_ptr_r;
494 std::vector<double*> host_ptr_psn;
495 std::vector<double*> host_ptr_rhs;
496 std::vector<double*> host_ptr_rhsLin;
498 std::vector<double*> host_ptr_freeVortexSheet;
499 std::vector<double*> host_ptr_attachedVortexSheet;
500 std::vector<double*> host_ptr_attachedSourceSheet;
502 std::vector<double*> host_ptr_freeVortexSheetLin;
503 std::vector<double*> host_ptr_attachedVortexSheetLin;
504 std::vector<double*> host_ptr_attachedSourceSheetLin;
506 std::vector<double*> host_ptr_meanEpsOverPanel;
508 std::vector<double*> host_ptr_viscousStresses;
517 host_ptr_freeVortexSheet.push_back(
W.
getBoundary(q).
afl.devFreeVortexSheetPtr);
518 host_ptr_attachedVortexSheet.push_back(
W.
getBoundary(q).
afl.devAttachedVortexSheetPtr);
519 host_ptr_attachedSourceSheet.push_back(
W.
getBoundary(q).
afl.devAttachedSourceSheetPtr);
521 host_ptr_freeVortexSheetLin.push_back(
W.
getBoundary(q).
afl.devFreeVortexSheetLinPtr);
522 host_ptr_attachedVortexSheetLin.push_back(
W.
getBoundary(q).
afl.devAttachedVortexSheetLinPtr);
523 host_ptr_attachedSourceSheetLin.push_back(
W.
getBoundary(q).
afl.devAttachedSourceSheetLinPtr);
525 host_ptr_meanEpsOverPanel.push_back(
W.
getBoundary(q).
afl.devMeanEpsOverPanelPtr);
527 host_ptr_viscousStresses.push_back(
W.
getBoundary(q).
afl.devViscousStressesPtr);
533 dev_ptr_ptr_freeVortexSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_freeVortexSheet.data());
534 dev_ptr_ptr_attachedVortexSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_attachedVortexSheet.data());
535 dev_ptr_ptr_attachedSourceSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_attachedSourceSheet.data());
537 dev_ptr_ptr_viscousStresses = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_viscousStresses.data());
539 dev_ptr_ptr_meanEpsOverPanel = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_meanEpsOverPanel.data());
565 std::vector<double> rbegend(4 * np);
566 std::vector<double> pseudonorm(6 * np);
567 for (
size_t q = 0; q < np; ++q)
586 std::vector<double> host_freeVortexSheet(np);
587 std::vector<double> host_attachedVortexSheet(np);
588 std::vector<double> host_attachedSourceSheet(np);
590 std::vector<double> host_freeVortexSheetLin(np);
591 std::vector<double> host_attachedVortexSheetLin(np);
592 std::vector<double> host_attachedSourceSheetLin(np);
598 for (
size_t p = 0; p < np; ++p)
612 cuCopyFixedArray(
W.
getBoundary(s).
afl.devFreeVortexSheetPtr, host_freeVortexSheet.data(),
sizeof(
double) * host_freeVortexSheet.size(), 102);
613 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedVortexSheetPtr, host_attachedVortexSheet.data(),
sizeof(
double)* host_attachedVortexSheet.size(), 103);
614 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedSourceSheetPtr, host_attachedSourceSheet.data(),
sizeof(
double)* host_attachedSourceSheet.size(), 104);
618 cuCopyFixedArray(
W.
getBoundary(s).
afl.devFreeVortexSheetLinPtr, host_freeVortexSheetLin.data(),
sizeof(
double) * host_freeVortexSheetLin.size(), 105);
619 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedVortexSheetLinPtr, host_attachedVortexSheetLin.data(),
sizeof(
double) * host_attachedVortexSheetLin.size(), 106);
620 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedSourceSheetLinPtr, host_attachedSourceSheetLin.data(),
sizeof(
double) * host_attachedSourceSheetLin.size(), 107);
629void Gpu::RefreshVirtualWakes(
int code)
631 if (n_CUDA_virtWake.size() == 0)
634 n_CUDA_totalVirtWake = 0;
637 size_t totnVirt = 0, totnPan = 0;
647 if (szVtx > n_CUDA_totalVirtWake)
649 if (n_CUDA_totalVirtWake > 0)
650 for (
size_t s = 0; s < 1; ++s)
694 std::vector<size_t> host_nVortices(0);
700 cuCopyFixedArray(dev_ptr_nVortices, host_nVortices.data(),
W.
getNumberOfBoundary()*
sizeof(
size_t), 108);
705 std::vector<double*> host_ptr_vtx;
706 std::vector<double*> host_ptr_vel;
707 std::vector<double*> host_ptr_rad;
708 std::vector<double*> host_ptr_i0;
709 std::vector<float*> host_ptr_i0f;
710 std::vector<double*> host_ptr_i1;
711 std::vector<double*> host_ptr_i2;
712 std::vector<double*> host_ptr_i3;
713 std::vector<float*> host_ptr_i3f;
729 cuCopyFixedArray(dev_ptr_ptr_vtx, host_ptr_vtx.data(), nBytes, 109);
730 cuCopyFixedArray(dev_ptr_ptr_rad, host_ptr_rad.data(), nBytes, 110);
731 cuCopyFixedArray(dev_ptr_ptr_vel, host_ptr_vel.data(), nBytes, 111);
732 cuCopyFixedArray(dev_ptr_ptr_i0, host_ptr_i0.data(), nBytes, 112);
733 cuCopyFixedArray(dev_ptr_ptr_i0f, host_ptr_i0f.data(), nBytes, 112);
734 cuCopyFixedArray(dev_ptr_ptr_i1, host_ptr_i1.data(), nBytes, 113);
735 cuCopyFixedArray(dev_ptr_ptr_i2, host_ptr_i2.data(), nBytes, 114);
736 cuCopyFixedArray(dev_ptr_ptr_i3, host_ptr_i3.data(), nBytes, 115);
737 cuCopyFixedArray(dev_ptr_ptr_i3f, host_ptr_i3f.data(), nBytes, 115);
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса Gpu.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
std::vector< std::pair< Point2D, Point2D > > psn
Псевдонормали к панелям профиля
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
std::vector< Point2D > nrm
Нормали к панелям профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Sheet sheets
Слои на профиле
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
const World2D & W
Константная ссылка на решаемую задачу
Gpu(const World2D &W_)
Конструктор
const WakeDataBase & getWakeVP() const
Возврат wakeVP.
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
Класс, опеделяющий слои на поверхности обтекаемого профиля
const double & attachedVortexSheet(size_t n, size_t moment) const
const double & attachedSourceSheet(size_t n, size_t moment) const
const double & freeVortexSheet(size_t n, size_t moment) const
std::vector< Vortex2D > vtx
Список вихревых элементов
Класс, опеделяющий текущую решаемую задачу
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
const Wake & getWake() const
Возврат константной ссылки на вихревой след
const WakeDataBase & getSource() const
Возврат константной ссылки на источники в области течения
const Passport & getPassport() const
Возврат константной ссылки на паспорт
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
const MeasureVP & getMeasureVP() const
Возврат константной ссылки на measureVP.
Класс, опеделяющий двумерный вихревой элемент
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
std::pair< std::string, int > boundaryCondition
Метод аппроксимации граничных условий
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля