VM2D  1.12
Vortex methods for 2D flows simulation
defs.h
Go to the documentation of this file.
1 /*--------------------------------*- VMlib -*----------------*---------------*\
2 | ## ## ## ## ## ## ## | | Version 1.12 |
3 | ## ## ### ### ## ## | VMlib: VM2D/VM3D Library | 2024/01/14 |
4 | ## ## ## # ## ## ## #### | Open Source Code *----------------*
5 | #### ## ## ## ## ## ## | https://www.github.com/vortexmethods/VM2D |
6 | ## ## ## #### ### #### | https://www.github.com/vortexmethods/VM3D |
7 | |
8 | Copyright (C) 2017-2024 Ilia Marchevsky |
9 *-----------------------------------------------------------------------------*
10 | File name: defs.h |
11 | Info: Source code of VMlib |
12 | |
13 | This file is part of VMlib. |
14 | VMLib 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 | VMlib 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 VMlib. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
38 #ifndef DEFS_H
39 #define DEFS_H
40 
41 #if defined(_WIN32)
42  #include <direct.h>
43 #endif
44 
45 #include <fstream>
46 #include <sys/stat.h>
47 #include <sys/types.h>
48 
49 #include <ctime>
50 #include <iostream>
51 #include <list>
52 
53 #include "Eigen/Dense"
54 
55 #include "Gpudefs.h"
56 #include "LogStream.h"
57 
58 #include "Vortex2D.h"
59 #include "v3D.h"
60 #include "PairInt.h"
61 
62 
64 #define DYN_SCHEDULE 20
65 
68 
70 typedef std::pair<double, double> timePeriod;
71 
73 const double PI = 3.1415926535897932384626433832795;
74 
76 const double IDPI = 0.1591549430918953357688837633725;
77 
79 const double DPI = 6.2831853071795864769252867665590;
80 
82 const double IQPI = 0.07957747154594766788444188168626;
83 
85 const double QPI = 12.566370614359172953850573533118;
86 
90 namespace defaults
91 {
93  const double defaultTimeStart = 0.0;
94 
96  const std::pair<std::pair<std::string, int>, std::string> defaultVelAccel = { {"RampLin", 1}, "" };
97  const double defaultTimeAccel = 0.0;
98 
100  const std::pair<std::pair<std::string, int>, std::string> defaultSaveVP = { {"text", 0}, "" };
101  const int defaultSaveVPstep = 0;
102 
104  const std::pair<std::pair<std::string, int>, std::string> defaultSaveVtx = { {"text", 0}, "" };
105  const int defaultSaveVtxStep = 100;
106 
108  const int defaultSaveVisStress = 0;
109 
111  const int defaultNameLength = 5;
112 
114  const double defaultDistFar = 10.0;
115 
117  const double defaultDelta = 1.e-5;
118 
120  const int defaultVortexPerPanel = 1;
121 
123  const double defaultMaxGamma = 0.0;
124 
126  const double defaultVRef = 0.0;
127 
129  const size_t defaultRequiredNPanels = 0;
130 
132  const std::pair<std::string, int> defaultPanelsType = { "panelsRectilinear", 0 };
133 
135  const std::pair<std::string, int> defaultBoundaryCondition = { "boundaryConstLayerAver", 0 };
136 
138  const std::pair<std::string, int> defaultLinearSystemSolver = { "linearSystemGauss", 0 };
139 
140 
142  const std::pair<std::string, int> defaultVelocityComputation{ "velocityBiotSavart", 0 };
143 
145  const bool defaultGeographicalAngles = false;
146 
148  const bool defaultRotateForces = false;
149 
151  const bool defaultCalcCoefficients = false;
152 
154  const double rotateAngleVpPoints = 0;
155 
157  const std::string defaultAirfoilsDir = "../settings/airfoils/";
158  const std::string defaultBodiesDir = "../settings/bodies/";
159 
161  const std::string defaultWakesDir = "../settings/wakes/";
162 
164  const std::vector<std::string> defaultFileAirfoil({});
165  const std::vector<std::string> defaultFileBody({});
166 
168  const std::string defaultFileWake("");
169 
171  const std::string defaultFileSource("");
172 
174  const std::vector<std::string> defaultAirfoil({});
175  const std::vector<std::string> defaultBody({});
176 
178  const VMlib::Point2D defaultBasePoint = { 0.0, 0.0 };
179  const VMlib::v3D defaultBasePoint3D = { 0.0, 0.0, 0.0 };
180 
182  const Point2D defaultScale = { 1.0, 1.0 };
183 
185  const double defaultAngle = 0.0;
186 
188  const double defaultChord = 1.0;
189 
191  const Point2D defaultAddedMass = { 0.0, 0.0 };
192 
194  const bool defaultInverse = false;
195 
198  const std::string defaultMechanicalSystem = "";
199 
201  const std::string defaultPspFile = "passport";
202 
204  const int defaultNp = 1;
205 
207  const std::string defaultCopyPath = "";
208 
210  static std::ostream* defaultQueueLogStream = &std::cout;
211 
213  static std::ostream* defaultWorld2DLogStream = &std::cout;
214 
216  static bool defaultAddMass = false;
217  static v3D defaultAddMassVcm = { 0.0, 0.0, 0.0 };
218  static v3D defaultAddMassWcm = { 0.0, 0.0, 0.0 };
219 } //namespace defaults
220 
221 
222 namespace VMlib
223 {
224 
228  std::string CurrentDataTime();
229 
230 
236  void PrintLogoToStream(std::ostream& str);
237 
243  void PrintUniversalLogoToStream(std::ostream& str);
244 
245 
253  void PrintLogoToTextFile(std::ofstream& str, const std::string& fileName, const std::string& descr);
254 
255 
262  void PrintHeaderToTextFile(std::ofstream& str, const std::string& header);
263 
264 
273  template <typename T>
274  std::ostream& operator<< (std::ostream& _stream, const std::vector<T>& _vec)
275  {
276  size_t n = _vec.size();
277  _stream << "{ ";
278  if (n > 0)
279  {
280  for (size_t j = 0; j < n - 1; ++j)
281  _stream << _vec[j] << ", ";
282  _stream << _vec[n - 1];
283  }
284  _stream << " }";
285  return _stream;
286  }//operator<<(...)
287 
288 
296  inline std::ostream& operator<< (std::ostream& _stream, const std::pair<std::pair<std::string, int>, std::string>& _pair)
297  {
298  _stream << "( ( " << _pair.first.first << ", " << _pair.first.second << " ), " << _pair.second << " )";
299  return _stream;
300  }//operator<<(...)
301 
302 
310  inline std::ostream& operator<< (std::ostream& _stream, const std::pair<std::string, int>& _pair)
311  {
312  _stream << "( " << _pair.first << ", " << _pair.second << " )";
313  return _stream;
314  }//operator<<(...)
315 
316 
317 
324  inline bool fileExistTest(std::string& fileName, LogStream& info, const std::list <std::string>& extList = {})
325  {
326  std::list<std::string> fullExtList(extList);
327  fullExtList.insert(fullExtList.begin(), "");
328 
329  for (const auto& ext : fullExtList)
330  {
331  std::string newFileName = ((ext == "") ? fileName : (fileName + "." + ext));
332  std::ifstream f(newFileName.c_str());
333  if (f.good())
334  {
335  f.close();
336  f.clear();
337 
338  info('i') << "file " << newFileName << " is found" << std::endl;
339  fileName = newFileName;
340  return true;
341  }
342  }
343 
344  info('e') << "file " << fileName << " is not found" << std::endl;
345  exit(-1);
346  return false;
347  }
348 
349 
357  inline std::string fileNameStep(const std::string& name, int length, size_t number, const std::string& ext)
358  {
359  std::string fname(name);
360 
361  size_t dec = 1;
362 
363  for (int i = 1; i < length; ++i)
364  {
365  dec *= 10;
366  if (number < dec)
367  fname += "0";
368  }
369 
370  std::ostringstream ss;
371  ss << number;
372  fname += ss.str();
373 
374  if (ext.size() > 0)
375  {
376  fname += ".";
377  fname += ext;
378  }
379 
380  return fname;
381  }
382 
383 
388  inline void copyFile(const std::string& fileNameFrom, const std::string& fileNameTo)
389  {
390  std::string buf;
391  buf.resize(BUFSIZ);
392 
393  FILE *in, *out;
394  size_t n;
395 
396 
397 #pragma warning (push)
398 #pragma warning (disable: 4996)
399  in = fopen(fileNameFrom.c_str(), "rb");
400  out = fopen(fileNameTo.c_str(), "wb");
401 #pragma warning (pop)
402 
403  while ((n = fread((void*)buf.data(), 1, BUFSIZ, in)) != 0)
404  {
405  fwrite((void*)buf.data(), 1, n, out);
406  }
407  }//copyFile
408 
409 
414  inline void CreateDirectory(const std::string& dir, const std::string& name)
415  {
416 #if defined(_WIN32)
417  _mkdir((dir + name).c_str());
418 #else
419  mkdir((dir + name).c_str(), S_IRWXU | S_IRGRP | S_IROTH);
420 #endif
421  }
422 
423 
429  template<typename T>
430  inline T sqr(T x) { return x * x; }
431 
432 
438  template <typename T>
439  inline double macos(const T x)
440  {
441  double res = abs(x) > 1.0 ? 0.5*PI*(1 - sign(x)) : acos(x);
442  return res;
443  }
444 
445 
451  template <typename T>
452  int sign(T x)
453  {
454  double dx = (double)x;
455  if (dx > 0) return 1;
456  if ( (dx < 0.0) || (dx < -0.0) ) return -1;
457  return 0;
458  }
459 
460 
461 
466  void SaveToStream(const Eigen::MatrixXd& matr, std::ostream& str);
467 
472  void SaveToStream(const Eigen::MatrixXcd& matr, std::ostream& str);
473 
478  void SaveToStream(const Eigen::VectorXd& vec, std::ostream& str);
479 
484  void SaveToStream(const std::vector<Point2D>& vec, std::ostream& str);
485 
490  double M4(double t);
491 
496  void ModifyE2(double* ee2, double dst2);
497 
498 
504  double Alpha(const Point2D& p, const Point2D& s);
505 
511  double Lambda(const Point2D& p, const Point2D& s);
512 
521  Point2D Omega(const Point2D& a, const Point2D& b, const Point2D& c);
522 
527  template<typename T>
528  void SwapEnd(T& var)
529  {
530  char* varArray = reinterpret_cast<char*>(&var);
531  for (long i = 0; i < static_cast<long>(sizeof(var) / 2); ++i)
532  std::swap(varArray[sizeof(var) - 1 - i], varArray[i]);
533  }
534 
536  inline double boundDenom(double r2, double eps2)
537  {
538 #ifndef LAMBVORTEX
539  return std::max(r2, eps2);
540 #else
541  if (r2 > eps2)
542  return std::max(r2, eps2);
543  else
544  return (r2 < 1e-10) ? 1e-10 : r2 / (1.0 - exp(-6.0*r2 / eps2));
545 #endif
546  }
547 
548 }//namespace VMlib
549 
550 using VMlib::sqr;
551 
552 #endif
PointType
Класс перечисления для определения типа набора точек (пелена/виртуальные вихри/точки для вычисления с...
Definition: defs.h:67
const std::string defaultPspFile
Имя файла с паспортом задачи
Definition: defs.h:201
const int defaultSaveVisStress
Шаг подсчета поля скорости и давления
Definition: defs.h:108
const double defaultChord
Хорда
Definition: defs.h:188
static std::ostream * defaultWorld2DLogStream
Поток вывода логов и ошибок задачи
Definition: defs.h:213
Глобальные параметры по умолчанию
Definition: defs.h:90
static v3D defaultAddMassVcm
Definition: defs.h:217
const std::string defaultWakesDir
Каталог с файлами вихревых следов
Definition: defs.h:161
const std::string defaultCopyPath
Путь к каталогу с задачей для копирования в новые каталоги
Definition: defs.h:207
const bool defaultGeographicalAngles
Признак работы в "географической" системе координат
Definition: defs.h:145
const double defaultAngle
Угол атаки
Definition: defs.h:185
std::string CurrentDataTime()
Формирование строки с текущем временем и датой
Definition: defs.cpp:44
const double PI
Число .
Definition: defs.h:73
Класс, определяющий работу с потоком логов
Definition: LogStream.h:53
const double defaultVRef
Референсная скорость, равная нулю, что означает ее равенство скорости набегающего потока ...
Definition: defs.h:126
const std::vector< std::string > defaultBody({})
const double QPI
Число .
Definition: defs.h:85
static v3D defaultAddMassWcm
Definition: defs.h:218
const int defaultVortexPerPanel
Число вихрей, рождаемых на одной панели
Definition: defs.h:120
const std::pair< std::pair< std::string, int >, std::string > defaultSaveVP
Шаг подсчета поля скорости и давления
Definition: defs.h:100
const std::vector< std::string > defaultFileBody({})
const std::pair< std::pair< std::string, int >, std::string > defaultVelAccel
Время разгона
Definition: defs.h:96
const std::pair< std::string, int > defaultPanelsType
Тип панелей
Definition: defs.h:132
const double IDPI
Число .
Definition: defs.h:76
void copyFile(const std::string &fileNameFrom, const std::string &fileNameTo)
Копирование файла
Definition: defs.h:388
const double defaultTimeAccel
Definition: defs.h:97
Заголовочный файл с описанием класса LogStream.
const bool defaultCalcCoefficients
Признак расчета безразмерных коэффициентов вместо сил
Definition: defs.h:151
const std::pair< std::pair< std::string, int >, std::string > defaultSaveVtx
Шаг подсчета поля скорости и давления
Definition: defs.h:104
const VMlib::Point2D defaultBasePoint
Базовое смещение профиля
Definition: defs.h:178
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
Definition: defs.cpp:259
const Point2D defaultScale
Коэффициент масштабирования профиля
Definition: defs.h:182
const double IQPI
Число .
Definition: defs.h:82
const std::pair< std::string, int > defaultBoundaryCondition
Способ удовлетворения граничного условия
Definition: defs.h:135
void PrintHeaderToTextFile(std::ofstream &str, const std::string &header)
Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D.
Definition: defs.cpp:172
const int defaultMechanicalSystemType
Тип механической системы
Definition: defs.h:197
std::string fileNameStep(const std::string &name, int length, size_t number, const std::string &ext)
Формирование имени файла
Definition: defs.h:357
Point2D Omega(const Point2D &a, const Point2D &b, const Point2D &c)
Вспомогательная функция вычисления величины .
Definition: defs.cpp:271
T sqr(T x)
Возведение числа в квадрат
Definition: defs.h:430
Файл кода с описанием класса PairInt.
static bool defaultAddMass
Расчет присоединенной массы
Definition: defs.h:216
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
Definition: defs.cpp:265
const std::vector< std::string > defaultAirfoil({})
Список профилей
const double defaultMaxGamma
Число вихрей, рождаемых на одной панели
Definition: defs.h:123
const size_t defaultRequiredNPanels
Желаемое число панелей для разбиения геометрии
Definition: defs.h:129
int sign(T x)
Усовершенствованный сигнум
Definition: defs.h:452
const VMlib::v3D defaultBasePoint3D
Definition: defs.h:179
Заголовочный файл с описанием класса v3D.
Класс, опеделяющий двумерный вектор
Definition: v3D.h:55
const Point2D defaultAddedMass
Присоединенная масса
Definition: defs.h:191
const std::string defaultBodiesDir
Definition: defs.h:158
const bool defaultRotateForces
Признак поворота сил в профильную систему координат
Definition: defs.h:148
std::pair< double, double > timePeriod
Тип для хранения начала и конца промежутка времени
Definition: defs.h:70
Класс, опеделяющий двумерный вектор
Definition: Point2D.h:75
void PrintLogoToStream(std::ostream &str)
Передача в поток вывода шапки программы VM2D/VM3D.
Definition: defs.cpp:105
static std::ostream * defaultQueueLogStream
Поток вывода логов и ошибок очереди
Definition: defs.h:210
bool fileExistTest(std::string &fileName, LogStream &info, const std::list< std::string > &extList={})
Проверка существования файла
Definition: defs.h:324
const std::pair< std::string, int > defaultLinearSystemSolver
Способ решения линейной системы
Definition: defs.h:138
const int defaultSaveVPstep
Definition: defs.h:101
const std::pair< std::string, int > defaultVelocityComputation
Способ вычисления скоростей вихрей
Definition: defs.h:142
const int defaultNameLength
Число разрядов в имени файла
Definition: defs.h:111
Описание констант и параметров для взаимодействия с графическим ускорителем
void ModifyE2(double *ee2, double dst2)
Модифицирует массив квадратов расстояний до ближайших вихрей из wake.
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
Definition: defs.cpp:136
const double DPI
Число .
Definition: defs.h:79
double boundDenom(double r2, double eps2)
Способ сглаживания скорости вихря (вихрь Рэнкина или вихрь Ламба)
Definition: defs.h:536
const std::string defaultFileSource("")
Файл с источниками
const std::string defaultFileWake("")
Файл со следом
const double defaultTimeStart
Начало расчета
Definition: defs.h:93
const double defaultDelta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
Definition: defs.h:117
const std::vector< std::string > defaultFileAirfoil({})
Список профилей
const std::string defaultMechanicalSystem
Definition: defs.h:198
void PrintUniversalLogoToStream(std::ostream &str)
Передача в поток вывода универсальной шапки программы VM2D/VM3D.
Definition: defs.cpp:89
void SwapEnd(T &var)
Вспомогательная функция перестановки байт местами (нужно для сохранения бинарных VTK) ...
Definition: defs.h:528
const double defaultDistFar
Радиус убивания дальнего следа
Definition: defs.h:114
Заголовочный файл с описанием класса Vortex2D.
const int defaultSaveVtxStep
Definition: defs.h:105
const std::string defaultAirfoilsDir
Каталог с файлами профилей
Definition: defs.h:157
void CreateDirectory(const std::string &dir, const std::string &name)
Создание каталога
Definition: defs.h:414
double macos(const T x)
Усовершенствованный аркосинус
Definition: defs.h:439
const int defaultNp
Необходимое число процессоров для решения задачи
Definition: defs.h:204
const double rotateAngleVpPoints
Угол поворота точек VP.
Definition: defs.h:154
void SaveToStream(const std::vector< Point2D > &vec, std::ostream &str)
Сохранение списка из двумерных векторов (точек) в поток
Definition: defs.cpp:216
double M4(double t)
Ядро сглаживания (Монагана)
Definition: defs.cpp:224
const bool defaultInverse
Признак разворота нормалей (для расчета внутреннего течения)
Definition: defs.h:194