VM2D  1.12
Vortex methods for 2D flows simulation
Mechanics2DRigidRotatePart.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: 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 "Passport2D.h"
46 #include "StreamParser.h"
47 #include "Velocity2D.h"
48 #include "Wake2D.h"
49 #include "World2D.h"
50 
51 using namespace VM2D;
52 
53 
54 MechanicsRigidRotatePart::MechanicsRigidRotatePart(const World2D& W_, size_t numberInPassport_)
55  : Mechanics(W_, numberInPassport_, 1, true, false, true),
56  w0(0.0),
57  phi0(W_.getAirfoil(numberInPassport_).phiAfl)
58 {
60  Initialize({ 0.0, 0.0 }, W_.getAirfoil(numberInPassport_).rcm, 0.0, W_.getAirfoil(numberInPassport_).phiAfl);
61 };
62 
63 //Вычисление гидродинамической силы, действующей на профиль
65 {
66  W.getTimestat().timeGetHydroDynamForce.first += omp_get_wtime();
67 
68  const double& dt = W.getPassport().timeDiscretizationProperties.dt;
69 
70  hydroDynamForce = { 0.0, 0.0 };
71  hydroDynamMoment = 0.0;
72 
73  viscousForce = { 0.0, 0.0 };
74  viscousMoment = 0.0;
75 
76  Point2D hDFGam = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.завихренностью
77  Point2D hDFdelta = { 0.0, 0.0 }; //гидродинамические силы, обусловленные приростом завихренности
78  Point2D hDFQ = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.источниками
79 
80  double hDMGam = 0.0; //гидродинамический момент, обусловленный присоед.завихренностью
81  double hDMdelta = 0.0; //гидродинамический момент, обусловленный приростом завихренности
82  double hDMQ = 0.0; //гидродинамический момент, обусловленный присоед.источниками
83 
84 
85  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
86  {
87 // Point2D Vcm = VeloOfAirfoilRcm(W.getCurrentStep() * dt);
88 // Point2D VcmOld = VeloOfAirfoilRcm((std::max(W.getCurrentStep(), (size_t)1) - 1) * dt);
89 
90 // double Wcm = AngularVelocityOfAirfoil(W.getCurrentStep() * dt);
91 // double WcmOld = AngularVelocityOfAirfoil((std::max(W.getCurrentStep(), (size_t)1) - 1) * dt);
92 
93  Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i));
94 
95  Point2D dr = rK - afl.rcm;
96 
97  Point2D velK = { -Wcm * dr[1], Wcm * dr[0] };
98 
99  double gAtt = Wcm * (dr ^ afl.tau[i]);
100  double gAttOld = WcmOld * (dr ^ afl.tau[i]);
101  double deltaGAtt = gAtt - gAttOld;
102 
103  double qAtt = Wcm * (dr ^ 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({ -dr[1], dr[0] });
110  hDMdelta += 0.5 * deltaK * dr.length2();
111 
112  /*2*/
113  hDFGam += 0.25 * (afl.getV(i) + afl.getV(i + 1)).kcross() * gAtt * afl.len[i];
114  hDMGam += 0.25 * dr ^ (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 * dr ^ (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)
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  W.getTimestat().timeGetHydroDynamForce.second += omp_get_wtime();
134 }// GetHydroDynamForce()
135 
136 // Вычисление скорости центра масс
138 {
139  return { 0.0, 0.0 };
140 }//VeloOfAirfoilRcm(...)
141 
142 // Вычисление положения центра масс
144 {
145  return afl.rcm;
146 }//PositionOfAirfoilRcm(...)
147 
148 // Вычисление угловой скорости профиля вокруг центра масс
150 {
151  return w0;
152 }//AngleOfAirfoil(...)
153 
154 // Вычисление угла поворота профиля вокруг центра масс
156 {
157  return afl.phiAfl;
158 }//AngleOfAirfoil(...)
159 
160 // Вычисление скоростей начал панелей
162 {
163  Point2D veloRcm = VeloOfAirfoilRcm(currTime);
164 
165  std::vector<Point2D> vel(afl.getNumberOfPanels(), { 0.0, 0.0 });
166  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
167  {
168  vel[i][0] = (afl.getR(i) - afl.rcm).kcross()[0] * Wcm;
169  vel[i][1] = (afl.getR(i) - afl.rcm).kcross()[1] * Wcm;
170  }
171 
172  afl.setV(vel);
173 }//VeloOfAirfoilPanels(...)
174 
175 
177 {
178  WcmOld = Wcm;
179  PhiOld = Phi;
180 
181  //До момента времени tAccel ротор равномерно ускоряется до скорости wTilde
182 
185 
186  if (t < tAccel)
187  {
188  Wcm = t * wAccel / tAccel;
189  Phi = phi0 + Wcm * t / 2.;
190 
191  W.getInfo('i') << "Wcm * t / 2. " << Wcm * t / 2. << std::endl;
192  }
193  else if (t < 3.0 * tAccel)
194  {
195  Wcm = WcmOld + (hydroDynamMoment + 0.0 * viscousMoment) * dt / J;
196  Phi = PhiOld + Wcm * dt;
197 
198  }
199  else
200  {
201  Wcm = WcmOld + (hydroDynamMoment + 0.0 * viscousMoment - externalTorque) * dt / J;
202  Phi = PhiOld + Wcm * dt;
203 
204 // W.getInfo('i') << "Wcm * dt " << Wcm * dt << std::endl;
205  }
206 
207  afl.Rotate(Phi - PhiOld);
208 
209 
210 
211 // W.getInfo('i') << "hydroDynamMoment " << hydroDynamMoment << std::endl;
212 
213 // W.getInfo('i') << "externalTorque " << externalTorque << std::endl;
214 
215 // W.getInfo('i') << "J " << J << std::endl;
216 
217 // W.getInfo('i') << "Wcm " << Wcm << std::endl;
218 
219 // W.getInfo('i') << "Phi " << Phi << std::endl;
220 
221 // W.getInfo('i') << "PhiOld " << PhiOld << std::endl;
222 
223 // W.getInfo('i') << "Phi - PhiOld " << Phi - PhiOld << std::endl;
224 
225 }//Move()
226 
227 
228 
230 {
231  mechParamsParser->get("J", J);
232 
233  W.getInfo('i') << "moment of inertia " << "J = " << J << std::endl;
234 
235  mechParamsParser->get("wAccel", wAccel);
236 
237  W.getInfo('i') << "wAccel = " << wAccel << std::endl;
238 
239  mechParamsParser->get("tAccel", tAccel);
240 
241  W.getInfo('i') << "tAccel = " << tAccel << std::endl;
242 
243  mechParamsParser->get("externalTorque", externalTorque);
244 
245  W.getInfo('i') << "externalTorque = " << externalTorque << std::endl;
246 
247 }//ReadSpecificParametersFromDictionary()
const double & freeVortexSheet(size_t n, size_t moment) const
Definition: Sheet2D.h:99
Point2D viscousForce
Вектор силы и момент вязкого трения, действующие на профиль
Definition: Mechanics2D.h:146
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
std::vector< double > viscousStress
Касательные напряжения на панелях профиля
Definition: Airfoil2D.h:188
Times & getTimestat() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition: World2D.h:242
void Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
Задание начального положения и начальной скорости
Definition: Mechanics2D.cpp:89
Заголовочный файл с описанием класса Wake.
const Boundary & boundary
Definition: Mechanics2D.h:91
Заголовочный файл с описанием класса World2D.
double hydroDynamMoment
Definition: Mechanics2D.h:143
double getCurrTime() const
Возвращает текуще время
Definition: Passport2D.h:102
Заголовочный файл с описанием класса Airfoil.
double tAccel
время, за которое профиль принудительно разгоняется
const double phi0
начальный угол отклонения профиля
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition: Airfoil2D.h:196
double nu
Коэффициент кинематической вязкости среды
Definition: Passport2D.h:96
Заголовочный файл с описанием класса MechanicsRigidRotatePart.
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
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
virtual Point2D PositionOfAirfoilRcm(double currTime) override
Вычисление положения центра масс профиля
virtual void GetHydroDynamForce() override
Вычисление гидродинамической силы, действующей на профиль
virtual double AngleOfAirfoil(double currTime) override
Вычисление угла поворота профиля
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
Definition: PassportGen.h:127
virtual Point2D VeloOfAirfoilRcm(double currTime) override
Вычисление скорости центра масс профиля
const double w0
начальная угловая скорость профиля
timePeriod timeGetHydroDynamForce
Начало и конец процесса вычисления нагрузок
Definition: Times2D.h:92
double rho
Плотность потока
Definition: Passport2D.h:75
Definition: Airfoil2D.h:45
Заголовочный файл с описанием класса StreamParser.
Airfoil & afl
Definition: Mechanics2D.h:87
Класс, опеделяющий двумерный вектор
Definition: Point2D.h:75
virtual void VeloOfAirfoilPanels(double currTime) override
Вычисление скоростей начал панелей
std::vector< Point2D > tau
Касательные к панелям профиля
Definition: Airfoil2D.h:182
virtual void ReadSpecificParametersFromDictionary() override
Чтение параметров конкретной механической системы
std::unique_ptr< VMlib::StreamParser > mechParamsParser
Умный указатель на парсер параметров механической системы
Definition: Mechanics2D.h:98
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода ...
Definition: WorldGen.h:74
Sheet sheets
Слои на профиле
Definition: Boundary2D.h:95
Заголовочный файл с описанием класса MeasureVP.
virtual double AngularVelocityOfAirfoil(double currTime) override
Вычисление угловой скорости профиля
double phiAfl
Поворот профиля
Definition: Airfoil2D.h:80
const World2D & W
Константная ссылка на решаемую задачу
Definition: Mechanics2D.h:79
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition: World2D.h:222
virtual void Rotate(double alpha)=0
Поворот профиля
Point2D rcm
Положение центра масс профиля
Definition: Airfoil2D.h:77
void setV(const Point2D &vel)
Установка постоянной скорости всех вершин профиля
Definition: Airfoil2D.h:121
std::vector< Point2D > nrm
Нормали к панелям профиля
Definition: Airfoil2D.h:177
double viscousMoment
Definition: Mechanics2D.h:147
virtual void Move() override
Перемещение профиля в соответствии с законом
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition: World2D.h:130
double externalTorque
внешний момент, который "снимается".
Класс, опеделяющий текущую решаемую задачу
Definition: World2D.h:68
double wAccel
скорость, до которой профиль принудительно разгоняется
std::vector< double > len
Длины панелей профиля
Definition: Airfoil2D.h:185
Заголовочный файл с описанием класса Velocity.
MechanicsRigidRotatePart(const World2D &W_, size_t numberInPassport_)
Конструктор
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
Definition: Mechanics2D.h:142
double J
момент инерции профиля
Заголовочный файл с описанием класса Boundary.
Абстрактный класс, определяющий вид механической системы
Definition: Mechanics2D.h:71