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

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

#include <Mechanics2DDeformable.h>

Inheritance diagram for VM2D::MechanicsDeformable:
Collaboration diagram for VM2D::MechanicsDeformable:

Public Member Functions

Point2DgetVcm ()
 текущая скорость профиля
 
Point2DgetRcm ()
 текущее отклонение профиля
 
double & getWcm ()
 текущая угловая скорость профиля
 
double & getPhicm ()
 текущий угол поворота профиля
 
 MechanicsDeformable (const World2D &W_, size_t numberInPassport_)
 Конструктор
 
 ~MechanicsDeformable ()
 Деструктор
 
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 Initialize (Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
 Задание начального положения и начальной скорости
 
void GenerateForcesHeader ()
 Генерация заголовка файла нагрузок
 
void GeneratePositionHeader ()
 Генерация заголовка файла положения профиля
 
void GenerateForcesString ()
 Сохранение строки со статистикой в файл нагрузок
 
void GeneratePositionString ()
 Сохранение строки со статистикой в файл нагрузок
 

Public Attributes

size_t indexOfUpperRightAngle
 хорда
 
size_t indexOfUpperLeftAngle
 
size_t indexOfLowerRightAngle
 
size_t indexOfLowerLeftAngle
 
std::vector< ChordPanelinitialChord
 
std::vector< ChordPanelchord
 
std::vector< double > upperShifts
 
std::vector< double > lowerShifts
 
std::unique_ptr< Beambeam
 
std::vector< std::vector< Point2D > > initialPossibleWays
 
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 deformParam
 
bool fsi
 

Detailed Description

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

Деформируемое твердое тело

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

Definition at line 129 of file Mechanics2DDeformable.h.

Constructor & Destructor Documentation

◆ MechanicsDeformable()

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

Конструктор

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

Definition at line 163 of file Mechanics2DDeformable.cpp.

164 :
165 Mechanics(W_, numberInPassport_, true, true)
166{
167 const auto& airfoil = W_.getAirfoil(numberInPassport_);
168
169 Vcm0 = { 0.0, 0.0 };
170 Rcm0 = { airfoil.rcm[0], airfoil.rcm[1] };
171 Vcm = Vcm0;
172 Rcm = Rcm0;
173 VcmOld = Vcm0;
174 RcmOld = Rcm;
175
176
178
179 Point2D zero = { 0.0, 0.0 };
180
181 Initialize(zero, airfoil.rcm + zero, 0.0, airfoil.phiAfl + 0.0);
182
183 if (airfoil.phiAfl != 0)
184 {
185 W.getInfo('e') << "Airfoil rotation for Turek problem is not allowed" << std::endl;
186 exit(2345);
187 }
188
189 if (fsi)
190 {
191 //Turek
192 //Выделение упругой хорды
194 double x0 = airfoil.getR(indexOfUpperRightAngle)[0];
195 double x1 = x0;
196 while (fabs(x1 - x0) < 1e-12)
197 {
199 x0 = x1;
200 x1 = airfoil.getR(indexOfUpperRightAngle)[0];
201 }
203
205 for (size_t i = 0; i < upperShifts.size(); ++i)
206 upperShifts[i] = airfoil.getR(i + 1)[1] - airfoil.getR(0)[1];
207
208
210 double y0 = airfoil.getR(indexOfUpperLeftAngle)[1];
211 double y1 = y0;
212 while (fabs(y1 - y0) < 1e-12)
213 {
215 y0 = y1;
216 y1 = airfoil.getR(indexOfUpperLeftAngle)[1];
217 }
219
220
221 indexOfLowerRightAngle = airfoil.getNumberOfPanels() + 1;
222 x0 = airfoil.getR(indexOfLowerRightAngle)[0];
223 x1 = x0;
224 while (fabs(x1 - x0) < 1e-12)
225 {
227 x0 = x1;
228 x1 = airfoil.getR(indexOfLowerRightAngle)[0];
229 }
231
232
233 lowerShifts.resize(airfoil.getNumberOfPanels() - indexOfLowerRightAngle - 1);
234 for (size_t i = 0; i < lowerShifts.size(); ++i)
235 lowerShifts[i] = airfoil.getR(airfoil.getNumberOfPanels() - 1 - i)[1] - airfoil.getR(0)[1];
236
238 y0 = airfoil.getR(indexOfLowerLeftAngle)[1];
239 y1 = y0;
240 while (fabs(y1 - y0) < 1e-12)
241 {
243 y0 = y1;
244 y1 = airfoil.getR(indexOfLowerLeftAngle)[1];
245 }
247
248 //W.getInfo('i') << "UR: " << airfoil.getR(indexOfUpperRightAngle) << std::endl;
249 //W.getInfo('i') << "UL: " << airfoil.getR(indexOfUpperLeftAngle) << std::endl;
250 //W.getInfo('i') << "LR: " << airfoil.getR(indexOfLowerRightAngle) << std::endl;
251 //W.getInfo('i') << "LL: " << airfoil.getR(indexOfLowerLeftAngle) << std::endl;
252
254 {
255 W.getInfo('e') << "indexOfUpperLeftAngle - indexOfUpperRightAngle != indexOfLowerRightAngle - indexOfLowerLeftAngle" << std::endl;
256 exit(2346);
257 }
258
260
261 for (size_t i = 0; i < indexOfUpperLeftAngle - indexOfUpperRightAngle; ++i)
262 {
263 size_t idxUp = indexOfUpperLeftAngle - 1 - i;
264 size_t idxDn = indexOfLowerLeftAngle + i;
265 Point2D rUpLeft = airfoil.getR(idxUp + 1);
266 Point2D rUpRight = airfoil.getR(idxUp);
267 Point2D rDnLeft = airfoil.getR(idxDn);
268 Point2D rDnRight = airfoil.getR(idxDn + 1);
269
270 if (std::max(fabs(rUpLeft[0] - rDnLeft[0]), fabs(rUpRight[0] - rDnRight[0])) > \
271 0.01 * std::min((rUpRight[0] - rUpLeft[0]), (rDnRight[0] - rDnLeft[0])))
272 {
273 W.getInfo('e') << "x_up != x_dn" << std::endl;
274 exit(2347);
275 }
276
277 chord[i].beg = 0.5 * (rUpLeft + rDnLeft);
278 chord[i].end = 0.5 * (rUpRight + rDnRight);
279 chord[i].infPanels = { idxUp, idxDn };
280 chord[i].rightSemiWidth = 0.5 * (rUpRight - rDnRight)[1];
281 }
283 beam = std::make_unique<Beam>(W, fsi, chord[0].beg[0], initialChord.back().end[0] - initialChord[0].beg[0], 3); //Beam
284 }
285 else //Fish
286 {
287 int np = (int)airfoil.getNumberOfPanels();
288 chord.resize(np / 2);
289
290 chord[0].beg = airfoil.getR(np / 2);
291 chord[np / 2 - 1].end = airfoil.getR(0);
292 chord[np / 2 - 1].rightSemiWidth = 0.0;
293
294 for (size_t i = 0; i < np / 2; ++i)
295 {
296 if (i != 0)
297 chord[i].beg = 0.5 * (airfoil.getR(np / 2 - i) + airfoil.getR(np / 2 + i));
298
299 if (i != np / 2 - 1)
300 chord[i].end = 0.5 * (airfoil.getR(np / 2 - i - 1) + airfoil.getR(np / 2 + i + 1));
301
302 chord[i].infPanels = { np / 2 - i, np / 2 + i + 1 };
303
304 if (i != np / 2 - 1)
305 chord[i].rightSemiWidth = (airfoil.getR(np / 2 - i - 1) - airfoil.getR(np / 2 + i + 1)).length() * 0.5;
306 }
308 beam = std::make_unique<Beam>(W, fsi, chord[0].beg[0], initialChord.back().end[0] - initialChord[0].beg[0], 3); //Beam
309 }
310
311 //std::ofstream of("chord.txt");
312 //for (size_t i = 0; i < chord.size(); ++i)
313 // of << chord[i].beg[0] << " " << chord[i].beg[1] << " " << chord[i].end[0] << " " << chord[i].end[1] << " " << chord[i].infPanels.first << " " << chord[i].infPanels.second << std::endl;
314 //of.close();
315
316
317
318 initialPossibleWays = airfoil.possibleWays;
319};
virtual void ReadSpecificParametersFromDictionary() override
Чтение параметров конкретной механической системы
std::vector< ChordPanel > initialChord
std::vector< std::vector< Point2D > > initialPossibleWays
std::vector< double > upperShifts
std::vector< double > lowerShifts
std::vector< ChordPanel > chord
std::unique_ptr< Beam > beam
Абстрактный класс, определяющий вид механической системы
Definition Mechanics2D.h:72
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 Vcm
Текущие скорость центра и угловая скорость
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition World2D.h:157
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
Definition WorldGen.h:82
Here is the call graph for this function:

◆ ~MechanicsDeformable()

VM2D::MechanicsDeformable::~MechanicsDeformable ( )
inline

Деструктор

Definition at line 159 of file Mechanics2DDeformable.h.

159{};

Member Function Documentation

◆ AngleOfAirfoil()

double MechanicsDeformable::AngleOfAirfoil ( double  currTime)
overridevirtual

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

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

Implements VM2D::Mechanics.

Definition at line 408 of file Mechanics2DDeformable.cpp.

409{
410 if (afl.phiAfl != Phi)
411 {
412 std::cout << "afl.phiAfl != Phi" << std::endl;
413 exit(100600);
414 }
415
416 return afl.phiAfl;
417}//AngleOfAirfoil(...)
double phiAfl
Поворот профиля
Definition Airfoil2D.h:100
Airfoil & afl
Definition Mechanics2D.h:87

◆ AngularVelocityOfAirfoil()

double MechanicsDeformable::AngularVelocityOfAirfoil ( double  currTime)
overridevirtual

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

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

Implements VM2D::Mechanics.

Definition at line 403 of file Mechanics2DDeformable.cpp.

404{
405 return Wcm;
406}//AngularVelocityOfAirfoil(...)

◆ GenerateForcesHeader()

void Mechanics::GenerateForcesHeader ( )
inherited

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

Definition at line 125 of file Mechanics2D.cpp.

126{
127 std::stringstream forceFileName, forceFileNameCsv;
128 forceFileName << W.getPassport().dir << "forces-airfoil-" << numberInPassport;
129 forceFileNameCsv << W.getPassport().dir << "forces-airfoil-" << numberInPassport << ".csv";
130
131 std::ofstream newForcesFile(forceFileName.str());
132 std::ofstream newForcesFileCsv(forceFileNameCsv.str());
133
134 VMlib::PrintLogoToTextFile(newForcesFile, forceFileName.str(), "Hydrodynamic loads for the airfoil " + W.getPassport().airfoilParams[numberInPassport].fileAirfoil);
135
137 VMlib::PrintHeaderToTextFile(newForcesFile, "currentStep currentTime Fx Fy Mz Ftaux Ftauy Mtau");
138 else
139 VMlib::PrintHeaderToTextFile(newForcesFile, "currentStep currentTime CFx CFy CMz CFtaux CFtauy CMtau");
140
142 newForcesFileCsv << "step,time,Fx,Fy,Mz,Ftaux,Ftauy,Mtau";
143 else
144 newForcesFileCsv << "step,time,CFx,CFy,CMz,CFtaux,CFtauy,CMtau";
145
146 newForcesFile.close();
147 newForcesFile.clear();
148
149 newForcesFileCsv.close();
150 newForcesFileCsv.clear();
151
152}//GenerateForcesHeader()
const size_t numberInPassport
Номер профиля в паспорте
Definition Mechanics2D.h:82
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
Definition Passport2D.h:282
std::vector< AirfoilParams > airfoilParams
Список структур с параметрами профилей
Definition Passport2D.h:273
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:251
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 183 of file Mechanics2D.cpp.

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

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

◆ GeneratePositionString()

void Mechanics::GeneratePositionString ( )
inherited

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

Definition at line 238 of file Mechanics2D.cpp.

239{
240 if (isMoves)
241 {
242 std::stringstream positionFileName, positionFileNameCsv;
243 positionFileName << W.getPassport().dir << "position-airfoil-" << numberInPassport;
244 positionFileNameCsv << W.getPassport().dir << "position-airfoil-" << numberInPassport << ".csv";
245
246 std::ofstream positionFile(positionFileName.str(), std::ios::app);
247 positionFile << std::endl << W.getCurrentStep() << " " << W.getCurrentTime() << " " << afl.rcm[0] << " " << afl.rcm[1] << " " << Phi << " " << Vcm[0] << " " << Vcm[1] << " " << Wcm;
248 positionFile.close();
249
250 std::ofstream positionFileCsv(positionFileNameCsv.str(), std::ios::app);
251 positionFileCsv << std::endl << W.getCurrentStep() << "," << W.getCurrentTime() << "," << afl.rcm[0] << "," << afl.rcm[1] << "," << Phi << "," << Vcm[0] << "," << Vcm[1] << "," << Wcm;
252 positionFileCsv.close();
253 }
254}
Point2D rcm
Положение центра масс профиля
Definition Airfoil2D.h:97
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetHydroDynamForce()

void MechanicsDeformable::GetHydroDynamForce ( )
overridevirtual

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

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

Implements VM2D::Mechanics.

Definition at line 322 of file Mechanics2DDeformable.cpp.

323{
324 W.getTimers().start("Force");
325
326 const double& dt = W.getPassport().timeDiscretizationProperties.dt;
327
328 hydroDynamForce = { 0.0, 0.0 };
329 hydroDynamMoment = 0.0;
330
331 viscousForce = { 0.0, 0.0 };
332 viscousMoment = 0.0;
333
334 Point2D hDFGam = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.завихренностью
335 Point2D hDFdelta = { 0.0, 0.0 }; //гидродинамические силы, обусловленные приростом завихренности
336 Point2D hDFQ = { 0.0, 0.0 }; //гидродинамические силы, обусловленные присоед.источниками
337
338 double hDMGam = 0.0; //гидродинамический момент, обусловленный присоед.завихренностью
339 double hDMdelta = 0.0; //гидродинамический момент, обусловленный приростом завихренности
340 double hDMQ = 0.0; //гидродинамический момент, обусловленный присоед.источниками
341 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
342 {
343 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
344
345 Point2D velK = 0.5 * (afl.getV(i) + afl.getV(i + 1));
346 double gAtt = (velK & afl.tau[i]);
347
348 double gAttOld = 0.0;
349 if (W.getCurrentStep() > 0)
350 {
351 auto oldAfl = W.getOldAirfoil(numberInPassport);
352 gAttOld = ((0.5 * (oldAfl.getV(i) + oldAfl.getV(i + 1))) & oldAfl.tau[i]);
353 }
354
355 double deltaGAtt = gAtt - gAttOld;
356
357 double qAtt = (velK & afl.nrm[i]);
358
360 double deltaK = boundary.sheets.freeVortexSheet(i, 0) * afl.len[i] - afl.gammaThrough[i] + deltaGAtt * afl.len[i];
361
362 /*1*/
363 hDFdelta += deltaK * Point2D({ -rK[1], rK[0] });
364 hDMdelta += 0.5 * deltaK * rK.length2();
365
366 /*2*/
367 hDFGam += 0.5 * velK.kcross() * gAtt * afl.len[i];
368 hDMGam += 0.5 * (rK ^ velK.kcross()) * gAtt * afl.len[i];
369
370 /*3*/
371 hDFQ -= 0.5 * velK * qAtt * afl.len[i];
372 hDMQ -= 0.5 * (rK ^ velK) * qAtt * afl.len[i];
373 }
374
375 const double rho = W.getPassport().physicalProperties.rho;
376
377 hydroDynamForce = rho * (hDFGam + hDFdelta * (1.0 / dt) + hDFQ);
378 hydroDynamMoment = rho * (hDMGam + hDMdelta / dt + hDMQ);
379
380 if ((W.getPassport().physicalProperties.nu > 0.0)/* && (W.currentStep > 0)*/)
381 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
382 {
383 Point2D rK = 0.5 * (afl.getR(i + 1) + afl.getR(i)) - afl.rcm;
384 viscousForce += rho * afl.viscousStress[i] * afl.tau[i];
385 viscousMoment += rho * (afl.viscousStress[i] * afl.tau[i]) & rK;
386 }
387
388 W.getTimers().stop("Force");
389}// 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:163
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition World2D.h:276
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: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 dt
Шаг по времени
Definition PassportGen.h:67
Here is the call graph for this function:

◆ getPhicm()

double & VM2D::MechanicsDeformable::getPhicm ( )
inline

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

Definition at line 148 of file Mechanics2DDeformable.h.

148{ return Phi; };

◆ getRcm()

Point2D & VM2D::MechanicsDeformable::getRcm ( )
inline

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

Definition at line 142 of file Mechanics2DDeformable.h.

142{ return Rcm; };

◆ getVcm()

Point2D & VM2D::MechanicsDeformable::getVcm ( )
inline

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

Definition at line 139 of file Mechanics2DDeformable.h.

139{ return Vcm; };

◆ getWcm()

double & VM2D::MechanicsDeformable::getWcm ( )
inline

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

Definition at line 145 of file Mechanics2DDeformable.h.

145{ return Wcm; };

◆ 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 92 of file Mechanics2D.cpp.

93{
94 Vcm0 = Vcm0_;
95 Wcm0 = Wcm0_;
96 Rcm0 = Rcm0_;
97 Phi0 = Phi0_;
98
99 Vcm = Vcm0;
100 Wcm = Wcm0;
101 Rcm = Rcm0;
102 Phi = Phi0;
103 VcmOld = Vcm0;
104 WcmOld = Wcm0;
105 RcmOld = Rcm0;
106 PhiOld = Phi0;
107
108 circulation = 2.0 * afl.area * Wcm;
110
113}//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 MechanicsDeformable::Move ( )
overridevirtual

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

Implements VM2D::Mechanics.

Definition at line 444 of file Mechanics2DDeformable.cpp.

445{
446 double x0 = chord[0].beg[0];
447 double t = W.getCurrentTime();
448
449
450 if (fsi) //turek
451 {
452 for (int i = 0; i < beam->R; ++i)
454
455 for (size_t i = 0; i < chord.size(); ++i)
456 {
457 chord[i].beg[1] = beam->getTotalDisp(chord[i].beg[0], t);
458 chord[i].end[1] = beam->getTotalDisp(chord[i].end[0], t);
459 }
460
461 std::vector<Point2D> upperPoints(chord.size() + upperShifts.size());
462 std::vector<Point2D> lowerPoints(chord.size() + lowerShifts.size());
463
464 for (size_t i = 0; i < chord.size() - 1; ++i)
465 {
466 const Point2D& begIp1 = chord[i + 1].beg;
467 const Point2D& endI = chord[i].end;
468 Point2D normI = (endI - chord[i].beg).unit().kcross();
469 Point2D normIp1 = (chord[i + 1].end - begIp1).unit().kcross();
470 upperPoints[i] = endI + 0.5 * chord[i].rightSemiWidth * (normI + normIp1);
471 lowerPoints[i] = endI - 0.5 * chord[i].rightSemiWidth * (normI + normIp1);
472 }
473 Point2D normBack = (chord.back().end - chord.back().beg).unit().kcross();
474 upperPoints[chord.size() - 1] = chord.back().end + chord.back().rightSemiWidth * normBack;
475 lowerPoints[chord.size() - 1] = chord.back().end - chord.back().rightSemiWidth * normBack;
476
477 for (size_t i = 0; i < upperShifts.size(); ++i)
478 upperPoints[chord.size() + i] = chord.back().end + upperShifts[upperShifts.size() - 1 - i] * normBack;
479 for (size_t i = 0; i < lowerShifts.size(); ++i)
480 lowerPoints[chord.size() + i] = chord.back().end + lowerShifts[lowerShifts.size() - 1 - i] * normBack;
481
482 afl.setR(0) = { chord.back().end[0], beam->getTotalDisp(chord.back().end[0], t) };
483 for (size_t i = 0; i < upperPoints.size(); ++i)
484 afl.setR(indexOfUpperLeftAngle - 1 - i) = upperPoints[i];
485 for (size_t i = 0; i < lowerPoints.size(); ++i)
486 afl.setR(indexOfLowerLeftAngle + 1 + i) = lowerPoints[i];
487
488 /*
489 std::ofstream file;
490 file.open(W.getPassport().dir + "file" + std::to_string(W.getCurrentStep()) + ".txt");
491 for (size_t c = 0; c < chord.size(); ++c)
492 file << std::endl;
493 file.close();
494 //*/
495 }
496 else //Fish
497 {
498 for (size_t i = 0; i < chord.size(); ++i)
499 {
500 chord[i].beg[1] = beam->getGivenLaw(chord[i].beg[0], t, deformParam);
501 chord[i].end[1] = beam->getGivenLaw(chord[i].end[0], t, deformParam);
502 }
503
504 std::vector<Point2D> upperPoints(chord.size());
505 std::vector<Point2D> lowerPoints(chord.size());
506
507 for (size_t i = 0; i < chord.size() - 1; ++i)
508 {
509 const Point2D& begIp1 = chord[i + 1].beg;
510 const Point2D& endI = chord[i].end;
511 Point2D normI = (endI - chord[i].beg).unit().kcross();
512 Point2D normIp1 = (chord[i + 1].end - begIp1).unit().kcross();
513 upperPoints[i] = endI + 0.5 * chord[i].rightSemiWidth * (normI + normIp1);
514 lowerPoints[i] = endI - 0.5 * chord[i].rightSemiWidth * (normI + normIp1);
515 }
516
517 Point2D normFront = (chord[0].end - chord[0].beg).unit().kcross();
518 Point2D normBack = (chord.back().end - chord.back().beg).unit().kcross();
519
520 int nph = (int)chord.size();
521
522 afl.setR(0) = chord.back().end;
523 afl.setR(nph) = chord[0].beg;
524 for (size_t i = 0; i < nph - 1; ++i)
525 {
526 afl.setR(nph - 1 - i) = upperPoints[i];
527 afl.setR(nph + 1 + i) = lowerPoints[i];
528 }
529 }
530
531
534
535 afl.possibleWays.clear();
536 afl.possibleWays.resize(initialPossibleWays.size());
537
538 for (size_t w = 0; w < initialPossibleWays.size(); ++w)
539 {
540 std::vector<Point2D> initialWay = initialPossibleWays[w];
541 afl.possibleWays[w].resize(initialWay.size());
542 for (size_t p = 0; p < initialWay.size(); ++p)
543 {
544 double x = initialWay[p][0];
545 double y;
546
547 if (fsi) //turek
548 y = beam->getTotalDisp(x, t);
549 else //fish
550 y = beam->getGivenLaw(x, t, deformParam);
551
552 afl.possibleWays[w][p] = Point2D{ x,y };
553 }
554 }
555
557}//Move()
Point2D & setR(size_t q)
Возврат ссылки на вершину профиля
Definition Airfoil2D.h:125
virtual void GetGabarits(double gap=0.02)
Вычисляет габаритный прямоугольник профиля
void CalcNrmTauLen()
Вычисление нормалей, касательных и длин панелей по текущему положению вершин
void lightningTest()
Тест на "отвещенность".
std::vector< std::vector< Point2D > > possibleWays
Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей
Definition Airfoil2D.h:199
size_t size() const
Definition numvector.h:114
Here is the call graph for this function:

◆ PositionOfAirfoilRcm()

Point2D MechanicsDeformable::PositionOfAirfoilRcm ( double  currTime)
overridevirtual

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

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

Implements VM2D::Mechanics.

Definition at line 398 of file Mechanics2DDeformable.cpp.

399{
400 return Rcm;
401}//PositionOfAirfoilRcm(...)

◆ ReadParametersFromDictionary()

void Mechanics::ReadParametersFromDictionary ( )
privateinherited

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

Definition at line 116 of file Mechanics2D.cpp.

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

◆ ReadSpecificParametersFromDictionary()

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

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

Implements VM2D::Mechanics.

Here is the caller graph for this function:

◆ VeloOfAirfoilPanels()

void MechanicsDeformable::VeloOfAirfoilPanels ( double  currTime)
overridevirtual

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

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

Implements VM2D::Mechanics.

Definition at line 420 of file Mechanics2DDeformable.cpp.

421{
422 std::vector<Point2D> veloW(afl.getNumberOfPanels(), {0.0, 0.0});
423
424 //if (W.getCurrentStep() == 0)
425 // for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
426 // veloW[i] = { 0.0, 0.0 };//afl.getR(i).kcross();
427
428 if (W.getCurrentStep() > 0)
429 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
430 veloW[i] = (1.0 / W.getPassport().timeDiscretizationProperties.dt) * (afl.getR(i) - W.getOldAirfoil(0).getR(i));
431
432 afl.setV(veloW);
433
434
435 //Циркуляция
437 circulation = 0.0;
438 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
439 circulation += 0.5 * afl.len[i] * ((afl.getV(i) + afl.getV(i + 1)) & afl.tau[i]);
440
441}//VeloOfAirfoilPanels(...)
void setV(const Point2D &vel)
Установка постоянной скорости всех вершин профиля
Definition Airfoil2D.h:145
Here is the call graph for this function:

◆ VeloOfAirfoilRcm()

Point2D MechanicsDeformable::VeloOfAirfoilRcm ( double  currTime)
overridevirtual

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

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

Implements VM2D::Mechanics.

Definition at line 392 of file Mechanics2DDeformable.cpp.

393{
394 return Vcm;
395}//VeloOfAirfoilRcm(...)

Member Data Documentation

◆ afl

Airfoil& VM2D::Mechanics::afl
protectedinherited

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

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

Definition at line 87 of file Mechanics2D.h.

◆ beam

std::unique_ptr<Beam> VM2D::MechanicsDeformable::beam

Definition at line 182 of file Mechanics2DDeformable.h.

◆ boundary

const Boundary& VM2D::Mechanics::boundary
protectedinherited

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

Definition at line 91 of file Mechanics2D.h.

◆ chord

std::vector<ChordPanel> VM2D::MechanicsDeformable::chord

Definition at line 178 of file Mechanics2DDeformable.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.

◆ deformParam

double VM2D::MechanicsDeformable::deformParam
private

Definition at line 133 of file Mechanics2DDeformable.h.

◆ fsi

bool VM2D::MechanicsDeformable::fsi
private

Definition at line 134 of file Mechanics2DDeformable.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.

◆ indexOfLowerLeftAngle

size_t VM2D::MechanicsDeformable::indexOfLowerLeftAngle

Definition at line 175 of file Mechanics2DDeformable.h.

◆ indexOfLowerRightAngle

size_t VM2D::MechanicsDeformable::indexOfLowerRightAngle

Definition at line 174 of file Mechanics2DDeformable.h.

◆ indexOfUpperLeftAngle

size_t VM2D::MechanicsDeformable::indexOfUpperLeftAngle

Definition at line 173 of file Mechanics2DDeformable.h.

◆ indexOfUpperRightAngle

size_t VM2D::MechanicsDeformable::indexOfUpperRightAngle

хорда

Definition at line 172 of file Mechanics2DDeformable.h.

◆ initialChord

std::vector<ChordPanel> VM2D::MechanicsDeformable::initialChord

Definition at line 177 of file Mechanics2DDeformable.h.

◆ initialPossibleWays

std::vector<std::vector<Point2D> > VM2D::MechanicsDeformable::initialPossibleWays

Definition at line 184 of file Mechanics2DDeformable.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.

◆ lowerShifts

std::vector<double> VM2D::MechanicsDeformable::lowerShifts

Definition at line 180 of file Mechanics2DDeformable.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.

◆ upperShifts

std::vector<double> VM2D::MechanicsDeformable::upperShifts

Definition at line 179 of file Mechanics2DDeformable.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: