55 :
Mechanics(W_, numberInPassport_, true, false)
73 W.getTimers().start(
"Force");
75 const double& dt =
W.getPassport().timeDiscretizationProperties.dt;
84 Point2D hDFdelta = { 0.0, 0.0 };
88 double hDMdelta = 0.0;
94 for (
size_t i = 0; i <
afl.getNumberOfPanels(); ++i)
100 double gAtt =
Wcm * (rK ^
afl.tau[i]);
101 double gAttOld =
WcmOld * (rK ^
afl.tau[i]);
102 double deltaGAtt = gAtt - gAttOld;
104 double qAtt =
Wcm * (rK ^
afl.nrm[i]);
107 double deltaK =
boundary.sheets.freeVortexSheet(i, 0) *
afl.len[i] -
afl.gammaThrough[i] + deltaGAtt *
afl.len[i];
110 hDFdelta += deltaK *
Point2D({ -rK[1], rK[0] });
111 hDMdelta += 0.5 * deltaK * rK.
length2();
114 hDFGam += 0.25 * (
afl.getV(i) +
afl.getV(i + 1)).
kcross() * gAtt *
afl.len[i];
115 hDMGam += 0.25 * rK ^ (
afl.getV(i) +
afl.getV(i + 1)).
kcross() * gAtt *
afl.len[i];
118 hDFQ -= 0.25 * (
afl.getV(i) +
afl.getV(i + 1)) * qAtt *
afl.len[i];
119 hDMQ -= 0.25 * rK ^ (
afl.getV(i) +
afl.getV(i + 1)) * qAtt *
afl.len[i];
122 const double rho =
W.getPassport().physicalProperties.rho;
127 if ((
W.getPassport().physicalProperties.nu > 0.0))
128 for (
size_t i = 0; i <
afl.getNumberOfPanels(); ++i)
135 W.getTimers().stop(
"Force");
165 std::vector<Point2D> veloW(
afl.getNumberOfPanels());
166 for (
size_t i = 0; i <
afl.getNumberOfPanels(); ++i)
167 veloW[i] = veloRcm +
Wcm * (
afl.getR(i) -
Rcm).kcross();
203 double dt =
W.getPassport().timeDiscretizationProperties.dt;
204 double t =
W.getCurrentTime();
212 kk[0] = {
Wcm, (M - 2.0 * bw *
Wcm - kw *
Phi - addMom) / Jeff };
213 kk[1] = {
Wcm + 0.5 * dt * kk[0][1], (M - 2.0 * bw * (
Wcm + 0.5 * dt * kk[0][1]) - kw * (
Phi + 0.5 * dt * kk[0][0]) - addMom) / Jeff };
214 kk[2] = {
Wcm + 0.5 * dt * kk[1][1], (M - 2.0 * bw * (
Wcm + 0.5 * dt * kk[1][1]) - kw * (
Phi + 0.5 * dt * kk[1][0]) - addMom) / Jeff };
215 kk[3] = {
Wcm + dt * kk[2][1], (M - 2.0 * bw * (
Wcm + dt * kk[2][1]) - kw * (
Phi + dt * kk[2][0]) - addMom) / Jeff };
217 dphi = dt * (kk[0][0] + 2. * kk[1][0] + 2. * kk[2][0] + kk[3][0]) / 6.0;
218 dw = dt * (kk[0][1] + 2. * kk[1][1] + 2. * kk[2][1] + kk[3][1]) / 6.0;
224 dphi = 0.5 * a *
sqr(t) - 0.5 * a *
sqr(t - dt);
248 W.getInfo(
'i') <<
"moment of inertia " <<
"J = " <<
J << std::endl;
252 W.getInfo(
'i') <<
"wAccel = " <<
wAccel << std::endl;
256 W.getInfo(
'i') <<
"tAccel = " <<
tAccel << std::endl;
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса MechanicsRigidRotatePart.
Заголовочный файл с описанием класса StreamParser.
T sqr(T x)
Возведение числа в квадрат
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
double phiAfl
Поворот профиля
Point2D rcm
Положение центра масс профиля
std::unique_ptr< VMlib::StreamParser > mechParamsParser
Умный указатель на парсер параметров механической системы
Point2D hydroDynamForce
Вектор гидродинамической силы и момент, действующие на профиль
Point2D Vcm0
Начальная скорость центра и угловая скорость
Point2D RcmOld
Текущие положение профиля
Mechanics(const World2D &W_, size_t numberInPassport_, bool isMoves_, bool isDeform_)
Конструктор
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
virtual void Move() override
Перемещение профиля в соответствии с законом
virtual Point2D VeloOfAirfoilRcm(double currTime) override
Вычисление скорости центра масс профиля
virtual Point2D PositionOfAirfoilRcm(double currTime) override
Вычисление положения центра масс профиля
virtual void VeloOfAirfoilPanels(double currTime) override
Вычисление скоростей начал панелей
MechanicsRigidRotatePart(const World2D &W_, size_t numberInPassport_)
Конструктор
double externalTorque
внешний момент, который "снимается"
virtual double AngularVelocityOfAirfoil(double currTime) override
Вычисление угловой скорости профиля
double J
начальная угловая скорость профиля
virtual void ReadSpecificParametersFromDictionary() override
Чтение параметров конкретной механической системы
virtual double AngleOfAirfoil(double currTime) override
Вычисление угла поворота профиля
double tAccel
время, за которое профиль принудительно разгоняется
virtual void GetHydroDynamForce() override
Вычисление гидродинамической силы, действующей на профиль
double wAccel
скорость, до которой профиль принудительно разгоняется
Класс, опеделяющий текущую решаемую задачу
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора