VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
VM2D::MeasureVP Class Reference

Класс, отвечающий за вычисление поля скорости и давления в заданых точках для вывода More...

#include <MeasureVP2D.h>

Collaboration diagram for VM2D::MeasureVP:

Public Member Functions

 MeasureVP (const World2D &W_)
 Конструктор
 
 ~MeasureVP ()
 Деструктор
 
void ReadPointsFromFile (const std::string &dir)
 Чтение точек, в которых нужно посчитать давление и скорость
 
void SetPoints (const std::vector< Point2D > &points, const std::vector< Point2D > &history)
 
void Initialization ()
 Инициализация векторов для вычисления скоростей и давлений Вызывается только на тех шагах расчета, когда это необходимо

 
void CalcPressure ()
 Расчет поля давления
 
void SaveVP ()
 Сохранение в файл вычисленных скоростей и давлений
 
std::vector< std::pair< Point2D, double > > GetVPinElasticPoints ()
 Возврат давления в "гидроупругих" точках
 
const WakeDataBase & getWakeVP () const
 Возврат wakeVP.
 
const std::vector< Point2D > & getVelocity () const
 Возврат velocity.
 
std::vector< Point2D > & getNonConstVelocity ()
 Возврат velocity.
 
const std::vector< double > & getDomainRadius () const
 Возврат domainRadius.
 
std::vector< double > & getNonConstDomainRadius ()
 Возврат domainRadius.
 
size_t getTotalNumberOfRealPoints () const
 

Public Attributes

std::vector< Point2D > elasticPoints
 Точки, в которых давление нужно вычислять в служебных целях (для задач гидроупругости), формируются программно
 
std::unique_ptr< WakeDataBase > wakeVP
 Умный указатель на точки, в которых нужно вычислять в данный момент времени Хранятся в виде "мнимой" системы вихрей, чтобы воспользоваться методом CalcConvVeloToSetOfPoints(...)
 
std::vector< Point2D > velocity
 Скорости в нужных точках
 
std::vector< double > domainRadius
 Радиусы вихрей в нужных точках
 
std::vector< double > pressure
 Давление в нужных точках
 

Protected Attributes

const World2D & W
 Константная ссылка на решаемую задачу
 

Private Attributes

std::vector< Point2D > initialPoints
 Точки, которые считываются из файла (давление пишется в vtk-файлы)
 
std::vector< Point2D > historyPoints
 Точки, которые считываются из файла (давление пишется в vtk и csv-файлы)
 
std::vector< std::ostringstream > sstr
 Буферы для накопления временнОй истории сил в соответствующих точках
 
int sstrCounter
 
int historyFrequency
 

Detailed Description

Класс, отвечающий за вычисление поля скорости и давления в заданых точках для вывода

Author
Марчевский Илья Константинович
Сокол Ксения Сергеевна
Рятина Евгения Павловна
Колганова Александра Олеговна
Version
1.14
Date
6 марта 2026 г.

Definition at line 64 of file MeasureVP2D.h.

Constructor & Destructor Documentation

◆ MeasureVP()

MeasureVP::MeasureVP ( const World2D &  W_)

Конструктор

Parameters
[in]W_константная ссылка на решаемую задачу

Definition at line 61 of file MeasureVP2D.cpp.

62 : W(W_)
63{
64 sstrCounter = 0;
65 wakeVP.reset(new WakeDataBase(W_));
66};//MeasureVP(...)
const World2D & W
Константная ссылка на решаемую задачу
std::unique_ptr< WakeDataBase > wakeVP
Умный указатель на точки, в которых нужно вычислять в данный момент времени Хранятся в виде "мнимой" ...
Definition MeasureVP2D.h:86
Класс, опеделяющий набор вихрей

◆ ~MeasureVP()

VM2D::MeasureVP::~MeasureVP ( )
inline

Деструктор

Definition at line 111 of file MeasureVP2D.h.

111{ };

Member Function Documentation

◆ CalcPressure()

void MeasureVP::CalcPressure ( )

Расчет поля давления

Todo:
Пока используем только средние значения свободного слоя на панелях

Definition at line 306 of file MeasureVP2D.cpp.

307{
308 W.getTimers().start("VelPres");
309
310 int addWSize = (int)wakeVP->vtx.size();
311 pressure.resize(addWSize);
312
313 Point2D dri;
314 Point2D Vi;
315 Point2D vi;
316
317 const Point2D& V0 = W.getV0();
318 const double& dt = W.getPassport().timeDiscretizationProperties.dt;
319
320 double P0 = /*1*/ 0.5 * V0.length2();
321
322 Point2D cPan;
323
324#pragma warning (push)
325#pragma warning (disable: 4101)
326 double alpha;
327 double lambda;
328 double dst2eps;
329#pragma warning (pop)
330
331#pragma omp parallel for default(none) private(alpha, lambda, dri, Vi, vi, dst2eps, cPan) shared(P0, dt, V0, addWSize, std::cout, IDPI)
332 for (int i = 0; i < addWSize; ++i)
333 {
334 const Point2D& pt = wakeVP->vtx[i].r();
335
336 pressure[i] = P0;
337 pressure[i] -= 0.5 * velocity[i].length2(); //2
338
339
340 for (size_t j = 0; j < W.getWake().vtx.size(); ++j)
341 {
342 dri = pt - W.getWake().vtx[j].r();
344
345 const double sigma2 = sqr(W.getWake().vtx[j].sigma());
346 dst2eps = VMlib::boundDenom(dri.length2(), sigma2);
347
348 vi = IDPI * W.getWake().vtx[j].g() / dst2eps * dri.kcross();
349 pressure[i] += vi & Vi; //3
350 }
351
352
353 for (size_t q = 0; q < W.getNumberOfAirfoil(); ++q)
354 //size_t q = 0;
355 {
356 const Airfoil& afl = W.getAirfoil(q);
357 const Boundary& bou = W.getBoundary(q);
358
359 for (size_t pnl = 0; pnl < afl.getNumberOfPanels(); ++pnl)
360 {
361 Point2D s = pt - afl.getR(pnl);
362 Point2D p = pt - afl.getR(pnl + 1);
363 Point2D u0 = afl.tau[pnl];
364 double alpha = VMlib::Alpha(s, p);
365 double lambda = VMlib::Lambda(s, p);
366
367 Point2D skos = IDPI * ((alpha * u0).kcross() + (lambda * u0));
368
369 Vi = 0.5 * (bou.sheets.freeVortexSheet(pnl, 0) /* - afl.gammaThrough[pnl] / afl.len[pnl]*/) * u0;
370 vi = skos.kcross() * bou.sheets.freeVortexSheet(pnl, 0);
371 //if ((i == 0) && (pnl == 0))
372 // std::cout << "vi & Vi = " << (vi & Vi) << std::endl;
373
374 pressure[i] += vi & Vi; //4
375
376 Vi = 0.5 * (afl.getV(pnl) + afl.getV(pnl + 1));
377 vi = skos.kcross() * (bou.sheets.attachedVortexSheet(pnl, 0) - bou.oldSheets.attachedVortexSheet(pnl, 0));
378 pressure[i] += vi & Vi; //4a
379
380 vi = skos * (bou.sheets.attachedSourceSheet(pnl, 0) - bou.oldSheets.attachedSourceSheet(pnl, 0));
381 pressure[i] += vi & Vi; //4b
382 }
383 }
384
385 for (size_t bou = 0; bou < W.getNumberOfBoundary(); ++bou)
386 {
387 const Point2D& rcm = W.getAirfoil(bou).rcm;
388
389
390 //
391 //if ((i==0) && (bou == 2))
392 //{
393 // for (int q = 0; q < W.getAirfoil(bou).possibleWays.size(); ++q)
394 // {
395 // std::cout << "Possible way #" << q << ": " << std::endl;
396 // for (size_t s = 0; s < W.getAirfoil(bou).possibleWays[q].size(); ++s)
397 // std::cout << W.getAirfoil(bou).possibleWays[q][s] << " ";
398 // std::cout << std::endl;
399 // }
400 //
401 // std::ofstream of(W.getPassport().dir + "ways2.txt");
402 // for (size_t q = 0; q < W.getAirfoil(bou).getNumberOfPanels(); ++q)
403 // {
404 // cPan = 0.5 * (W.getAirfoil(bou).getR(q) + W.getAirfoil(bou).getR(q + 1));
405
406 // alpha = 0.0;
407
408 // int way = W.getAirfoil(bou).wayToVertex[q];
409 // if (way == 0)
410 // of << q << " " << rcm[0] << " " << rcm[1] << " " << cPan[0] << " " << cPan[1] << std::endl;
411 // else
412 // {
413 // of << q << " " << rcm[0] << " " << rcm[1];
414 // for (int q = 0; q < W.getAirfoil(bou).possibleWays[way - 1].size() + 1; ++q)
415 // {
416 // Point2D start = ((q == 0) ? rcm : W.getAirfoil(bou).possibleWays[way - 1][q - 1]);
417 // Point2D finish = ((q == W.getAirfoil(bou).possibleWays[way - 1].size()) ? cPan : W.getAirfoil(bou).possibleWays[way - 1][q]);
418 // of << " " << finish[0] << " " << finish[1];
419 // }
420 // of << std::endl;
421 // }
422 // }
423 // of.close();
424 //}
425 //
426
427
428 for (size_t j = 0; j < W.getAirfoil(bou).getNumberOfPanels(); ++j)
429 {
430 cPan = 0.5 * (W.getAirfoil(bou).getR(j) + W.getAirfoil(bou).getR(j + 1));
431
432 alpha = 0.0;
433
434 int way = W.getAirfoil(bou).wayToVertex[j];
435 //if (way < 0)
436 // W.getInfo('i') << "Pressure computation is incorrect, way inside airfoil is undefined" << std::endl;
437
438 if (way == 0)
439 alpha = atan2((cPan - pt) ^ (rcm - pt), (cPan - pt) & (rcm - pt));
440 else
441 if (way > 0)
442 {
443 for (int q = 0; q < W.getAirfoil(bou).possibleWays[way - 1].size() + 1; ++q)
444 {
445 Point2D start = ((q == 0) ? rcm : W.getAirfoil(bou).possibleWays[way - 1][q - 1]);
446 Point2D finish = ((q == W.getAirfoil(bou).possibleWays[way - 1].size()) ? cPan : W.getAirfoil(bou).possibleWays[way - 1][q]);
447 alpha += atan2((finish - pt) ^ (start - pt), (finish - pt) & (start - pt));
448 }
449 }
450
451
453 pressure[i] += IDPI * alpha * (W.getBoundary(bou).sheets.freeVortexSheet(j, 0) + W.getBoundary(bou).sheets.attachedVortexSheet(j, 0) - W.getBoundary(bou).oldSheets.attachedVortexSheet(j, 0)) * W.getAirfoil(bou).len[j] / dt;
454
455 pressure[i] -= IDPI * alpha * W.getAirfoil(bou).gammaThrough[j] / dt;
456
457 lambda = 0.5 * log((pt - cPan).length2());
458 pressure[i] -= IDPI * lambda * (W.getBoundary(bou).sheets.attachedSourceSheet(j, 0) - W.getBoundary(bou).oldSheets.attachedSourceSheet(j, 0)) * W.getAirfoil(bou).len[j] / dt;
459 }
460 }//for bou
461 }//for i
462
463 for (size_t i = 0; i < pressure.size(); ++i)
465
466 W.getTimers().stop("VelPres");
467}//CalcPressure()
const double IDPI
Число .
Definition defs.h:79
std::vector< double > len
Длины панелей профиля
Definition Airfoil2D.h:94
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
Definition Airfoil2D.h:113
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
Definition Airfoil2D.h:137
std::vector< Point2D > tau
Касательные к панелям профиля
Definition Airfoil2D.h:91
Point2D rcm
Положение центра масс профиля
Definition Airfoil2D.h:97
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Definition Airfoil2D.h:163
Абстрактный класс, определяющий обтекаемый профиль
Definition Airfoil2D.h:182
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition Airfoil2D.h:276
std::vector< int > wayToVertex
Номера путей к вершинам
Definition Airfoil2D.h:202
std::vector< std::vector< Point2D > > possibleWays
Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей
Definition Airfoil2D.h:199
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле
Definition Boundary2D.h:65
Sheet oldSheets
Слои на профиле с предыдущего шага
Definition Boundary2D.h:99
Sheet sheets
Слои на профиле
Definition Boundary2D.h:96
std::vector< double > pressure
Давление в нужных точках
Definition MeasureVP2D.h:95
std::vector< Point2D > velocity
Скорости в нужных точках
Definition MeasureVP2D.h:89
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
Definition Passport2D.h:304
const double & attachedVortexSheet(size_t n, size_t moment) const
Definition Sheet2D.h:105
const double & attachedSourceSheet(size_t n, size_t moment) const
Definition Sheet2D.h:110
const double & freeVortexSheet(size_t n, size_t moment) const
Definition Sheet2D.h:100
VortexesParams wakeVortexesParams
Струтура, определяющая параметры вихрей в следе
Definition Velocity2D.h:112
std::vector< Vortex2D > vtx
Список вихревых элементов
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
Definition World2D.h:180
const Wake & getWake() const
Возврат константной ссылки на вихревой след
Definition World2D.h:232
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition World2D.h:163
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition World2D.h:288
Point2D getV0() const
Возврат текущей скорости набегающего потока
Definition World2D.h:148
const Velocity & getVelocity() const
Возврат константной ссылки на объект для вычисления скоростей
Definition World2D.h:253
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:263
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
Definition World2D.h:186
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
Definition World2D.h:197
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
void stop(const std::string &timerLabel)
Останов счетчика
Definition TimesGen.cpp:68
void start(const std::string &timerLabel)
Запуск счетчика
Definition TimesGen.cpp:55
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
Definition numvector.h:511
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
Definition numvector.h:386
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
Definition defs.cpp:268
T sqr(T x)
Возведение числа в квадрат
Definition defs.h:463
double boundDenom(double r2, double eps2)
Способ сглаживания скорости вихря (вихрь Рэнкина или вихрь Ламба)
Definition defs.h:577
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
Definition defs.cpp:262
double rho
Плотность потока
Definition Passport2D.h:75
std::vector< Point2D > convVelo
Вектор конвективных скоростей вихрей
Definition Velocity2D.h:72
std::vector< Point2D > diffVelo
Вектор диффузионных скоростей вихрей
Definition Velocity2D.h:75
double dt
Шаг по времени
Definition PassportGen.h:67
Here is the call graph for this function:

◆ getDomainRadius()

const std::vector< double > & VM2D::MeasureVP::getDomainRadius ( ) const
inline

Возврат domainRadius.

Returns
константную ссылку на начало domainRadius

Definition at line 153 of file MeasureVP2D.h.

153{ return domainRadius; };
std::vector< double > domainRadius
Радиусы вихрей в нужных точках
Definition MeasureVP2D.h:92

◆ getNonConstDomainRadius()

std::vector< double > & VM2D::MeasureVP::getNonConstDomainRadius ( )
inline

Возврат domainRadius.

Returns
неконстантную ссылку на начало domainRadius

Definition at line 158 of file MeasureVP2D.h.

158{ return domainRadius; };
Here is the caller graph for this function:

◆ getNonConstVelocity()

std::vector< Point2D > & VM2D::MeasureVP::getNonConstVelocity ( )
inline

Возврат velocity.

Returns
неконстантную ссылку на velocity

Definition at line 148 of file MeasureVP2D.h.

148{ return velocity; };
Here is the caller graph for this function:

◆ getTotalNumberOfRealPoints()

size_t VM2D::MeasureVP::getTotalNumberOfRealPoints ( ) const
inline

Definition at line 160 of file MeasureVP2D.h.

160{ return initialPoints.size() + historyPoints.size(); };
std::vector< Point2D > initialPoints
Точки, которые считываются из файла (давление пишется в vtk-файлы)
Definition MeasureVP2D.h:68
std::vector< Point2D > historyPoints
Точки, которые считываются из файла (давление пишется в vtk и csv-файлы)
Definition MeasureVP2D.h:71

◆ getVelocity()

const std::vector< Point2D > & VM2D::MeasureVP::getVelocity ( ) const
inline

Возврат velocity.

Returns
константную ссылку на velocity

Definition at line 143 of file MeasureVP2D.h.

143{ return velocity; };

◆ GetVPinElasticPoints()

std::vector< std::pair< Point2D, double > > MeasureVP::GetVPinElasticPoints ( )

