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