VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
VM2D::MechanicsRigidOscillPart Class Reference

Класс, определяющий вид механической системы More...

#include <Mechanics2DRigidOscillPart.h>

Inheritance diagram for VM2D::MechanicsRigidOscillPart:
Collaboration diagram for VM2D::MechanicsRigidOscillPart:

Public Member Functions

Point2D & getV ()
 текущая скорость профиля
 
Point2D & getVOld ()
 
Point2D & getR ()
 текущее отклонение профиля
 
Point2D & getROld ()
 
double & getW ()
 текущая угловая скорость профиля
 
double & getWOld ()
 
double & getPhi ()
 текущий угол поворота профиля
 
double & getPhiOld ()
 
bool & getStrongCoupling ()
 
 MechanicsRigidOscillPart (const World2D &W_, size_t numberInPassport_)
 Конструктор
 
 ~MechanicsRigidOscillPart ()
 Деструктор
 
virtual void GetHydroDynamForce () override
 Вычисление гидродинамической силы, действующей на профиль
 
virtual Point2D VeloOfAirfoilRcm (double currTime) override
 Вычисление скорости центра масс профиля
 
virtual Point2D PositionOfAirfoilRcm (double currTime) override
 Вычисление положения центра масс профиля
 
virtual double AngularVelocityOfAirfoil (double currTime) override
 Вычисление угловой скорости профиля
 
virtual double AngleOfAirfoil (double currTime) override
 Вычисление угла поворота профиля
 
virtual void VeloOfAirfoilPanels (double currTime) override
 Вычисление скоростей начал панелей
 
virtual void ReadSpecificParametersFromDictionary () override
 Чтение параметров конкретной механической системы
 
virtual void Move () override
 Перемещение профиля в соответствии с законом
 
void MoveKinematic ()
 
void MoveOnlyVelo ()
 
void Initialize (Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
 Задание начального положения и начальной скорости
 
void GenerateForcesHeader ()
 Генерация заголовка файла нагрузок
 
void GeneratePositionHeader ()
 Генерация заголовка файла положения профиля
 
void GenerateForcesString ()
 Сохранение строки со статистикой в файл нагрузок
 
void GeneratePositionString ()
 Сохранение строки со статистикой в файл нагрузок
 

Public Attributes

Point2D Vcm0
 Начальная скорость центра и угловая скорость
 
double Wcm0
 
Point2D Rcm0
 Начальное положение профиля
 
double Phi0
 
Point2D Vcm
 Текущие скорость центра и угловая скорость
 
double Wcm
 
Point2D Rcm
 Текущие положение профиля
 
double Phi
 
Point2D VcmOld
 Скорость и отклонение с предыдущего шага
 
double WcmOld
 
Point2D RcmOld
 Текущие положение профиля
 
double PhiOld
 
double circulation
 Текущая циркуляция скорости по границе профиля
 
double circulationOld
 Циркуляция скорости по границе профиля с предыдущего шага
 
const bool isMoves
 Переменная, отвечающая за то, двигается профиль или нет
 
const bool isDeform
 Переменная, отвечающая за то, деформируется профиль или нет
 
Point2D hydroDynamForce
 Вектор гидродинамической силы и момент, действующие на профиль
 
double hydroDynamMoment
 
Point2D viscousForce
 Вектор силы и момент вязкого трения, действующие на профиль
 
double viscousMoment
 

Protected Attributes

const World2DW
 Константная ссылка на решаемую задачу
 
const size_t numberInPassport
 Номер профиля в паспорте
 
Airfoilafl
 
const Boundaryboundary
 
const VortexesParamsvirtVortParams
 
std::unique_ptr< VMlib::StreamParsermechParamsParser
 Умный указатель на парсер параметров механической системы
 

Private Member Functions

void ReadParametersFromDictionary ()
 Парсинг списка параметров механической системы
 

Private Attributes

double m
 масса профиля
 
double J
 момент инерции профиля
 
Point2D b
 параметр демпфирования механической системы
 
double bw
 
Point2D k
 параметр жесткости механической системы
 
double kw
 
Point2D initDisplacement
 начальное отклонение
 
double initAngularDisplacement
 
Point2D initVelocity
 начальные скорости
 
double initAngularVelocity
 
bool strongCoupling
 признак полунеявной схемы связывания
 

Detailed Description

Класс, определяющий вид механической системы

Упруго закрепленное тело, метод расщепления

Author
Марчевский Илья Константинович
Сокол Ксения Сергеевна
Рятина Евгения Павловна
Колганова Александра Олеговна
Version
1.14
Date
6 марта 2026 г.

Definition at line 64 of file Mechanics2DRigidOscillPart.h.

Constructor & Destructor Documentation

◆ MechanicsRigidOscillPart()

MechanicsRigidOscillPart::MechanicsRigidOscillPart ( const World2D W_,
size_t  numberInPassport_ 
)

Конструктор

Parameters
[in]W_константная ссылка на решаемую задачу
[in]numberInPassport_номер профиля в паспорте задачи

Definition at line 53 of file Mechanics2DRigidOscillPart.cpp.

54 :
55 Mechanics(W_, numberInPassport_, true, false)
56 //, V0({ 0.0, 0.0 })
57 //, r0({ W_.getAirfoil(numberInPassport_).rcm[0], W_.getAirfoil(numberInPassport_).rcm[1] })
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
66 strongCoupling = false;
67
70};
double phiAfl
Поворот профиля
Definition Airfoil2D.h:100
Point2D rcm
Положение центра масс профиля
Definition Airfoil2D.h:97
Абстрактный класс, определяющий вид механической системы
Definition Mechanics2D.h:72
Point2D Vcm0
Начальная скорость центра и угловая скорость
Point2D RcmOld
Текущие положение профиля
Point2D VcmOld
Скорость и отклонение с предыдущего шага
void Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
Задание начального положения и начальной скорости
Point2D Rcm
Текущие положение профиля
Point2D Rcm0
Начальное положение профиля
Point2D Vcm
Текущие скорость центра и угловая скорость
bool strongCoupling
признак полунеявной схемы связывания
Point2D initVelocity
начальные скорости
Point2D initDisplacement
начальное отклонение
virtual void ReadSpecificParametersFromDictionary() override
Чтение параметров конкретной механической системы
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition World2D.h:163
Here is the call graph for this function:

◆ ~MechanicsRigidOscillPart()

VM2D::MechanicsRigidOscillPart::~MechanicsRigidOscillPart ( )
inline

Деструктор

Definition at line 120 of file Mechanics2DRigidOscillPart.h.

120{};

Member Function Documentation

◆ AngleOfAirfoil()

double MechanicsRigidOscillPart::AngleOfAirfoil ( double  currTime)
overridevirtual

Вычисление угла поворота профиля

Parameters
[in]currTimeтекущее время

Implements VM2D::Mechanics.

Definition at line 159 of file Mechanics2DRigidOscillPart.cpp.

160{
161 if (afl.phiAfl != Phi)
162 {
163 std::cout << "afl.phiAfl != Phi" << std::endl;
164 exit(100600);
165 }
166
167 return afl.phiAfl;
168}//AngleOfAirfoil(...)
Airfoil & afl
Definition Mechanics2D.h:87

◆ AngularVelocityOfAirfoil()

double MechanicsRigidOscillPart::AngularVelocityOfAirfoil ( double  currTime)
overridevirtual

Вычисление угловой скорости профиля

Parameters
[in]currTimeтекущее время

Implements VM2D::Mechanics.

Definition at line 154 of file Mechanics2DRigidOscillPart.cpp.

155{
156 return Wcm;
157}//AngularVelocityOfAirfoil(...)

◆ GenerateForcesHeader()

void Mechanics::GenerateForcesHeader ( )
inherited

Генерация заголовка файла нагрузок

Definition at line 126 of file Mechanics2D.cpp.

127{
128 std::stringstream forceFileName, forceFileNameCsv;
129 forceFileName << W.getPassport().dir << "forces-airfoil-" << numberInPassport;
130 forceFileNameCsv << W.getPassport().dir << "forces-airfoil-" << numberInPassport << ".csv";
131
132 std::ofstream newForcesFile(forceFileName.str());
133 std::ofstream newForcesFileCsv(forceFileNameCsv.str());
134
135 VMlib::PrintLogoToTextFile(newForcesFile, forceFileName.str(), "Hydrodynamic loads for the airfoil " + W.getPassport().airfoilParams[numberInPassport].fileAirfoil);
136
138 VMlib::PrintHeaderToTextFile(newForcesFile, "currentStep currentTime Fx Fy Mz Ftaux Ftauy Mtau");
139 else
140 VMlib::PrintHeaderToTextFile(newForcesFile, "currentStep currentTime CFx CFy CMz CFtaux CFtauy CMtau");
141
143 newForcesFileCsv << "step,time,Fx,Fy,Mz,Ftaux,Ftauy,Mtau";
144 else
145 newForcesFileCsv << "step,time,CFx,CFy,CMz,CFtaux,CFtauy,CMtau";
146
147 newForcesFile.close();
148 newForcesFile.clear();
149
150 newForcesFileCsv.close();
151 newForcesFileCsv.clear();
152
153}//GenerateForcesHeader()
const size_t numberInPassport
Номер профиля в паспорте
Definition Mechanics2D.h:82
const World2D & W
Константная ссылка на решаемую задачу
Definition Mechanics2D.h:79
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
Definition Passport2D.h:294
std::vector< AirfoilParams > airfoilParams
Список структур с параметрами профилей
Definition Passport2D.h:276
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:263
std::string dir
Рабочий каталог задачи
void PrintHeaderToTextFile(std::ofstream &str, const std::string &header)
Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D.
Definition defs.cpp:175
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
Definition defs.cpp:139
Here is the call graph for this function:

◆ GenerateForcesString()

void Mechanics::GenerateForcesString ( )
inherited

Сохранение строки со статистикой в файл нагрузок

Definition at line 184 of file Mechanics2D.cpp.

