VM2D  1.12
Vortex methods for 2D flows simulation
Mechanics2DRigidGivenLaw.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: Mechanics2DRigidGivenLaw.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 
40 #include <algorithm>
41 
43 
44 #include "Airfoil2D.h"
45 #include "Boundary2D.h"
46 
47 
48 #include "MeasureVP2D.h"
49 #include "Passport2D.h"
50 #include "StreamParser.h"
51 #include "Velocity2D.h"
52 #include "Wake2D.h"
53 #include "World2D.h"
54 
55 using namespace VM2D;
56 
57 MechanicsRigidGivenLaw::MechanicsRigidGivenLaw(const World2D& W_, size_t numberInPassport_)
58  : Mechanics(W_, numberInPassport_, 0, true, false, false)
59 {
62 };
63 
64 
65 //Вычисление гидродинамической силы, действующей на профиль
67 {
68  W.getTimestat().timeGetHydroDynamForce.first += omp_get_wtime();
69 
70  const double& dt = W.getPassport().timeDiscretizationProperties.dt;
71 
72  hydroDynamForce = { 0.0, 0.0 };
73  hydroDynamMoment = 0.0;
74 
75  viscousForce = { 0.0, 0.0 };
76  viscousMoment = 0.0;
77 
78  Point2D hDFGam = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.завихренностью
79  Point2D hDFdelta = { 0.0, 0.0 }; //гидродинамические силы, обусловленные приростом завихренности
80  Point2D hDFQ = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.источниками
81 
82  double hDMGam = 0.0; //гидродинамический момент, обусловленный присоед.завихренностью
83  double hDMdelta = 0.0; //гидродинамический момент, обусловленный приростом завихренности
84  double hDMQ = 0.0; //гидродинамический момент, обусловленный присоед.источниками
85 
86 
87  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
88  {
90  Point2D VcmOld = VeloOfAirfoilRcm((std::max(W.getCurrentStep(), (size_t)1) - 1) * dt);
91 
92  double Wcm = AngularVelocityOfAirfoil(W.getCurrentStep() * dt);
93  double WcmOld = AngularVelocityOfAirfoil((std::max(W.getCurrentStep(), (size_t)1) - 1) * dt);
94 
95  Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i));
96 
97  Point2D dr = rK - afl.rcm;
98 
99  Point2D velK = { -Wcm * dr[1], Wcm * dr[0] };
100  velK += Vcm;
101 
102  double gAtt = Wcm * (dr ^ afl.tau[i]) + (Vcm & afl.tau[i]);
103  double gAttOld = WcmOld * (dr ^ afl.tau[i]) + (VcmOld & afl.tau[i]);
104  double deltaGAtt = gAtt - gAttOld;
105 
106  double qAtt = Wcm * (dr ^ afl.nrm[i]) + (Vcm & afl.nrm[i]);
107 
109  double deltaK = boundary.sheets.freeVortexSheet(i, 0) * afl.len[i] - afl.gammaThrough[i] + deltaGAtt * afl.len[i];
110 
111  /*1*/
112  hDFdelta += deltaK * Point2D({ -dr[1], dr[0] });
113  hDMdelta += 0.5 * deltaK * dr.length2();
114 
115  /*2*/
116  hDFGam += 0.25 * (afl.getV(i) + afl.getV(i+1)).kcross() * gAtt * afl.len[i];
117  hDMGam += 0.25 * dr ^ (afl.getV(i) + afl.getV(i + 1)).kcross() * gAtt * afl.len[i];
118 
119  /*3*/
120  hDFQ -= 0.25 * (afl.getV(i) + afl.getV(i + 1)) * qAtt * afl.len[i];
121  hDMQ -= 0.25 * dr ^ (afl.getV(i) + afl.getV(i + 1)) * qAtt * afl.len[i];
122  }
123 
124  const double rho = W.getPassport().physicalProperties.rho;
125 
126  hydroDynamForce = rho * (hDFGam + hDFdelta * (1.0 / dt) + hDFQ);
127  hydroDynamMoment = rho * (hDMGam + hDMdelta / dt + hDMQ);
128 
129  if ((W.getPassport().physicalProperties.nu > 0.0) && (W.currentStep > 0))
130  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
131  {
132  Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
133  viscousForce += rho * (afl.viscousStress[i] * afl.tau[i]);
134  viscousMoment += rho * (afl.viscousStress[i] * afl.tau[i]) & rK;
135  }
136 
137  W.getTimestat().timeGetHydroDynamForce.second += omp_get_wtime();
138 }// GetHydroDynamForce()
139 
140 
141 // Вычисление скорости центра масс
143 {
144  return VelocityOfCenterOfMass(currTime);
145 }//VeloOfAirfoilRcm(...)
146 
147 
148 // Вычисление положения центра масс
150 {
151  return PositionOfCenterOfMass(currTime);
152 }//PositionOfAirfoilRcm(...)
153 
154 // Вычисление угловой скорости профиля вокруг центра масс
156 {
157  return AngularVelocity(currTime);
158 }//AngularVelocityOfAirfoil(...)
159 
160  //Вычисление угла поворота профиля
162 {
163  return RotationAngle(currTime);
164 }//AngleOfAirfoil(...)
165 
166 
167 
168 
169 
170 
171 
172 // Вычисление скоростей начал панелей
174 {
175  Point2D veloRcm = VeloOfAirfoilRcm(currTime);
176 
177  std::vector<Point2D> vel(afl.getNumberOfPanels(), { 0.0, 0.0 });
178  for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
179  {
180  vel[i][0] = (afl.getR(i) - afl.rcm).kcross()[0] * Wcm;
181  vel[i][1] = (afl.getR(i) - afl.rcm).kcross()[1] * Wcm;
182  vel[i] += veloRcm;
183  }
184 
185  afl.setV(vel);
186 }//VeloOfAirfoilPanels(...)
187 
189 {
192 
193  //Point2D airfoilVelo = VeloOfAirfoilRcm(t);
194  Point2D aflRcmOld = afl.rcm;
195  double aflPhiOld = afl.phiAfl;
196  afl.Move(PositionOfAirfoilRcm(t + dt) - aflRcmOld);
197  afl.Rotate(AngleOfAirfoil(t + dt) - aflPhiOld);
198 
199  Vcm = VeloOfAirfoilRcm(t + dt);
200  Phi = AngleOfAirfoil(t + dt);
201  Wcm = AngularVelocityOfAirfoil(t + dt);
202 }//Move()
203 
204 
206 {
207  mechParamsParser->get("timeAccel", timeAccel);
208  W.getInfo('i') << "time of accelerated movement: " << "timeAccel = " << timeAccel << std::endl;
209 
210  mechParamsParser->get("initPosition", initPosition);
211  W.getInfo('i') << "initial position: " << "initPosition = " << initPosition << std::endl;
212 
213  mechParamsParser->get("targetVelocity", targetVelocity);
214  W.getInfo('i') << "target Velocity: " << "targetVelocity = " << targetVelocity << std::endl;
215 
216  mechParamsParser->get("targetAmplitude", targetAmplitude);
217  W.getInfo('i') << "target Amplitude: " << "targetAmplitude = " << targetAmplitude << std::endl;
218 
219 
220  /*
221  mechParamsParser->get("Comega", Comega);
222 
223  W.getInfo('i') << "frequency " << "Comega = " << Comega << std::endl;
224 
225  mechParamsParser->get("CA", CA);
226 
227  W.getInfo('i') << "Amplitude CA = " << CA << std::endl;
228  */
229 }//ReadSpecificParametersFromDictionary()
const double & freeVortexSheet(size_t n, size_t moment) const
Definition: Sheet2D.h:99
Point2D viscousForce
Вектор силы и момент вязкого трения, действующие на профиль
Definition: Mechanics2D.h:146
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
std::function< double(double)> AngularVelocity
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.
virtual double AngleOfAirfoil(double currTime) override
Вычисление угла поворота профиля
const Boundary & boundary
Definition: Mechanics2D.h:91
Заголовочный файл с описанием класса World2D.
virtual Point2D VeloOfAirfoilRcm(double currTime) override
Вычисление скорости центра масс профиля
std::function< Point2D(double)> VelocityOfCenterOfMass
double hydroDynamMoment
Definition: Mechanics2D.h:143
double getCurrTime() const
Возвращает текуще время
Definition: Passport2D.h:102
Заголовочный файл с описанием класса Airfoil.
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition: Airfoil2D.h:196
double nu
Коэффициент кинематической вязкости среды
Definition: Passport2D.h:96
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
Point2D VcmOld
Скорость и отклонение с предыдущего шага
Definition: Mechanics2D.h:123
virtual Point2D PositionOfAirfoilRcm(double currTime) override
Вычисление положения центра масс профиля
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
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
Definition: PassportGen.h:127
std::function< double(double)> RotationAngle
virtual void ReadSpecificParametersFromDictionary() override
Чтение параметров конкретной механической системы
timePeriod timeGetHydroDynamForce
Начало и конец процесса вычисления нагрузок
Definition: Times2D.h:92
double rho
Плотность потока
Definition: Passport2D.h:75
Definition: Airfoil2D.h:45
Заголовочный файл с описанием класса StreamParser.
Airfoil & afl
Definition: Mechanics2D.h:87
std::function< Point2D(double)> PositionOfCenterOfMass
Класс, опеделяющий двумерный вектор
Definition: Point2D.h:75
virtual void GetHydroDynamForce() override
Вычисление гидродинамической силы, действующей на профиль
std::vector< Point2D > tau
Касательные к панелям профиля
Definition: Airfoil2D.h:182
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.
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
size_t currentStep
Текущий номер шага в решаемой задаче
Definition: WorldGen.h:69
std::vector< Point2D > nrm
Нормали к панелям профиля
Definition: Airfoil2D.h:177
double viscousMoment
Definition: Mechanics2D.h:147
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition: WorldGen.h:91
virtual void VeloOfAirfoilPanels(double currTime) override
Вычисление скоростей начал панелей
Класс, опеделяющий текущую решаемую задачу
Definition: World2D.h:68
std::vector< double > len
Длины панелей профиля
Definition: Airfoil2D.h:185
Заголовочный файл с описанием класса Velocity.
virtual double AngularVelocityOfAirfoil(double currTime) override
Вычисление угловой скорости профиля
MechanicsRigidGivenLaw(const World2D &W_, size_t numberInPassport_)
Конструктор
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
Definition: Mechanics2D.h:142
Заголовочный файл с описанием класса MechanicsRigidGivenLaw.
virtual void Move() override
Перемещение профиля в соответствии с законом
virtual void Move(const Point2D &dr)=0
Перемещение профиля
Заголовочный файл с описанием класса Boundary.
Абстрактный класс, определяющий вид механической системы
Definition: Mechanics2D.h:71