90 double omega = sqrt(ck / cm);
97 currentDPhi[n] += dt * (-ck * phiAst - cDamp * omega * psiAst - cq) / cm;
99 std::cout <<
"n = " << n << std::endl;
100 std::cout <<
"ck / cm = " << ck / cm << std::endl;
101 std::cout <<
"cq / cm = " << cq / cm << std::endl;
110 double omega = sqrt(ck / cm);
113 auto acceleration = [&](
double phi,
double dphi) {
114 return (-ck *
phi - cDamp * omega * dphi - cq) / cm;
120 double k1_phi = dphi;
121 double k1_dphi = acceleration(
phi, dphi);
123 double k2_phi = dphi + 0.5 * dt * k1_dphi;
124 double k2_dphi = acceleration(
phi + 0.5 * dt * k1_phi, dphi + 0.5 * dt * k1_dphi);
126 double k3_phi = dphi + 0.5 * dt * k2_dphi;
127 double k3_dphi = acceleration(
phi + 0.5 * dt * k2_phi, dphi + 0.5 * dt * k2_dphi);
129 double k4_phi = dphi + dt * k3_dphi;
130 double k4_dphi = acceleration(
phi + dt * k3_phi, dphi + dt * k3_dphi);
132 currentPhi[n] =
phi + (dt / 6.0) * (k1_phi + 2 * k2_phi + 2 * k3_phi + k4_phi);
133 currentDPhi[n] = dphi + (dt / 6.0) * (k1_dphi + 2 * k2_dphi + 2 * k3_dphi + k4_dphi);
135 std::cout <<
"phi = " <<
currentPhi[n] << std::endl;
142 for (
int i = 0; i <
R; ++i)
152 const double c1 = deformParam[3];
153 const double c2 = deformParam[4];
159 alpha = deformParam[1];
162 const double lambda = deformParam[2];
163 const double length = 1.0;
164 const double f = deformParam[0];
165 if (!fsi && (f == 0))
168 auto A = [c1, c2](
double xi) {
return 1.0 + (xi - 1.0) * c1 + (xi * xi - 1.0) * c2;};
171 double result = W.getPassport().physicalProperties.accelCft(t) * alpha * A(x + 0.5) * sin(
DPI * ((x + 0.5) / (length * lambda) - f * t));
181 Mechanics(W_, numberInPassport_, true, true)
183 const auto& airfoil = W_.
getAirfoil(numberInPassport_);
186 Rcm0 = { airfoil.rcm[0], airfoil.rcm[1] };
197 Initialize(zero, airfoil.rcm + zero, 0.0, airfoil.phiAfl + 0.0);
199 if (airfoil.phiAfl != 0)
201 W.
getInfo(
'e') <<
"Airfoil rotation for Turek problem is not allowed" << std::endl;
212 while (fabs(x1 - x0) < 1e-12)
222 upperShifts[i] = airfoil.getR(i + 1)[1] - airfoil.getR(0)[1];
228 while (fabs(y1 - y0) < 1e-12)
240 while (fabs(x1 - x0) < 1e-12)
251 lowerShifts[i] = airfoil.getR(airfoil.getNumberOfPanels() - 1 - i)[1] - airfoil.getR(0)[1];
256 while (fabs(y1 - y0) < 1e-12)
271 W.
getInfo(
'e') <<
"indexOfUpperLeftAngle - indexOfUpperRightAngle != indexOfLowerRightAngle - indexOfLowerLeftAngle" << std::endl;
281 Point2D rUpLeft = airfoil.getR(idxUp + 1);
282 Point2D rUpRight = airfoil.getR(idxUp);
283 Point2D rDnLeft = airfoil.getR(idxDn);
284 Point2D rDnRight = airfoil.getR(idxDn + 1);
286 if (std::max(fabs(rUpLeft[0] - rDnLeft[0]), fabs(rUpRight[0] - rDnRight[0])) > \
287 0.01 * std::min((rUpRight[0] - rUpLeft[0]), (rDnRight[0] - rDnLeft[0])))
289 W.
getInfo(
'e') <<
"x_up != x_dn" << std::endl;
293 chord[i].beg = 0.5 * (rUpLeft + rDnLeft);
294 chord[i].end = 0.5 * (rUpRight + rDnRight);
295 chord[i].infPanels = { idxUp, idxDn };
296 chord[i].rightSemiWidth = 0.5 * (rUpRight - rDnRight)[1];
303 int np = (int)airfoil.getNumberOfPanels();
304 chord.resize(np / 2);
306 chord[0].beg = airfoil.getR(np / 2);
307 chord[np / 2 - 1].end = airfoil.getR(0);
308 chord[np / 2 - 1].rightSemiWidth = 0.0;
310 for (
size_t i = 0; i < np / 2; ++i)
313 chord[i].beg = 0.5 * (airfoil.getR(np / 2 - i) + airfoil.getR(np / 2 + i));
316 chord[i].end = 0.5 * (airfoil.getR(np / 2 - i - 1) + airfoil.getR(np / 2 + i + 1));
318 chord[i].infPanels = { np / 2 - i, np / 2 + i + 1 };
321 chord[i].rightSemiWidth = (airfoil.getR(np / 2 - i - 1) - airfoil.getR(np / 2 + i + 1)).length() * 0.5;
351 Point2D hDFdelta = { 0.0, 0.0 };
355 double hDMdelta = 0.0;
362 double gAtt = (velK &
afl.
tau[i]);
364 double gAttOld = 0.0;
368 gAttOld = ((0.5 * (oldAfl.getV(i) + oldAfl.getV(i + 1))) & oldAfl.tau[i]);
371 double deltaGAtt = gAtt - gAttOld;
373 double qAtt = (velK &
afl.
nrm[i]);
379 hDFdelta += deltaK *
Point2D({ -rK[1], rK[0] });
380 hDMdelta += 0.5 * deltaK * rK.
length2();
384 hDMGam += 0.5 * (rK ^ velK.
kcross()) * gAtt *
afl.
len[i];
387 hDFQ -= 0.5 * velK * qAtt *
afl.
len[i];
388 hDMQ -= 0.5 * (rK ^ velK) * qAtt *
afl.
len[i];
428 std::cout <<
"afl.phiAfl != Phi" << std::endl;
462 double x0 =
chord[0].beg[0];
468 for (
int i = 0; i <
beam->R; ++i)
471 for (
size_t i = 0; i <
chord.size(); ++i)
480 for (
size_t i = 0; i <
chord.size() - 1; ++i)
486 upperPoints[i] = endI + 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
487 lowerPoints[i] = endI - 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
490 upperPoints[
chord.size() - 1] =
chord.back().end +
chord.back().rightSemiWidth * normBack;
491 lowerPoints[
chord.size() - 1] =
chord.back().end -
chord.back().rightSemiWidth * normBack;
499 for (
size_t i = 0; i < upperPoints.size(); ++i)
501 for (
size_t i = 0; i < lowerPoints.size(); ++i)
514 for (
size_t i = 0; i <
chord.size(); ++i)
520 std::vector<Point2D> upperPoints(
chord.size());
521 std::vector<Point2D> lowerPoints(
chord.size());
523 for (
size_t i = 0; i <
chord.size() - 1; ++i)
529 upperPoints[i] = endI + 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
530 lowerPoints[i] = endI - 0.5 *
chord[i].rightSemiWidth * (normI + normIp1);
540 for (
size_t i = 0; i < nph - 1; ++i)
542 afl.
setR(nph - 1 - i) = upperPoints[i];
543 afl.
setR(nph + 1 + i) = lowerPoints[i];
558 for (
size_t p = 0; p < initialWay.size(); ++p)
560 double x = initialWay[p][0];
564 y =
beam->getTotalDisp(x, t);
578#if defined(INITIAL) || defined(BRIDGE)
582 W.
getInfo(
'i') <<
"mechDeformable: " <<
"deformParam = {";
584 W.getInfo(
'i') <<
" " << val;
585 W.
getInfo(
'i') <<
" }" << std::endl;
588 W.
getInfo(
'i') <<
"mechDeformable: " <<
"fsi = " <<
fsi << std::endl;
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса 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
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
double getGivenLaw(double x, double t, const std::vector< double > &deformParam) 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
Плотность потока