185{
186 std::stringstream forceFileName, forceFileNameCsv;
187 forceFileName << W.getPassport().dir << "forces-airfoil-" << numberInPassport;
188 forceFileNameCsv << W.getPassport().dir << "forces-airfoil-" << numberInPassport << ".csv";
189
190 //double cShock = (W.getPassport().physicalProperties.getCurrTime() > W.getPassport().physicalProperties.timeAccel + 2.0 * W.getPassport().timeDiscretizationProperties.dt) ? 1.0 : 0.0;
191 double cShock = 1.0;
192
193 Point2D cartesianHydroForce = cShock * hydroDynamForce;
194 Point2D cartesianViscoForce = cShock * viscousForce;
195
196 double cartesianHydroMoment = cShock * hydroDynamMoment;
197 double cartesianViscoMoment = cShock * viscousMoment;
198
199 double rotationAngle = W.getPassport().airfoilParams[numberInPassport].angle;
200
201 //Для обдува ветром, когда углы считаются по компасу
202 //if (W.getPassport().geographicalAngles)
203 //{
204 // cartesianHydroForce = cartesianHydroForce.rotated(-0.5 * PI - W.getPassport().airfoilParams[numberInPassport].angle);
205 // cartesianViscoForce = cartesianViscoForce.rotated(-0.5 * PI - W.getPassport().airfoilParams[numberInPassport].angle);
206 // //rotationAngle += 0.5 * PI;
207 //}
208
209 //if (W.getPassport().rotateForces)
210 //{
211 // cartesianHydroForce = cartesianHydroForce.rotated(rotationAngle);
212 // cartesianViscoForce = cartesianViscoForce.rotated(rotationAngle);
213 //}
214
217 {
218 const double& chord = W.getPassport().airfoilParams[numberInPassport].chord;
219 cartesianHydroForce /= (flowPress * chord);
220 cartesianViscoForce /= (flowPress * chord);
221
222 cartesianHydroMoment /= (flowPress * sqr(chord));
223 cartesianViscoMoment /= (flowPress * sqr(chord));
224 }
225
226
227 std::ofstream forcesFile(forceFileName.str(), std::ios::app);
228 forcesFile << std::endl << W.getCurrentStep() << " " << W.getCurrentTime() << " " << cartesianHydroForce[0] << " " << cartesianHydroForce[1] << " " << cartesianHydroMoment << " " << cartesianViscoForce[0] << " " << cartesianViscoForce[1] << " " << cartesianViscoMoment;
229 forcesFile.close();
230
231 std::ofstream forcesFileCsv(forceFileNameCsv.str(), std::ios::app);
232 forcesFileCsv << std::endl << W.getCurrentStep() << "," << W.getCurrentTime() << "," << cartesianHydroForce[0] << "," << cartesianHydroForce[1] << "," << cartesianHydroMoment << "," << cartesianViscoForce[0] << "," << cartesianViscoForce[1] << "," << cartesianViscoMoment;
233 forcesFileCsv.close();
234
235}//GenerateForcesString()
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
Point2D viscousForce
Вектор силы и момент вязкого трения, действующие на профиль
double hydroDynamMoment
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
Definition Passport2D.h:301
double getCurrentTime() const
Definition WorldGen.h:100
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition WorldGen.h:99
T sqr(T x)
Возведение числа в квадрат
Definition defs.h:455
double vRef
Референсная скорость
Definition Passport2D.h:81
double rho
Плотность потока
Definition Passport2D.h:75
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GeneratePositionHeader()

void Mechanics::GeneratePositionHeader ( )
inherited

Генерация заголовка файла положения профиля

Definition at line 157 of file Mechanics2D.cpp.

158{
159 if (isMoves)
160 {
161 std::stringstream positionFileName, positionFileNameCsv;
162 positionFileName << W.getPassport().dir << "position-airfoil-" << numberInPassport;
163 positionFileNameCsv << W.getPassport().dir << "position-airfoil-" << numberInPassport << ".csv";
164
165 std::ofstream newPositionFile(positionFileName.str());
166 std::ofstream newPositionFileCsv(positionFileNameCsv.str());
167
168 VMlib::PrintLogoToTextFile(newPositionFile, positionFileName.str(), "Position of the airfoil " + W.getPassport().airfoilParams[numberInPassport].fileAirfoil);
169
170 VMlib::PrintHeaderToTextFile(newPositionFile, "currentStep currentTime x y phi Vx Vy w");
171
172 newPositionFileCsv << "step,time,x,y,phi,Vx,Vy,w";
173
174 newPositionFile.close();
175 newPositionFile.clear();
176
177 newPositionFileCsv.close();
178 newPositionFileCsv.clear();
179 }
180}//GeneratePositionHeader()
const bool isMoves
Переменная, отвечающая за то, двигается профиль или нет
Here is the call graph for this function:

◆ GeneratePositionString()

void Mechanics::GeneratePositionString ( )
inherited

Сохранение строки со статистикой в файл нагрузок

Definition at line 239 of file Mechanics2D.cpp.

240{
241 if (isMoves)
242 {
243 std::stringstream positionFileName, positionFileNameCsv;
244 positionFileName << W.getPassport().dir << "position-airfoil-" << numberInPassport;
245 positionFileNameCsv << W.getPassport().dir << "position-airfoil-" << numberInPassport << ".csv";
246
247 std::ofstream positionFile(positionFileName.str(), std::ios::app);
248 positionFile << std::endl << W.getCurrentStep() << " " << W.getCurrentTime() << " " << afl.rcm[0] << " " << afl.rcm[1] << " " << Phi << " " << Vcm[0] << " " << Vcm[1] << " " << Wcm;
249 positionFile.close();
250
251 std::ofstream positionFileCsv(positionFileNameCsv.str(), std::ios::app);
252 positionFileCsv << std::endl << W.getCurrentStep() << "," << W.getCurrentTime() << "," << afl.rcm[0] << "," << afl.rcm[1] << "," << Phi << "," << Vcm[0] << "," << Vcm[1] << "," << Wcm;
253 positionFileCsv.close();
254 }
255}
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetHydroDynamForce()

void MechanicsRigidOscillPart::GetHydroDynamForce ( )
overridevirtual

Вычисление гидродинамической силы, действующей на профиль

Todo:
Учитываем только нулевой момент решения. Надо ли учитывать остальные?