Возврат давления в "гидроупругих" точках

Definition at line 926 of file MeasureVP2D.cpp.

927{
928 std::vector<std::pair<Point2D, double>> result;
929 result.reserve(elasticPoints.size());
930
931 const size_t nRealPressurePoints = initialPoints.size() + historyPoints.size(); //число реальных точек - без учета тех, что для гидроупругости
932
933 for (size_t q = 0; q < elasticPoints.size(); ++q)
934 result.push_back({ velocity[nRealPressurePoints + q], pressure[nRealPressurePoints + q] });
935
936 return result;
937}
std::vector< Point2D > elasticPoints
Точки, в которых давление нужно вычислять в служебных целях (для задач гидроупругости),...
Definition MeasureVP2D.h:81

◆ getWakeVP()

const WakeDataBase & VM2D::MeasureVP::getWakeVP ( ) const
inline

Возврат wakeVP.

Returns
константную ссылку на вихревой след

Definition at line 138 of file MeasureVP2D.h.

138{ return *wakeVP; };
Here is the caller graph for this function:

◆ Initialization()

void MeasureVP::Initialization ( )

Инициализация векторов для вычисления скоростей и давлений Вызывается только на тех шагах расчета, когда это необходимо

Definition at line 179 of file MeasureVP2D.cpp.

180{
181 W.getTimers().start("VelPres");
182
184 {
185 //W.getInfo('i') << "Preparing VP points" << std::endl;
186
187 wakeVP->vtx.clear();
188 wakeVP->vtx.reserve(initialPoints.size() + historyPoints.size() + elasticPoints.size());
189
190 Vortex2D addvtx;
191
192 velocity.clear();
193 pressure.clear();
194 domainRadius.clear();
195
196 //отключаем проверку того, что точки расположены вне профиля
197 /*
198 //определяем точки, которые не находятся внутри профилей
199 bool inside;
200 for (size_t i = 0; i < initialPoints.size(); ++i)
201 {
202 inside = false;
203 for (size_t j = 0; j < W.getNumberOfAirfoil(); ++j)
204 {
205 if (W.getAirfoil(j).isInsideGabarits(initialPoints[i]) && W.getAirfoil(j).IsPointInAirfoil(initialPoints[i]))
206 {
207 inside = true;
208 break;
209 }
210 }
211 if (!inside)
212 {
213 addvtx.r() = initialPoints[i];
214 wakeVP.vtx.push_back(addvtx);
215 }
216 }
217 */
218
219 //добавляем все точки, а не только те, которые вне профиля
220 for (size_t i = 0; i < initialPoints.size(); ++i)
221 {
222 addvtx.r() = initialPoints[i];
223 addvtx.g() = 0.0;
224 addvtx.sigma() = -1.0;
225 wakeVP->vtx.push_back(addvtx);
226
227 }//for i
228
229 for (size_t i = 0; i < historyPoints.size(); ++i)
230 {
231 addvtx.r() = historyPoints[i];
232 addvtx.g() = 0.0;
233 addvtx.sigma() = -1.0;
234 wakeVP->vtx.push_back(addvtx);
235 }//for i
236
237
238 elasticPoints.clear();
239
240 for (size_t afl = 0; afl < W.getNumberOfAirfoil(); ++afl)
241 {
242 MechanicsDeformable* ptr = dynamic_cast<MechanicsDeformable*>(&(W.getNonConstMechanics(afl)));
243 if ((ptr != nullptr) && (ptr->beam->fsi))
244 {
245 if (afl > 0)
246 {
247 W.getInfo('e') << "Only airfoil 0 can be elastic!" << std::endl;
248 exit(-345);
249 }
250
251 //if (ptr->beam->fsi) //turek
252 {
253 elasticPoints.reserve(ptr->chord.size() * 2);
254 for (size_t q = 0; q < ptr->chord.size(); ++q)
255 {
256 std::pair<size_t, size_t> pnls = ptr->chord[q].infPanels;
257 elasticPoints.push_back(
258 0.5 * (W.getAirfoil(afl).getR(pnls.first) + W.getAirfoil(afl).getR(pnls.first + 1))
259 + 0.01 * W.getAirfoil(afl).len[pnls.first] * W.getAirfoil(afl).nrm[pnls.first]
260 );
261
262 elasticPoints.push_back(
263 0.5 * (W.getAirfoil(afl).getR(pnls.second) + W.getAirfoil(afl).getR(pnls.second + 1))
264 + 0.01 * W.getAirfoil(afl).len[pnls.second] * W.getAirfoil(afl).nrm[pnls.second]
265 );
266 }
267
268 //std::ofstream elastPointsPositionsFile(W.getPassport().dir + "elastPointsPos-" + std::to_string(W.getCurrentStep()) + ".txt");
269 //for (size_t q = 0; q < elasticPoints.size(); ++q)
270 // elastPointsPositionsFile << elasticPoints[q][0] << " " << elasticPoints[q][1] << std::endl;
271 //elastPointsPositionsFile.close();
272 }
273 }
274 else //fish and other types
275 {
277 for (size_t q = 0; q < W.getAirfoil(afl).getNumberOfPanels(); ++q)
278 elasticPoints.push_back(0.5 * (W.getAirfoil(afl).getR(q) + W.getAirfoil(afl).getR(q + 1)) + W.getAirfoil(afl).nrm[q] * 1e-10);
279 }
280 }
281
282 /*
283 std::cout << "Elast_points added!\n";
284 for (size_t afl = 0; afl < W.getNumberOfAirfoil(); ++afl)
285 {
286 elasticPoints.reserve(W.getAirfoil(afl).getNumberOfPanels());
287 for (size_t q = 0; q < W.getAirfoil(afl).getNumberOfPanels(); ++q)
288 elasticPoints.push_back(0.5 * (W.getAirfoil(afl).getR(q) + W.getAirfoil(afl).getR(q + 1)) + W.getAirfoil(afl).nrm[q] * 1e-4);
289 }
290 */
291
292 for (size_t i = 0; i < elasticPoints.size(); ++i)
293 {
294 addvtx.r() = elasticPoints[i];
295 addvtx.g() = 0.0;
296 addvtx.sigma() = -1.0;
297 wakeVP->vtx.push_back(addvtx);
298 }//for i
299
300 }
301 W.getTimers().stop("VelPres");
302
303}//Initialization()
std::vector< Point2D > nrm
Нормали к панелям профиля
Definition Airfoil2D.h:81
Класс, определяющий вид механической системы
std::vector< ChordPanel > chord
std::unique_ptr< Beam > beam
Mechanics & getNonConstMechanics(size_t i) const
Возврат неконстантной ссылки на объект механики
Definition World2D.h:225
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59
HD double & sigma()
Функция для доступа к радиусу вихря
Definition Vortex2D.h:108
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
Definition Vortex2D.h:92
HD double & g()
Функция для доступа к циркуляции вихря
Definition Vortex2D.h:100
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
Definition WorldGen.h:82
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition WorldGen.h:99
int saveVPstep
Шаг вычисления и сохранения скорости и давления
Definition PassportGen.h:86
Here is the call graph for this function:

◆ ReadPointsFromFile()

void MeasureVP::ReadPointsFromFile ( const std::string &  dir)

Чтение точек, в которых нужно посчитать давление и скорость

Parameters
[in]dirконстантная ссылка на строку — имя каталога, где лежит cчитываемый файл

Definition at line 69 of file MeasureVP2D.cpp.

70{
71 std::string filename = dir + "pointsVP";
72 std::ifstream VPFile;
73
74 if (fileExistTest(filename, W.getInfo(), true, { "txt", "TXT" }))
75 {
76 std::stringstream VPFile(VMlib::Preprocessor(filename).resultString);
77
78 VMlib::StreamParser VPParser(W.getInfo(), "velocity & pressure parser", VPFile);
79
80 VPParser.get("points", initialPoints);
81 VPParser.get("history", historyPoints);
82 VPParser.get("historyFrequency", historyFrequency, &defaults::defaultHistoryFrequency, false);
83
84 for (auto& pt : initialPoints)
85 pt = pt.rotated(-W.getPassport().rotateAngleVpPoints * PI / 180.0);
86
87 for (auto& pt : historyPoints)
88 pt = pt.rotated(-W.getPassport().rotateAngleVpPoints * PI / 180.0);
89
90
91 if (historyPoints.size() > 0)
92 {
93 sstr.resize(historyPoints.size());
94 sstrCounter = 0;
95
96 VMlib::CreateUserDirectory(dir, "velPres");
97 std::string VPFileNameList = W.getPassport().dir + "velPres/listPoints";
98 std::ofstream VPFileList(VPFileNameList.c_str());
99
100 VMlib::PrintLogoToTextFile(VPFileList, VPFileNameList.c_str(), "List of points, where velocity and pressure are measured in csv-files");
101
102 VMlib::PrintHeaderToTextFile(VPFileList, "No. FileName X Y");
103
104 for (size_t q = 0; q < historyPoints.size(); ++q)
105 {
106 VPFileList << '\n' << q << '\t' << VMlib::fileNameStep("VP-atPoint-", 2, q, "csv") << '\t' << historyPoints[q][0] << '\t' << historyPoints[q][1];
107
108 std::string VPFileNameCsv;
109 VPFileNameCsv = W.getPassport().dir + "velPres/" + VMlib::fileNameStep("VP-atPoint-", 2, q, "csv");
110
111 std::ofstream VPFileCsv(VPFileNameCsv.c_str());
112
114 VPFileCsv << "pt,t,Vx,Vy,p" << std::endl;
115 else
116 VPFileCsv << "pt,t,CVx,CVy,Cp" << std::endl;
117
118 VPFileCsv.close();
119 VPFileCsv.clear();
120 }
121
122 VPFileList.close();
123 VPFileList.clear();
124 }
125 }
126}//ReadPointsFromFile(...)
const double PI
Число .
Definition defs.h:76
std::vector< std::ostringstream > sstr
Буферы для накопления временнОй истории сил в соответствующих точках
Definition MeasureVP2D.h:74
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
Definition Passport2D.h:297
std::string dir
Рабочий каталог задачи
Класс, позволяющий выполнять предварительную обработку файлов
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
bool fileExistTest(const std::string &fileName_, LogStream &info, bool exitKey=false, const std::list< std::string > &extList={})
Проверка существования файла
Definition defs.h:346
void PrintHeaderToTextFile(std::ofstream &str, const std::string &header)
Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D.
Definition defs.cpp:175
void CreateUserDirectory(const std::string &dir, const std::string &name)
Создание каталога
Definition defs.h:447
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
Definition defs.cpp:139
std::string fileNameStep(const std::string &name, int length, size_t number, const std::string &ext)
Формирование имени файла
Definition defs.h:387
const int defaultHistoryFrequency
Шаг сохранения буферов истории скорости и давления к контрольных точках в файл
Definition defs.h:114
const double rotateAngleVpPoints
Угол поворота точек VP.
Definition defs.h:169
Here is the call graph for this function:

◆ SaveVP()

