VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
Mechanics2DRigidRotatePart.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: Mechanics2DRigidRotatePart.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
41
42#include "Airfoil2D.h"
43#include "Boundary2D.h"
44#include "MeasureVP2D.h"
45#include "StreamParser.h"
46#include "Velocity2D.h"
47#include "Wake2D.h"
48#include "World2D.h"
49#include "Gmres2D.h"
50
51using namespace VM2D;
52
53
55 : Mechanics(W_, numberInPassport_, true, false)
56 //w0(0.0),
57 //phi0(W_.getAirfoil(numberInPassport_).phiAfl)
58{
59 Vcm0 = { 0.0, 0.0 };
60 Rcm0 = { W_.getAirfoil(numberInPassport_).rcm[0], W_.getAirfoil(numberInPassport_).rcm[1] };
61 Vcm = Vcm0;
62 Rcm = Rcm0;
63 VcmOld = Vcm0;
64 RcmOld = Rcm;
65
67 Initialize({ 0.0, 0.0 }, W_.getAirfoil(numberInPassport_).rcm, 0.0, W_.getAirfoil(numberInPassport_).phiAfl);
68};
69
70//Вычисление гидродинамической силы, действующей на профиль
72{
73 W.getTimers().start("Force");
74
75 const double& dt = W.getPassport().timeDiscretizationProperties.dt;
76
77 hydroDynamForce = { 0.0, 0.0 };
78 hydroDynamMoment = 0.0;
79
80 viscousForce = { 0.0, 0.0 };
81 viscousMoment = 0.0;
82
83 Point2D hDFGam = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.завихренностью
84 Point2D hDFdelta = { 0.0, 0.0 }; //гидродинамические силы, обусловленные приростом завихренности
85 Point2D hDFQ = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.источниками
86
87 double hDMGam = 0.0; //гидродинамический момент, обусловленный присоед.завихренностью
88 double hDMdelta = 0.0; //гидродинамический момент, обусловленный приростом завихренности
89 double hDMQ = 0.0; //гидродинамический момент, обусловленный присоед.источниками
90
91
92
93
94 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
95 {
96 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
97
98 Point2D velK = { -Wcm * rK[1], Wcm * rK[0] };
99
100 double gAtt = Wcm * (rK ^ afl.tau[i]);
101 double gAttOld = WcmOld * (rK ^ afl.tau[i]);
102 double deltaGAtt = gAtt - gAttOld;
103
104 double qAtt = Wcm * (rK ^ afl.nrm[i]);
105
107 double deltaK = boundary.sheets.freeVortexSheet(i, 0) * afl.len[i] - afl.gammaThrough[i] + deltaGAtt * afl.len[i];
108
109 /*1*/
110 hDFdelta += deltaK * Point2D({ -rK[1], rK[0] });
111 hDMdelta += 0.5 * deltaK * rK.length2();
112
113 /*2*/
114 hDFGam += 0.25 * (afl.getV(i) + afl.getV(i + 1)).kcross() * gAtt * afl.len[i];
115 hDMGam += 0.25 * rK ^ (afl.getV(i) + afl.getV(i + 1)).kcross() * gAtt * afl.len[i];
116
117 /*3*/
118 hDFQ -= 0.25 * (afl.getV(i) + afl.getV(i + 1)) * qAtt * afl.len[i];
119 hDMQ -= 0.25 * rK ^ (afl.getV(i) + afl.getV(i + 1)) * qAtt * afl.len[i];
120 }
121
122 const double rho = W.getPassport().physicalProperties.rho;
123
124 hydroDynamForce = rho * (hDFGam + hDFdelta * (1.0 / dt) + hDFQ);
125 hydroDynamMoment = rho * (hDMGam + hDMdelta / dt + hDMQ);
126
127 if ((W.getPassport().physicalProperties.nu > 0.0)/* && (W.currentStep > 0)*/)
128 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
129 {
130 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
131 viscousForce += rho * afl.viscousStress[i] * afl.tau[i];
132 viscousMoment += rho * (afl.viscousStress[i] * afl.tau[i]) & rK;
133 }
134
135 W.getTimers().stop("Force");
136}// GetHydroDynamForce()
137
138// Вычисление скорости центра масс
140{
141 return Point2D{0.0, 0.0};
142}//VeloOfAirfoilRcm(...)
143
144// Вычисление положения центра масс
146{
147 return Rcm;
148}//PositionOfAirfoilRcm(...)
149
151{
152 return Wcm;
153}//AngularVelocityOfAirfoil(...)
154
156{
157 return afl.phiAfl;
158}//AngleOfAirfoil(...)
159
160// Вычисление скоростей начал панелей
162{
163 Point2D veloRcm = VeloOfAirfoilRcm(currTime);
164
165 std::vector<Point2D> veloW(afl.getNumberOfPanels());
166 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
167 veloW[i] = veloRcm + Wcm * (afl.getR(i) - Rcm).kcross();
168
169 afl.setV(veloW);
170
172 circulation = 2.0 * afl.area * Wcm;
173}//VeloOfAirfoilPanels(...)
174
175
177{
178 double Jeff = J;
179
180 //Point2D F = hydroDynamForce + viscousForce;
181 double M = hydroDynamMoment + viscousMoment;
182
183 PhiOld = Phi;
184 WcmOld = Wcm;
185
186
187 Point2D dr, dV;
188 double dphi, dw;
189
190 //W.getInfo('t') << "k = " << k << std::endl;
191
192
193 dr[1] = 0.0;
194 dV[1] = 0.0;
195
196 dr[0] = 0.0;
197 dV[0] = 0.0;
198
199 double bw = 0.0;
200 double kw = 0.0;
201
202
204 double t = W.getCurrentTime();
205
206
207 double addMom = (t > 3.0 * tAccel) ? externalTorque : 0.0;
208
209 if (t > 1.0 * tAccel)
210 {
211 Point2D kk[4];
212 kk[0] = { Wcm, (M - 2.0 * bw * Wcm - kw * Phi - addMom) / Jeff };
213 kk[1] = { Wcm + 0.5 * dt * kk[0][1], (M - 2.0 * bw * (Wcm + 0.5 * dt * kk[0][1]) - kw * (Phi + 0.5 * dt * kk[0][0]) - addMom) / Jeff };
214 kk[2] = { Wcm + 0.5 * dt * kk[1][1], (M - 2.0 * bw * (Wcm + 0.5 * dt * kk[1][1]) - kw * (Phi + 0.5 * dt * kk[1][0]) - addMom) / Jeff };
215 kk[3] = { Wcm + dt * kk[2][1], (M - 2.0 * bw * (Wcm + dt * kk[2][1]) - kw * (Phi + dt * kk[2][0]) - addMom) / Jeff };
216
217 dphi = dt * (kk[0][0] + 2. * kk[1][0] + 2. * kk[2][0] + kk[3][0]) / 6.0;
218 dw = dt * (kk[0][1] + 2. * kk[1][1] + 2. * kk[2][1] + kk[3][1]) / 6.0;
219 }
220 else
221 {
222 double a = wAccel / tAccel;
223 dw = dt * a;
224 dphi = 0.5 * a * sqr(t) - 0.5 * a * sqr(t - dt);
225 }
226
227
228 afl.Move(dr);
229 afl.Rotate(dphi);
230
231 Rcm += dr;
232 Vcm += dV;
233
234 Phi += dphi;
235
236 //std::cout << "Phi = " << Phi << ", afl.Phi = " << afl.phiAfl << std::endl;
237
238 Wcm += dw;
239
240}//Move()
241
242
243
245{
246 mechParamsParser->get("J", J);
247
248 W.getInfo('i') << "moment of inertia " << "J = " << J << std::endl;
249
250 mechParamsParser->get("wAccel", wAccel);
251
252 W.getInfo('i') << "wAccel = " << wAccel << std::endl;
253
254 mechParamsParser->get("tAccel", tAccel);
255
256 W.getInfo('i') << "tAccel = " << tAccel << std::endl;
257
258 mechParamsParser->get("externalTorque", externalTorque);
259
260 W.getInfo('i') << "externalTorque = " << externalTorque << std::endl;
261
262}//ReadSpecificParametersFromDictionary()
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса MechanicsRigidRotatePart.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
double phiAfl
Поворот профиля
Definition Airfoil2D.h:100
std::vector< double > len
Длины панелей профиля
Definition Airfoil2D.h:94
void setV(const Point2D &vel)
Установка постоянной скорости всех вершин профиля
Definition Airfoil2D.h:145
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
Definition Airfoil2D.h:113
double area
Площадь профиля
Definition Airfoil2D.h:103
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
Point2D rcm
Положение центра масс профиля
Definition Airfoil2D.h:97
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Definition Airfoil2D.h:163
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition Airfoil2D.h:276
virtual void Move(const Point2D &dr)
Перемещение профиля
std::vector< double > viscousStress
Нейросеть для коэффициентов I0 и I3 диффузионной скорости
Definition Airfoil2D.h:268
virtual void Rotate(double alpha)
Поворот профиля
Sheet sheets
Слои на профиле
Definition Boundary2D.h:96
Абстрактный класс, определяющий вид механической системы
Definition Mechanics2D.h:72
std::unique_ptr< VMlib::StreamParser > mechParamsParser
Умный указатель на парсер параметров механической системы
Definition Mechanics2D.h:98
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
Point2D Vcm0
Начальная скорость центра и угловая скорость
Point2D RcmOld
Текущие положение профиля
Point2D VcmOld
Скорость и отклонение с предыдущего шага
const World2D & W
Константная ссылка на решаемую задачу
Definition Mechanics2D.h:79
void Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
Задание начального положения и начальной скорости
Point2D Rcm
Текущие положение профиля
Point2D Rcm0
Начальное положение профиля
Point2D viscousForce
Вектор силы и момент вязкого трения, действующие на профиль
double circulationOld
Циркуляция скорости по границе профиля с предыдущего шага
double hydroDynamMoment
Airfoil & afl
Definition Mechanics2D.h:87
Point2D Vcm
Текущие скорость центра и угловая скорость
double circulation
Текущая циркуляция скорости по границе профиля
const Boundary & boundary
Definition Mechanics2D.h:91
virtual void Move() override
Перемещение профиля в соответствии с законом
virtual Point2D VeloOfAirfoilRcm(double currTime) override
Вычисление скорости центра масс профиля
virtual Point2D PositionOfAirfoilRcm(double currTime) override
Вычисление положения центра масс профиля
virtual void VeloOfAirfoilPanels(double currTime) override
Вычисление скоростей начал панелей
MechanicsRigidRotatePart(const World2D &W_, size_t numberInPassport_)
Конструктор
double externalTorque
внешний момент, который "снимается"
virtual double AngularVelocityOfAirfoil(double currTime) override
Вычисление угловой скорости профиля
double J
начальная угловая скорость профиля
virtual void ReadSpecificParametersFromDictionary() override
Чтение параметров конкретной механической системы
virtual double AngleOfAirfoil(double currTime) override
Вычисление угла поворота профиля
double tAccel
время, за которое профиль принудительно разгоняется
virtual void GetHydroDynamForce() override
Вычисление гидродинамической силы, действующей на профиль
double wAccel
скорость, до которой профиль принудительно разгоняется
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
Definition Passport2D.h:301
const double & freeVortexSheet(size_t n, size_t moment) const
Definition Sheet2D.h:100
Класс, опеделяющий текущую решаемую задачу
Definition World2D.h:77
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition World2D.h:163
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition World2D.h:288
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:263
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
void stop(const std::string &timerLabel)
Останов счетчика
Definition TimesGen.cpp:68
void start(const std::string &timerLabel)
Запуск счетчика
Definition TimesGen.cpp:55
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
Definition WorldGen.h:82
double getCurrentTime() const
Definition WorldGen.h:100
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
Definition numvector.h:511
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
Definition numvector.h:386
double nu
Коэффициент кинематической вязкости среды
Definition Passport2D.h:99
double rho
Плотность потока
Definition Passport2D.h:75
double dt
Шаг по времени
Definition PassportGen.h:67