Implements VM2D::Mechanics.

Definition at line 73 of file Mechanics2DRigidOscillPart.cpp.

74{
75 W.getTimers().start("Force");
76
77 const double& dt = W.getPassport().timeDiscretizationProperties.dt;
78
79 hydroDynamForce = { 0.0, 0.0 };
80 hydroDynamMoment = 0.0;
81
82 viscousForce = { 0.0, 0.0 };
83 viscousMoment = 0.0;
84
85 Point2D hDFGam = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.завихренностью
86 Point2D hDFdelta = { 0.0, 0.0 }; //гидродинамические силы, обусловленные приростом завихренности
87 Point2D hDFQ = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.источниками
88
89 double hDMGam = 0.0; //гидродинамический момент, обусловленный присоед.завихренностью
90 double hDMdelta = 0.0; //гидродинамический момент, обусловленный приростом завихренности
91 double hDMQ = 0.0; //гидродинамический момент, обусловленный присоед.источниками
92 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
93 {
94 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
95
96 Point2D velK = 0.5 * (afl.getV(i) + afl.getV(i + 1));
97 double gAtt = (velK & afl.tau[i]);
98
99 double gAttOld = 0.0;
100 if (W.getCurrentStep() > 0)
101 {
102 auto oldAfl = W.getOldAirfoil(numberInPassport);
103 gAttOld = ((0.5 * (oldAfl.getV(i) + oldAfl.getV(i + 1))) & oldAfl.tau[i]);
104 }
105
106 double deltaGAtt = gAtt - gAttOld;
107
108 double qAtt = (velK & afl.nrm[i]);
109
111 double deltaK = boundary.sheets.freeVortexSheet(i, 0) * afl.len[i] - afl.gammaThrough[i] + deltaGAtt * afl.len[i];
112
113 /*1*/
114 hDFdelta += deltaK * Point2D({ -rK[1], rK[0] });
115 hDMdelta += 0.5 * deltaK * rK.length2();
116
117 /*2*/
118 hDFGam += 0.5 * velK.kcross() * gAtt * afl.len[i];
119 hDMGam += 0.5 * (rK ^ velK.kcross()) * gAtt * afl.len[i];
120
121 /*3*/
122 hDFQ -= 0.5 * velK * qAtt * afl.len[i];
123 hDMQ -= 0.5 * (rK ^ velK) * qAtt * afl.len[i];
124 }
125
126 const double rho = W.getPassport().physicalProperties.rho;
127
128 hydroDynamForce = rho * (hDFGam + hDFdelta * (1.0 / dt) + hDFQ);
129 hydroDynamMoment = rho * (hDMGam + hDMdelta / dt + hDMQ);
130
131 if ((W.getPassport().physicalProperties.nu > 0.0)/* && (W.currentStep > 0)*/)
132 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
133 {
134 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
135 viscousForce += rho * afl.viscousStress[i] * afl.tau[i];
136 viscousMoment += rho * (afl.viscousStress[i] * afl.tau[i]) & rK;
137 }
138
139 W.getTimers().stop("Force");
140}// GetHydroDynamForce()
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
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition Airfoil2D.h:276
std::vector< double > viscousStress
Нейросеть для коэффициентов I0 и I3 диффузионной скорости
Definition Airfoil2D.h:268
Sheet sheets
Слои на профиле
Definition Boundary2D.h:96
const Boundary & boundary
Definition Mechanics2D.h:91
const double & freeVortexSheet(size_t n, size_t moment) const
Definition Sheet2D.h:100
const AirfoilGeometry & getOldAirfoil(size_t i) const
Возврат константной ссылки на объект старого профиля
Definition World2D.h:169
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition World2D.h:288
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
void stop(const std::string &timerLabel)
Останов счетчика
Definition TimesGen.cpp:68
void start(const std::string &timerLabel)
Запуск счетчика
Definition TimesGen.cpp:55
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 dt
Шаг по времени
Definition PassportGen.h:67
Here is the call graph for this function:

◆ getPhi()

double & VM2D::MechanicsRigidOscillPart::getPhi ( )
inline

текущий угол поворота профиля

Definition at line 108 of file Mechanics2DRigidOscillPart.h.

108{ return Phi; };
Here is the caller graph for this function:

◆ getPhiOld()

double & VM2D::MechanicsRigidOscillPart::getPhiOld ( )
inline

Definition at line 109 of file Mechanics2DRigidOscillPart.h.

109{ return PhiOld; };
Here is the caller graph for this function:

◆ getR()

Point2D & VM2D::MechanicsRigidOscillPart::getR ( )
inline

текущее отклонение профиля

Definition at line 100 of file Mechanics2DRigidOscillPart.h.

100{ return Rcm; };
Here is the caller graph for this function:

◆ getROld()

Point2D & VM2D::MechanicsRigidOscillPart::getROld ( )
inline

Definition at line 101 of file Mechanics2DRigidOscillPart.h.

101{ return RcmOld; };
Here is the caller graph for this function:

◆ getStrongCoupling()

bool & VM2D::MechanicsRigidOscillPart::getStrongCoupling ( )
inline

Definition at line 111 of file Mechanics2DRigidOscillPart.h.

111{ return strongCoupling; };
Here is the caller graph for this function:

◆ getV()

Point2D & VM2D::MechanicsRigidOscillPart::getV ( )
inline

текущая скорость профиля

Definition at line 96 of file Mechanics2DRigidOscillPart.h.