void MeasureVP::SaveVP ( )

Сохранение в файл вычисленных скоростей и давлений

Definition at line 655 of file MeasureVP2D.cpp.

656{
657 W.getTimers().start("Save");
658
659 double scaleV = 1.0, scaleP = 1.0;
661 {
662 const double& vRef = W.getPassport().physicalProperties.vRef;
663 scaleV = 1.0 / vRef;
664 scaleP = 1.0 / (0.5 * W.getPassport().physicalProperties.rho * sqr(vRef));
665 }
666
667
668 std::ofstream outfile;
669
671 const size_t nRealPressurePoints = initialPoints.size() + historyPoints.size(); //число реальных точек - без учета тех, что для гидроупругости
672
673 if (W.getPassport().timeDiscretizationProperties.fileTypeVP.second == 0) //text format VTK
674 {
675 std::string fname = VMlib::fileNameStep("VelPres", W.getPassport().timeDiscretizationProperties.nameLength, W.getCurrentStep(), "vtk");
676 outfile.open(W.getPassport().dir + "velPres/" + fname);
677
678 outfile << "# vtk DataFile Version 2.0\n";
679 outfile << "VM2D VTK result: " << (W.getPassport().dir + "velPres/" + fname).c_str() << " saved " << VMlib::CurrentDataTime() << '\n';
680 outfile << "ASCII\n";
681 outfile << "DATASET UNSTRUCTURED_GRID\n";
682 outfile << "POINTS " << nRealPressurePoints << " float\n";
683
684 for (size_t i = 0; i < nRealPressurePoints; ++i)
685 {
686 double xi = (wakeVP->vtx[i].r())[0];
687 double yi = (wakeVP->vtx[i].r())[1];
688 outfile << xi << " " << yi << " " << "0.0\n";
689 }//for i
690
691 outfile << "CELLS " << nRealPressurePoints << " " << 2 * nRealPressurePoints << '\n';
692 for (size_t i = 0; i < nRealPressurePoints; ++i)
693 outfile << "1 " << i << '\n';
694
695 outfile << "CELL_TYPES " << nRealPressurePoints << '\n';
696 for (size_t i = 0; i < nRealPressurePoints; ++i)
697 outfile << "1\n";
698
699 outfile << '\n';
700 outfile << "POINT_DATA " << nRealPressurePoints << '\n';
701
703 outfile << "VECTORS V float\n";
704 else
705 outfile << "VECTORS CV float\n";
706
707 for (size_t i = 0; i < nRealPressurePoints; ++i)
708 {
709 outfile << velocity[i][0] * scaleV << " " << velocity[i][1] * scaleV << " 0.0\n";
710 }//for i
711
712 outfile << '\n';
713
715 outfile << "SCALARS P float 1\n";
716 else
717 outfile << "SCALARS CP float 1\n";
718
719 outfile << "LOOKUP_TABLE default\n";
720
721 for (size_t i = 0; i < nRealPressurePoints; ++i)
722 {
723 outfile << pressure[i] * scaleP << '\n';
724 }//for i
725
726 outfile.close();
727 }
728 else if (W.getPassport().timeDiscretizationProperties.fileTypeVP.second == 1) //binary format VTK
729 {
730 //Тест способа хранения чисел
731 uint16_t x = 0x0001;
732 bool littleEndian = (*((uint8_t*)&x));
733 const char eolnBIN[] = "\n";
734
735 std::string fname = VMlib::fileNameStep("VelPres", W.getPassport().timeDiscretizationProperties.nameLength, W.getCurrentStep(), "vtk");
736 outfile.open(W.getPassport().dir + "velPres/" + fname, std::ios::out | std::ios::binary);
737
738 outfile << "# vtk DataFile Version 3.0" << "\r\n" << "VM2D VTK result: " << (W.getPassport().dir + "velPres/" + fname).c_str() << " saved " << VMlib::CurrentDataTime() << eolnBIN;
739 outfile << "BINARY" << eolnBIN;
740 outfile << "DATASET UNSTRUCTURED_GRID" << eolnBIN << "POINTS " << nRealPressurePoints << " " << "float" << eolnBIN;
741
742
743 Eigen::VectorXf pData = Eigen::VectorXf::Zero(nRealPressurePoints);
744 Eigen::VectorXf vData = Eigen::VectorXf::Zero(nRealPressurePoints * 3);
745 Eigen::VectorXf rData = Eigen::VectorXf::Zero(nRealPressurePoints * 3);
746
747
748 for (size_t i = 0; i < nRealPressurePoints; ++i)
749 {
750 rData(3 * i + 0) = (float)(wakeVP->vtx[i].r())[0];
751 rData(3 * i + 1) = (float)(wakeVP->vtx[i].r())[1];
752 }//for i
753
754 for (size_t i = 0; i < nRealPressurePoints; ++i)
755 {
756 vData(3 * i + 0) = (float)(velocity[i][0] * scaleV);
757 vData(3 * i + 1) = (float)(velocity[i][1] * scaleV);
758 }//for i
759
760 for (size_t i = 0; i < nRealPressurePoints; ++i)
761 {
762 pData(i) = (float)(pressure[i] * scaleP);
763 }//for i
764
765 //POINTS
766 if (littleEndian)
767 for (int i = 0; i < nRealPressurePoints * 3; ++i)
768 VMlib::SwapEnd(rData(i));
769 outfile.write(reinterpret_cast<char*>(rData.data()), nRealPressurePoints * 3 * sizeof(float));
770
771 // CELLS
772 std::vector<int> cells(2 * nRealPressurePoints);
773 for (size_t i = 0; i < nRealPressurePoints; ++i)
774 {
775 cells[2 * i + 0] = 1;
776 cells[2 * i + 1] = (int)i;
777 }
778
779 std::vector<int> cellsTypes;
780 cellsTypes.resize(nRealPressurePoints, 1);
781
782 if (littleEndian)
783 {
784 for (int i = 0; i < nRealPressurePoints * 2; ++i)
785 VMlib::SwapEnd(cells[i]);
786
787 for (int i = 0; i < nRealPressurePoints; ++i)
788 VMlib::SwapEnd(cellsTypes[i]);
789 }
790
791 outfile << eolnBIN << "CELLS " << nRealPressurePoints << " " << nRealPressurePoints * 2 << eolnBIN;
792 outfile.write(reinterpret_cast<char*>(cells.data()), nRealPressurePoints * 2 * sizeof(int));
793 outfile << eolnBIN << "CELL_TYPES " << nRealPressurePoints << eolnBIN;
794 outfile.write(reinterpret_cast<char*>(cellsTypes.data()), nRealPressurePoints * sizeof(int));
795
796 //VECTORS V
797 if (littleEndian)
798 for (int i = 0; i < nRealPressurePoints * 3; ++i)
799 VMlib::SwapEnd(vData(i));
800
801 outfile << eolnBIN << "POINT_DATA " << nRealPressurePoints << eolnBIN;
802
804 outfile << "VECTORS V " << "float" << eolnBIN;
805 else
806 outfile << "VECTORS CV " << "float" << eolnBIN;
807
808 outfile.write(reinterpret_cast<char*>(vData.data()), nRealPressurePoints * 3 * sizeof(float));
809
810 //SCALARS P
811 if (littleEndian)
812 for (int i = 0; i < nRealPressurePoints; ++i)
813 VMlib::SwapEnd(pData(i));
814
816 outfile << eolnBIN << "SCALARS P " << "float" << " 1" << eolnBIN;
817 else
818 outfile << eolnBIN << "SCALARS CP " << "float" << " 1" << eolnBIN;
819
820 outfile << "LOOKUP_TABLE default" << eolnBIN;
821 outfile.write(reinterpret_cast<char*>(pData.data()), nRealPressurePoints * sizeof(float));
822
823 outfile << eolnBIN;
824
825 outfile.close();
826 }
827 else if (W.getPassport().timeDiscretizationProperties.fileTypeVP.second == 2) //csv
828 {
829 std::string fname = VMlib::fileNameStep("VelPres", W.getPassport().timeDiscretizationProperties.nameLength, W.getCurrentStep(), "csv");
830 outfile.open(W.getPassport().dir + "velPres/" + fname);
831
833 outfile << "point,x,y,Vx,Vy,P\n";
834 else
835 outfile << "point,x,y,CVx,CVy,CP\n";
836
837 for (size_t i = 0; i < nRealPressurePoints; ++i)
838 {
839 double xi = (wakeVP->vtx[i].r())[0];
840 double yi = (wakeVP->vtx[i].r())[1];
841 outfile << i << "," << xi << "," << yi \
842 << "," << velocity[i][0] * scaleV << "," << velocity[i][1] * scaleV \
843 << "," << pressure[i] * scaleP << '\n';
844 }//for i
845 outfile.close();
846 }
847 else if (W.getPassport().timeDiscretizationProperties.fileTypeVP.second == 3) //csvBundle
848 {
849 std::string fnameBunCsv = W.getPassport().dir + "velPres/" + "velPresBundle.csv";
850 std::ofstream VPFileBunCsv(fnameBunCsv.c_str(), W.getCurrentStep() ? std::ios::app : std::ios::out);
851 {
852 if (W.getCurrentStep() == 0)
853 VPFileBunCsv << nRealPressurePoints << '\n';
854
855
856 for (size_t q = 0; q < nRealPressurePoints; ++q)
857 {
858 VPFileBunCsv << W.getCurrentStep() << "," \
859 << W.getCurrentTime() << "," \
860 << q << "," \
861 << wakeVP->vtx[q].r()[0] << "," << wakeVP->vtx[q].r()[1] << "," \
862 << velocity[q][0] * scaleV << "," << velocity[q][1] * scaleV << "," \
863 << pressure[q] * scaleP << '\n';
864 }
865 }
866
867 }
868
869
870 //Вывод в csv-файлы точек "historyPoints"
871 #pragma omp parallel for
872 for (int q = 0; q < (int)historyPoints.size(); ++q)
873 {
874
875 if (W.getCurrentStep() == 0)
876 {
877 std::string VPFileNameCsv;
878 VPFileNameCsv = W.getPassport().dir + "velPres/" + VMlib::fileNameStep("VP-atPoint-", 2, q, "csv");
879
880 std::ofstream VPFileCsv(VPFileNameCsv.c_str(), std::ios::out);
881
883 VPFileCsv << "point,time,Vx,Vy,P\n";
884 else
885 VPFileCsv << "point,time,CVx,CVy,CP\n";
886
887 VPFileCsv.close();
888 }
889
890 sstr[q] << q << "," << W.getCurrentTime() << ","
891 << velocity[initialPoints.size() + q][0] * scaleV << ","
892 << velocity[initialPoints.size() + q][1] * scaleV << ","
893 << pressure[initialPoints.size() + q] * scaleP << '\n';
894
895 if (q == 0)
897 }
898
899 //Сохраняем буфера в файл рас в historyFrequency шагов
901 {
902 #pragma omp parallel for
903 for (int q = 0; q < (int)historyPoints.size(); ++q)
904 {
905 std::string VPFileNameCsv;
906 VPFileNameCsv = W.getPassport().dir + "velPres/" + VMlib::fileNameStep("VP-atPoint-", 2, q, "csv");
907
908 std::ofstream VPFileCsv(VPFileNameCsv.c_str(), std::ios::app);
909
910 VPFileCsv << sstr[q].str();
911
912 VPFileCsv.close();
913
914 sstr[q].str("");
915 sstr[q].clear();
916
917
918 if (q == 0)
919 sstrCounter = 0;
920 }
921 }
922
923 W.getTimers().stop("Save");
924}//SaveVP()
double getCurrentTime() const
Definition WorldGen.h:100
std::string CurrentDataTime()
Формирование строки с текущем временем и датой
Definition defs.cpp:47
void SwapEnd(T &var)
Вспомогательная функция перестановки байт местами (нужно для сохранения бинарных VTK)
Definition defs.h:569
double vRef
Референсная скорость
Definition Passport2D.h:81
int nameLength
Число разрядов в имени файла
Definition PassportGen.h:76
std::pair< std::string, int > fileTypeVP
Тип файлов для сохранения скорости и давления
Definition PassportGen.h:84
Here is the call graph for this function:

