VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
Mechanics2D.cpp
Go to the documentation of this file.
1/*--------------------------------*- VM2D -*-----------------*---------------*\
2| ## ## ## ## #### ##### | | Version 1.14 |
3| ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2026/03/06 |
4| ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5| #### ## ## ## ## ## | Open Source Code |
6| ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7| |
8| Copyright (C) 2017-2026 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9*-----------------------------------------------------------------------------*
10| File name: Mechanics2D.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 "Mechanics2D.h"
41
42#include "Airfoil2D.h"
43#include "Boundary2D.h"
44#include "MeasureVP2D.h"
45#include "StreamParser.h"
46#include "Velocity2D.h"
47#include "Wake2D.h"
48#include "World2D.h"
49#include "Gmres2D.h"
50
51
52
53using namespace VM2D;
54
55//Конструктор
56Mechanics::Mechanics(const World2D& W_, size_t numberInPassport_, bool isMoves_, bool isDeform_)
57 :
58 W(W_),
59 numberInPassport(numberInPassport_),
60 afl(W_.getNonConstAirfoil(numberInPassport_)),
61 boundary(W_.getBoundary(numberInPassport_)),
62 virtVortParams(W_.getVelocity().virtualVortexesParams[numberInPassport_]),
63
64 Vcm0({ 0.0, 0.0 }),
65 Wcm0(0.0),
66 Rcm0({ 0.0, 0.0 }),
67 Phi0(0.0),
68
69 Wcm(0.0),
70 Phi(0.0),
71
72 WcmOld(0.0),
73 PhiOld(0.0),
74
75 /*Vcm0(Vcm0_),
76 Wcm0(Wcm0_),
77 Rcm0(Rcm0_),
78 Phi0(Phi0_),*/
79
80 isMoves(isMoves_),
81 isDeform(isDeform_),
82
83 hydroDynamForce({0.0, 0.0}),
84 hydroDynamMoment(0.0),
85 viscousForce({ 0.0, 0.0 }),
86 viscousMoment(0.0)
87
88{
89 ReadParametersFromDictionary();
90};
91
92//Задание начального положения и начальной скорости
93void Mechanics::Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
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(...)
115
116//Парсинг списка параметров механической системы
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()
123
124
125// Генерация заголовка файла нагрузок
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()
154
155
156//Генерация заголовка файла положения профиля
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()
181
182
183//Сохранение строки со статистикой в файл нагрузок
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
215 double flowPress = 0.5 * W.getPassport().physicalProperties.rho * sqr(W.getPassport().physicalProperties.vRef);
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()
236
237
238//Сохранение строки со статистикой в файл положения
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}//GeneratePositionString()
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
double phiAfl
Поворот профиля
Definition Airfoil2D.h:100
double area
Площадь профиля
Definition Airfoil2D.h:103
Point2D rcm
Положение центра масс профиля
Definition Airfoil2D.h:97
virtual void Move(const Point2D &dr)
Перемещение профиля
const size_t numberInPassport
Номер профиля в паспорте
Definition Airfoil2D.h:188
virtual void Rotate(double alpha)
Поворот профиля
std::unique_ptr< VMlib::StreamParser > mechParamsParser
Умный указатель на парсер параметров механической системы
Definition Mechanics2D.h:98
const bool isMoves
Переменная, отвечающая за то, двигается профиль или нет
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
void GeneratePositionHeader()
Генерация заголовка файла положения профиля
Point2D Vcm0
Начальная скорость центра и угловая скорость
const size_t numberInPassport
Номер профиля в паспорте
Definition Mechanics2D.h:82
Point2D RcmOld
Текущие положение профиля
void GeneratePositionString()
Сохранение строки со статистикой в файл нагрузок
void GenerateForcesString()
Сохранение строки со статистикой в файл нагрузок
Mechanics(const World2D &W_, size_t numberInPassport_, bool isMoves_, bool isDeform_)
Конструктор
Point2D VcmOld
Скорость и отклонение с предыдущего шага
const World2D & W
Константная ссылка на решаемую задачу
Definition Mechanics2D.h:79
void Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
Задание начального положения и начальной скорости
Point2D Rcm
Текущие положение профиля
Point2D Rcm0
Начальное положение профиля
void ReadParametersFromDictionary()
Парсинг списка параметров механической системы
Point2D viscousForce
Вектор силы и момент вязкого трения, действующие на профиль
double circulationOld
Циркуляция скорости по границе профиля с предыдущего шага
double hydroDynamMoment
Airfoil & afl
Definition Mechanics2D.h:87
Point2D Vcm
Текущие скорость центра и угловая скорость
void GenerateForcesHeader()
Генерация заголовка файла нагрузок
double circulation
Текущая циркуляция скорости по границе профиля
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
Definition Passport2D.h:301
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
Definition Passport2D.h:294
std::vector< AirfoilParams > airfoilParams
Список структур с параметрами профилей
Definition Passport2D.h:276
Класс, опеделяющий текущую решаемую задачу
Definition World2D.h:77
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition World2D.h:163
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:263
std::string dir
Рабочий каталог задачи
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
Definition WorldGen.h:82
double getCurrentTime() const
Definition WorldGen.h:100
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition WorldGen.h:99
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
double vRef
Референсная скорость
Definition Passport2D.h:81
double rho
Плотность потока
Definition Passport2D.h:75