VM2D  1.12
Vortex methods for 2D flows simulation
Boundary2DConstLayerAver.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: Boundary2DConstLayerAver.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 
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 //Пересчет решения на интенсивность вихревого слоя
58 {
59  Vortex2D virtVort;
60  Point2D midNorm;
61 
62  size_t np = afl.getNumberOfPanels();
63 
65 
67 
68  //Очистка и резервирование памяти
69  virtualWake.vecHalfGamma.clear();
70  virtualWake.vecHalfGamma.reserve(np * nVortPerPan);
71 
72  //Очистка и резервирование памяти
73  virtualWake.aflPan.clear();
74  virtualWake.aflPan.reserve(np * nVortPerPan);
75 
76  //Резервирование памяти
77  virtualWake.vtx.clear();
78  virtualWake.vtx.reserve(np * nVortPerPan);
79 
80  //Очистка и резервирование памяти
81  vortexBeginEnd.clear();
82  vortexBeginEnd.reserve(np);
83 
85 
86  std::pair<int, int> pair;
87 
88  for (size_t i = 0; i < np; ++i)
89  {
90  midNorm = afl.nrm[i] * delta;
91 
92  size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(sol(i) * afl.len[i]) / maxG), nVortPerPan);
93 
94  pair.first = (int)virtualWake.vtx.size();
95 
96 
97  Point2D dr = 1.0 / NEWnVortPerPan * (afl.getR(i + 1) - afl.getR(i));
98 
99  for (size_t j = 0; j < NEWnVortPerPan; ++j)
100  {
101  virtVort.r() = afl.getR(i) + dr * (j * 1.0 + 0.5) + midNorm;
102  virtVort.g() = sol(i) * afl.len[i] / NEWnVortPerPan;
103  virtualWake.vtx.push_back(virtVort);
104 
105  virtualWake.vecHalfGamma.push_back(0.5 * sol(i) * afl.tau[i]);
106  virtualWake.aflPan.push_back({ numberInPassport, i });
107  }
108 
109  pair.second = (int)virtualWake.vtx.size();
110  vortexBeginEnd.push_back(pair);
111  }
112 
113 
114  for (size_t j = 0; j < np; ++j)
115  sheets.freeVortexSheet(j, 0) = sol(j);
116 
117 }//SolutionToFreeVortexSheetAndVirtualVortex(...)
118 
119 
120 //Генерация блока матрицы
121 void BoundaryConstLayerAver::FillMatrixSelf(Eigen::MatrixXd& matr, Eigen::VectorXd& lastLine, Eigen::VectorXd& lactCol)
122 {
123  size_t np = afl.getNumberOfPanels();
124 
125  for (size_t i = 0; i < np; ++i)
126  {
127  lactCol(i) = 1.0;
128  lastLine(i) = afl.len[i];
129  }
130 
131  for (size_t i = 0; i < np; ++i)
132  for (size_t j = 0; j < np; ++j)
133  matr(i, j) = afl.getA(1, i, afl, j)[0];
134 
135 }//FillMatrixSelf(...)
136 
137 void BoundaryConstLayerAver::FillIQSelf(std::pair<Eigen::MatrixXd, Eigen::MatrixXd>& IQ)
138 {
139  afl.calcIQ(1, afl, IQ);
140 }//FillIQSelf(...)
141 
142 //Генерация блока матрицы влияния от другого профиля того же типа
143 void BoundaryConstLayerAver::FillMatrixFromOther(const Boundary& otherBoundary, Eigen::MatrixXd& matr)
144 {
145  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
146  for (size_t j = 0; j < otherBoundary.afl.getNumberOfPanels(); ++j)
147  matr(i, j) = afl.getA(1, i, otherBoundary.afl, j)[0];
148 }//FillMatrixFromOther(...)
149 
150 
151 void BoundaryConstLayerAver::FillIQFromOther(const Boundary& otherBoundary, std::pair<Eigen::MatrixXd, Eigen::MatrixXd>& IQ)
152 {
153  afl.calcIQ(1, otherBoundary.afl, IQ);
154 }//FillIQFromOther(...)
155 
156 
157 //Вычисление скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на профиле
158 void BoundaryConstLayerAver::CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase& pointsDb, std::vector<Point2D>& velo) const
159 {
160  std::vector<Point2D> selfVelo(pointsDb.vtx.size());
161 
162  double cft = IDPI;
163 
164 #pragma warning (push)
165 #pragma warning (disable: 4101)
166  //Локальные переменные для цикла
167  Point2D velI;
168  Point2D tempVel;
169  //double dst2eps, dst2;
170 #pragma warning (pop)
171 
172 #pragma omp parallel for default(none) shared(selfVelo, cft, pointsDb, std::cout) private(velI, tempVel)
173  for (int i = 0; i < pointsDb.vtx.size(); ++i)
174  {
176 
177  velI.toZero();
178 
179  const Point2D& posI = pointsDb.vtx[i].r();
180 
183  for (size_t j = 0; j < sheets.getSheetSize(); ++j)
184  {
185  Point2D dj = afl.getR(j + 1) - afl.getR(j);
186  Point2D tauj = dj.unit();
187 
188  Point2D s = posI - afl.getR(j);
189  Point2D p = posI - afl.getR(j + 1);
190 
191  double a = VMlib::Alpha(p, s);
192 
193  double lambda;
194  if ( (s.length2() > 1e-16) && (p.length2() > 1e-16) )
195  lambda = VMlib::Lambda(p, s);
196  else
197  lambda = 0.0;
198 
199  Point2D skos = -a * tauj.kcross() + lambda * tauj;
200 
201  velI += sheets.freeVortexSheet(j, 0) * skos.kcross();
202  velI += sheets.attachedVortexSheet(j, 0) * skos.kcross();
203  velI += sheets.attachedSourceSheet(j, 0) * skos;
204  }//for j
205 
206  velI *= cft;
207  selfVelo[i] = velI;
208  }//for i
209 
210  for (size_t i = 0; i < velo.size(); ++i)
211  velo[i] += selfVelo[i];
212 }//CalcConvVelocityToSetOfPointsFromSheets(...)
213 
214 
215 #if defined(USE_CUDA)
216 void BoundaryConstLayerAver::GPUCalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase& pointsDb, std::vector<Point2D>& velo) const
217 {
218  if (afl.numberInPassport == 0)
219  {
220  const size_t npt = pointsDb.vtx.size();
221  double*& dev_ptr_pt = pointsDb.devVtxPtr;
222 
223  size_t npnl = afl.getNumberOfPanels();
224  for (size_t q = 1; q < W.getNumberOfAirfoil(); ++q)
225  npnl += W.getAirfoil(q).getNumberOfPanels();
226 
227  double*& dev_ptr_r = afl.devRPtr;
228  double*& dev_ptr_freeVortexSheet = afl.devFreeVortexSheetPtr;
229  double*& dev_ptr_attachedVortexSheet = afl.devAttachedVortexSheetPtr;
230  double*& dev_ptr_attachedSourceSheet = afl.devAttachedSourceSheetPtr;
231 
232  std::vector<Point2D>& Vel = velo;
233  std::vector<Point2D> locvel(npt);
234  double*& dev_ptr_vel = pointsDb.devVelPtr;
236 
237 
238  if (npt > 0)
239  {
240  //double tt1 = omp_get_wtime();
241  cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, dev_ptr_freeVortexSheet, dev_ptr_attachedVortexSheet, dev_ptr_attachedSourceSheet, dev_ptr_vel, eps2);
242  //double tt2 = omp_get_wtime();
243  //std::cout << "SHEET: " << tt2 - tt1 << std::endl;
244 
245  std::vector<Point2D> newV(Vel.size());
246  W.getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (double*)newV.data());
247 
248  for (size_t q = 0; q < Vel.size(); ++q)
249  Vel[q] += newV[q];
250  }
251  }
252 }
253 //GPUCalcConvVelocityToSetOfPointsFromSheets(...)
254 #endif
255 
256 
257 void BoundaryConstLayerAver::CalcConvVelocityAtVirtualVortexes(std::vector<Point2D>& velo) const
258 {
259  std::vector<Point2D>& Vel = velo;
260 
261  //Скорости виртуальных вихрей
262 
263  /*
264  std::stringstream ss;
265  ss << afl.numberInPassport << "-" << W.currentStep;
266  std::ofstream of(W.getPassport().dir + "dbg/tele_" + ss.str());
267  for (int i = 0; i < (int)Vel.size(); ++i)
268  of << afl.getV(virtualWake.aflPan[i].second) << " " << virtualWake.vecHalfGamma[i] << " " << W.getPassport().physicalProperties.V0() << std::endl;
269  of.close();
270  */
271 
272  //std::cout << virtualWake.vecHalfGamma.size() << std::endl;
273 #pragma omp parallel for default(none) shared(Vel)
274  for (int i = 0; i < (int)Vel.size(); ++i)
275  Vel[i] = afl.getV(virtualWake.aflPan[i].second) \
277  - W.getPassport().physicalProperties.V0(); // V0 потом прибавляется ко всем скоростям в функции MoveVortexes
278 
279 
280 }//CalcConvVelocityAtVirtualVortexes(...)
281 
282 
283 //Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников
285 {
286 
287  for (size_t i = 0; i < sheets.getSheetSize(); ++i)
288  {
291  }
292 
293  for (size_t i = 0; i < sheets.getSheetSize(); ++i)
294  {
295  sheets.attachedVortexSheet(i, 0) = 0.5 * (afl.getV(i) + afl.getV(i + 1)) & afl.tau[i];
296  sheets.attachedSourceSheet(i, 0) = 0.5 * (afl.getV(i) + afl.getV(i + 1)) & afl.nrm[i];
297  }
298 }//ComputeAttachedSheetsIntensity()
299 
300 
301 //Вычисляет влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой части
302 void BoundaryConstLayerAver::GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& wakeRhs) const
303 {
304  double& velI = wakeRhs[0];
305 
306  const Point2D& posI0 = afl.getR(panel);
307  const Point2D& posI1 = afl.getR(panel + 1);
308 
309 
310  for (size_t it = 0; it != count; ++it)
311  {
312  const Vortex2D& vt = ptr[it];
313 
314  const Point2D& posJ = vt.r();
315  const double& gamJ = vt.g();
316 
317  Point2D s = posJ - posI0;
318  Point2D p = posJ - posI1;
319 
320  double alpha = VMlib::Alpha(p, s);
321 
322  velI -= gamJ * alpha;
323  }
324 }// GetInfluenceFromVorticesToRectPanel(...)
325 
326 
327 
328 //Вычисляет влияния части подряд идущих источников в области течения на прямолинейную панель для правой части
329 void BoundaryConstLayerAver::GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& wakeRhs) const
330 {
331  double& velI = wakeRhs[0];
332 
333  const Point2D& posI0 = afl.getR(panel);
334  const Point2D& posI1 = afl.getR(panel + 1);
335 
336  for (size_t it = 0; it != count; ++it)
337  {
338  const Vortex2D& vt = ptr[it];
339  const Point2D& posJ = vt.r();
340  const double& gamJ = vt.g();
341 
342  Point2D s = posJ - posI0;
343  Point2D p = posJ - posI1;
344 
345  double lambda = VMlib::Lambda(p, s);
346 
347  velI -= gamJ * lambda;
348  }
349 }// GetInfluenceFromSourcesToRectPanel(...)
350 
351 
352 //Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения
354 {
355  vel.toZero();
356 
357  const Point2D& posI = ptr.r();
358 
359  Point2D dj = afl.getR(panel + 1) - afl.getR(panel);
360  Point2D tauj = dj.unit();
361 
362  Point2D s = posI - afl.getR(panel);
363  Point2D p = posI - afl.getR(panel + 1);
364 
365  double a = VMlib::Alpha(p, s);
366 
367  double lambda;
368  if ((s.length2() > 1e-16) && (p.length2() > 1e-16))
369  lambda = VMlib::Lambda(p, s);
370  else
371  lambda = 0.0;
372 
373  vel += sheets.attachedSourceSheet(panel, 0) * (-a * tauj.kcross() + lambda * tauj);
374 }// GetInfluenceFromSourceSheetAtRectPanelToVortex(...)
375 
376 //Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вихрь в области течения
378 {
379  vel.toZero();
380 
381  const Point2D& posI = ptr.r();
382 
383  Point2D dj = afl.getR(panel + 1) - afl.getR(panel);
384  Point2D tauj = dj.unit();
385 
386  Point2D s = posI - afl.getR(panel);
387  Point2D p = posI - afl.getR(panel + 1);
388  double a = VMlib::Alpha(p, s);
389 
390  double lambda;
391  if ((s.length2() > 1e-16) && (p.length2() > 1e-16))
392  lambda = VMlib::Lambda(p, s);
393  else
394  lambda = 0.0;
395 
396  Point2D skos = -a * tauj.kcross() + lambda * tauj;
397 
398  vel += sheets.freeVortexSheet(panel, 0) * skos.kcross();
399  vel += sheets.attachedVortexSheet(panel, 0) * skos.kcross();
400 
401 }// GetInfluenceFromVortexSheetAtRectPanelToVortex(...)
402 
403 
404 //Вычисляет влияния набегающего потока на прямолинейную панель для правой части
405 void BoundaryConstLayerAver::GetInfluenceFromVInfToRectPanel(std::vector<double>& vInfRhs) const
406 {
407  size_t np = afl.getNumberOfPanels();
408  vInfRhs.resize(np);
409 
410 #pragma omp parallel for default(none) shared(vInfRhs, np)
411  for (int i = 0; i < np; ++i)
412  vInfRhs[i] = afl.tau[i] & W.getPassport().physicalProperties.V0();
413 
414 }// GetInfluenceFromVInfToRectPanel(...)
const double & freeVortexSheet(size_t n, size_t moment) const
Definition: Sheet2D.h:99
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
const double & attachedVortexSheet(size_t n, size_t moment) const
Definition: Sheet2D.h:104
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &ptr, Point2D &vel) const override
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения ...
Заголовочный файл с описанием класса Wake.
virtual void FillIQFromOther(const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой...
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
Definition: Passport2D.h:151
virtual void FillMatrixSelf(Eigen::MatrixXd &matr, Eigen::VectorXd &lastLine, Eigen::VectorXd &lactCol) override
Генерация блока матрицы
Заголовочный файл с описанием класса World2D.
Заголовочный файл с описанием класса 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
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
const size_t numberInPassport
Номер профиля в паспорте
Definition: Airfoil2D.h:74
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
Definition: Passport2D.h:296
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
Definition: Airfoil2D.h:101
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
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
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
Definition: VirtualWake2D.h:73
virtual void GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
Definition: defs.cpp:265
const size_t numberInPassport
Номер профиля в паспорте
Definition: Boundary2D.h:70
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
Definition: World2D.h:147
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников ...
virtual void FillMatrixFromOther(const Boundary &otherBoundary, Eigen::MatrixXd &matr) override
Генерация блока матрицы влияния от другого профиля того же типа
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
Definition: Airfoil2D.h:45
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
size_t getSheetSize() const
Definition: Sheet2D.h:94
Класс, опеделяющий двумерный вектор
Definition: Point2D.h:75
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле ...
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
Заголовочный файл с описанием класса BoundaryConstLayerAver.
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
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
virtual void GetInfluenceFromVortexSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const override
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
virtual void FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя ...
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
Definition: Passport2D.h:154
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
Definition: Boundary2D.h:85
std::vector< Point2D > nrm
Нормали к панелям профиля
Definition: Airfoil2D.h:177
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition: World2D.h:130
Point2D V0() const
Функция скорости набегающего потока с учетом разгона
Definition: Passport2D.h:93
Класс, опеделяющий набор вихрей
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
Definition: numvector.h:524
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
Definition: Passport2D.h:299
std::vector< double > len
Длины панелей профиля
Definition: Airfoil2D.h:185
Заголовочный файл с описанием класса Velocity.
virtual void CalcConvVelocityAtVirtualVortexes(std::vector< Point2D > &velo) const override
Вычисление конвективной скорости в точках расположения виртуальных вихрей
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