◆ SetPoints()

void MeasureVP::SetPoints ( const std::vector< Point2D > &  points,
const std::vector< Point2D > &  history 
)

Definition at line 129 of file MeasureVP2D.cpp.

130{
131 initialPoints = points;
132 historyPoints = history;
133
134 sstr.resize(historyPoints.size());
135 sstrCounter = 0;
136
137 for (auto& pt : initialPoints)
138 pt = pt.rotated(-W.getPassport().rotateAngleVpPoints * PI / 180.0);
139
140 for (auto& pt : historyPoints)
141 pt = pt.rotated(-W.getPassport().rotateAngleVpPoints * PI / 180.0);
142
143
144 if (historyPoints.size() > 0)
145 {
147 std::string VPFileNameList = W.getPassport().dir + "velPres/listPoints";
148 std::ofstream VPFileList(VPFileNameList.c_str());
149
150 VMlib::PrintLogoToTextFile(VPFileList, VPFileNameList.c_str(), "List of points, where velocity and pressure are measured in csv-files");
151
152 VMlib::PrintHeaderToTextFile(VPFileList, "No. FileName X Y");
153
154 for (size_t q = 0; q < historyPoints.size(); ++q)
155 {
156 VPFileList << '\n' << q << '\t' << VMlib::fileNameStep("VP-atPoint-", 2, q, "csv") << '\t' << historyPoints[q][0] << '\t' << historyPoints[q][1];
157
158 std::string VPFileNameCsv;
159 VPFileNameCsv = W.getPassport().dir + "velPres/" + VMlib::fileNameStep("VP-atPoint-", 2, q, "csv");
160
161 std::ofstream VPFileCsv(VPFileNameCsv.c_str());
162
164 VPFileCsv << "pt,t,Vx,Vy,p" << std::endl;
165 else
166 VPFileCsv << "pt,t,CVx,CVy,Cp" << std::endl;
167
168 VPFileCsv.close();
169 VPFileCsv.clear();
170 }
171
172 VPFileList.close();
173 VPFileList.clear();
174 }
175}//SetPoints(...)
Here is the call graph for this function:

Member Data Documentation

◆ domainRadius

std::vector<double> VM2D::MeasureVP::domainRadius

Радиусы вихрей в нужных точках

Definition at line 92 of file MeasureVP2D.h.

◆ elasticPoints

std::vector<Point2D> VM2D::MeasureVP::elasticPoints

Точки, в которых давление нужно вычислять в служебных целях (для задач гидроупругости), формируются программно

Definition at line 81 of file MeasureVP2D.h.

◆ historyFrequency

int VM2D::MeasureVP::historyFrequency
private

Definition at line 76 of file MeasureVP2D.h.

◆ historyPoints

std::vector<Point2D> VM2D::MeasureVP::historyPoints
private

Точки, которые считываются из файла (давление пишется в vtk и csv-файлы)

Definition at line 71 of file MeasureVP2D.h.

◆ initialPoints

std::vector<Point2D> VM2D::MeasureVP::initialPoints
private

Точки, которые считываются из файла (давление пишется в vtk-файлы)

Definition at line 68 of file MeasureVP2D.h.

◆ pressure

std::vector<double> VM2D::MeasureVP::pressure

Давление в нужных точках

Definition at line 95 of file MeasureVP2D.h.

◆ sstr

std::vector<std::ostringstream> VM2D::MeasureVP::sstr
private

Буферы для накопления временнОй истории сил в соответствующих точках

Definition at line 74 of file MeasureVP2D.h.

◆ sstrCounter

int VM2D::MeasureVP::sstrCounter
private

Definition at line 75 of file MeasureVP2D.h.

◆ velocity

std::vector<Point2D> VM2D::MeasureVP::velocity

Скорости в нужных точках

Definition at line 89 of file MeasureVP2D.h.

◆ W

const World2D& VM2D::MeasureVP::W
protected

Константная ссылка на решаемую задачу

Todo:
Сделать учет давления на бесконечности

Definition at line 102 of file MeasureVP2D.h.

◆ wakeVP

std::unique_ptr<WakeDataBase> VM2D::MeasureVP::wakeVP

Умный указатель на точки, в которых нужно вычислять в данный момент времени Хранятся в виде "мнимой" системы вихрей, чтобы воспользоваться методом CalcConvVeloToSetOfPoints(...)

Definition at line 86 of file MeasureVP2D.h.


The documentation for this class was generated from the following files: