CO2 выстрел, моделирование.

SwD

Решил смоделировать процесс в котором давление газа распространяется со скоростью света и падения температуры не происходит.
Т.е. пуля ползет по стволу, а газ расширяется, придает пуле постоянно меняющееся ускорение, давление падает по ходу пули от изменения объема. Получается эдакая суперскорость, которую реально достичь нельзя. С другой стороны есть программа Игната, которая считает падение давления по адиабатической формуле. В принципе это можно добавить и в мою программу. Результат интересный - практические измерения лежат примерно посередине между этими двумя результатами (с учетом адиабаты и без).
Что думаю - может таки подобрать эмпирически показатель адиабаты?
Кому интересно - собственно, прога.
=====================================
#include «stdio.h»
#include «math.h»

/* MP654 - 0.25 cub.sm */
/* MP651 - 0.37 */

main ()
{
double m = 0.00033;
double S = 1.59;
double P0 = 60;
#if 0
double U0 = 0.25;
double Lmax = .096;
#else
double U0 = 0.37;
double Lmax = 0.15;
#endif
double L;
double V = 0;
double step = 0.00000001;
int i = 1;
for (L = 0; L « Lmax; L += step){
double P = (P0 * U0) / (U0 + L*100. * S/10.);
double a = P * S / m;
V = V - 2 * a * step / (-sqrt(V*V + 2*a*step) - V);
if (L*100 »= i){
printf ("%d: %g, %g\n", i, V, P);
i++;
}
}
printf ("%g\n", V);
return 0;
}

[edited by SwD]

SwD

Добавил адиабатическое расширение.
Для малых объемов клапанов получились вообще красивые значения. А вот для больших объемов - уже фигня... Чего ишшо добавить?
==========================
double P = P0 / pow (((U0 + L*100. * S/10.) / U0), 1.34);

Zhora47

Молодец, SWD. Дерзай !
Я вот все времени не найду свою модель до ума довести, рассмотреть там все процессы, о которых мы с тобой так много недавно спорили. Поэтому тоже остановился на расчетах с поправочными коэффициентами (но по своей модели). Все нормально считается. Физика выстрела во всех деталях, конечно, очень интересна, но вспоминать институтские курсы и сидеть в библиотеках, к сожалению, времени не хватает.
Вижу и ты встал на путь "инженерных приближений".
Удачи.

SwD

Поэтому тоже остановился на расчетах с поправочными коэффициентами (но по своей модели).
Хотелось бы вывести хотя бы эмпирически зависимость поправок. Я вот игрался показателем адиабаты - так он, зараза, зависит от объема клапана (т.е. это не просто показатель адиабаты, а показатель падения давления) и, возможно, от длины ствола.
Например, при мелком клапане MP654 беру степень 1.2-1.3, чтоб сходилось с реальным.
Для MP651 - 1.3. Для апгрейженого MP651 (1.5 куб см дозатор) - 1.9 (приходится увеличивать падение давления), причем если задать ствол 450 мм, то скорость шара получается за 200, а скорость пули 0.5 - 168. Т.е. 168 м/с 0.5 гр при дозаторе 1.5 куб. см. Проверить бы.. Т.е. убедиться, что показатель степени не зависит от длины ствола. Или зависит..
А от дозатора - точно зависит - слишком фантастические величины получаются при увеличении дозатора при том же показателе степени.. А может там и не степень менять надо, а еще что-то в формулу вкручивать..
Начисто забыл интегралы и прочее - приходится в цикле, по dL суммировать 😀

Возможно, имеет значение "пропускная способность системы", т.е. когда увеличивается объем дозатора - давление падает еще больше только из-за того, что дозатор "не успевает" поставить требуемое количество газа для поддержания давления.. Или инерционность какая самого газа? Ведь у меня расход - 0.2-0.3 грамма, а вес пули - 0.5 грамма 😀 Вот, наверное еще что придется добавить - рост веса пули 😀 А вес - объем до дозатора, текущее давление (не учитываем пока, что давление по длине струи разное)..
Интересно, что на сей предмет прикручено у Игната? Даже при отсутсвии данных о перепусках результат его расчетов меньше.

