ГЛАВНАЯ

ЛАБОРАТОРИЯ

Письмо автору

Пример программы для выполнения курсового проекта
Раздел описания констант
Раздел описания переменных
Начало тела программы
Детальная параметризация модели водосбора 1 порядка
Модель формирования стока (водосбора)
Оценка прогноза. Графика
Модель кинематической волны
Оценка прогноза. Графика

Program Kurs_1; { Название программы }
{ Подключение библиотечных модулей: стандартных (Сtr, Printer) и пользовательских Mlb, Mmatem1, MGraph1 }
Uses Crt, Mlb, Mmatem1, MGraph1, Printer;
Label m1, m2, m3, m4; { Описание меток }
Const { Описание констант }
pk=1/86.4; { Переходный коэффициент }
n=78; { Рассчетный период }
dL=135; { км - длина расчетного участка }
{ В графике для модели кинематической волны используется 1-ый приток * }
Lr1=94; { км - расстояние до 1 притока (от верхнего створа) * }
Lr2=116.5; { км - расстояние до 2 притока }
F1=1560; { км2 - площадь водосбора 1 притока * }
F2=742; { км2 - площадь водосбора 2 притока }
{ Задание имен файлов исходных данных }
pt=2; { Число притоков }
put1='c:\bp\imp\kursovik\';
put2='c:\bp\exp\kursovik\';
name11='Kap2_69'; { для модели водосбора * }
name12='jvo2_69'; { для модели водосбора }
namef1='Капша - Ерёмина гора 1969'; { * }
namef2='Явосьма - Ушаково 1969'; name2='pash2_69'; { для модели руслового стока }
namer='Паша - в/с Паречье, н/с Часовенская 1969';
Var { Описание переменных }
q, q2, z : array[1..4, 1..n] of real; { Резервирование }
R : array[1..n, 0..70] of real;
rp : array[1..11,0..100] of real; { массивов }
w, i, j, w1, w2, n2, p, w3, sc, nt : byte; { Резервирование }
j1, j2 : byte;
a1, a2, a, dx, Pr, nx, f, lu1, lu2 : real;
k, tau, SSd, tau2, dt : real;
name, namef : string;
t : text; { переменных }
{---------------------------------------------------------------}
Begin
m1:
ClrScr;
for sc:=1 to pt do begin { <--- Учет притоков }
if sc=1 then begin
name:=name11;
namef:=namef1;
f:=f1;
end;
if sc=2 then begin
name:=name12;
namef:=namef2;
f:=f2
end;
{ Организация системы меню }
GotoXY(20,5); Writeln('Исследование параметров ',sc:1,'-го притока');
GotoXY(20,7); Writeln(' Модель водосбора ');
VMenu(20,9,3,' Детальная оптимизация параметров ',
' Прогноз с заданием параметров ',
' Использовать фактические данные ','','','','', w);
if (w=1) or (w=2) then
VMenu(20,14,2,' Модель водосбора I порядка ',
' Модель водосбора II порядка ',
'','','','','',w1);
{ Детальная параметризация модели водосбора 1 порядка}
if w=1 then Parametr(put1+name+'.prn', { Процедура выполняющая детальную параметризацию. }
put2+name+'.rez', { См. модуль Mmatem1}
n, 1, F, k, tau, SSd);
{ Задание произвольных параметров }
{ Ввод численных значений параметров модели }
if (w=2) and (w1=1) then begin
ClrScr;
GotoXY(20,3); Write(' Введите коэффициент стока: '); Readln(k);
GotoXY(20,5); Write(' Введите время добегания: '); Readln(tau);
end;
if (w=2) and (w1=2) then begin
ClrScr;
GotoXY(20,3); Write(' Введите k: '); Readln(k);
GotoXY(20,5); Write(' Введите тау 1: '); Readln(tau);
GotoXY(20,7); Write(' Введите тау 2: '); Readln(tau2);
end;
{ Модель формирования стока (водосбора) }
{ Импорт исходных данных }

