Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
дз разрыв.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
329.98 Кб
Скачать
  1. Найти структуру возникающую при распаде разрыва.

  2. Определить параметры в общей области.

  3. Определить параметры на разрывах.

  4. Показать изменение параметров внутрь волны разряжения.

Газ в обл 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;

}