VM2D  1.12
Vortex methods for 2D flows simulation
defs.cpp
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.cpp |
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 
37 #include "defs.h"
38 
39 using namespace VMlib;
40 
41 std::string Months[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
42 
43 //Формирование строки с текущем временем и датой
45 {
46  std::time_t t = std::time(nullptr);
47 
48 #pragma warning(push)
49 #pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS
50  std::tm tm = *std::localtime(&t);
51 #pragma warning(pop)
52 
53  std::stringstream dateTimeStringStream;
54  //dateTimeStringStream << "| This file was created automatically " << std::put_time(&tm, "%d %B %Y") << " at " << std::put_time(&tm, "%H:%M:%S");
55 
56  std::stringstream st_day, st_hour, st_min, st_sec;
57  if (tm.tm_mday < 10)
58  st_day << "0" << tm.tm_mday;
59  else
60  st_day << tm.tm_mday;
61 
62  if (tm.tm_hour < 10)
63  st_hour << "0" << tm.tm_hour;
64  else
65  st_hour << tm.tm_hour;
66 
67  if (tm.tm_min < 10)
68  st_min << "0" << tm.tm_min;
69  else
70  st_min << tm.tm_min;
71 
72  if (tm.tm_sec < 10)
73  st_sec << "0" << tm.tm_sec;
74  else
75  st_sec << tm.tm_sec;
76 
77  dateTimeStringStream \
78  << st_day.str() << " " << Months[tm.tm_mon] << " " << 1900 + tm.tm_year \
79  << " at " \
80  << st_hour.str() << ":" << st_min.str() << ":" << st_sec.str();
81 
82  //std::string dateTimeString;
83  //dateTimeStringStream >> dateTimeString;
84 
85  return dateTimeStringStream.str();
86 }
87 
88 //Печать универсального логотипа
89 void VMlib::PrintUniversalLogoToStream(std::ostream& str)
90 {
91  str <<
92  "-------------------------------------------------------------------------------" << '\n' << \
93  "##\\ ##\\ ##\\ ##\\ ######\\ #######\\ ##\\ ######\\ #######\\ " << '\n' << \
94  "## | ## | ###\\ ### | ## __##\\ ## __##\\ ## | ## ___##\\ ## __##\\ " << '\n' << \
95  "## | ## | ####\\ #### | \\__/ ## | ## | ## | ## / \\_ / ## | ## | ## |" << '\n' << \
96  "\\##\\ ## | ##\\##\\## ## | ###### | ## | ## | ## / ##### / ## | ## |" << '\n' << \
97  " \\##\\## / ## \\### ## | ## ____/ ## | ## | ## / \\___##\\ ## | ## |" << '\n' << \
98  " \\### / ## |\\# /## | ## | ## | ## | ## / ##\\ ## | ## | ## |" << '\n' << \
99  " \\# / ## | \\_/ ## | ########\\ ####### | ## / \\###### | ####### |" << '\n' << \
100  " \\_/ \\__| \\__| \\________| \\_______/ \\__/ \\______/ \\_______/ " << '\n' << \
101  "-------------------------------------------------------------------------------" << '\n';
102 }
103 
104 //Передача в поток вывода шапки программы VM2D/VM3D
105 void VMlib::PrintLogoToStream(std::ostream& str)
106 {
107 #ifdef CODE2D
108  str <<
109  "/*--------------------------------*- VM2D -*-----------------*---------------*\\" << '\n' << \
110  "| ## ## ## ## #### ##### | | Version 1.12 |" << '\n' << \
111  "| ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2024/01/14 |" << '\n' << \
112  "| ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*" << '\n' << \
113  "| #### ## ## ## ## ## | Open Source Code |" << '\n' << \
114  "| ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |" << '\n' << \
115  "| |" << '\n' << \
116  "| Copyright (C) 2017-2024 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |" << '\n' << \
117  "*-----------------------------------------------------------------------------*" << '\n';
118 #endif
119 
120 #ifdef CODE3D
121  str <<
122  "/*--------------------------------*- VM3D -*-----------------*---------------*\\" << '\n' << \
123  "| ## ## ## ## #### ##### | | Version 1.0 |" << '\n' << \
124  "| ## ## ### ### ## ## ## ## | VM3D: Vortex Method | 2019/05/30 |" << '\n' << \
125  "| ## ## ## # ## ## ## ## | for 3D Flow Simulation *----------------*" << '\n' << \
126  "| #### ## ## ## ## ## ## | Open Source Code |" << '\n' << \
127  "| ## ## ## #### ##### | https://www.github.com/vortexmethods/VM3D |" << '\n' << \
128  "| |" << '\n' << \
129  "| Copyright (C) 2019 Ilia Marchevsky, Georgy Shcheglov, Sergey Dergachev |" << '\n' << \
130  "*-----------------------------------------------------------------------------*" << '\n';
131 #endif
132 }
133 
134 
135 //Формирование заголовка файла программы VM2D/VM3D
136 void VMlib::PrintLogoToTextFile(std::ofstream& str, const std::string& fileName, const std::string& descr)
137 {
138  PrintLogoToStream(str);
139 
140  str <<
141  "| File name: " << fileName;
142  for (size_t q = 0; q < 65 - fileName.length(); ++q)
143  str << " ";
144  str <<
145  "|" << '\n';
146 
147  str <<
148  "| Info: " << descr;
149  for (size_t q = 0; q < 70 - descr.length(); ++q)
150  str << " ";
151  str <<
152  "|" << '\n';
153 
154 
155  std::string dateTimeString = "| This file was created automatically " + CurrentDataTime();
156  //dateTimeStringStream >> dateTimeString;
157 
158  str << dateTimeString;
159  for (size_t q = 0; q < 78 - dateTimeString.length(); ++q)
160  str << " ";
161  str <<
162  "|" << '\n';
163 
164  str <<
165  "\\*---------------------------------------------------------------------------*/" << '\n';
166 }//PrintLogoToTextFile(...)
167 
168 
169 
170 
171 //Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D
172 void VMlib::PrintHeaderToTextFile(std::ofstream& str, const std::string& header)
173 {
174  str << '\n';
175  str << "// " << header << '\n';
176  str << "//";
177  for (size_t q = 0; q < header.length()+1; ++q)
178  str << '-';
179 }
180 
181 //Сохранение матрицы в поток
182 void VMlib::SaveToStream(const Eigen::MatrixXd& matr, std::ostream& str)
183 {
184  str.precision(16);
185  for (int i = 0; i < matr.rows(); ++i)
186  {
187  for (int j = 0; j < matr.cols(); ++j)
188  str << matr(i, j) << " ";
189  str << std::endl;
190  }
191 }//SaveToStream(...)
192 
193 
194 //Сохранение комплекснозначной матрицы в поток
195 void VMlib::SaveToStream(const Eigen::MatrixXcd& matr, std::ostream& str)
196 {
197  for (int i = 0; i < matr.rows(); ++i)
198  {
199  for (int j = 0; j < matr.cols(); ++j)
200  str << matr(i, j) << " ";
201  str << std::endl;
202  }
203 }//SaveToStream(...)
204 
205 
206 //Сохранение вектора в поток
207 void VMlib::SaveToStream(const Eigen::VectorXd& vec, std::ostream& str)
208 {
209  str.precision(16);
210  for (int i = 0; i < vec.size(); ++i)
211  str << vec(i) << " ";
212 }//SaveToStream(...)
213 
214 
215 //Сохранение списка из двумерных векторов (точек) в поток
216 void VMlib::SaveToStream(const std::vector<Point2D>& vec, std::ostream& str)
217 {
218  for (size_t i = 0; i < vec.size(); ++i)
219  str << "{ " << vec[i][0] << " " << vec[i][1] << " } ";
220 }//SaveToStream(...)
221 
222 
223 //Ядро сглаживания (Монагана)
224 double VMlib::M4(double t)
225 {
226  double t2 = t*t;
227  double mt = t > 0 ? t : -t;
228 
229  return (mt > 2.0) ? 0.0 : \
230  (mt > 1.0) ? 0.5*sqr(2.0 - mt)*(1.0 - mt) : 1.0 - 2.5*t2 + 1.5*t2*mt;
231 }//M4(...)
232 
233 void VMlib::ModifyE2(double* ee2, double dst2)
234 {
235  if (dst2 > 0)
236  {
237  if (dst2 < ee2[0])
238  {
239  ee2[2] = ee2[1];
240  ee2[1] = ee2[0];
241  ee2[0] = dst2;
242  }//if (dist2<ee2[0])
243  else
244  {
245  if (dst2 < ee2[1])
246  {
247  ee2[2] = ee2[1];
248  ee2[1] = dst2;
249  }// if (dist2<ee2[1])
250  else
251  if (dst2 < ee2[2])
252  ee2[2] = dst2;
253  }//else
254  }//if (dst2>0)
255 }//ModifyE2(...)
256 
257 
258 // Вспомогательная функция вычисления угла между векторами
259 double VMlib::Alpha(const Point2D& p, const Point2D& s)
260 {
261  return atan2(cross3(p, s), p & s);
262 }
263 
264 // Вспомогательная функция вычисления логарифма отношения норм векторов
265 double VMlib::Lambda(const Point2D& p, const Point2D& s)
266 {
267  return 0.5*log((s & s) / (p & p));
268 }
269 
270 // Вспомогательная функция вычисления величины \f$ (\vec a \cdot \vec b) \cdot \vec c + (\vec a \times \vec b) \times \vec c \f$
271 Point2D VMlib::Omega(const Point2D& a, const Point2D& b, const Point2D& c)
272 {
273  return (a & b) * c + (Point2D({ -c[1], c[0] }))*cross3(a, b);
274 }
std::string CurrentDataTime()
Формирование строки с текущем временем и датой
Definition: defs.cpp:44
Описание базовых вспомогательных функций
void ModifyE2(double *ee2, double dst2)
Модифицирует массив квадратов расстояний до ближайших вихрей из wake.
Definition: defs.cpp:233
std::string Months[12]
Definition: defs.cpp:41
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
Definition: defs.cpp:259
void PrintHeaderToTextFile(std::ofstream &str, const std::string &header)
Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D.
Definition: defs.cpp:172
Point2D Omega(const Point2D &a, const Point2D &b, const Point2D &c)
Вспомогательная функция вычисления величины .
Definition: defs.cpp:271
T sqr(T x)
Возведение числа в квадрат
Definition: defs.h:430
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
Definition: defs.cpp:265
double cross3(const numvector< T, n > &x, const numvector< P, n > &y)
Вычисление третьей компоненты векторного произведения
Definition: numvector.h:1064
Класс, опеделяющий двумерный вектор
Definition: Point2D.h:75
void PrintLogoToStream(std::ostream &str)
Передача в поток вывода шапки программы VM2D/VM3D.
Definition: defs.cpp:105
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
Definition: defs.cpp:136
void SaveToStream(const Eigen::MatrixXd &matr, std::ostream &str)
Сохранение матрицы в поток
Definition: defs.cpp:182
void PrintUniversalLogoToStream(std::ostream &str)
Передача в поток вывода универсальной шапки программы VM2D/VM3D.
Definition: defs.cpp:89
double M4(double t)
Ядро сглаживания (Монагана)
Definition: defs.cpp:224