Assign(t, put1+name+'.prn');
Reset(t);
for j:=1 to n do
for i:=1 to 3 do Read(t, q[i,j]);
Close(t);
if w=3 then goto m4;
VMenu(20,10,2,' Прогноз с корректировкой ',
' Прогноз без корректировки ',
'','','','','',w2);
if w1=1 then begin
{ Начальные условия }
q[4,1]:=q[2,1];
{ Модель }
for i:=1 to n-1 do begin
if w2=1 then q[4,i+1]:=q[2,i]+(k*q[3,i]*F*pk-q[2,i])/tau;
if w2=2 then q[4,i+1]:=q[4,i]+(k*q[3,i]*F*pk-q[4,i])/tau;
end;
end;
if w1=2 then begin
{ Начальные условия}
q[4,1]:=q[2,1];
q[4,2]:=q[2,2];
ClrScr; Cursor(False);
{ Модель }
for i:=2 to n-1 do begin
if w2=1 then begin
a1:=k*q[3,i]*F*pk+(tau+tau2)*q[2,i]-
tau*tau2*(q[2,i-1]-2*q[2,i])-q[2,i];
a2:=tau+tau2+tau*tau2;
q[4,i+1]:=a1/a2;
end;
if w2=2 then begin
a1:=k*q[3,i]*F*pk+(tau+tau2)*q[4,i]-
tau*tau2*(q[4,i-1]-2*q[4,i])-q[4,i];
a2:=tau+tau2+tau*tau2;
q[4,i+1]:=a1/a2;
end;
end;
end;
{ Экспорт данных }
Assign(t, put2+name+'.rez');
Rewrite(t);
for j:=1 to n do begin
for i:=1 to 4 do Write(t, q[i,j]:9:2);
Writeln(t);
end;
Close(t);
{ Гидрограф и статистика }
OP_SSd(put2+name+'.rez', n, 1, SSd); { Оценка прогноза }
Gidrograf(namef, put2+name+'.rez', n, { Гидрограф }
w1, F, k, tau, tau2, SSd);
m4:
if sc=1 then for i:=1 to n do begin
q2[1,i]:=q[2,i]; { фактический первый приток }
q2[2,i]:=q[4,i]; { прогнозный первый приток }
end;
if sc=2 then for i:=1 to n do begin
q2[3,i]:=q[2,i]; { фактический второй приток }
q2[4,i]:=q[4,i]; { прогнозный второй приток } end;
end;
{---------------------------------------------------------------}
VMenu(20,15,2,' Вернуться к модели водосбора ',
' Модель кинематической волны ',
'','','','','',w1);
if w1=1 then goto m1;
{ Модель кинематической волны }
{ Импорт исходных данных }
m2: Assign(t, put1+name2+'.prn');
Reset(t);
for j:=1 to n do
for i:=1 to 3 do
Read(t, z[i,j]);
Close(t);
{---------------------------------------------------------------}
m3: ClrScr;
GotoXY(20,5); Writeln('Модель кинематической волны '); Writeln;
GotoXY(10,7);
Write('Введите скорость перемещения волны по руслу (км/сут): ');
Readln(a);
dx:=dL/10;
dt:=0.9*dx/a;
nt:=round(1/dt);
dt:=1/nt;
GotoXY(10,9);
Write('Шаг по времени в сутках (с корректировкой): ', dt:5:3);
GotoXY(10,11);
Writeln('Критерий устойчивости: ', (a*dt/dx):5:3);
for i:=1 to 11 do rp[i,0]:=(i-1)*(dL/10);
{ Поиск узла впадения притоков }
a1:=7777777;
for i:=1 to 11 do
if a1>abs(rp[i,0]-Lr1) then begin
a1:=abs(rp[i,0]-Lr1);
j1:=i;
end;
a1:=7777777;
for i:=1 to 11 do
if a1>abs(rp[i,0]-Lr2) then begin
a1:=abs(rp[i,0]-Lr2);
j2:=i;
end;
if j1=1 then j1:=2;
if j2=1 then j2:=2;
{ Начальные и граничные условия}
for i:=1 to n2 do R[1,i]:=z[2,1]+i*((z[3,1]-z[2,1])/n2);
for i:=1 to n do R[i,0]:=z[2,i];}
VMenu(20, 14, 2,' Фактический приток ',
' Прогнозный приток ',
'','','','','', w);
VMenu(20, 19, 2,' Прогноз с корректировкой ',
' Прогноз без корректировки ',
'','','','','', w1);
{---------------------------------------------------------------}
ClrScr;
z[4,1]:=z[3,1];
for sc:=1 to n-1 do begin { <--------------------- * ! }
{ Граничные условия }
for i:=1 to nt+1 do rp[1,i]:=z[2,sc]+(i-1)*(z[2,sc+1]-z[2,sc])/nt;
{ Начальные условия }
if (w1=1) and (sc>1) then
for j:=2 to 11 do rp[j,1]:=z[2,sc]+(j-1)*(z[3,sc]-z[2,sc])/10
else
for j:=2 to 11 do rp[j,1]:=rp[j,nt+1]; { корректировка }
if sc=1 then
for j:=2 to 11 do rp[j,1]:=z[2,sc]+(j-1)*(z[3,sc]-z[2,sc])/10;
for i:=1 to nt do begin
for j:=2 to 11 do begin
Pr:=0;
if (j=j1) and (w=1) then Pr:=q2[1,sc];
if (j=j2) and (w=1) then Pr:=q2[3,sc];
if (j=j1) and (w=2) then Pr:=q2[2,sc];
if (j=j2) and (w=2) then Pr:=q2[4,sc];
rp[j,i+1]:=rp[j,i]+dt*Pr-(a*dt/dx)*(rp[j,i]-rp[j-1,i]);
end;
end;
if (a<=60) and (sc<3) then begin
Writeln(sc:1);
for i:=1 to nt+1 do begin
for j:=1 to 11 do begin
Write(rp[j,i]:6:1);
end;
if i=nt+1 then Writeln(z[3,sc+1]:7:1)
else Writeln;
end;
end;
z[4,sc+1]:=rp[11,nt+1];
if (a<=60) and (sc=2) then Pres;
end; { <--------------------- * ! }
{ Экспорт данных }
for i:=1 to n do z[1,i]:=z[2,i];
for i:=1 to n do z[2,i]:=z[3,i];
if w=1 then for i:=1 to n do z[3,i]:=q2[1,i];
if w=2 then for i:=1 to n do z[3,i]:=q2[2,i];
Assign(t, put2+name2+'.rez');
Rewrite(t);
for j:=1 to n do begin
for i:=1 to 4 do Write(t, z[i,j]:9:2);
Writeln(t);
end;
Close(t);
OP_SSd(put2+name2+'.rez', n, 1, SSd); { Оценка прогноза }
Gidrograf2(namer, put2+name2+'.rez', n, 1, dL,
dx, a, SSd);
{---------------------------------------------------------------}
VMenu(48,21,3,' Вернуться к модели водосбора ',
' К модели кинематической волны ',
' В Ы Х О Д ',
'','','','',w1);
if w1=1 then goto m1;
if w1=2 then goto m2;
{ Вывод на печать результатов расчета }
for i:=1 to n do begin
for j:=1 to 4 do begin
Write(Lst, q[j,i]:9:2);
end; Writeln(Lst,' ');
end;
End.

ГЛАВНАЯ

ЛАБОРАТОРИЯ

В НАЧАЛО

Письмо автору