96{ return Vcm; };
Here is the caller graph for this function:

◆ getVOld()

Point2D & VM2D::MechanicsRigidOscillPart::getVOld ( )
inline

Definition at line 97 of file Mechanics2DRigidOscillPart.h.

97{ return VcmOld; };
Here is the caller graph for this function:

◆ getW()

double & VM2D::MechanicsRigidOscillPart::getW ( )
inline

текущая угловая скорость профиля

Definition at line 104 of file Mechanics2DRigidOscillPart.h.

104{ return Wcm; };
Here is the caller graph for this function:

◆ getWOld()

double & VM2D::MechanicsRigidOscillPart::getWOld ( )
inline

Definition at line 105 of file Mechanics2DRigidOscillPart.h.

105{ return WcmOld; };
Here is the caller graph for this function:

◆ Initialize()

void Mechanics::Initialize ( Point2D  Vcm0_,
Point2D  Rcm0_,
double  Wcm0_,
double  Phi0_ 
)
inherited

Задание начального положения и начальной скорости

Parameters
[in]Vcm0_- скорость центра масс
[in]Rcm0_- положение центра масс
[in]Wcm0_- угловая скорость центра масс
[in]Phi0_- угол поворота центра масс

Definition at line 93 of file Mechanics2D.cpp.

94{
95 Vcm0 = Vcm0_;
96 Wcm0 = Wcm0_;
97 Rcm0 = Rcm0_;
98 Phi0 = Phi0_;
99
100 Vcm = Vcm0;
101 Wcm = Wcm0;
102 Rcm = Rcm0;
103 Phi = Phi0;
104 VcmOld = Vcm0;
105 WcmOld = Wcm0;
106 RcmOld = Rcm0;
107 PhiOld = Phi0;
108
109 circulation = 2.0 * afl.area * Wcm;
111
114}//Initialize(...)
double area
Площадь профиля
Definition Airfoil2D.h:103
virtual void Move(const Point2D &dr)
Перемещение профиля
virtual void Rotate(double alpha)
Поворот профиля
double circulationOld
Циркуляция скорости по границе профиля с предыдущего шага
double circulation
Текущая циркуляция скорости по границе профиля
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Move()

void MechanicsRigidOscillPart::Move ( )
overridevirtual

Перемещение профиля в соответствии с законом

Implements VM2D::Mechanics.

Definition at line 187 of file Mechanics2DRigidOscillPart.cpp.

188{
189 Point2D meff;
190 //if (W.getPassport().airfoilParams[numberInPassport].addedMass.length2() > 0)
191 // meff = Point2D{ m + W.getPassport().airfoilParams[numberInPassport].addedMass[0], m + W.getPassport().airfoilParams[numberInPassport].addedMass[1] };
192 //else
193 meff = Point2D{ m, m };
194
195 double Jeff = J;
196
198 double M = hydroDynamMoment + viscousMoment;
199
200 VcmOld = Vcm;
201 RcmOld = Rcm;
202 PhiOld = Phi;
203 WcmOld = Wcm;
204
205 Point2D dr, dV;
206 double dphi, dw;
207
208 //W.getInfo('t') << "k = " << k << std::endl;
209
210 if (k[0] > 0)
211 {
213 Point2D kk[4];
214
215 kk[0] = { Vcm[0], (F[0] - 2.0 * b[0] * Vcm[0] - k[0] * Rcm[0]) / meff[0] };
216 kk[1] = { Vcm[0] + 0.5 * dt * kk[0][1], (F[0] - 2.0 * b[0] * (Vcm[0] + 0.5 * dt * kk[0][1]) - k[0] * (Rcm[0] + 0.5 * dt * kk[0][0])) / meff[0] };
217 kk[2] = { Vcm[0] + 0.5 * dt * kk[1][1], (F[0] - 2.0 * b[0] * (Vcm[0] + 0.5 * dt * kk[1][1]) - k[0] * (Rcm[0] + 0.5 * dt * kk[1][0])) / meff[0] };
218 kk[3] = { Vcm[0] + dt * kk[2][1], (F[0] - 2.0 * b[0] * (Vcm[0] + dt * kk[2][1]) - k[0] * (Rcm[0] + dt * kk[2][0])) / meff[0] };
219
220 dr[0] = dt * (kk[0][0] + 2. * kk[1][0] + 2. * kk[2][0] + kk[3][0]) / 6.0;
221 dV[0] = dt * (kk[0][1] + 2. * kk[1][1] + 2. * kk[2][1] + kk[3][1]) / 6.0;
222 }
223 else
224 {
225 dr[0] = 0.0;
226 dV[0] = 0.0;
227 }
228
229
230
231 if (k[1] > 0)
232 {
234 Point2D kk[4];
235 kk[0] = { Vcm[1], (F[1] - 2.0 * b[1] * Vcm[1] - k[1] * Rcm[1]) / meff[1]};
236 kk[1] = { Vcm[1] + 0.5 * dt * kk[0][1], (F[1] - 2.0 * b[1] * (Vcm[1] + 0.5 * dt * kk[0][1]) - k[1] * (Rcm[1] + 0.5 * dt * kk[0][0])) / meff[1]};
237 kk[2] = { Vcm[1] + 0.5 * dt * kk[1][1], (F[1] - 2.0 * b[1] * (Vcm[1] + 0.5 * dt * kk[1][1]) - k[1] * (Rcm[1] + 0.5 * dt * kk[1][0])) / meff[1]};
238 kk[3] = { Vcm[1] + dt * kk[2][1], (F[1] - 2.0 * b[1] * (Vcm[1] + dt * kk[2][1]) - k[1] * (Rcm[1] + dt * kk[2][0])) / meff[1]};
239
240 dr[1] = dt * (kk[0][0] + 2. * kk[1][0] + 2. * kk[2][0] + kk[3][0]) / 6.0;
241 dV[1] = dt * (kk[0][1] + 2. * kk[1][1] + 2. * kk[2][1] + kk[3][1]) / 6.0;
242 }
243 else
244 {
245 dr[1] = 0.0;
246 dV[1] = 0.0;
247 }
248
249
250
251 if (kw > 0)
252 {
254 Point2D kk[4];
255
256 kk[0] = { Wcm, (M - 2.0 * bw * Wcm - kw * Phi) / Jeff };
257 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])) / Jeff };
258 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])) / Jeff };
259 kk[3] = { Wcm + dt * kk[2][1], (M - 2.0 * bw * (Wcm + dt * kk[2][1]) - kw * (Phi + dt * kk[2][0])) / Jeff };
260
261 dphi = dt * (kk[0][0] + 2. * kk[1][0] + 2. * kk[2][0] + kk[3][0]) / 6.0;
262 dw = dt * (kk[0][1] + 2. * kk[1][1] + 2. * kk[2][1] + kk[3][1]) / 6.0;
263 }
264 else
265 {
266 dphi = 0.0;
267 dw = 0.0;
268 }
269
270 afl.Move(dr);
271 afl.Rotate(dphi);
272
273 Rcm += dr;
274 Vcm += dV;
275
276 Phi += dphi;
277 Wcm += dw;
278}//Move()
double m
масса профиля
Point2D b
параметр демпфирования механической системы
Point2D k
параметр жесткости механической системы
double J
момент инерции профиля
Here is the call graph for this function:

◆ MoveKinematic()

void MechanicsRigidOscillPart::MoveKinematic ( )

Definition at line 282 of file Mechanics2DRigidOscillPart.cpp.

283{
284 VcmOld = Vcm;
285 RcmOld = Rcm;
286
287 Point2D dr, dV;
289
290 if (k[1] > 0)
291 {
292 dr[1] = Vcm[1] * dt;
293 dV[1] = 0.0;
294 }
295 else
296 {
297 dr[1] = 0.0;
298 dV[1] = 0.0;
299 }
300
301
302 if (k[0] > 0)
303 {
304 dr[0] = Vcm[0] * dt;
305 dV[0] = 0.0;
306 }
307 else
308 {
309 dr[0] = 0.0;
310 dV[0] = 0.0;
311 }
312
313 afl.Move(dr);
314
315 Rcm += dr;
316 Vcm += dV;
317}//MoveKinematic()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ MoveOnlyVelo()

void MechanicsRigidOscillPart::MoveOnlyVelo ( )

Definition at line 320 of file Mechanics2DRigidOscillPart.cpp.

321{
322 Point2D meff;
323 if (W.getPassport().airfoilParams[numberInPassport].addedMass.length2() > 0)
324 meff = Point2D{ m + W.getPassport().airfoilParams[numberInPassport].addedMass[0], m + W.getPassport().airfoilParams[numberInPassport].addedMass[1] };
325 else
326 meff = Point2D{ m, m };
327
328 Point2D dr, dV;
329
330 if (k[1] > 0)
331 {
333 Point2D kk[4];
334
335 kk[0] = { Vcm[1], (hydroDynamForce[1] - 2.0 * b[1] * Vcm[1] - k[1] * Rcm[1]) / meff[1]};
336 kk[1] = { Vcm[1] + 0.5 * dt * kk[0][1], (hydroDynamForce[1] - 2.0 * b[1] * (Vcm[1] + 0.5 * dt * kk[0][1]) - k[1] * (Rcm[1] + 0.5 * dt * kk[0][0])) / meff[1]};
337 kk[2] = { Vcm[1] + 0.5 * dt * kk[1][1], (hydroDynamForce[1] - 2.0 * b[1] * (Vcm[1] + 0.5 * dt * kk[1][1]) - k[1] * (Rcm[1] + 0.5 * dt * kk[1][0])) / meff[1]};
338 kk[3] = { Vcm[1] + dt * kk[2][1], (hydroDynamForce[1] - 2.0 * b[1] * (Vcm[1] + dt * kk[2][1]) - k[1] * (Rcm[1] + dt * kk[2][0])) / meff[1]};
339
340 dr[1] = 0.0;// dt* (kk[0][0] + 2.0 * kk[1][0] + 2.0 * kk[2][0] + kk[3][0]) / 6.0;
341 dV[1] = dt * (kk[0][1] + 2.0 * kk[1][1] + 2.0 * kk[2][1] + kk[3][1]) / 6.0;
342 }
343 else
344 {
345 dr[1] = 0.0;
346 dV[1] = 0.0;
347 }
348
349
350 if (k[0] > 0)
351 {
353 Point2D kk[4];
354
355 kk[0] = { Vcm[0], (hydroDynamForce[0] - 2.0 * b[0] * Vcm[0] - k[0] * Rcm[0]) / meff[0]};
356 kk[1] = { Vcm[0] + 0.5 * dt * kk[0][1], (hydroDynamForce[0] - 2.0 * b[0] * (Vcm[0] + 0.5 * dt * kk[0][1]) - k[0] * (Rcm[0] + 0.5 * dt * kk[0][0])) / meff[0]};
357 kk[2] = { Vcm[0] + 0.5 * dt * kk[1][1], (hydroDynamForce[0] - 2.0 * b[0] * (Vcm[0] + 0.5 * dt * kk[1][1]) - k[0] * (Rcm[0] + 0.5 * dt * kk[1][0])) / meff[0]};
358 kk[3] = { Vcm[0] + dt * kk[2][1], (hydroDynamForce[0] - 2.0 * b[0] * (Vcm[0] + dt * kk[2][1]) - k[0] * (Rcm[0] + dt * kk[2][0])) / meff[0]};
359
360 dr[0] = 0.0; // dt* (kk[0][0] + 2.0 * kk[1][0] + 2.0 * kk[2][0] + kk[3][0]) / 6.0;
361 dV[0] = dt * (kk[0][1] + 2.0 * kk[1][1] + 2.0 * kk[2][1] + kk[3][1]) / 6.0;
362 }
363 else
364 {
365 dr[0] = 0.0;
366 dV[0] = 0.0;
367 }
368
369 //afl.Move({ dx, dy });
370 Vcm += dV;
371
372}//MoveOnlyVelo()
Here is the call graph for this function:
Here is the caller graph for this function:

