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
50using namespace VM2D;
51
52
54 : Mechanics(W_, numberInPassport_, true, false)
55 //w0(0.0),
56 //phi0(W_.getAirfoil(numberInPassport_).phiAfl)
57{
58 Vcm0 = { 0.0, 0.0 };
59 Rcm0 = { W_.getAirfoil(numberInPassport_).rcm[0], W_.getAirfoil(numberInPassport_).rcm[1] };
60 Vcm = Vcm0;
61 Rcm = Rcm0;
62 VcmOld = Vcm0;
63 RcmOld = Rcm;
64
66 Initialize({ 0.0, 0.0 }, W_.getAirfoil(numberInPassport_).rcm, 0.0, W_.getAirfoil(numberInPassport_).phiAfl);
67};
68
69//Вычисление гидродинамической силы, действующей на профиль
71{
72 W.getTimers().start("Force");
73
74 const double& dt = W.getPassport().timeDiscretizationProperties.dt;
75
76 hydroDynamForce = { 0.0, 0.0 };
77 hydroDynamMoment = 0.0;
78
79 viscousForce = { 0.0, 0.0 };
80 viscousMoment = 0.0;
81
82 Point2D hDFGam = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.завихренностью
83 Point2D hDFdelta = { 0.0, 0.0 }; //гидродинамические силы, обусловленные приростом завихренности
84 Point2D hDFQ = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.источниками
85
86 double hDMGam = 0.0; //гидродинамический момент, обусловленный присоед.завихренностью
87 double hDMdelta = 0.0; //гидродинамический момент, обусловленный приростом завихренности
88 double hDMQ = 0.0; //гидродинамический момент, обусловленный присоед.источниками
89
90
91
92
93 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
94 {
95 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
96
97 Point2D velK = { -Wcm * rK[1], Wcm * rK[0] };
98
99 double gAtt = Wcm * (rK ^ afl.tau[i]);
100 double gAttOld = WcmOld * (rK ^ afl.tau[i]);
101 double deltaGAtt = gAtt - gAttOld;
102
103 double qAtt = Wcm * (rK ^ afl.nrm[i]);
104
106 double deltaK = boundary.sheets.freeVortexSheet(i, 0) * afl.len[i] - afl.gammaThrough[i] + deltaGAtt * afl.len[i];
107
108 /*1*/
109 hDFdelta += deltaK * Point2D({ -rK[1], rK[0] });
110 hDMdelta += 0.5 * deltaK * rK.length2();
111
112 /*2*/
113 hDFGam += 0.25 * (afl.getV(i) + afl.getV(i + 1)).kcross() * gAtt * afl.len[i];
114 hDMGam += 0.25 * rK ^ (afl.getV(i) + afl.getV(i + 1)).kcross() * gAtt * afl.len[i];
115
116 /*3*/
117 hDFQ -= 0.25 * (afl.getV(i) + afl.getV(i + 1)) * qAtt * afl.len[i];
118 hDMQ -= 0.25 * rK ^ (afl.getV(i) + afl.getV(i + 1)) * qAtt * afl.len[i];
119 }
120
121 const double rho = W.getPassport().physicalProperties.rho;
122
123 hydroDynamForce = rho * (hDFGam + hDFdelta * (1.0 / dt) + hDFQ);
124 hydroDynamMoment = rho * (hDMGam + hDMdelta / dt + hDMQ);
125
126 if ((W.getPassport().physicalProperties.nu > 0.0)/* && (W.currentStep > 0)*/)
127 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
128 {
129 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
130 viscousForce += rho * afl.viscousStress[i] * afl.tau[i];
131 viscousMoment += rho * (afl.viscousStress[i] * afl.tau[i]) & rK;
132 }
133
134 W.getTimers().stop("Force");
135}// GetHydroDynamForce()
136
137// Вычисление скорости центра масс
139{
140 return Point2D{0.0, 0.0};
141}//VeloOfAirfoilRcm(...)
142
143// Вычисление положения центра масс
145{
146 return Rcm;
147}//PositionOfAirfoilRcm(...)
148
150{
151 return Wcm;
152}//AngularVelocityOfAirfoil(...)
153
155{
156 return afl.phiAfl;
157}//AngleOfAirfoil(...)
158
159// Вычисление скоростей начал панелей
161{
162 Point2D veloRcm = VeloOfAirfoilRcm(currTime);
163
164 std::vector<Point2D> veloW(afl.getNumberOfPanels());
165 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
166 veloW[i] = veloRcm + Wcm * (afl.getR(i) - Rcm).kcross();
167
168 afl.setV(veloW);
169
171 circulation = 2.0 * afl.area * Wcm;
172}//VeloOfAirfoilPanels(...)
173
174
176{
177 double Jeff = J;
178
179 PhiOld = Phi;
180 WcmOld = Wcm;
181
182
183 Point2D dr, dV;
184 double dphi, dw;
185
186 //W.getInfo('t') << "k = " << k << std::endl;
187
188
189 dr[1] = 0.0;
190 dV[1] = 0.0;
191
192 dr[0] = 0.0;
193 dV[0] = 0.0;
194
195 double bw = 0.0;
196 double kw = 0.0;
197
198
200 double t = W.getCurrentTime();
201
202
203 double addMom = (t > 3.0 * tAccel) ? externalTorque : 0.0;
204
205 if (t > 1.0 * tAccel)
206 {
207 Point2D kk[4];
208 kk[0] = { Wcm, (hydroDynamMoment - 2.0 * bw * Wcm - kw * Phi - addMom) / Jeff };
209 kk[1] = { Wcm + 0.5 * dt * kk[0][1], (hydroDynamMoment - 2.0 * bw * (Wcm + 0.5 * dt * kk[0][1]) - kw * (Phi + 0.5 * dt * kk[0][0]) - addMom) / Jeff };
210 kk[2] = { Wcm + 0.5 * dt * kk[1][1], (hydroDynamMoment - 2.0 * bw * (Wcm + 0.5 * dt * kk[1][1]) - kw * (Phi + 0.5 * dt * kk[1][0]) - addMom) / Jeff };
211 kk[3] = { Wcm + dt * kk[2][1], (hydroDynamMoment - 2.0 * bw * (Wcm + dt * kk[2][1]) - kw * (Phi + dt * kk[2][0]) - addMom) / Jeff };
212
213 dphi = dt * (kk[0][0] + 2. * kk[1][0] + 2. * kk[2][0] + kk[3][0]) / 6.0;
214 dw = dt * (kk[0][1] + 2. * kk[1][1] + 2. * kk[2][1] + kk[3][1]) / 6.0;
215 }
216 else
217 {
218 double a = wAccel / tAccel;
219 dw = dt * a;
220 dphi = 0.5 * a * sqr(t) - 0.5 * a * sqr(t - dt);
221 }
222
223
224 afl.Move(dr);
225 afl.Rotate(dphi);
226
227 Rcm += dr;
228 Vcm += dV;
229
230 Phi += dphi;
231
232 //std::cout << "Phi = " << Phi << ", afl.Phi = " << afl.phiAfl << std::endl;
233
234 Wcm += dw;
235
236}//Move()
237
238
239
241{
242 mechParamsParser->get("J", J);
243
244 W.getInfo('i') << "moment of inertia " << "J = " << J << std::endl;
245
246 mechParamsParser->get("wAccel", wAccel);
247
248 W.getInfo('i') << "wAccel = " << wAccel << std::endl;
249
250 mechParamsParser->get("tAccel", tAccel);
251
252 W.getInfo('i') << "tAccel = " << tAccel << std::endl;
253
254 mechParamsParser->get("externalTorque", externalTorque);
255
256 W.getInfo('i') << "externalTorque = " << externalTorque << std::endl;
257
258}//ReadSpecificParametersFromDictionary()
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса 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:289
const double & freeVortexSheet(size_t n, size_t moment) const
Definition Sheet2D.h:100
Класс, опеделяющий текущую решаемую задачу
Definition World2D.h:74
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition World2D.h:157
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition World2D.h:276
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:251
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:510
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