VM2D  1.12
Vortex methods for 2D flows simulation
Boundary2DLinLayerAver.cpp
Go to the documentation of this file.
1 /*--------------------------------*- VM2D -*-----------------*---------------*\
2 | ## ## ## ## #### ##### | | Version 1.12 |
3 | ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2024/01/14 |
4 | ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5 | #### ## ## ## ## ## | Open Source Code |
6 | ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7 | |
8 | Copyright (C) 2017-2024 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9 *-----------------------------------------------------------------------------*
10 | File name: Boundary2DLinLayerAver.cpp |
11 | Info: Source code of VM2D |
12 | |
13 | This file is part of VM2D. |
14 | VM2D is free software: you can redistribute it and/or modify it |
15 | under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation, either version 3 of the License, or |
17 | (at your option) any later version. |
18 | |
19 | VM2D is distributed in the hope that it will be useful, but WITHOUT |
20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22 | for more details. |
23 | |
24 | You should have received a copy of the GNU General Public License |
25 | along with VM2D. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
42 #include "Boundary2DLinLayerAver.h"
43 
44 #include "Airfoil2D.h"
45 #include "MeasureVP2D.h"
46 #include "Mechanics2D.h"
47 #include "Passport2D.h"
48 #include "StreamParser.h"
49 #include "Velocity2D.h"
50 #include "Wake2D.h"
51 #include "World2D.h"
52 
53 using namespace VM2D;
54 
55 
56 //Пересчет решения на интенсивность вихревого слоя //Lin
58 {
59  Vortex2D virtVort;
60  Point2D midNorm;
61 
63 
65 
66  //Очистка и резервирование памяти
67  virtualWake.vecHalfGamma.clear();
68  virtualWake.vecHalfGamma.reserve(afl.getNumberOfPanels() * nVortPerPan);
69 
70  //Очистка и резервирование памяти
71  virtualWake.aflPan.clear();
72  virtualWake.aflPan.reserve(afl.getNumberOfPanels() * nVortPerPan);
73 
74  //Очистка и резервирование памяти
75  virtualWake.vtx.clear();
76  virtualWake.vtx.reserve(afl.getNumberOfPanels() * nVortPerPan);
77 
78  //Очистка и резервирование памяти
79  vortexBeginEnd.clear();
81 
83 
84  std::pair<int, int> pair;
85 
86  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
87  {
88  midNorm = afl.nrm[i] * delta;
89 
90  //число участков, на которые разбивается панель для сброса вихрей
91  //определяется через наибольшее значение решения на профиле, т.е. в крайней точке
92 
93 
94  pair.first = (int)virtualWake.vtx.size();
95 
96  double a = sol(i) - 0.5 * sol(afl.getNumberOfPanels() + i);
97  double b = sol(i) + 0.5 * sol(afl.getNumberOfPanels() + i);
98 
99  if (fabs(a - b) < 1e-10)
100  {
101  size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(sol(i)*afl.len[i]) / maxG), nVortPerPan);
102  Point2D dr = 1.0 / NEWnVortPerPan * (afl.getR(i + 1) - afl.getR(i));
103 
104  for (size_t j = 0; j < NEWnVortPerPan; ++j)
105  {
106  virtVort.r() = afl.getR(i) + dr * (j * 1.0 + 0.5) + midNorm;
107  virtVort.g() = sol(i) * afl.len[i] / NEWnVortPerPan;
108  virtualWake.vtx.push_back(virtVort);
109 
110  virtualWake.vecHalfGamma.push_back(0.5 * sol(i) * afl.tau[i]);
111  virtualWake.aflPan.push_back({ numberInPassport, i });
112  }
113  }
114  else if (a * b >= 0.0)
115  {
116  size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(0.5*(a+b)*afl.len[i]) / maxG), nVortPerPan);
117  std::vector<double> ds(NEWnVortPerPan+1, 0.0);
118 
119  for (size_t k = 1; k <= NEWnVortPerPan; ++k)
120  {
121  if ((a > 0) || (b > 0))
122  ds[k] = afl.len[i] / (a - b) * (a - sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
123  else
124  ds[k] = afl.len[i] / (a - b) * (a + sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
125  }
126 
127  for (size_t j = 0; j < NEWnVortPerPan; ++j)
128  {
129  virtVort.r() = afl.getR(i) + 0.5*(ds[j]+ds[j+1])*afl.tau[i] + midNorm;
130  virtVort.g() = 0.5 * (a+b) * afl.len[i] / NEWnVortPerPan;
131  virtualWake.vtx.push_back(virtVort);
132 
133  virtualWake.vecHalfGamma.push_back(0.5 * (a + 0.5*(ds[j] + ds[j + 1]) * (b-a)/ afl.len[i]) * afl.tau[i]);
134  virtualWake.aflPan.push_back({ numberInPassport, i });
135  }
136  }
137  else
138  {
139  double sast = -a * afl.len[i] / (b - a);
140 
141  //from 0 to sast
142  {
143  size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(0.5*(a + 0.0)*sast) / maxG), (int)std::ceil(nVortPerPan * sast / afl.len[i]));
144  std::vector<double> ds(NEWnVortPerPan + 1, 0.0);
145 
146  for (size_t k = 1; k <= NEWnVortPerPan; ++k)
147  {
148  if (a > 0)
149  ds[k] = sast / (a - 0.0) * (a - sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
150  else
151  ds[k] = sast / (a - 0.0) * (a + sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
152  }
153 
154  for (size_t j = 0; j < NEWnVortPerPan; ++j)
155  {
156  virtVort.r() = afl.getR(i) + 0.5*(ds[j] + ds[j + 1])*afl.tau[i] + midNorm;
157  virtVort.g() = 0.5 * (a + 0.0) * sast / NEWnVortPerPan;
158  virtualWake.vtx.push_back(virtVort);
159 
160  virtualWake.vecHalfGamma.push_back(0.5 * (a + 0.5*(ds[j] + ds[j + 1]) * (0.0 - a) / sast) * afl.tau[i]);
161  virtualWake.aflPan.push_back({ numberInPassport, i });
162  }
163  }
164 
165  double sastast = afl.len[i] - sast;
166 
167  //from sats to len
168  {
169  size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(0.5*(0.0 + b)*sastast) / maxG), (int)std::ceil(nVortPerPan * sastast / afl.len[i]));
170  std::vector<double> ds(NEWnVortPerPan + 1, 0.0);
171 
172  for (size_t k = 1; k <= NEWnVortPerPan; ++k)
173  {
174  if (b > 0)
175  ds[k] = sastast / (0.0 - b) * (0.0 - sqrt((b*b * k) / NEWnVortPerPan));
176  else
177  ds[k] = sastast / (0.0 - b) * (0.0 + sqrt((b*b * k) / NEWnVortPerPan));
178  }
179 
180  for (size_t j = 0; j < NEWnVortPerPan; ++j)
181  {
182  virtVort.r() = afl.getR(i) + sast * afl.tau[i] + 0.5*(ds[j] + ds[j + 1])*afl.tau[i] + midNorm;
183  virtVort.g() = 0.5 * (0.0 + b) * sastast / NEWnVortPerPan;
184  virtualWake.vtx.push_back(virtVort);
185 
186  virtualWake.vecHalfGamma.push_back(0.5 * (0.0 + 0.5*(ds[j] + ds[j + 1]) * (b - 0.0) / sastast) * afl.tau[i]);
187  virtualWake.aflPan.push_back({ numberInPassport, i });
188  }
189 
190  }
191  }
192 
193  pair.second = (int)virtualWake.vtx.size();
194  vortexBeginEnd.push_back(pair);
195  }
196 
197 
198  for (size_t j = 0; j < afl.getNumberOfPanels(); ++j)
199  {
200  sheets.freeVortexSheet(j, 0) = sol(j);
201  sheets.freeVortexSheet(j, 1) = sol(afl.getNumberOfPanels() + j);
202  }
203 
204 }//SolutionToFreeVortexSheetAndVirtualVortex(...)
205 
206 
207 
208 //Генерация блока матрицы //Lin
209 void BoundaryLinLayerAver::FillMatrixSelf(Eigen::MatrixXd& matr, Eigen::VectorXd& lastLine, Eigen::VectorXd& lastCol)
210 {
211  size_t np = afl.getNumberOfPanels();
212 
213  std::vector<double> res(4, 0.0);
214 
215  for (size_t i = 0; i < np; ++i)
216  {
217  lastCol(i) = 1.0;
218  lastLine(i) = afl.len[i];
219  lastCol(np + i) = 0.0;
220  lastLine(np + i) = 0.0;
221  }
222 
223  for (size_t i = 0; i < np; ++i)
224  for (size_t j = 0; j < np; ++j)
225  {
226  res = afl.getA(2, i, afl, j);
227  matr(i, j) = res[0];
228  matr(i, np + j) = res[1];
229  matr(np + i, j) = res[2];
230  matr(np + i, np + j) = res[3];
231  }
232 }//FillMatrixSelf(...)
233 
234 //Генерация блока матрицы //Lin
235 void BoundaryLinLayerAver::FillIQSelf(std::pair<Eigen::MatrixXd, Eigen::MatrixXd>& IQ)
236 {
237  afl.calcIQ(2, afl, IQ);
238 }//FillIQSelf(...)
239 
240 
241 //Генерация блока матрицы влияния от другого профиля того же типа // Lin
242 void BoundaryLinLayerAver::FillMatrixFromOther(const Boundary& otherBoundary, Eigen::MatrixXd& matr)
243 {
244  size_t np = afl.getNumberOfPanels();
245  size_t npOther = otherBoundary.afl.getNumberOfPanels();
246 
247  std::vector<double> res(4, 0.0);
248 
249  for (size_t i = 0; i < np; ++i)
250  for (size_t j = 0; j < npOther; ++j)
251  {
252  res = afl.getA(2, i, otherBoundary.afl, j);
253 
254  matr(i, j) = res[0];
255  matr(i, npOther + j) = res[1];
256  matr(np + i, j) = res[2];
257  matr(np + i, npOther + j) = res[3];
258  }
259 }//FillMatrixFromOther(...)
260 
261 void BoundaryLinLayerAver::FillIQFromOther(const Boundary& otherBoundary, std::pair<Eigen::MatrixXd, Eigen::MatrixXd>& IQ)
262 {
263  afl.calcIQ(2, otherBoundary.afl, IQ);
264 }//FillIQFromOther(...)
265 
266 
267 //Вычисление скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на профиле
268 void BoundaryLinLayerAver::CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase& pointsDb, std::vector<Point2D>& velo) const
269 {
270  std::vector<Point2D> selfVelo(pointsDb.vtx.size());
271 
272 #pragma warning (push)
273 #pragma warning (disable: 4101)
274  //Локальные переменные для цикла
275  Point2D velI;
276  Point2D tempVel;
277 #pragma warning (pop)
278 
279 #pragma omp parallel for default(none) shared(selfVelo, pointsDb, std::cout) private(velI, tempVel)
280  for (int i = 0; i < pointsDb.vtx.size(); ++i)
281  {
282  velI.toZero();
283 
284  const Point2D& posI = pointsDb.vtx[i].r();
285 
288  for (size_t j = 0; j < afl.getNumberOfPanels(); ++j)
289  {
290  Point2D dj = afl.getR(j + 1) - afl.getR(j);
291  Point2D tauj = dj.unit();
292 
293  Point2D s = posI - afl.getR(j);
294  Point2D p = posI - afl.getR(j + 1);
295 
296  double a = VMlib::Alpha(p, s);
297 
298  double lambda = VMlib::Lambda(p, s);
299 
300  Point2D u1 = 0.5 / dj.length() * VMlib::Omega(p + s, tauj, tauj) ;
301 
302  Point2D skos0 = -a * tauj.kcross() + lambda * tauj;
303  Point2D skos1 = -a * u1.kcross() + lambda * u1 - tauj;
304 
306  velI += sheets.freeVortexSheet(j, 0) * skos0.kcross() + sheets.freeVortexSheet(j, 1) * skos1.kcross();
307  velI += sheets.attachedVortexSheet(j, 0) * skos0.kcross() + sheets.attachedVortexSheet(j, 1) * skos1.kcross();
308  velI += sheets.attachedSourceSheet(j, 0) * skos0 + sheets.attachedSourceSheet(j, 1) * skos1;
309  }//for j
310 
311  velI *= IDPI;
312  selfVelo[i] = velI;
313  }//for i
314 
315  for (size_t i = 0; i < velo.size(); ++i)
316  velo[i] += selfVelo[i];
317 }//CalcConvVelocityToSetOfPointsFromSheets(...)
318 
319 #if defined(USE_CUDA)
320 void BoundaryLinLayerAver::GPUCalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase& pointsDb, std::vector<Point2D>& velo) const
321 {
322  const size_t npt = pointsDb.vtx.size();
323  double*& dev_ptr_pt = pointsDb.devVtxPtr;
324  const size_t npnl = afl.getNumberOfPanels(); //virtualWake.vtx.size();
325 
326  double*& dev_ptr_r = afl.devRPtr;
327  double*& dev_ptr_freeVortexSheet = afl.devFreeVortexSheetPtr;
328  double*& dev_ptr_attachedVortexSheet = afl.devAttachedVortexSheetPtr;
329  double*& dev_ptr_attachedSourceSheet = afl.devAttachedSourceSheetPtr;
330 
331  std::vector<Point2D>& Vel = velo;
332  std::vector<Point2D> newV(npt);
333  double*& dev_ptr_vel = pointsDb.devVelPtr;
335 
336  //Явная синхронизация слоев не нужна, т.к. она выполняется в Gpu::RefreshAfls()
337  if (npt > 0)
338  {
339  cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, dev_ptr_freeVortexSheet, dev_ptr_attachedVortexSheet, dev_ptr_attachedSourceSheet, dev_ptr_vel, eps2);
340 
341  W.getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (double*)newV.data());
342 
343  for (size_t q = 0; q < Vel.size(); ++q)
344  Vel[q] += newV[q];
345  }
346 
347  //tCUDAEND = omp_get_wtime();
348 
349  //W.getInfo('t') << "CONV_VIRT_GPU: " << (tCUDAEND - tCUDASTART) << std::endl;
350 }
351 //GPUCalcConvVelocityToSetOfPointsFromSheets(...)
352 #endif
353 
354 
355 void BoundaryLinLayerAver::CalcConvVelocityAtVirtualVortexes(std::vector<Point2D>& velo) const
356 {
357  std::vector<Point2D>& Vel = velo;
358 
359  //Скорости виртуальных вихрей
360 
361 #pragma omp parallel for default(none) shared(Vel)
362  for (int i = 0; i < (int)Vel.size(); ++i)
363  Vel[i] = afl.getV(virtualWake.aflPan[i].second) \
366 }//CalcConvVelocityAtVirtualVortexes(...)
367 
368 
369 //Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников
371 {
372  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
373  {
378  }
379 
380  const Airfoil* oldAfl = (W.getCurrentStep() == 0) ? &afl : &W.getOldAirfoil(numberInPassport);
381 
382  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
383  {
384  sheets.attachedVortexSheet(i, 0) = 0.5 * (afl.getV(i + 1) + afl.getV(i)) & afl.tau[i];
386 
387  sheets.attachedSourceSheet(i, 0) = 0.5 * (afl.getV(i + 1) + afl.getV(i)) & afl.nrm[i];
389 
390 
391  }
392 }//ComputeAttachedSheetsIntensity()
393 
394 
395 void BoundaryLinLayerAver::GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& wakeRhs) const
396 {
397  double& velI = wakeRhs[0];
398  double& velILin = wakeRhs[1];
399 
400  const Point2D& posI0 = afl.getR(panel);
401  const Point2D& posI1 = afl.getR(panel + 1);
402  Point2D di = posI1 - posI0;
403  const Point2D& taui = afl.tau[panel];
404 
405  for (size_t it = 0; it != count; ++it)
406  {
407  const Vortex2D& vt = ptr[it];
408  const Point2D& posJ = vt.r();
409  const double& gamJ = vt.g();
410 
411  Point2D s = posJ - posI0;
412  Point2D p = posJ - posI1;
413 
414  Point2D u1 = 0.5 / di.length() * VMlib::Omega(p + s, taui, taui);
415 
416  double alpha = VMlib::Alpha(p, s);
417  double lambda = VMlib::Lambda(p, s);
418 
419  velI -= gamJ * alpha;
420 
421  velILin -= gamJ * (alpha * (u1 & taui) + lambda * (u1 & (-taui.kcross())));
422  }
423 }//GetInfluenceFromVorticesToRectPanel(...)
424 
425 
426 //Вычисляет влияния части подряд идущих источников в области течения на прямолинейную панель для правой части
427 void BoundaryLinLayerAver::GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& wakeRhs) const
428 {
429  double& velI = wakeRhs[0];
430  double& velILin = wakeRhs[1];
431 
432  const Point2D& posI0 = afl.getR(panel);
433  const Point2D& posI1 = afl.getR(panel + 1);
434  Point2D di = posI1 - posI0;
435  const Point2D& taui = afl.tau[panel];
436 
437  for (size_t it = 0; it != count; ++it)
438  {
439  const Vortex2D& vt = ptr[it];
440  const Point2D& posJ = vt.r();
441  const double& gamJ = vt.g();
442 
443  Point2D s = posJ - posI0;
444  Point2D p = posJ - posI1;
445 
446  Point2D u1 = 0.5 / di.length() * VMlib::Omega(p + s, taui, taui);
447 
448  double alpha = VMlib::Alpha(p, s);
449  double lambda = VMlib::Lambda(p, s);
450 
451  velI -= gamJ * lambda;
452 
453  velILin -= gamJ * (alpha * (u1 & taui.kcross()) + lambda * (u1 & taui) - 1.0);
454  }
455 
456 }//GetInfluenceFromSourcesToRectPanel(...)
457 
458 //Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения
460 {
461  vel.toZero();
462 
463  const Point2D& posI = ptr.r();
464 
465  Point2D dj = afl.getR(panel + 1) - afl.getR(panel);
466  Point2D tauj = dj.unit();
467 
468  Point2D s = posI - afl.getR(panel);
469  Point2D p = posI - afl.getR(panel + 1);
470 
471  Point2D u1 = 0.5 / dj.length()* VMlib::Omega(p + s, tauj, tauj);
472 
473  double a = VMlib::Alpha(p, s);
474 
475  double lambda;
476  if ((s.length2() > 1e-16) && (p.length2() > 1e-16))
477  lambda = VMlib::Lambda(p, s);
478  else
479  lambda = 0.0;
480 
481  vel += sheets.attachedSourceSheet(panel, 0) * (-a * u1.kcross() + lambda * u1 - tauj);
482  vel *= IDPI;
483 }// GetInfluenceFromSourceSheetAtRectPanelToVortex(...)
484 
485 //Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вихрь в области течения
487 {
488  vel.toZero();
489 
490  const Point2D& posI = ptr.r();
491 
492  Point2D dj = afl.getR(panel + 1) - afl.getR(panel);
493  Point2D tauj = dj.unit();
494 
495  Point2D s = posI - afl.getR(panel);
496  Point2D p = posI - afl.getR(panel + 1);
497 
498  Point2D u1 = 0.5 / dj.length()* VMlib::Omega(p + s, tauj, tauj);
499 
500  double lambda;
501  if ((s.length2() > 1e-16) && (p.length2() > 1e-16))
502  lambda = VMlib::Lambda(p, s);
503  else
504  lambda = 0.0;
505 
506  vel += sheets.freeVortexSheet(panel, 0) * (lambda * u1.kcross() - tauj.kcross());
507  vel += sheets.attachedVortexSheet(panel, 0) * (lambda * u1.kcross() - tauj.kcross());
508  vel *= IDPI;
509 }// GetInfluenceFromVortexSheetAtRectPanelToVortex(...)
510 
511 //Вычисляет влияния набегающего потока на прямолинейную панель для правой части
512 void BoundaryLinLayerAver::GetInfluenceFromVInfToRectPanel(std::vector<double>& vInfRhs) const
513 {
514  size_t np = afl.getNumberOfPanels();
515 
516  vInfRhs.resize(2 * np);
517 
518 #pragma omp parallel for default(none) shared(vInfRhs, np)
519  for (int i = 0; i < np; ++i)
520  {
521  vInfRhs[i] = afl.tau[i] & W.getPassport().physicalProperties.V0();
522  vInfRhs[np + i] = 0;
523  }
524 }// GetInfluenceFromVInfToRectPanel(...)
const double & freeVortexSheet(size_t n, size_t moment) const
Definition: Sheet2D.h:99
virtual void CalcConvVelocityAtVirtualVortexes(std::vector< Point2D > &velo) const override
Вычисление конвективной скорости в точках расположения виртуальных вихрей
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
const double & attachedVortexSheet(size_t n, size_t moment) const
Definition: Sheet2D.h:104
Заголовочный файл с описанием класса Wake.
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
Definition: Passport2D.h:151
Заголовочный файл с описанием класса World2D.
virtual void FillIQFromOther(const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой...
Заголовочный файл с описанием класса Airfoil.
double maxGamma
Максимально допустимая циркуляция вихря
Definition: Passport2D.h:157
const double IDPI
Число .
Definition: defs.h:76
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле ...
Definition: Boundary2D.h:63
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
Definition: VirtualWake2D.h:70
P length() const
Вычисление 2-нормы (длины) вектора
Definition: numvector.h:371
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
Definition: Passport2D.h:296
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
Definition: Airfoil2D.h:101
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const override
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения ...
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
Definition: Airfoil2D.h:113
virtual std::vector< double > getA(size_t p, size_t i, const Airfoil &airfoil, size_t j) const =0
Вычисление коэффициентов матрицы A для расчета влияния панели на панель
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
Definition: Vortex2D.h:85
HD double & g()
Функция для доступа к циркуляции вихря
Definition: Vortex2D.h:93
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
Definition: defs.cpp:259
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Definition: Airfoil2D.h:139
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
Definition: numvector.h:383
double dt
Шаг по времени
Definition: PassportGen.h:65
const Airfoil & getOldAirfoil(size_t i) const
Возврат константной ссылки на объект старого профиля
Definition: World2D.h:136
virtual void FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя ...
Point2D Omega(const Point2D &a, const Point2D &b, const Point2D &c)
Вспомогательная функция вычисления величины .
Definition: defs.cpp:271
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
Definition: VirtualWake2D.h:73
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
Definition: PassportGen.h:127
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
Definition: defs.cpp:265
const size_t numberInPassport
Номер профиля в паспорте
Definition: Boundary2D.h:70
virtual void GetInfluenceFromVortexSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const override
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
virtual void FillMatrixSelf(Eigen::MatrixXd &matr, Eigen::VectorXd &lastLine, Eigen::VectorXd &lactCol) override
Генерация блока матрицы
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников ...
Definition: Airfoil2D.h:45
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле ...
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
Заголовочный файл с описанием класса BoundaryLinLayerAver.
Класс, опеделяющий двумерный вектор
Definition: Point2D.h:75
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0]*newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
Definition: numvector.h:399
std::vector< Point2D > tau
Касательные к панелям профиля
Definition: Airfoil2D.h:182
Sheet sheets
Слои на профиле
Definition: Boundary2D.h:95
Заголовочный файл с описанием класса MeasureVP.
const double & attachedSourceSheet(size_t n, size_t moment) const
Definition: Sheet2D.h:109
Sheet oldSheets
Слои на профиле с предыдущего шага
Definition: Boundary2D.h:98
double phiAfl
Поворот профиля
Definition: Airfoil2D.h:80
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition: World2D.h:222
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
Definition: World2D.h:227
virtual void calcIQ(size_t p, const Airfoil &otherAirfoil, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &matrPair) const =0
Вычисление коэффициентов матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2.
Класс, опеделяющий двумерный вихревой элемент
Definition: Vortex2D.h:51
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
Definition: Passport2D.h:154
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
Definition: Boundary2D.h:85
std::vector< Point2D > nrm
Нормали к панелям профиля
Definition: Airfoil2D.h:177
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
Абстрактный класс, определяющий обтекаемый профиль
Definition: Airfoil2D.h:60
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition: WorldGen.h:91
virtual void FillMatrixFromOther(const Boundary &otherBoundary, Eigen::MatrixXd &matr) override
Генерация блока матрицы влияния от другого профиля того же типа
Point2D V0() const
Функция скорости набегающего потока с учетом разгона
Definition: Passport2D.h:93
Класс, опеделяющий набор вихрей
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
Definition: numvector.h:524
virtual void GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
Definition: Passport2D.h:299
std::vector< double > len
Длины панелей профиля
Definition: Airfoil2D.h:185
Заголовочный файл с описанием класса Velocity.
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
Definition: Boundary2D.h:82
const World2D & W
Константная ссылка на решаемую задачу
Definition: Boundary2D.h:67
double eps2
Квадрат радиуса вихря
Definition: Passport2D.h:142
const Airfoil & afl
Definition: Boundary2D.h:76
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
Definition: numvector.h:507