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