60 EJ(1.1703239289446188),
100 double omega = sqrt(ck / cm);
103 auto acceleration = [&](
double phi,
double dphi) {
104 return (-ck *
phi - cDamp * omega * dphi - cq) / cm;
110 double k1_phi = dphi;
111 double k1_dphi = acceleration(
phi, dphi);
113 double k2_phi = dphi + 0.5 * dt * k1_dphi;
114 double k2_dphi = acceleration(
phi + 0.5 * dt * k1_phi, dphi + 0.5 * dt * k1_dphi);
116 double k3_phi = dphi + 0.5 * dt * k2_dphi;
117 double k3_dphi = acceleration(
phi + 0.5 * dt * k2_phi, dphi + 0.5 * dt * k2_dphi);
119 double k4_phi = dphi + dt * k3_dphi;
120 double k4_dphi = acceleration(
phi + dt * k3_phi, dphi + dt * k3_dphi);
122 currentPhi[n] =
phi + (dt / 6.0) * (k1_phi + 2 * k2_phi + 2 * k3_phi + k4_phi);
123 currentDPhi[n] = dphi + (dt / 6.0) * (k1_dphi + 2 * k2_dphi + 2 * k3_dphi + k4_dphi);
125 std::cout <<
"phi = " <<
currentPhi[n] << std::endl;
132 for (
int i = 0; i <
R; ++i)
139 const double c1 = -0.825;
140 const double c2 = 1.625;
148 const double lambda = 1.0;
149 const double length = 1.0;
150 const double f = deformParam;
152 auto A = [c1, c2](
double xi) {
return 1.0 + (xi - 1.0) * c1 + (xi * xi - 1.0) * c2;};
155 double result = W.getPassport().physicalProperties.accelCft(t) * alpha * A(x + 0.5) * sin(
DPI * ((x + 0.5) / (length * lambda) - f * t));
165 Mechanics(W_, numberInPassport_, true, true)
167 const auto& airfoil = W_.
getAirfoil(numberInPassport_);
170 Rcm0 = { airfoil.rcm[0], airfoil.rcm[1] };
181 Initialize(zero, airfoil.rcm + zero, 0.0, airfoil.phiAfl + 0.0);
183 if (airfoil.phiAfl != 0)
185 W.
getInfo(
'e') <<
"Airfoil rotation for Turek problem is not allowed" << std::endl;
196 while (fabs(x1 - x0) < 1e-12)
206 upperShifts[i] = airfoil.getR(i + 1)[1] - airfoil.getR(0)[1];
212 while (fabs(y1 - y0) < 1e-12)
224 while (fabs(x1 - x0) < 1e-12)
235 lowerShifts[i] = airfoil.getR(airfoil.getNumberOfPanels() - 1 - i)[1] - airfoil.getR(0)[1];
240 while (fabs(y1 - y0) < 1e-12)
255 W.
getInfo(
'e') <<
"indexOfUpperLeftAngle - indexOfUpperRightAngle != indexOfLowerRightAngle - indexOfLowerLeftAngle" << std::endl;
265 Point2D rUpLeft = airfoil.getR(idxUp + 1);
266 Point2D rUpRight = airfoil.getR(idxUp);
267 Point2D rDnLeft = airfoil.getR(idxDn);
268 Point2D rDnRight = airfoil.getR(idxDn + 1);
270 if (std::max(fabs(rUpLeft[0] - rDnLeft[0]), fabs(rUpRight[0] - rDnRight[0])) > \
271 0.01 * std::min((rUpRight[0] - rUpLeft[0]), (rDnRight[0] - rDnLeft[0])))
273 W.
getInfo(
'e') <<
"x_up != x_dn" << std::endl;
277 chord[i].beg = 0.5 * (rUpLeft + rDnLeft);
278 chord[i].end = 0.5 * (rUpRight + rDnRight);
279 chord[i].infPanels = { idxUp, idxDn };
280 chord[i].rightSemiWidth = 0.5 * (rUpRight - rDnRight)[1];
287 int np = (int)airfoil.getNumberOfPanels();
288 chord.resize(np / 2);
290 chord[0].beg = airfoil.getR(np / 2);
291 chord[np / 2 - 1].end = airfoil.getR(0);
292 chord[np / 2 - 1].rightSemiWidth = 0.0;
294 for (
size_t i = 0; i < np / 2; ++i)
297 chord[i].beg = 0.5 * (airfoil.getR(np / 2 - i) + airfoil.getR(np / 2 + i));
300 chord[i].end = 0.5 * (airfoil.getR(np / 2 - i - 1) + airfoil.getR(np / 2 + i + 1));
302 chord[i].infPanels = { np / 2 - i, np / 2 + i + 1 };
305 chord[i].rightSemiWidth = (airfoil.getR(np / 2 - i - 1) - airfoil.getR(np / 2 + i + 1)).length() * 0.5;
335 Point2D hDFdelta = { 0.0, 0.0 };
339 double hDMdelta = 0.0;
346 double gAtt = (velK &
afl.
tau[i]);
348 double gAttOld = 0.0;
352 gAttOld = ((0.5 * (oldAfl.getV(i) + oldAfl.getV(i + 1))) & oldAfl.tau[i]);
355 double deltaGAtt = gAtt - gAttOld;
357 double qAtt = (velK &
afl.
nrm[i]);
363 hDFdelta += deltaK *
Point2D({ -rK[1], rK[0] });
364 hDMdelta += 0.5 * deltaK * rK.
length2();
368 hDMGam += 0.5 * (rK ^ velK.
kcross()) * gAtt *
afl.
len[i];
371 hDFQ -= 0.5 * velK * qAtt *
afl.
len[i];
372 hDMQ -= 0.5 * (rK ^ velK) * qAtt *
afl.
len[i];
412 std::cout <<
"afl.phiAfl != Phi" << std::endl;
446 double x0 =
chord[0].beg[0];
452 for (
int i = 0; i <
beam->R; ++i)
455 for (
size_t i = 0; i <
chord.size(); ++i)
464 for (
size_t i = 0; i <
chord.size() - 1; ++i)
470 upperPoints[i] = endI + 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
471 lowerPoints[i] = endI - 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
474 upperPoints[
chord.size() - 1] =
chord.back().end +
chord.back().rightSemiWidth * normBack;
475 lowerPoints[
chord.size() - 1] =
chord.back().end -
chord.back().rightSemiWidth * normBack;
483 for (
size_t i = 0; i < upperPoints.size(); ++i)
485 for (
size_t i = 0; i < lowerPoints.size(); ++i)
498 for (
size_t i = 0; i <
chord.size(); ++i)
504 std::vector<Point2D> upperPoints(
chord.size());
505 std::vector<Point2D> lowerPoints(
chord.size());
507 for (
size_t i = 0; i <
chord.size() - 1; ++i)
513 upperPoints[i] = endI + 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
514 lowerPoints[i] = endI - 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
524 for (
size_t i = 0; i < nph - 1; ++i)
526 afl.
setR(nph - 1 - i) = upperPoints[i];
527 afl.
setR(nph + 1 + i) = lowerPoints[i];
542 for (
size_t p = 0; p < initialWay.size(); ++p)
544 double x = initialWay[p][0];
548 y =
beam->getTotalDisp(x, t);
562#if defined(INITIAL) || defined(BRIDGE)
569 W.
getInfo(
'i') <<
"mechDeformable: " <<
"fsi = " <<
fsi << std::endl;
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
double phiAfl
Поворот профиля
std::vector< double > len
Длины панелей профиля
void setV(const Point2D &vel)
Установка постоянной скорости всех вершин профиля
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
std::vector< Point2D > nrm
Нормали к панелям профиля
std::vector< Point2D > tau
Касательные к панелям профиля
Point2D rcm
Положение центра масс профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Point2D & setR(size_t q)
Возврат ссылки на вершину профиля
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
virtual void GetGabarits(double gap=0.02)
Вычисляет габаритный прямоугольник профиля
void CalcNrmTauLen()
Вычисление нормалей, касательных и длин панелей по текущему положению вершин
void lightningTest()
Тест на "отвещенность".
std::vector< double > viscousStress
Нейросеть для коэффициентов I0 и I3 диффузионной скорости
std::vector< std::vector< Point2D > > possibleWays
Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей
std::vector< double > qCoeff
double getGivenLaw(double x, double t, double deformParam) const
void solveDU_RK(int n, double dt)
Beam(const World2D &W_, bool fsi_, double x0_, double L_, int R_)
std::vector< std::vector< double > > presLastSteps
double shape(int n, double x) const
const std::vector< double > unitLambda
std::vector< double > currentPhi
void solveDU(int n, double dt)
std::vector< double > currentDPhi
double phi(int n, double t) const
double getTotalDisp(double x, double t) const
Sheet sheets
Слои на профиле
Абстрактный класс, определяющий вид механической системы
std::unique_ptr< VMlib::StreamParser > mechParamsParser
Умный указатель на парсер параметров механической системы
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
Point2D Vcm0
Начальная скорость центра и угловая скорость
const size_t numberInPassport
Номер профиля в паспорте
Point2D RcmOld
Текущие положение профиля
Point2D VcmOld
Скорость и отклонение с предыдущего шага
const World2D & W
Константная ссылка на решаемую задачу
void Initialize(Point2D Vcm0_, Point2D Rcm0_, double Wcm0_, double Phi0_)
Задание начального положения и начальной скорости
Point2D Rcm
Текущие положение профиля
Point2D Rcm0
Начальное положение профиля
Point2D viscousForce
Вектор силы и момент вязкого трения, действующие на профиль
double circulationOld
Циркуляция скорости по границе профиля с предыдущего шага
Point2D Vcm
Текущие скорость центра и угловая скорость
double circulation
Текущая циркуляция скорости по границе профиля
const Boundary & boundary
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
const double & freeVortexSheet(size_t n, size_t moment) const
Класс, опеделяющий текущую решаемую задачу
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
const AirfoilGeometry & getOldAirfoil(size_t i) const
Возврат константной ссылки на объект старого профиля
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
const Passport & getPassport() const
Возврат константной ссылки на паспорт
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
void stop(const std::string &timerLabel)
Останов счетчика
void start(const std::string &timerLabel)
Запуск счетчика
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
double getCurrentTime() const
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
double nu
Коэффициент кинематической вязкости среды
double rho
Плотность потока