60#if defined(__CUDACC__) || defined(USE_CUDA)
82 cuReserveDevMem((
void*&)dev_blocks,
sizeof(
int), 0);
83 cuCopyFixedArray(dev_blocks, &blocks,
sizeof(
int), 0);
85 cuSetConstants(
sizeof(
Vortex2D)/
sizeof(
double), Vortex2D::offsPos /
sizeof(
double), Vortex2D::offsGam /
sizeof(
double), Vortex2D::offsSgm /
sizeof(
double));
127#if defined(__CUDACC__) || defined(USE_CUDA)
128 inflTreePnlVortex->MemoryFreeForGMRES();
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);
140 ReleaseDevMem(
W.
getWake().devMeshPtr, 8);
141 ReleaseDevMem(
W.
getWake().devNeiPtr, 9);
142 ReleaseDevMem(
W.
getWake().devNearestPanelPtr, 9);
148 for (
size_t s = 0; s < 1; ++s)
179 ReleaseDevMem(dev_ptr_nPanels, 25);
180 ReleaseDevMem(dev_ptr_nVortices, 26);
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);
192 ReleaseDevMem(dev_ptr_ptr_r, 34);
193 ReleaseDevMem(dev_ptr_ptr_rhs, 35);
195 ReleaseDevMem(dev_ptr_ptr_freeVortexSheet, 36);
196 ReleaseDevMem(dev_ptr_ptr_attachedVortexSheet, 37);
197 ReleaseDevMem(dev_ptr_ptr_attachedSourceSheet, 38);
199 ReleaseDevMem(dev_ptr_ptr_meanEpsOverPanel, 39);
201 ReleaseDevMem(dev_ptr_ptr_viscousStresses, 40);
213 ReleaseDevMem(dev_blocks, 44);
217#if defined(__CUDACC__) || defined(USE_CUDA)
221void Gpu::RefreshWake(
int code)
228 size_t curLength = n_CUDA_wake;
233 ReleaseDevMem(
W.
getWake().devVtxPtr, 44);
234 ReleaseDevMem(
W.
getWake().devVelPtr, 45);
235 ReleaseDevMem(
W.
getWake().devRadPtr, 46);
236 ReleaseDevMem(
W.
getWake().devI0Ptr, 47);
237 ReleaseDevMem(
W.
getWake().devI0fPtr, 47);
238 ReleaseDevMem(
W.
getWake().devI1Ptr, 48);
239 ReleaseDevMem(
W.
getWake().devI2Ptr, 49);
240 ReleaseDevMem(
W.
getWake().devI3Ptr, 50);
241 ReleaseDevMem(
W.
getWake().devI3fPtr, 50);
243 ReleaseDevMem(
W.
getWake().devMeshPtr, 51);
244 ReleaseDevMem(
W.
getWake().devNeiPtr, 52);
245 ReleaseDevMem(
W.
getWake().devNearestPanelPtr, 52);
248 size_t sz = curLength;
253 W.
getWake().devVtxPtr = ReserveDevMem<double,
sizeof(
Vortex2D) /
sizeof(
double)>(sz, n_CUDA_wake);
255 W.
getWake().devVelPtr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
256 W.
getWake().devRadPtr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
258 W.
getWake().devI0Ptr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
259 W.
getWake().devI0fPtr = ReserveDevMem<float, 1>(sz, n_CUDA_wake);
260 W.
getWake().devI1Ptr = ReserveDevMem<double, 1>(sz, n_CUDA_wake);
261 W.
getWake().devI2Ptr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
262 W.
getWake().devI3Ptr = ReserveDevMem<double, 2>(sz, n_CUDA_wake);
263 W.
getWake().devI3fPtr = ReserveDevMem<float, 2>(sz, n_CUDA_wake);
265 W.
getWake().devMeshPtr = ReserveDevMem<int, 2>(sz, n_CUDA_wake);
266 W.
getWake().devNeiPtr = ReserveDevMem<int, 1>(sz, n_CUDA_wake);
267 W.
getWake().devNearestPanelPtr = ReserveDevMem<int, 1>(sz, n_CUDA_wake);
271 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << n_CUDA_wake <<
" vortices" << std::endl;
290 size_t curLength = n_CUDA_source;
296 size_t sz = curLength;
301 W.
getSource().devVtxPtr = ReserveDevMem<double,
sizeof(
Vortex2D) /
sizeof(
double)>(sz, n_CUDA_source);
304 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << sz <<
" sources" << std::endl;
321void Gpu::RefreshVP(
int code)
328 size_t curLength = n_CUDA_velVP;
340 size_t sz = curLength;
348 W.
getMeasureVP().devPressurePtr = ReserveDevMem<double, 1>(sz, n_CUDA_velVP);
350 W.
getInfo(
'i') <<
"CUDA memory resize: " << curLength <<
" -> " << n_CUDA_velVP <<
" points_VP" << std::endl;
361void Gpu::AllocateSolution(
double*& dev_sol,
size_t n)
364 dev_sol = ReserveDevMem<double, 1>(n, new_n);
367void Gpu::SetSolution(
double* sol,
double* dev_sol,
size_t n)
369 CopyMemToDev<double,1>(n, sol, dev_sol);
373void Gpu::ReleaseSolution(
double* dev_sol)
375 ReleaseDevMem(dev_sol, 100);
379void Gpu::RefreshAfls(
int code)
388 for (
size_t s = 0; s < 1; ++s)
409 ReleaseDevMem(dev_ptr_nPanels, 64);
410 ReleaseDevMem(dev_ptr_ptr_r, 65);
411 ReleaseDevMem(dev_ptr_ptr_rhs, 66);
413 ReleaseDevMem(dev_ptr_ptr_freeVortexSheet, 67);
414 ReleaseDevMem(dev_ptr_ptr_attachedVortexSheet, 68);
415 ReleaseDevMem(dev_ptr_ptr_attachedSourceSheet, 69);
417 ReleaseDevMem(dev_ptr_nVortices, 70);
418 ReleaseDevMem(dev_ptr_ptr_vtx, 71);
419 ReleaseDevMem(dev_ptr_ptr_rad, 72);
420 ReleaseDevMem(dev_ptr_ptr_vel, 73);
421 ReleaseDevMem(dev_ptr_ptr_i0, 74);
422 ReleaseDevMem(dev_ptr_ptr_i0f, 74);
423 ReleaseDevMem(dev_ptr_ptr_i1, 75);
424 ReleaseDevMem(dev_ptr_ptr_i2, 76);
425 ReleaseDevMem(dev_ptr_ptr_i3, 77);
426 ReleaseDevMem(dev_ptr_ptr_i3f, 77);
430 std::vector<size_t> host_nPanels(0);
432 size_t totnPanels = 0;
437 host_nPanels.push_back(nps);
444 W.
getBoundary(0).
afl.devRPtr = ReserveDevMem<double, 4>(totnPanels, n_CUDA_pnls);
445 W.
getBoundary(0).
afl.devPsnPtr = ReserveDevMem<double, 6>(totnPanels, n_CUDA_pnls);
446 W.
getBoundary(0).
afl.devRhsPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
447 W.
getBoundary(0).
afl.devRhsLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
448 W.
getBoundary(0).
afl.devMeanEpsOverPanelPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
450 W.
getBoundary(0).
afl.devFreeVortexSheetPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
451 W.
getBoundary(0).
afl.devAttachedVortexSheetPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
452 W.
getBoundary(0).
afl.devAttachedSourceSheetPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
456 W.
getBoundary(0).
afl.devFreeVortexSheetLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
457 W.
getBoundary(0).
afl.devAttachedVortexSheetLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
458 W.
getBoundary(0).
afl.devAttachedSourceSheetLinPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
467 W.
getBoundary(0).
afl.devViscousStressesPtr = ReserveDevMem<double, 1>(totnPanels, n_CUDA_pnls);
505 std::vector<double*> host_ptr_r;
506 std::vector<double*> host_ptr_psn;
507 std::vector<double*> host_ptr_rhs;
508 std::vector<double*> host_ptr_rhsLin;
510 std::vector<double*> host_ptr_freeVortexSheet;
511 std::vector<double*> host_ptr_attachedVortexSheet;
512 std::vector<double*> host_ptr_attachedSourceSheet;
514 std::vector<double*> host_ptr_freeVortexSheetLin;
515 std::vector<double*> host_ptr_attachedVortexSheetLin;
516 std::vector<double*> host_ptr_attachedSourceSheetLin;
518 std::vector<double*> host_ptr_meanEpsOverPanel;
520 std::vector<double*> host_ptr_viscousStresses;
529 host_ptr_freeVortexSheet.push_back(
W.
getBoundary(q).
afl.devFreeVortexSheetPtr);
530 host_ptr_attachedVortexSheet.push_back(
W.
getBoundary(q).
afl.devAttachedVortexSheetPtr);
531 host_ptr_attachedSourceSheet.push_back(
W.
getBoundary(q).
afl.devAttachedSourceSheetPtr);
533 host_ptr_freeVortexSheetLin.push_back(
W.
getBoundary(q).
afl.devFreeVortexSheetLinPtr);
534 host_ptr_attachedVortexSheetLin.push_back(
W.
getBoundary(q).
afl.devAttachedVortexSheetLinPtr);
535 host_ptr_attachedSourceSheetLin.push_back(
W.
getBoundary(q).
afl.devAttachedSourceSheetLinPtr);
537 host_ptr_meanEpsOverPanel.push_back(
W.
getBoundary(q).
afl.devMeanEpsOverPanelPtr);
539 host_ptr_viscousStresses.push_back(
W.
getBoundary(q).
afl.devViscousStressesPtr);
545 dev_ptr_ptr_freeVortexSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_freeVortexSheet.data());
546 dev_ptr_ptr_attachedVortexSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_attachedVortexSheet.data());
547 dev_ptr_ptr_attachedSourceSheet = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_attachedSourceSheet.data());
549 dev_ptr_ptr_viscousStresses = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_viscousStresses.data());
551 dev_ptr_ptr_meanEpsOverPanel = ReserveDevMemAndCopyFixedArray(
W.
getNumberOfBoundary(), host_ptr_meanEpsOverPanel.data());
577 std::vector<double> rbegend(4 * np);
578 std::vector<double> pseudonorm(6 * np);
579 for (
size_t q = 0; q < np; ++q)
598 std::vector<double> host_freeVortexSheet(np);
599 std::vector<double> host_attachedVortexSheet(np);
600 std::vector<double> host_attachedSourceSheet(np);
602 std::vector<double> host_freeVortexSheetLin(np);
603 std::vector<double> host_attachedVortexSheetLin(np);
604 std::vector<double> host_attachedSourceSheetLin(np);
610 for (
size_t p = 0; p < np; ++p)
624 cuCopyFixedArray(
W.
getBoundary(s).
afl.devFreeVortexSheetPtr, host_freeVortexSheet.data(),
sizeof(
double) * host_freeVortexSheet.size(), 102);
625 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedVortexSheetPtr, host_attachedVortexSheet.data(),
sizeof(
double)* host_attachedVortexSheet.size(), 103);
626 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedSourceSheetPtr, host_attachedSourceSheet.data(),
sizeof(
double)* host_attachedSourceSheet.size(), 104);
630 cuCopyFixedArray(
W.
getBoundary(s).
afl.devFreeVortexSheetLinPtr, host_freeVortexSheetLin.data(),
sizeof(
double) * host_freeVortexSheetLin.size(), 105);
631 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedVortexSheetLinPtr, host_attachedVortexSheetLin.data(),
sizeof(
double) * host_attachedVortexSheetLin.size(), 106);
632 cuCopyFixedArray(
W.
getBoundary(s).
afl.devAttachedSourceSheetLinPtr, host_attachedSourceSheetLin.data(),
sizeof(
double) * host_attachedSourceSheetLin.size(), 107);
641void Gpu::RefreshVirtualWakes(
int code)
643 if (n_CUDA_virtWake.size() == 0)
646 n_CUDA_totalVirtWake = 0;
649 size_t totnVirt = 0, totnPan = 0;
659 if (szVtx > n_CUDA_totalVirtWake)
661 if (n_CUDA_totalVirtWake > 0)
662 for (
size_t s = 0; s < 1; ++s)
706 std::vector<size_t> host_nVortices(0);
712 cuCopyFixedArray(dev_ptr_nVortices, host_nVortices.data(),
W.
getNumberOfBoundary()*
sizeof(
size_t), 108);
717 std::vector<double*> host_ptr_vtx;
718 std::vector<double*> host_ptr_vel;
719 std::vector<double*> host_ptr_rad;
720 std::vector<double*> host_ptr_i0;
721 std::vector<float*> host_ptr_i0f;
722 std::vector<double*> host_ptr_i1;
723 std::vector<double*> host_ptr_i2;
724 std::vector<double*> host_ptr_i3;
725 std::vector<float*> host_ptr_i3f;
741 cuCopyFixedArray(dev_ptr_ptr_vtx, host_ptr_vtx.data(), nBytes, 109);
742 cuCopyFixedArray(dev_ptr_ptr_rad, host_ptr_rad.data(), nBytes, 110);
743 cuCopyFixedArray(dev_ptr_ptr_vel, host_ptr_vel.data(), nBytes, 111);
744 cuCopyFixedArray(dev_ptr_ptr_i0, host_ptr_i0.data(), nBytes, 112);
745 cuCopyFixedArray(dev_ptr_ptr_i0f, host_ptr_i0f.data(), nBytes, 112);
746 cuCopyFixedArray(dev_ptr_ptr_i1, host_ptr_i1.data(), nBytes, 113);
747 cuCopyFixedArray(dev_ptr_ptr_i2, host_ptr_i2.data(), nBytes, 114);
748 cuCopyFixedArray(dev_ptr_ptr_i3, host_ptr_i3.data(), nBytes, 115);
749 cuCopyFixedArray(dev_ptr_ptr_i3f, host_ptr_i3f.data(), nBytes, 115);
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса 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
Минимальное число вихрей, рождаемых на каждой панели профииля