123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- uses
- crt;
- const
- { ... parameters }
- w = 10; { max. 10 }
- h = 10; { max. 10 }
- type
- tp = array[0..w,0..h] of double;
- var
- temp : tp;
- phi : tp;
- Bi : tp;
- boundary : array[0..w,0..h] of double;
- function start_temp(i,j : longint) : double;
- begin
- start_temp:=(boundary[i,0]*(h-j)+boundary[i,h]*j+boundary[0,j]*(w-i)+boundary[w,j]*i)/(w+h);
- end;
- procedure init;
- var
- i,j : longint;
- begin
- for i:=0 to w do
- for j:=0 to h do
- temp[i,j]:=start_temp(i,j);
- end;
- procedure draw;
- var
- i,j : longint;
- begin
- for i:=0 to w do
- for j:=0 to h do
- begin
- textcolor(white);
- gotoxy(i*7+1,j*2+1);
- writeln(temp[i,j]:6:0);
- textcolor(darkgray);
- gotoxy(i*7+1,j*2+2);
- writeln(phi[i,j]:6:3);
- end;
- end;
- procedure calc_phi;
- var
- i,j : longint;
- begin
- for i:=0 to w do
- for j:=0 to h do
- begin
- if (i=0) and (j=0) then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+0.5*temp[i,j+1]+0.5*temp[i+1,j]-(1+Bi[i,j])*temp[i,j];
- end
- else if (i=0) and (j=h) then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+0.5*temp[i,j-1]+0.5*temp[i+1,j]-(1+Bi[i,j])*temp[i,j];
- end
- else if (i=w) and (j=0) then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+0.5*temp[i,j+1]+0.5*temp[i-1,j]-(1+Bi[i,j])*temp[i,j];
- end
- else if (i=w) and (j=h) then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+0.5*temp[i,j-1]+0.5*temp[i-1,j]-(1+Bi[i,j])*temp[i,j];
- end
- else if i=0 then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+temp[i+1,j]+0.5*temp[i,j-1]+0.5*temp[i,j+1]-(2+Bi[i,j])*temp[i,j];
- end
- else if i=w then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+temp[i-1,j]+0.5*temp[i,j-1]+0.5*temp[i,j+1]-(2+Bi[i,j])*temp[i,j];
- end
- else if j=0 then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+temp[i,j+1]+0.5*temp[i-1,j]+0.5*temp[i+1,j]-(2+Bi[i,j])*temp[i,j];
- end
- else if j=h then
- begin
- phi[i,j]:=Bi[i,j]*boundary[i,j]+temp[i,j-1]+0.5*temp[i-1,j]+0.5*temp[i+1,j]-(2+Bi[i,j])*temp[i,j];
- end
- else
- phi[i,j]:=temp[i,j-1]+temp[i-1,j]-4*temp[i,j]+temp[i+1,j]+temp[i,j+1];
- end;
- end;
- procedure adapt(i,j : longint);
- begin
- if (i=0) and (j=0) then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+0.5*temp[i,j+1]+0.5*temp[i+1,j])/(1+Bi[i,j]);
- end
- else if (i=0) and (j=h) then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+0.5*temp[i,j-1]+0.5*temp[i+1,j])/(1+Bi[i,j]);
- end
- else if (i=w) and (j=0) then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+0.5*temp[i,j+1]+0.5*temp[i-1,j])/(1+Bi[i,j]);
- end
- else if (i=w) and (j=h) then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+0.5*temp[i,j-1]+0.5*temp[i-1,j])/(1+Bi[i,j]);
- end
- else if i=0 then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+temp[i+1,j]+0.5*temp[i,j-1]+0.5*temp[i,j+1])/(2+Bi[i,j]);
- end
- else if i=w then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+temp[i-1,j]+0.5*temp[i,j-1]+0.5*temp[i,j+1])/(2+Bi[i,j]);
- end
- else if j=0 then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+temp[i,j+1]+0.5*temp[i-1,j]+0.5*temp[i+1,j])/(2+Bi[i,j]);
- end
- else if j=h then
- begin
- temp[i,j]:=(Bi[i,j]*boundary[i,j]+temp[i,j-1]+0.5*temp[i-1,j]+0.5*temp[i+1,j])/(2+Bi[i,j]);
- end
- else
- temp[i,j]:=(temp[i,j-1]+temp[i-1,j]+temp[i+1,j]+temp[i,j+1])/4;
- end;
- var
- iter,i,j,mi,mj : longint;
- habs,sigma_phi : double;
- begin
- clrscr;
- iter:=0;
- { setup boundary conditions }
- for i:=0 to w do
- for j:=0 to h do
- begin
- if (i=0) or (i=w) then
- bi[i,j]:=100
- else
- bi[i,j]:=100;
- if (j=0) then
- boundary[i,j]:=1000
- else
- boundary[i,j]:=300;
- end;
- init;
- draw;
- repeat
- calc_phi;
- mi:=0;
- mj:=0;
- sigma_phi:=0;
- inc(iter);
- habs:=abs(phi[mi,mj]);
- for i:=0 to w do
- for j:=0 to h do
- begin
- if abs(phi[i,j])>habs then
- begin
- mi:=i;
- mj:=j;
- habs:=abs(phi[mi,mj]);
- end;
- { calculate error }
- sigma_phi:=sigma_phi+abs(phi[i,j]);
- end;
- adapt(mi,mj);
- gotoxy(1,23);
- textcolor(white);
- writeln(iter,' iterations, sigma_phi=',sigma_phi);
- until keypressed or (sigma_phi<0.5);
- draw;
- gotoxy(1,23);
- textcolor(white);
- writeln(iter,' iterations, sigma_phi=',sigma_phi);
- writeln('press a key');
- if readkey=#0 then
- readkey;
- end.
|