Найти структуру возникающую при распаде разрыва.
Определить параметры в общей области.
Определить параметры на разрывах.
Показать изменение параметров внутрь волны разряжения.
|
Газ в обл 1 |
Газ в обл 2 |
Скорости, м/с |
Давления, Мпа |
Температуры, К |
|||||
|
k1 |
R1,Дж/кг*К |
k2 |
R2,Дж/кг*К |
u1 |
u2 |
p1 |
p2 |
Т1 |
Т2 |
Вариант №3 |
1,4 |
287 |
1,66 |
2078 |
0 |
0 |
10 |
0.005 |
2000 |
500 |
Результаты:
Таблица значений параметров |
|
|
|
|
|
|
|
Давление, МПа |
Температура, К |
Плотность, кг/м^3 |
Скорость, м/c |
Скорость звука, м/c |
Число Маха |
Область 1 |
10 |
2000 |
17.422 |
0 |
896.44 |
0 |
Область 2 |
0.005 |
500 |
0.0048 |
0 |
1316.13 |
0 |
Общая область, газ 1 |
0.047 |
432.608 |
0.379 |
-2397.59 |
416.92 |
5.746 |
Общая область, газ 2 |
0.047 |
1625.02 |
0.014 |
-2397.59 |
2372.71 |
1.011 |
Структура течения
t |
Ударная волна |
Волна разрежения ПФ |
Волна разрежения ЗФ |
Контактный разрыв |
0 |
0 |
0 |
0 |
0 |
1 |
-3661,8 |
896,437 |
-1980,7 |
-2397,6 |
Таблица с результатами
|
|
|
|
|
-4 760,390 |
5 000 |
4,792E-03 |
500,000 |
0,000 |
-3 661,840 |
5 000 |
4,792E-03 |
500,000 |
0,000 |
-3 661,840 |
47 068 |
1,388E-02 |
1 625,020 |
1,010 |
-2 397,590 |
47 068 |
1,388E-02 |
1 625,020 |
1,010 |
-2 397,590 |
47 068 |
3,791E-01 |
432,608 |
5,751 |
-1 980,670 |
47 068 |
3,791E-01 |
432,608 |
5,751 |
-1 261,390 |
276 084 |
1,341E+00 |
717,156 |
3,350 |
-542,116 |
1 130 000 |
3,675E+00 |
1 073,240 |
1,826 |
177,161 |
3 660 000 |
8,499E+00 |
1 500,850 |
0,772 |
896,437 |
10 000 000 |
1,742E+01 |
2 000,000 |
0,000 |
896,437 |
10 000 000 |
1,742E+01 |
2 000,000 |
0,000 |
1 165,370 |
10 000 000 |
17,4216 |
2 000,000 |
0,000 |
Листинг программы:
#include<iostream>
#include<conio.h>
#include<vector>
#include<cstring>
#include<math.h>
#include<fstream>
#include<locale>
usingnamespace std;
constdouble pi = 3.141592653589793238;
constchar SourceData[] = "SourceData.bin";
constchar ResultData[] = "ResultData.xls";
constchar ForTXFile[] = "ForTX.xls";
class MyList;
enum Direction { Conform, Inverse };
enum Part { One, Two };
enum Rupture { ShockWave, Depression };
typedef vector<double> TVec;
typedef vector<TVec> TMat;
typedefdouble (*pfunc)(MyList&);
class MyString;
class MyList;
void WriteSourceData(MyList &in)
{
double temp = 0;
for (int i = 0; i <= in.size(); i++)
{
cout << in[i] <<" = ";
cin >> temp;
in.push(in[i], temp);
}
in.WriteData();
}
void WriteResult(double dzeta, double p, double ro, double t, double)
{
ofstream Result(ResultData, ios_base::app);
if (!Result)
{
cout <<"Не удалось вывести в файл."<< endl;
exit(0);
}
Result << dzeta <<'\t'<< p <<'\t'<< ro <<'\t'<< t << endl;
Result.close();
}
/*Файл выходных данных. Работает в режиме дописывания в конец.
Возможно, в итоге потребуется сортировка.*/
void WriteResult(double dzeta, double p, double ro, double t, double m, double m2 )
{
ofstream Result(ResultData, ios_base::app);
if (!Result)
{
cout <<"Не удалось вывести в файл."<< endl;
exit(0);
}
Result << dzeta <<'\t'<< p <<'\t'<< ro <<'\t'<< t <<'\t'
<< m <<'\t'<< m2 << endl;
Result.close();
}
void AskUser(MyList &in)
{
cout <<"1. Счет."<< endl;
cout <<"2. Изменение исходных данных и счет."<< endl;
char choise;
do
{
choise = _getch();
switch (choise) {
case'1': in.ReadData();
return;
case'2': WriteSourceData(in);
return;
default: cout <<"Некорректныйввод. Попробуйте снова."<< endl;
choise = '\0';
break;
}
} while (!choise);
}
/*Функция нахождения единичного решения уравнения методом
половинного деления.
Левая граница области поиска передается в списке in, правая -
черезпеременную end.*/
double HalfDiv(pfunc f, MyList &left, char *arg_to_search, double end)
{
constdouble EPS = 1e-5;
MyList right = left, middle = left;
right.push(arg_to_search, end);
do {
middle.push(arg_to_search, (left.pop(arg_to_search) + right.pop(arg_to_search))/2);
if ((f(left) * f(middle)) < 0 )
right = middle;
else
left = middle;
} while ( (right.pop(arg_to_search) - left.pop(arg_to_search)) > EPS);
return (left.pop(arg_to_search) + right.pop(arg_to_search))/2;
}
inlinedouble a(MyList &in)
{
return sqrt(in.pop("k")*in.pop("R")*in.pop("T"));
}
inlinedouble T(MyList &in)
{
return in.pop("p")/in.pop("ro")/in.pop("R");
}
inlinedouble ro(MyList &in)
{
return in.pop("p")/in.pop("T")/in.pop("R");
}
double Fi(double k, double s)
{
if (s < 1)
return pow(s, 1/k);
else {
if (abs((k - 1) * s + (k +1)) <= 1e-3) cout <<"Ошибкавнахождениикорня";
return ((k + 1) * s + (k - 1))/ ((k - 1) * s + (k +1));
}
}
double Psi(double k, double s)
{
if ( s > 1 ) {
if (abs((k + 1) * s + (k - 1)) <= 1e-3) cout <<"Ошибкавнахождениикорня";
return sqrt(2 / k) * (s - 1) / sqrt( (k + 1) * s + (k - 1));
}
else
return 2 / (k - 1) * (pow(s, (k - 1)/ 2 / k) - 1);
}
double Hi(MyList &in)
{
return in.pop("a1") * Psi(in.pop("k1"), in.pop("po")/in.pop("p1")) +
in.pop("a2") * Psi(in.pop("k2"), in.pop("po")/in.pop("p2")) -
(in.pop("u2") - in.pop("u1"));
}
inlinevoid Transform(MyList &l1, MyList &l2, MyList &mn)
{
l1.push("k", mn.pop("k1"));
l1.push("R", mn.pop("R1"));
l1.push("u", mn.pop("u1"));
l1.push("p", mn.pop("p1"));
l1.push("T", mn.pop("T1"));
l2.push("k", mn.pop("k2"));
l2.push("R", mn.pop("R2"));
l2.push("u", mn.pop("u2"));
l2.push("p", mn.pop("p2"));
l2.push("T", mn.pop("T2"));
}
shortint StructureIdentification(double po, double p1, double p2)
{
if (po < 0) {
cout <<"Некорректно найден корень. Программа будет закрыта.";
exit(0);
}
if (p1 > p2) {
if ( po < p2 ) {
cout <<"Имеет место структура 1:"<< endl;
cout <<"\tВлево - волна разрежения\n\tВправо - волна разрежения\n";
return 1;
}
else
if ( po < p1) {
cout <<"Имеет место структура 2:"<< endl;
cout <<"\tВлево - ударная волна\n\tВправо - волна разрежения\n";
return 2;
}
else
if ( po > p1) {
cout <<"Имеет место структура 3:"<< endl;
cout <<"\tВлево - ударная волна\n\tВправо - ударная волна\n";
return 3;
}
}
else {
if ( po < p1 ) {
cout <<"Имеет место структура 4:"<< endl;
cout <<"\tВлево - волна разрежения\n\tВправо - волна разрежения\n";
return 4;
}
else
if ( po < p2) {
cout <<"Имеет место структура 5:"<< endl;
cout <<"\tВлево - волна разрежения\n\tВправо - ударная волна\n";
return 5;
}
else
if ( po > p2) {
cout <<"Имеет место структура 6:"<< endl;
cout <<"\tВлево - ударная волна\n\tВправо - ударная волна\n";
return 6;
}
}
}
double DCount(MyList &o, MyList &l)
{
double temp = l.pop("p") - o.pop("p") + l.pop("ro") * pow(l.pop("u") ,2 )
- o.pop("ro") * pow(o.pop("u") ,2 );
temp /= l.pop("ro") * l.pop("u") - o.pop("ro") * o.pop("u");
return temp;
}
inlinevoid WriteResultFrom(MyList &in, double u, bool print = true)
{
if (print)
WriteResult(u, in.pop("p"), in.pop("ro"), in.pop("T"), abs(u/in.pop("a")),
abs((u - in.pop("u"))/in.pop("a")));
else
WriteResult(u, in.pop("p"), in.pop("ro"), in.pop("T"), abs(u/in.pop("a")));
}
void SortInDirection(Direction what, TMat &in)
{
TVec tmp(5);
for (unsignedshort i = 0; i < in.size(); i++)
for (unsignedshort j = 0; j < in.size()-1; j++)
{
if (in[j][0] > in[j+1][0]) {
tmp = in[j+1];
in[j+1] = in[j];
in[j] = tmp;
}
}
}
void WriteMat(TMat &in)
{
ofstream OutFile(ResultData, ios_base::binary|ios_base::app);
if (!OutFile)
{
cout <<"Ошибкаоткрытияфайла!."<< endl;
exit(0);
}
for (unsignedshort i = 0; i < in.size() ; i++)
WriteResult(in[i][0], in[i][1], in[i][2], in[i][3], in[i][4], 1);
OutFile.close();
}
void DeprWaveCount(MyList &o, Direction what)
{
constunsignedshort num = 4;
TMat out(num);
for (int i = 0; i < num; i++)
out[i].resize(5);
double d = (o.pop("u2") - o.pop("u1")) / num;
double dz = o.pop("u1"), p = o.pop("p"), ro = o.pop("ro"), t = o.pop("T"),
k = o.pop("k"), a2, a = o.pop("a"), tmp = dz;
out[0][0] = dz;
out[0][1] = p;
out[0][2] = ro;
out[0][3] = o.pop("T");
out[0][4] = 1;
for (int i = 1; i< num ; i++)
{
out[i][0] = dz + i * d;
a2 = a + (k-1)/(k+1)* i * abs(d);
out[i][1] = p * pow(a2/a, 2 * k/(k-1));
out[i][2] = ro * pow(a2/a, 2/(k-1));
out[i][3] = out[i][1]/out[i][2]/o.pop("R");
out[i][4] = 1;
}
SortInDirection(what, out);
WriteMat(out);
}
void ChangeDotToComma(constchar *filename)
{
fstream ToChange(filename, ios::in|ios::out);
if (!ToChange)
{
cout <<"Ошибкаоткрытияфайла"<< endl;
}
char buf;
long pos;
while (ToChange)
{
ToChange >> buf;
if (buf == '.'){
pos = ToChange.tellg();
ToChange.seekp(pos-1);
ToChange <<',';
ToChange.seekg(pos);
}
}
ToChange.close();
}
void ForTX(double dz, char *type)
{
fstream Out(ForTXFile,ios_base::binary|ios_base::app);
if (!Out) {
cout <<"Ошибка открытия файла!."<< endl;
exit(0);
}
Out << type << endl;
Out <<"дзета,м/с"<<'\t'<<"t,c"<< endl;
Out << 0 <<'\t'<< 0 << endl;
Out << dz <<'\t'<< 1 << endl;
Out.close();
}
int sign(double in)
{
return in/abs(in);
}
void Speed(Rupture type, Direction what, MyList &l, MyList &o)
{
if (type == ShockWave)
{
o.push("u2",o.push("u1", DCount(o,l)));
}
else {
double u1 = 0, u2 = 0;
if (what == Inverse) {
u1 = o.push("u1",o.pop("u") - o.pop("a"));
u2 = o.push("u2", l.pop("u") - l.pop("a"));
}
else {
u1 = o.push("u1", o.pop("u") + o.pop("a"));
u2 = o.push("u2", l.pop("u") + l.pop("a"));
}
}
char text[] = "Волнаразрежения";
if (type == ShockWave ) strcpy(text, "СУ");
if (what == Inverse) {
WriteResultFrom(l, (1 - 0.3 * sign(o.pop("u2"))) * o.pop("u2"), false);
ForTX(o.pop("u"), "Контактный разрыв");
WriteResultFrom(l, o.pop("u2"));
if (type == Depression) {DeprWaveCount(o, what);ForTX(o.pop("u2"), text);}
else WriteResultFrom(o, o.pop("u1"));ForTX(o.pop("u1"), text);
WriteResultFrom(o, o.pop("u"));
}
else
{
WriteResultFrom(o, o.pop("u"));
if (type == Depression) {DeprWaveCount(o,what);ForTX(o.pop("u2"), text);}
else WriteResultFrom(o, o.pop("u1"));ForTX(o.pop("u1"), text);
WriteResultFrom(l, o.pop("u2"));
WriteResultFrom(l, (1 + 0.3 * sign(o.pop("u2")))*o.pop("u2"), false);
}
}
void ro_o(MyList &l, MyList &o)
{
o.push("ro", l.pop("ro") * Fi(l.pop("k"), o.pop("p")/l.pop("p")));
}
void InitializeFiles()
{
ofstream ResultCreate;
ResultCreate.open(ResultData, ios_base::trunc);
ResultCreate <<"Дзета, м/с"<<'\t'<<"p, Па"<<'\t'<<"ro, кг/м^3"
<<'\t'<<"T,K"<<'\t'<<"M абс"<<'\t'<<"M отн"<< endl;
ResultCreate.close();
ResultCreate.open(ForTXFile, ios_base::trunc);
ResultCreate.close();
}
int main()
{
InitializeFiles();
MyList l1("Field1.bin"), o1("Field_o1.bin"),
l2("Field2.bin"), o2("Field_o2.bin"), mn("Test.bin");
mn = CopyToNew(mn, "k1, R1, k2, R2, u1, u2, p1, p2, T1, T2");
setlocale(LC_ALL,"russian");
AskUser(mn);
mn.push("p1", mn.pop("p1") * 1e+6);
mn.push("p2", mn.pop("p2") * 1e+6);
mn.show();
Transform(l1, l2, mn);
Transform(o1, o2, mn);
mn.push("a1", a(l1));
mn.push("a2", a(l2));
mn.push("po",0);
double po = HalfDiv(&Hi, mn, "po", 10e7);
l1.push("ro", ro(l1)); l2.push("ro", ro(l2));
o1.push("p", po); o2.push("p", po);
ro_o(l1, o1); ro_o(l2, o2);
o1.push("T", T(o1)); o2.push("T", T(o2));
l1.push("a", a(l1)); l2.push("a", a(l2)); o1.push("a", a(o1));
o2.push("a", a(o2));
o2.push("u",o1.push("u", l1.pop("u") + l1.pop("a") * Psi(o1.pop("k"), o1.pop("p")/l1.pop("p"))));
Rupture Type1, Type2;
switch (StructureIdentification(o1.pop("p"), l1.pop("p"), l2.pop("p"))) {
case 1: Type1 = Depression;
Type2 = Type1;
break;
case 2: Type1 = Depression;
Type2 = ShockWave;
break;
case 3: Type1 = ShockWave;
Type2 = Type1;
break;
case 4: Type1 = Depression;
Type2 = Type1;
break;
case 5: Type1 = ShockWave;
Type2 = Depression;
break;
case 6: Type1 = ShockWave;
Type2 = Type1;
break;
default: cout <<"Ошибка в определении структуры."<<endl;
exit(0);
}
Speed(Type2, Inverse, l2, o2);
Speed(Type1, Conform, l1, o1);
cout <<"Параметры в области \"общая 1\":"<< endl;
o1.show();
cout <<"Параметры в области \"общая 2\":"<< endl;
o2.show();
cout <<"Параметры в области \"1\":"<< endl;
l1.show();
cout <<"Параметры в области \"2\":"<< endl;
l2.show();
ChangeDotToComma(ResultData);
ChangeDotToComma(ForTXFile);
cout <<"Нажмите любую клавишу, когда будете готовы."<< endl;
_getch();
return 0;
}