Вижу и ты встал на путь "инженерных приближений".
Метод последовательных итераций 😊 От простого к сложному..
Хотел провести верхнюю и нижнюю границу в зависимости от основных параметров системы (ствол, калибр, вес пули, объем дозатора, стартовое давление).
С верхней границей - все просто - газ не охлаждается, давление меняется от изменения объема при движении пули. Причем интересно, что для MP654 верхняя граница (при родном клапане и стволе) 133 м/с.
С нижней границей оказалось посложнее. Я думал, введение адиабаты даст нижний предел - ан нет, для MP654 в этом варианте у меня получилось 114 м/с (у Игната - в районе 90, хотя реальная практика - около того), а для MP651 с дозатором 1.5 куб см получилось 200 м/с, что на нижний предел оччень слабо похоже.
Теперь бы выявить зависимость показателя степени от дозатора.. Или для начала массу газа добавить в расчет..

[edited by SwD]

SwD

Получается следущая таблица, с показателем адиабаты 1.34:
Вес шара = 0.33 гр.
Давление 60 атм.
MP654K
Дозатор 0.25 куб.см
Ствол 10 см (9.6 - разница незаметна)
Расчетная скорость 114.8 м/с
MP651K
Дозатор 0.37 куб. см, мертвый объем 0.159 куб. см.
Ствол 15 см
Расчетная скорость 124 м/с (реальная - 134)
Расчетная скорость на 10 см ствола 114.8 м/с,
сказался мертвый объем.
Ствол 45 см, заметный разгон прекращается на 22-м сантимерте, скорость 133 м/с, на срезе ствола 140 м/с.
MP651
Дозатор 1.5 куб.см. (м.о. тот же)
ствол 15 см
расчетная скорость - 201 м/с (ну-ну)
ствол 10 см - 177 м/с (да-да)
ствол 45 см - 259 м/с (запредел какой-то).
на 22-х см - 222 м/с.
После введения поправки для дозатора 1.5 куб см (степень 1.9) получилось следущее:
ствол 10 см - 158 м/с
ствол 15 см - 174 м/с
ствол 33 см - 200 м/с, далее разгон небольшой
ствол 45 см - 207 м/с.

Что получается. Трудно назвать вариант расчета верхним пределом, т.к. для MP654 получено 114.8 м/с, что вроде не предел для его штатных параметров? Опять же MP651 показывает результат выше, чем расчетный 124.. Хотя, полученные 201 м/с для 15 см ствола (дозатор 1.5) - внушают - явный перебор..

[edited by SwD]

Zhora47