◆ PositionOfAirfoilRcm()

Point2D MechanicsRigidOscillPart::PositionOfAirfoilRcm ( double  currTime)
overridevirtual

Вычисление положения центра масс профиля

Parameters
[in]currTimeтекущее время

Implements VM2D::Mechanics.

Definition at line 149 of file Mechanics2DRigidOscillPart.cpp.

150{
151 return Rcm;
152}//PositionOfAirfoilRcm(...)

◆ ReadParametersFromDictionary()

void Mechanics::ReadParametersFromDictionary ( )
privateinherited

Парсинг списка параметров механической системы

Definition at line 117 of file Mechanics2D.cpp.

118{
119 std::stringstream ss(W.getPassport().airfoilParams[afl.numberInPassport].mechanicalSystemParameters);
120
121 mechParamsParser.reset(new VMlib::StreamParser(W.getInfo(), "mechanical parser", ss));
122}//ReadParametersFromDictionary()
const size_t numberInPassport
Номер профиля в паспорте
Definition Airfoil2D.h:188
std::unique_ptr< VMlib::StreamParser > mechParamsParser
Умный указатель на парсер параметров механической системы
Definition Mechanics2D.h:98
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
Definition WorldGen.h:82
Here is the call graph for this function:

◆ ReadSpecificParametersFromDictionary()

virtual void VM2D::MechanicsRigidOscillPart::ReadSpecificParametersFromDictionary ( )
overridevirtual

Чтение параметров конкретной механической системы

Implements VM2D::Mechanics.

Here is the caller graph for this function:

◆ VeloOfAirfoilPanels()

void MechanicsRigidOscillPart::VeloOfAirfoilPanels ( double  currTime)
overridevirtual

Вычисление скоростей начал панелей

Parameters
[in]currTimeтекущее время

Implements VM2D::Mechanics.

Definition at line 171 of file Mechanics2DRigidOscillPart.cpp.

172{
173 Point2D veloRcm = VeloOfAirfoilRcm(currTime);
174
175 std::vector<Point2D> veloW(afl.getNumberOfPanels());
176 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
177 veloW[i] = veloRcm + Wcm * (afl.getR(i) - Rcm).kcross();
178
179 afl.setV(veloW);
180
182 circulation = 2.0 * afl.area * Wcm;
183
184}//VeloOfAirfoilPanels(...)
void setV(const Point2D &vel)
Установка постоянной скорости всех вершин профиля
Definition Airfoil2D.h:145
virtual Point2D VeloOfAirfoilRcm(double currTime) override
Вычисление скорости центра масс профиля
Here is the call graph for this function:

◆ VeloOfAirfoilRcm()

Point2D MechanicsRigidOscillPart::VeloOfAirfoilRcm ( double  currTime)
overridevirtual

Вычисление скорости центра масс профиля

Parameters
[in]currTimeтекущее время

Implements VM2D::Mechanics.

Definition at line 143 of file Mechanics2DRigidOscillPart.cpp.

144{
145 return Vcm;
146}//VeloOfAirfoilRcm(...)
Here is the caller graph for this function:

Member Data Documentation

◆ afl

Airfoil& VM2D::Mechanics::afl
protectedinherited

Константная ссылка на профиль
инициализируется автоматом в конструкторе, при помощи const_cast

Warning
использует const_cast для получения неконстантной ссылки

Definition at line 87 of file Mechanics2D.h.

◆ b

Point2D VM2D::MechanicsRigidOscillPart::b
private

параметр демпфирования механической системы

Definition at line 76 of file Mechanics2DRigidOscillPart.h.

◆ boundary

const Boundary& VM2D::Mechanics::boundary
protectedinherited

Константная ссылка на граничное условие
инициализируется автоматом в конструкторе

Definition at line 91 of file Mechanics2D.h.

◆ bw

double VM2D::MechanicsRigidOscillPart::bw
private

Definition at line 77 of file Mechanics2DRigidOscillPart.h.

◆ circulation

double VM2D::Mechanics::circulation
inherited

Текущая циркуляция скорости по границе профиля

Definition at line 121 of file Mechanics2D.h.

◆ circulationOld

double VM2D::Mechanics::circulationOld
inherited

Циркуляция скорости по границе профиля с предыдущего шага

