56 void BarnesHut::BuildOneTree(std::unique_ptr<MortonTree>& tree,
int maxTreeLevel, std::vector<PointsCopy>& pointsCopy,
double& time)
58 tree = std::make_unique<MortonTree>(
prm, maxTreeLevel, pointsCopy);
60 double t1 = omp_get_wtime();
61 tree->MakeRootMortonTree();
62 tree->BuildMortonInternalTree();
63 tree->BuildMortonParticlesTree();
67 tree->FillMortonLowCells();
69 double t2 = omp_get_wtime();
108 double tTreeParamsStart = omp_get_wtime();
113 omp_set_max_active_levels(3);
114 std::cout <<
"OMP_LEVEL = 2" << std::endl;
123 treeVrt->CalculateMortonTreeParams(0, 0);
125 double tTreeParamsFinish = omp_get_wtime();
126 timeParams += tTreeParamsFinish - tTreeParamsStart;
128 double tInflStart = omp_get_wtime();
130#pragma omp parallel for schedule(dynamic, 10)
131 for (
int i = 0; i < (int)treeContr->mortonLowCells.size(); ++i)
133 auto& lci = treeContr->mortonLowCells[i];
134 auto& lowCell = treeContr->mortonTree[lci];
136 for (
auto& e : lowCell.E)
139 treeContr->CalcLocalCoeffToLowLevel(lci,
treeVrt, 0,
true);
140 treeContr->CalcVeloBiotSavart(lci,
treeVrt);
141 treeContr->CalcVeloTaylorExpansion(lci);
146 const size_t knb = 3;
147 std::vector<std::vector<std::pair<double, size_t>>> initdist(pointsCopy.size());
148 for (
auto& d : initdist)
149 d.resize(2 * knb, { -1.0, -1 });
150 double timeKnn = -omp_get_wtime();
153#pragma omp parallel for
154 for (
int j = 0; j < pointsCopy.size(); ++j)
156 double sd2 = (initdist[j][0].first + initdist[j][1].first + initdist[j][2].first) / 3.0;
157 pointsCopy[j].epsast = (sd2 > 0) ? sqrt(sd2) : 1000.0;
159 timeKnn += omp_get_wtime();
161 double tInflStop = omp_get_wtime();
162 timeInfl += tInflStop - tInflStart;
164 int n = (int)pointsCopy.size();
166#pragma omp parallel for
167 for (
int i = 0; i < n; ++i)
168 result[i] =
IDPI * pointsCopy[i].veloCopy;
172#pragma omp parallel for
173 for (
int i = 0; i < n; ++i)
174 epsast[i] = pointsCopy[i].epsast;