Насчет поправок: показатель он на то и показатель, чтобы быть связанным с объемом. Я для "подгонки" изменял начальное давление (брал 50 вместо 60 атмосфер). Иногда, если конструкция сложная, как например в РПШ, может иметь смысл исскуственно уменьшить объем расширительной камеры, так как там она как бы двухсекционная и эти секции не очень хорошо соединены друг с другом (канал узкий - перекрывается пружиной клапана), т.е. надо либо учитывать либо только часть камеры, ближнюю к клапану, либо и вторую часть, но частично. Кстати, если не ошибаюсь, для 651 с аирганмодовской камерой вроде тоже такой эффект должен существовать.
По поводу твоего
"Возможно, имеет значение "пропускная способность системы", т.е. когда увеличивается объем дозатора - давление падает еще больше только из-за того, что дозатор "не успевает" поставить требуемое количество газа для поддержания давления.. Или инерционность какая самого газа? Ведь у меня расход - 0.2-0.3 грамма, а вес пули - 0.5 грамма."
могу сказать следующее - если считать стстему с распределенными параметрами, (которую считал я) то там это все само по себе либо учитывается либо легко просматривается. Т.е. инерционность там учитывается точно, а недостаток пропускной способности можно оценить посредством сравнения скоростей течения газа в разных сечениях системы. Там где скорость получается охрененная - там явно главный затык и будет.
В принципе, если обойтись без таких расчетов, то можно грубо принять, что давление падает от "задней" стенки дозатора до пули по какому-либо закону, ну например, по экспоненте или гиперболе, хотя надежнее и проще будет линейное падение.
Можно, к примеру, допустить, что давление в дозаторе одинаково во всем его объеме и равно какому-то p1, а давление в стволе у клапана будет тоже p1, а у пули - p2.
Тогда среднее (среднемассовое) давление (считаемое тобой) будет
p=(0.5*(p1+p2)*rho(0.5*(p1+p2))*Vs+p1*Vd*rho(p1) )/(Vd*rho(p1)+Vs*rho(0.5*(p1+p2)),
где rho(...)- функция зависимости плотности от давления (например, адиабата); Vs - объем части ствола от клапана до пули; Vd - объем дозатора.

Кстати, по поводу больших объемов - если ты получил для них космические скорости и думаешь, что это фигня, то ты IMHO не совсем прав. Ошибка здесь может заключаться только в том, что ты не знаешь, какая температура газа будет рядом с пулей, а она там может быть существенно ниже средней - вплоть до абсолютного нуля. НО, если все же не задавать такие огромные объемы, чтобы доходить до таких температур, то можно заметить (в своей модели видел и тоже сначала не поверил), что температура не очень низкая, а скорость пули охрененная. И это вовсе не есть ошибка. Когда говорят, что скорость выше скорости звука недостижима - почему-то все забывают две вещи:
1) скорость выше скорости звука недостижима для СТАЦИОНАРНОГО потока газа, т.е. совсем не в случае распространения фронта волны давления. Кажется, этот закон называется уравнением Гюгонио (могу ошибаться).
2)Физическое ограничение скорости течения газа вызвано конечной тепловой скоростью его молекул. А они имеют солидный разброс по скоростям, т.е. нехилая их часть имеет скорость больше скорости звука. Кстати и их средняя скорость выше скорости звука.

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

P.S. Я пока писал, ты еще одно письмо запостил. Вот уж я ни на шутку расписался.

[edited by Zhora47]

SwD

Очередной инженерный тык. Добавил к весу пули вес газа в камере, убрал адиабату (степень 1). Результаты:
MP654K - 129 м/с
MP651K - 142 м/с (10 см - 128 м/с)
MP651K (2.1 cub.sm.) - 177 м/с (10 см - 152 м/с) 45 см - скромно промолчу..
Видимо, вес газа надо к весу пули подмешивать 😀 также постепенно.. Потом рассмотреть еще раз показатель степени.. А когда тыки кончатся - опять сесть в позу мыслителя..

[edited by SwD]

SwD

С весом газа - непонятки. При размышлении получается, что газ большей частью тормозится, после того как с охрененной скоростью вылетает из клапана.
Повторюсь, хотелось бы создать следущие модели:
1 макси (создана) - показывает нереальные значения.
2 приближенная макси - максимально приближенная сверху к реальным результатам. Т.е. - чтоб показывала недостижимый предел. Но недостижимый потому, что не учитывает трение, утечки и недостатки режимов работы клапанов.
По-идее пуля гонится не просто давлением, а фронтом давления. Складывается впечатление, что в маломощных пистолетах вообще имеет значение импульс, который пуля в первый момент получает от вылетевшей из клапана струи газа. Т.е. тут одним давлением не обойтись, но если это невозможно посчитать, то на это можно попробовать забить или выразить каким-либо эмпирическим коэфициентом.
Итак, что хотелось бы получить в модели.
Учет массы и калибра пули - это есть
Учет длины ствола - это есть.
Учет силы, создаваемой фронтом давления - как бы есть.
А вот учет изменения фронта давления - начинаются сложности.
Давление фронта меняется:
- от падения давления от изменения объема (типа есть, аж со степенью)
- падает от скорости пули при приближении ее скорости распространения фронта (скорость распространения тоже от чего-то зависит и это можно моделировать или принять в виде каких-то коэфициентов)
- поправка на пройденное расстояние
Дополнительный фактор, влияющий на создание фронта:
- пропускная способность клапана (выразить бы каким-то коэфициентом при приближении модели к реальному дивайсу), причем пропускная способность больше сказывается на расчетах с большими дозаторами..

