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
50
51
52using namespace VM2D;
53
54//Конструктор
55Mechanics::Mechanics(const World2D& W_, size_t numberInPassport_, bool isMoves_, bool isDeform_)
56 :
57 W(W_),
58 numberInPassport(numberInPassport_),
59 afl(W_.getNonConstAirfoil(numberInPassport_)),
60 boundary(W_.getBoundary(numberInPassport_)),
61 virtVortParams(W_.getVelocity().virtualVortexesParams[numberInPassport_]),
62
63 Vcm0({ 0.0, 0.0 }),
64 Wcm0(0.0),
65 Rcm0({ 0.0, 0.0 }),
66 Phi0(0.0),
67
68 Wcm(0.0),
69 Phi(0.0),
70
71 WcmOld(0.0),
72 PhiOld(0.0),
73
74 /*Vcm0(Vcm0_),
75 Wcm0(Wcm0_),
76 Rcm0(Rcm0_),
77 Phi0(Phi0_),*/
78
79 isMoves(isMoves_),
80 isDeform(isDeform_),
81
82 hydroDynamForce({0.0, 0.0}),
83 hydroDynamMoment(0.0),
84 viscousForce({ 0.0, 0.0 }),
85 viscousMoment(0.0)
86
87{
88 ReadParametersFromDictionary();
89};
90
91//Задание начального положения и начальной скорости
92void Mechanics::Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
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(...)
114
115//Парсинг списка параметров механической системы
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()
122
123
124// Генерация заголовка файла нагрузок
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()
153
154
155//Генерация заголовка файла положения профиля
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()
180
181
182//Сохранение строки со статистикой в файл нагрузок
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
214 double flowPress = 0.5 * W.getPassport().physicalProperties.rho * sqr(W.getPassport().physicalProperties.vRef);
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()
235
236
237//Сохранение строки со статистикой в файл положения
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}//GeneratePositionString()
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса 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:289
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
Definition Passport2D.h:282
std::vector< AirfoilParams > airfoilParams
Список структур с параметрами профилей
Definition Passport2D.h:273
Класс, опеделяющий текущую решаемую задачу
Definition World2D.h:74
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition World2D.h:157
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:251
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