837{
839
841 {
842 double timePreKnn = -omp_get_wtime();
843
844
845 std::vector<double> rightBorder, horizSpan;
848
850 {
851
854 }
855
857 {
860 }
861 else
862 {
865 }
866#if defined(__CUDACC__) || defined(USE_CUDA)
868#endif
869
870 timePreKnn += omp_get_wtime();
871
872
873
874
876
877
878 bool useFastCollapseAlgorithm = false;
879#if defined(__CUDACC__) || defined(USE_CUDA)
881 useFastCollapseAlgorithm = true;
882#endif
883
884 if (!useFastCollapseAlgorithm)
885 {
886
887
889
890
891
892
893 }
894 else
895 {
896
897 for (int collapsStep = 0; collapsStep < 1; ++collapsStep)
898 {
899
900
901 double timeResize = -omp_get_wtime();
903 timeResize += omp_get_wtime();
904
905
906
911
912#ifndef USE_CUDA
913
914 std::vector<std::vector<std::pair<double, size_t>>> initdist(
vtx.size());
915 for (auto& d : initdist)
916 d.resize(2 * knbForRestruct, { -1.0, -1 });
917 double timeKnn = -omp_get_wtime();
919 timeKnn += omp_get_wtime();
920
921#else
922 double timeAlloc = -omp_get_wtime();
923 std::vector<std::pair<double, size_t>> initdistcuda(knbForRestruct *
vtx.size());
924 timeAlloc += omp_get_wtime();
925
926
927 double timeKnn = -omp_get_wtime();
929
932
934 knnTree.MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
936 knnTree.Build();
937
939
940 cudaMemcpy(&minr, knnTree.minrD,
sizeof(
Point2D), cudaMemcpyDeviceToHost);
941 cudaMemcpy(&maxr, knnTree.maxrD,
sizeof(
Point2D), cudaMemcpyDeviceToHost);
942
943
944 kNNcuda<knbForRestruct>(minr, maxr,
W.
getCuda().blocks,
vtx, initdistcuda, vecForKnn, cSP, cRBP, maxG, epsCol, collapsStep);
946 timeKnn += omp_get_wtime();
947
948#endif
949
950 double timeCopy = -omp_get_wtime();
951#pragma omp parallel for
952 for (
int i = 0; i <
vtx.size(); ++i)
953 {
954#ifndef USE_CUDA
955 for (int j = 0; j < knbForRestruct; ++j)
956 neighbNew[i * knbForRestruct + j] = (
int)initdist[i][j].second;
957#else
958 for (int j = 0; j < knbForRestruct; ++j)
959 neighbNew[i * knbForRestruct + j] = (
int)initdistcuda[i * knbForRestruct + j].second;
960#endif
961 }
962 timeCopy += omp_get_wtime();
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982 double timeReserve = -omp_get_wtime();
983 std::vector<Vortex2D> ri, rj;
984 std::vector<Point2D> rnew;
985 std::vector<std::pair<int, int>> rindex;
986 ri.reserve(
vtx.size());
987 rj.reserve(
vtx.size());
988 rnew.reserve(
vtx.size());
989
990 rindex.reserve(
vtx.size());
991 timeReserve += omp_get_wtime();
992
993
994
995#ifdef USE_CUDA
996
998
999
1000 std::vector<std::pair<Point2D, Point2D>> segments(2 * ri.size());
1001 for (size_t i = 0; i < ri.size(); ++i)
1002 {
1003 segments[2 * i + 0].first = ri[i];
1004 segments[2 * i + 0].second = rnew[i];
1005
1006 segments[2 * i + 1].first = rj[i];
1007 segments[2 * i + 1].second = rnew[i];
1008 }
1009
1010
1011 std::vector<int> hit(segments.size());
1012 if (ri.size() > 0)
1013 {
1014 double* devSegments_ptr;
1015
1016 cudaMalloc(&devSegments_ptr, segments.size() * sizeof(double) * 4);
1017 cudaMemcpy(devSegments_ptr, segments.data(), segments.size() * sizeof(double) * 4, cudaMemcpyHostToDevice);
1018
1020 auto& cntrTreeSeg = *
W.
getCuda().cntrTreeSegment;
1021 cntrTreeSeg.MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
1022 cntrTreeSeg.UpdatePanelGeometry((int)segments.size(), (double4*)devSegments_ptr);
1023 cntrTreeSeg.Build();
1024
1025 BHcu::treePanelsSegmentsIntersectionCalculationWrapper(*
W.
getNonConstCuda().auxTreePnl, cntrTreeSeg,
1027
1029
1030 cudaMemcpy(hit.data(),
W.
getWake().devNearestPanelPtr, segments.size() *
sizeof(
int), cudaMemcpyDeviceToHost);
1031 cudaFree(devSegments_ptr);
1032 }
1033
1034 for (size_t i = 0; i < ri.size(); ++i)
1035 {
1036 if (hit[2 * i + 0] == -1 && hit[2 * i + 1] == -1)
1037 {
1038 vtx[rindex[i].first].r() = rnew[i];
1039 vtx[rindex[i].first].g() +=
vtx[rindex[i].second].g();
1040 vtx[rindex[i].first].sigma() = std::max(
vtx[rindex[i].first].sigma(),
vtx[rindex[i].second].sigma());
1041
1042 vtx[rindex[i].second].g() = 0.0;
1043 }
1044 }
1045
1046#else
1047 double timeCollaps;
1048
1049 timeCollaps = -omp_get_wtime();
1051
1052 timeCollaps += omp_get_wtime();
1053
1054 size_t hitA, hitB;
1055 bool ifInside;
1056#pragma omp parallel for private (hitA, hitB, ifInside)
1057 for (int i = 0; i < (int)ri.size(); ++i)
1058 {
1059 ifInside = false;
1061 {
1064 if ((hitA != size_t(-1)) || (hitB != size_t(-1)))
1065 ifInside = true;
1066 }
1067 if (!ifInside)
1068 {
1069 vtx[rindex[i].first].r() = rnew[i];
1070 vtx[rindex[i].first].g() +=
vtx[rindex[i].second].g();
1071 vtx[rindex[i].first].sigma() = std::max(
vtx[rindex[i].first].sigma(),
vtx[rindex[i].second].sigma());
1072
1073 vtx[rindex[i].second].g() = 0.0;
1074
1075 }
1076 }
1077#endif
1078 }
1079 }
1080
1081 }
1082 double timeRemove = -omp_get_wtime();
1085 timeRemove += omp_get_wtime();
1086
1087
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103}
Point2D upRight
Правый верхний угол габаритного прямоугольника профиля
Point2D lowLeft
Левый нижний угол габаритного прямоугольника профиля
void setCollapseCoeff(double pos_, double refLength_)
Установка правой границы самого правого профиля (для организации увеличения радиуса коллапса)
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
int RemoveFar()
Зануление далеко улетевших вихрей
size_t RemoveZero()
Исключение нулевых и мелких вихрей
int Collaps(int type, int times)
Коллапс вихрей
int CollapsNewFast(int type, int times, std::vector< Vortex2D > &ri, std::vector< Vortex2D > &rj, std::vector< Point2D > &rnew, std::vector< std::pair< int, int > > &rindex)
const Wake & getWake() const
Возврат константной ссылки на вихревой след
VMlib::vmTimer timerInside
Gpu & getNonConstCuda() const
Возврат неконстантной ссылки на объект, связанный с видеокартой (GPU)
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Wake & getNonConstWake() const
Возврат неконстантной ссылки на вихревой след
void stop(const std::string &timerLabel)
Останов счетчика
void start(const std::string &timerLabel)
Запуск счетчика
void WakekNNnewForCollaps(const std::vector< Vortex2D > &vtx, const size_t k, std::vector< std::vector< std::pair< double, size_t > > > &initdist, double cSP, double cRBP, double maxG, double epsCol, int type)
std::pair< std::string, int > velocityComputation