SwD

В связи с уточнением результатов, показанных пистолетом (ранее считавшиеся фантастическими), устаканена следущая модель:
показатель адиабаты 1.36,
учитывает - объем клапана, длину ствола, вес пули, добавляемый вес газа. Не учитывает релятивисткие эффекты при приближении к скорости света (т.е. к скорости звука 😀 ).
Для MP651 c клапаном 1.5 куб.см подтверждено 164 м/с пулей 0.48.
Устаканились константы при разных объемах клапанов.

==================================
#include «stdio.h»
#include «math.h»

/* MP654 - 0.25 cub.sm */
/* MP651 - 0.37 */
/* Density CO2 under 60 atm = 0,1182 г/см3 */
#define VARIANT 3

main ()
{
double m = 0.00048; // 0.00033; 0.00048; 0.0005; 0.00028
double S = 1.59;
#if VARIANT == 1
double P0 = 60; /* mp654 std */
double U0 = 0.25; /* valve Volume */
double Lmax = .1; /* barrel length */
double Vdead = 0;
double ad = 1.36; //.36; //3;
#elif VARIANT == 2
double P0 = 60; /* standart MP651 */
double U0 = 0.37;
double Lmax = 0.15;
double Vdead = 0;
double ad = 1.36; //.36; //2;
#elif VARIANT == 3
double P0 = 60; /* MP651 valve volume 1.5 */
double U0 = 1.5;//37;
double Lmax = 0.15;
double Vdead = 0;
double ad = 1.36; //.36;
#else
# error Invalid variant
#endif
double L;
double V = 0;
//double step = 0.00000001;
double step = 0.00001;
double P;
double a;
double mg;
int i = 0;
mg = 0.1182 * U0 / 1000;
for (L = 0; L « Lmax; L += step){
P = P0 / pow (((U0 + Vdead + L*10. * S) / U0), ad);
a = P * S / (m + mg * (Vdead + L*10. * S) / (Vdead + L*10. * S + U0)); // mg - P / P0 * U0 * 0.1182 / 1000.);
V = V - 2 * a * step / (-sqrt(V*V + 2*a*step) - V);
if (L*100 »= i){
printf ("%d: %g, %g %g \n", (int)(L*100), V, P, mg * (Vdead + L*10. * S) / (Vdead + L*10. * S + U0));
i++;
}
}
printf ("%g, %g, %g, %g\n", V, P, m, mg * (Vdead + L*10. * S) / (Vdead + L*10. * S + U0));
return 0;
}


Добавление:

code:

#include «stdio.h»
#include «math.h»

/* стартовые параметры: */
typedef struct {
double Mbullet; /* масса пули, gramm */
double Caliber; /* калибр, mm */
double P0; /* давление в баллоне, atm */
double U0; /* объем накопителя или расходный объем, cub. sm. */
double Lmax; /* длина ствола, mm */
double Udead; /* мертвый объем, cub. sm. */
int CO2; /* 1 - CO2, 0 - air */
double F2; /* общая сила сопротивления движению пули, kg */
} ModelT;

/*
Модель предназначена для оценки мощности изделия в зависимости от начальных
параметров. Отклонение практики в сторону занижения является сигналом к поиску
серьезного отклонения в конструкции - затор в перепускном, перерасход по
повторному открытию клапана, недостаточное время открытия клапана и т.п.
Следует учитывать, что для газобалонных изделий за U0 скорее принимается
расход, чем объем накопителя, т.к. накопитель не является изолированным и расход
обычно больше объема небольшого накопителя.
Интерфейс удобного ввода стартовых значений - на усмотрение разработчика.
*/

void calc_speed (ModelT *model);

int main (int argc, char **argv)
{
ModelT model;
model.Mbullet = 0.5; /* масса пули, gramm */
model.Caliber = 4.5; /* калибр, mm */
model.P0 = 60; /* давление в баллоне, atm */
model.U0 = 1.5; /* объем накопителя или расходный объем, cub. sm. */
model.Lmax = 450; /* длина ствола, mm */
model.Udead = 1; /* мертвый объем, cub. sm. */
model.CO2 = 1; /* 1 - CO2, 0 - air */
model.F2 = 0.5; /* общая сила сопротивления движению пули (средняя потолочная), N */
calc_speed (&model);
return 0;
}

void calc_speed (ModelT *model)
{
double m = model->Mbullet / 1000.; /* gramm -> kg */
double S = model->Caliber * model->Caliber * M_PI / 400.; /* sq. sm. */
double S2 = model->Caliber / 1000. * model->Caliber / 1000. * M_PI / 4.; /* sq. m. M_PI = 3.1415926535897932384626433832795*/
double F = 0; /* F soprotivleniya vozduha */
double Lmax = model->Lmax / 1000.;
double L; /* L distance passed, m */
double V;
double step = 0.000001;
double P;
double mg; /* gas mass */
double ad = model->CO2 ? 1.36 : 1.4; /* adiabata */
double Vs0 = model->CO2 ? 256.7 : 331.; /* sound speed in gas at 293K */
double r = model->CO2 ? 0.1182 / 60 : 0.0012; /* Gas density g/cub.sm.*/
double m0 = r * model->P0; /* gas density under pressure */
double T0 = 293; /* temperature, K */
int i = 0;
double Vs;
double T1;
double E = 0;
double dmg, dmg1;
double V2;
mg = m0 * model->U0 / 1000;
for (L = 0; L « Lmax; L += step){
/* двигаем пулю по стволу на step и пересчитываем новый объем */
double dU = model-»U0 / (model->U0 + model->Udead + L*100.*S); /* 100 - convert m to sm */
P = model->P0 * dU * pow (dU, ad - 1); /* новое давление с учетом адиабаты */
/* давление совершает работу по перемещению пули и части газа на step */
E += (P*S*9.8 - F - model->F2) * step; /* 9.8 - convert kg to N */
/* вычисляем массу газа в стволе по соотношению объемов */
dmg = mg * (model->Udead + L*100. * S) / (model->Udead + L*100. * S + model->U0);
F = .5 * 1.29 * V*V*S2; /* F sopr. vozd */
dmg1 = dmg/2; /* часть массы газа отнимает энергию пули, возможно не половина массы газа в стволе */
if (L*100 >= i){
/* пересчитать температуру газа и скорость звука в нем */
T1 = T0 / pow ((model->P0/P), ((ad-1) / ad));
Vs = Vs0 * sqrt (T1 / 273);
V = sqrt(E*2/(m+dmg1)); /* учесть часть массы газа в стволе */
/* вывод:
пройденное расстояние: скорость пули, скорость звука в газе, энергия пули,
давление, температура газа (C), знак превышения скорости пули скорости звука в рабочем газе */
printf ("%d: %g, %g %g %g %g %s\n", (int)(L*100),
V, Vs, V*V*m/2, P,
T1-273, (Vs « V ? "--" : ""));
i++;
}
}
T1 = T0 / pow ((model-»P0/P), ((ad-1) / ad));
Vs = Vs0 * sqrt (T1 / 273);
V = sqrt(E*2/(m+dmg1));
/* Итог
скорость пули (энергия), скорость звука в газе, масса пули,
идеальный расход газа приведенного к начальному давлению,
давление на срезе, температура газа, расход приведенный к
атмосферному давлению куб. см.
*/
printf ("%g (%g), %g, %g, %g, %g, %g, %g\n", V, V*V*m/2, Vs,
model->Mbullet, 1000*dmg/m0, P, T1-273, 1000*dmg/m0*model->P0);
}