VM2D  1.12
Vortex methods for 2D flows simulation
Mechanics2D.cpp
Go to the documentation of this file.
1 /*--------------------------------*- VM2D -*-----------------*---------------*\
2 | ## ## ## ## #### ##### | | Version 1.12 |
3 | ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2024/01/14 |
4 | ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5 | #### ## ## ## ## ## | Open Source Code |
6 | ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7 | |
8 | Copyright (C) 2017-2024 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9 *-----------------------------------------------------------------------------*
10 | File name: 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 "Passport2D.h"
46 #include "StreamParser.h"
47 #include "Velocity2D.h"
48 #include "Wake2D.h"
49 #include "World2D.h"
50 
51 
52 
53 using namespace VM2D;
54 
55 //Конструктор
56 Mechanics::Mechanics(const World2D& W_, size_t numberInPassport_, int degOfFreedom_, bool isMoves_, bool isDeform_, bool isRotate_)
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  /*Vcm0(Vcm0_),
70  Wcm0(Wcm0_),
71  Rcm0(Rcm0_),
72  Phi0(Phi0_),*/
73 
74  isMoves(isMoves_),
75  isDeform(isDeform_),
76  isRotate(isRotate_),
77  degOfFreedom(degOfFreedom_),
78 
79  hydroDynamForce({0.0, 0.0}),
80  hydroDynamMoment(0.0),
81  viscousForce({ 0.0, 0.0 }),
82  viscousMoment(0.0)
83 
84 {
86 };
87 
88 //Задание начального положения и начальной скорости
89 void Mechanics::Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
90 {
91  Vcm0 = Vcm0_;
92  Wcm0 = Wcm0_;
93  Rcm0 = Rcm0_;
94  Phi0 = Phi0_;
95 
96  Vcm = Vcm0;
97  Wcm = Wcm0;
98  Rcm = Rcm0;
99  Phi = Phi0;
100  VcmOld = Vcm0;
101  WcmOld = Wcm0;
102  RcmOld = Rcm0;
103  PhiOld = Phi0;
104 
107 }//Initialize(...)
108 
109 //Парсинг списка параметров механической системы
111 {
112  std::stringstream ss(W.getPassport().airfoilParams[afl.numberInPassport].mechanicalSystemParameters);
113 
114  mechParamsParser.reset(new VMlib::StreamParser(W.getInfo(), "mechanical parser", ss));
115 }//ReadParametersFromDictionary()
116 
117 
118 // Генерация заголовка файла нагрузок
120 {
121  std::stringstream forceFileName, forceFileNameCsv;
122  forceFileName << W.getPassport().dir << "forces-airfoil-" << numberInPassport;
123  forceFileNameCsv << W.getPassport().dir << "forces-airfoil-" << numberInPassport << ".csv";
124 
125  std::ofstream newForcesFile(forceFileName.str());
126  std::ofstream newForcesFileCsv(forceFileNameCsv.str());
127 
128  VMlib::PrintLogoToTextFile(newForcesFile, forceFileName.str(), "Hydrodynamic loads for the airfoil " + W.getPassport().airfoilParams[numberInPassport].fileAirfoil);
129 
131  VMlib::PrintHeaderToTextFile(newForcesFile, "currentStep currentTime Fx Fy Mz Ftaux Ftauy Mtau");
132  else
133  VMlib::PrintHeaderToTextFile(newForcesFile, "currentStep currentTime CFx CFy CMz CFtaux CFtauy CMtau");
134 
136  newForcesFileCsv << "step,t,Fx,Fy,Mz,Ftaux,Ftauy,Mtau";
137  else
138  newForcesFileCsv << "step,t,CFx,CFy,CMz,CFtaux,CFtauy,CMtau";
139 
140  newForcesFile.close();
141  newForcesFile.clear();
142 
143  newForcesFileCsv.close();
144  newForcesFileCsv.clear();
145 
146 }//GenerateForcesHeader()
147 
148 
149 //Генерация заголовка файла положения профиля
151 {
152  if (isMoves)
153  {
154  std::stringstream positionFileName, positionFileNameCsv;
155  positionFileName << W.getPassport().dir << "position-airfoil-" << numberInPassport;
156  positionFileNameCsv << W.getPassport().dir << "position-airfoil-" << numberInPassport << ".csv";
157 
158  std::ofstream newPositionFile(positionFileName.str());
159  std::ofstream newPositionFileCsv(positionFileNameCsv.str());
160 
161  VMlib::PrintLogoToTextFile(newPositionFile, positionFileName.str(), "Position of the airfoil " + W.getPassport().airfoilParams[numberInPassport].fileAirfoil);
162 
163  VMlib::PrintHeaderToTextFile(newPositionFile, "currentStep currentTime x y phi Vx Vy w");
164 
165  newPositionFileCsv << "step,t,x,y,phi,Vx,Vy,w";
166 
167  newPositionFile.close();
168  newPositionFile.clear();
169 
170  newPositionFileCsv.close();
171  newPositionFileCsv.clear();
172  }
173 }//GeneratePositionHeader()
174 
175 
176 //Сохранение строки со статистикой в файл нагрузок
178 {
179  W.getTimestat().timeOther.first += omp_get_wtime();
180 
181  std::stringstream forceFileName, forceFileNameCsv;
182  forceFileName << W.getPassport().dir << "forces-airfoil-" << numberInPassport;
183  forceFileNameCsv << W.getPassport().dir << "forces-airfoil-" << numberInPassport << ".csv";
184 
185  //double cShock = (W.getPassport().physicalProperties.getCurrTime() > W.getPassport().physicalProperties.timeAccel + 2.0 * W.getPassport().timeDiscretizationProperties.dt) ? 1.0 : 0.0;
186  double cShock = 1.0;
187 
188  Point2D cartesianHydroForce = cShock * hydroDynamForce;
189  Point2D cartesianViscoForce = cShock * viscousForce;
190 
191  double cartesianHydroMoment = cShock * hydroDynamMoment;
192  double cartesianViscoMoment = cShock * viscousMoment;
193 
194  double rotationAngle = W.getPassport().airfoilParams[numberInPassport].angle;
196  {
197  cartesianHydroForce = cartesianHydroForce.rotated(-0.5 * PI - W.getPassport().airfoilParams[numberInPassport].angle);
198  cartesianViscoForce = cartesianViscoForce.rotated(-0.5 * PI - W.getPassport().airfoilParams[numberInPassport].angle);
199  //rotationAngle += 0.5 * PI;
200  }
201 
202  //if (W.getPassport().rotateForces)
203  //{
204  // cartesianHydroForce = cartesianHydroForce.rotated(rotationAngle);
205  // cartesianViscoForce = cartesianViscoForce.rotated(rotationAngle);
206  //}
207 
208  double flowPress = 0.5 * W.getPassport().physicalProperties.rho * sqr(W.getPassport().physicalProperties.vRef);
210  {
211  const double& chord = W.getPassport().airfoilParams[numberInPassport].chord;
212  cartesianHydroForce /= (flowPress * chord);
213  cartesianViscoForce /= (flowPress * chord);
214 
215  cartesianHydroMoment /= (flowPress * sqr(chord));
216  cartesianViscoMoment /= (flowPress * sqr(chord));
217  }
218 
219 
220  std::ofstream forcesFile(forceFileName.str(), std::ios::app);
221  forcesFile << std::endl << W.getCurrentStep() << " " << W.getPassport().physicalProperties.getCurrTime() << " " << cartesianHydroForce[0] << " " << cartesianHydroForce[1] << " " << cartesianHydroMoment << " " << cartesianViscoForce[0] << " " << cartesianViscoForce[1] << " " << cartesianViscoMoment;
222  forcesFile.close();
223 
224  std::ofstream forcesFileCsv(forceFileNameCsv.str(), std::ios::app);
225  forcesFileCsv << std::endl << W.getCurrentStep() << "," << W.getPassport().physicalProperties.getCurrTime() << "," << cartesianHydroForce[0] << "," << cartesianHydroForce[1] << "," << cartesianHydroMoment << "," << cartesianViscoForce[0] << "," << cartesianViscoForce[1] << "," << cartesianViscoMoment;
226  forcesFileCsv.close();
227 
228  W.getTimestat().timeOther.second += omp_get_wtime();
229 }//GenerateForcesString()
230 
231 
232 //Сохранение строки со статистикой в файл положения
234 {
235  W.getTimestat().timeOther.first += omp_get_wtime();
236 
237  if (isMoves)
238  {
239  std::stringstream positionFileName, positionFileNameCsv;
240  positionFileName << W.getPassport().dir << "position-airfoil-" << numberInPassport;
241  positionFileNameCsv << W.getPassport().dir << "position-airfoil-" << numberInPassport << ".csv";
242 
243  std::ofstream positionFile(positionFileName.str(), std::ios::app);
244  positionFile << std::endl << W.getCurrentStep() << " " << W.getPassport().physicalProperties.getCurrTime() << " " << afl.rcm[0] << " " << afl.rcm[1] << " " << Phi << " " << Vcm[0] << " " << Vcm[1] << " " << Wcm;
245  positionFile.close();
246 
247  std::ofstream positionFileCsv(positionFileNameCsv.str(), std::ios::app);
248  positionFileCsv << std::endl << W.getCurrentStep() << "," << W.getPassport().physicalProperties.getCurrTime() << "," << afl.rcm[0] << "," << afl.rcm[1] << "," << Phi << "," << Vcm[0] << "," << Vcm[1] << "," << Wcm;
249  positionFileCsv.close();
250  }
251 
252  W.getTimestat().timeOther.second += omp_get_wtime();
253 }//GeneratePositionString()
Point2D viscousForce
Вектор силы и момент вязкого трения, действующие на профиль
Definition: Mechanics2D.h:146
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
Times & getTimestat() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition: World2D.h:242
void Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
Задание начального положения и начальной скорости
Definition: Mechanics2D.cpp:89
bool geographicalAngles
Признак работы в "географической" системе координат
Definition: Passport2D.h:283
const double PI
Число .
Definition: defs.h:73
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
double vRef
Референсная скорость
Definition: Passport2D.h:81
Point2D Rcm
Текущие положение профиля
Definition: Mechanics2D.h:120
double hydroDynamMoment
Definition: Mechanics2D.h:143
double getCurrTime() const
Возвращает текуще время
Definition: Passport2D.h:102
Заголовочный файл с описанием класса Airfoil.
const size_t degOfFreedom
Количество степеней свободы
Definition: Mechanics2D.h:139
const size_t numberInPassport
Номер профиля в паспорте
Definition: Airfoil2D.h:74
std::string dir
Рабочий каталог задачи
Definition: PassportGen.h:118
void GenerateForcesHeader()
Генерация заголовка файла нагрузок
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
Definition: Passport2D.h:296
Point2D VcmOld
Скорость и отклонение с предыдущего шага
Definition: Mechanics2D.h:123
const bool isMoves
Переменная, отвечающая за то, двигается профиль или нет
Definition: Mechanics2D.h:130
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
Definition: Passport2D.h:289
Point2D Rcm0
Начальное положение профиля
Definition: Mechanics2D.h:104
void PrintHeaderToTextFile(std::ofstream &str, const std::string &header)
Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D.
Definition: defs.cpp:172
void GeneratePositionHeader()
Генерация заголовка файла положения профиля
const size_t numberInPassport
Номер профиля в паспорте
Definition: Mechanics2D.h:82
Point2D RcmOld
Текущие положение профиля
Definition: Mechanics2D.h:126
T sqr(T x)
Возведение числа в квадрат
Definition: defs.h:430
void ReadParametersFromDictionary()
Парсинг списка параметров механической системы
double rho
Плотность потока
Definition: Passport2D.h:75
Definition: Airfoil2D.h:45
Заголовочный файл с описанием класса StreamParser.
Airfoil & afl
Definition: Mechanics2D.h:87
Класс, опеделяющий двумерный вектор
Definition: Point2D.h:75
const bool isRotate
Переменная, отвечающая за то, может профиль вращаться или нет
Definition: Mechanics2D.h:136
void GenerateForcesString()
Сохранение строки со статистикой в файл нагрузок
std::unique_ptr< VMlib::StreamParser > mechParamsParser
Умный указатель на парсер параметров механической системы
Definition: Mechanics2D.h:98
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
Definition: defs.cpp:136
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода ...
Definition: WorldGen.h:74
Заголовочный файл с описанием класса MeasureVP.
double phiAfl
Поворот профиля
Definition: Airfoil2D.h:80
const World2D & W
Константная ссылка на решаемую задачу
Definition: Mechanics2D.h:79
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition: World2D.h:222
virtual void Rotate(double alpha)=0
Поворот профиля
Point2D rcm
Положение центра масс профиля
Definition: Airfoil2D.h:77
const bool isDeform
Переменная, отвечающая за то, деформируется профиль или нет
Definition: Mechanics2D.h:133
Mechanics(const World2D &W_, size_t numberInPassport_, int degOfFreedom_, bool isMoves_, bool isDeform_, bool isRotate_)
Конструктор
Definition: Mechanics2D.cpp:56
void GeneratePositionString()
Сохранение строки со статистикой в файл нагрузок
double viscousMoment
Definition: Mechanics2D.h:147
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition: WorldGen.h:91
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition: World2D.h:130
Класс, опеделяющий текущую решаемую задачу
Definition: World2D.h:68
std::vector< AirfoilParams > airfoilParams
Список структур с параметрами профилей
Definition: Passport2D.h:280
Заголовочный файл с описанием класса Velocity.
Point2D Vcm0
Начальная скорость центра и угловая скорость
Definition: Mechanics2D.h:101
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
Definition: Mechanics2D.h:142
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
Definition: StreamParser.h:151
timePeriod timeOther
Все прочее
Definition: Times2D.h:113
Point2D rotated(const double angle=1.5707963267948966192313216916398) const
Поворот вектора на произвольный угол против часовой стрелки (по умолчанию 90 градусов) ...
Definition: Point2D.h:118
virtual void Move(const Point2D &dr)=0
Перемещение профиля
Заголовочный файл с описанием класса Boundary.