Definition at line 124 of file Mechanics2D.h.

◆ hydroDynamForce

Point2D VM2D::Mechanics::hydroDynamForce
inherited

Вектор гидродинамической силы и момент, действующие на профиль

Definition at line 134 of file Mechanics2D.h.

◆ hydroDynamMoment

double VM2D::Mechanics::hydroDynamMoment
inherited

Definition at line 135 of file Mechanics2D.h.

◆ initAngularDisplacement

double VM2D::MechanicsRigidOscillPart::initAngularDisplacement
private

Definition at line 85 of file Mechanics2DRigidOscillPart.h.

◆ initAngularVelocity

double VM2D::MechanicsRigidOscillPart::initAngularVelocity
private

Definition at line 89 of file Mechanics2DRigidOscillPart.h.

◆ initDisplacement

Point2D VM2D::MechanicsRigidOscillPart::initDisplacement
private

начальное отклонение

Definition at line 84 of file Mechanics2DRigidOscillPart.h.

◆ initVelocity

Point2D VM2D::MechanicsRigidOscillPart::initVelocity
private

начальные скорости

Definition at line 88 of file Mechanics2DRigidOscillPart.h.

◆ isDeform

const bool VM2D::Mechanics::isDeform
inherited

Переменная, отвечающая за то, деформируется профиль или нет

Definition at line 131 of file Mechanics2D.h.

◆ isMoves

const bool VM2D::Mechanics::isMoves
inherited

Переменная, отвечающая за то, двигается профиль или нет

Definition at line 128 of file Mechanics2D.h.

◆ J

double VM2D::MechanicsRigidOscillPart::J
private

момент инерции профиля

Definition at line 73 of file Mechanics2DRigidOscillPart.h.

◆ k

Point2D VM2D::MechanicsRigidOscillPart::k
private

параметр жесткости механической системы

Definition at line 80 of file Mechanics2DRigidOscillPart.h.

◆ kw

double VM2D::MechanicsRigidOscillPart::kw
private

Definition at line 81 of file Mechanics2DRigidOscillPart.h.

◆ m

double VM2D::MechanicsRigidOscillPart::m
private

масса профиля

Definition at line 70 of file Mechanics2DRigidOscillPart.h.

◆ mechParamsParser

std::unique_ptr<VMlib::StreamParser> VM2D::Mechanics::mechParamsParser
protectedinherited

Умный указатель на парсер параметров механической системы

Definition at line 98 of file Mechanics2D.h.

◆ numberInPassport

const size_t VM2D::Mechanics::numberInPassport
protectedinherited

Номер профиля в паспорте

Definition at line 82 of file Mechanics2D.h.

◆ Phi

double VM2D::Mechanics::Phi
inherited

Definition at line 112 of file Mechanics2D.h.

◆ Phi0

double VM2D::Mechanics::Phi0
inherited

Definition at line 106 of file Mechanics2D.h.

◆ PhiOld

double VM2D::Mechanics::PhiOld
inherited

Definition at line 118 of file Mechanics2D.h.

◆ Rcm

Point2D VM2D::Mechanics::Rcm
inherited

Текущие положение профиля

Definition at line 112 of file Mechanics2D.h.

◆ Rcm0

Point2D VM2D::Mechanics::Rcm0
inherited

Начальное положение профиля

Definition at line 106 of file Mechanics2D.h.

◆ RcmOld

Point2D VM2D::Mechanics::RcmOld
inherited

Текущие положение профиля

Definition at line 118 of file Mechanics2D.h.

◆ strongCoupling

bool VM2D::MechanicsRigidOscillPart::strongCoupling
private

признак полунеявной схемы связывания

Definition at line 92 of file Mechanics2DRigidOscillPart.h.

◆ Vcm

Point2D VM2D::Mechanics::Vcm
inherited

Текущие скорость центра и угловая скорость

Definition at line 109 of file Mechanics2D.h.

◆ Vcm0

Point2D VM2D::Mechanics::Vcm0
inherited

Начальная скорость центра и угловая скорость

Definition at line 103 of file Mechanics2D.h.

◆ VcmOld

Point2D VM2D::Mechanics::VcmOld
inherited

Скорость и отклонение с предыдущего шага

Definition at line 115 of file Mechanics2D.h.

◆ virtVortParams

const VortexesParams& VM2D::Mechanics::virtVortParams
protectedinherited

Константная ссылка на структуру с параметрами виртуального вихревого слоя для профиля
инициализируется автоматом в конструкторе

Definition at line 95 of file Mechanics2D.h.

◆ viscousForce

Point2D VM2D::Mechanics::viscousForce
inherited

Вектор силы и момент вязкого трения, действующие на профиль

Definition at line 138 of file Mechanics2D.h.

◆ viscousMoment

double VM2D::Mechanics::viscousMoment
inherited

Definition at line 139 of file Mechanics2D.h.

◆ W

const World2D& VM2D::Mechanics::W
protectedinherited

Константная ссылка на решаемую задачу

Definition at line 79 of file Mechanics2D.h.

◆ Wcm

double VM2D::Mechanics::Wcm
inherited

Definition at line 109 of file Mechanics2D.h.

◆ Wcm0

double VM2D::Mechanics::Wcm0
inherited

Definition at line 103 of file Mechanics2D.h.

◆ WcmOld

double VM2D::Mechanics::WcmOld
inherited

Definition at line 115 of file Mechanics2D.h.


The documentation for this class was generated from the following files: