Распараллеливание решения уравнения Пуассона с краевыми условиями Дирихле

Автор работы: Пользователь скрыл имя, 22 Марта 2012 в 19:30, курсовая работа

Краткое описание

Уравнение Пуассона — эллиптическое дифференциальное уравнение в частных производных, которое описывает:
электростатическое поле,
стационарное поле температуры,
поле давления,
поле потенциала скорости в гидродинамике.

Содержание работы

Введение 3
1. Простейшая разностная схема «крест». Устойчивость схемы «крест» 6
2. Методы решения сеточных уравнений 11
2.1. Метод простых итераций 11
2.2. Метод простых итераций с оптимальным параметром 12
2.3. Чебышёвское ускорение метода простых итераций 14
2.4. Метод Якоби 15
2.5. Метод Зейделя 16
2.6. Метод верхней релаксации 17
2.7. Попеременно - треугольный итерационный метод 18
3. Сводка результатов по итерационным методам решения сеточных уравнений 21
4. Распараллеливание решения уравнения Пуассона с краевыми условиями Дирихле 22
Заключение 25
Список использованных источников 26

Содержимое работы - 1 файл

Курсовая.docx

— 235.81 Кб (Скачать файл)

 

 

 

 

 

 

 

 

 

 

Приложения

«Unit1.pas»

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ComCtrls, StdCtrls, ExtCtrls, Math, Spin, Grids, jpeg, Unit2, Gala;

type

  TForm1 = class(TForm)

    Panel1: TPanel;

    GroupBox1: TGroupBox;

    GroupBox2: TGroupBox;

    GroupBox3: TGroupBox;

    GroupBox4: TGroupBox;

    GroupBox5: TGroupBox;

    PageControl1: TPageControl;

    TabSheet1: TTabSheet;

    TabSheet2: TTabSheet;

    Button1: TButton;

    Button2: TButton;

    Timer1: TTimer;

    Edit1: TEdit;

    SpinEdit1: TSpinEdit;

    SpinEdit2: TSpinEdit;

    SpinEdit3: TSpinEdit;

    SpinEdit4: TSpinEdit;

    StringGrid1: TStringGrid;

    StringGrid2: TStringGrid;

    StringGrid3: TStringGrid;

    Label1: TLabel;

    StringGrid4: TStringGrid;

    StringGrid5: TStringGrid;

    StringGrid6: TStringGrid;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    Label6: TLabel;

    Panel2: TPanel;

    Panel3: TPanel;

    Panel4: TPanel;

    Panel5: TPanel;

    Panel6: TPanel;

    Label7: TLabel;

    Label8: TLabel;

    Label9: TLabel;

    Label10: TLabel;

    Label11: TLabel;

    Label12: TLabel;

    Timer2: TTimer;

    Label13: TLabel;

    Label15: TLabel;

    Label14: TLabel;

    Image1: TImage;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

  private

    { Private declarations }

     Group:      Integer;

  public

    { Public declarations }

  end;

  TProcess01 = class(TGalaProcess)

  protected

    end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

 

Function f(x:extended;y:extended):extended;

begin

f:=power(x,3)+2*y-3*x

end;

 

Function U_0_y(y:extended):extended;

begin

U_0_y:=power(y,4)+3*y;

end;

 

Function U_l_y(y:extended):extended;

begin

U_l_y:=power(y,3)+4*y;

end;

 

Function U_x_0(x:extended):extended;

begin

U_x_0:=2*x+5*sqr(x);

end;

 

Function U_x_T(x:extended):extended;

begin

U_x_T:=3*x+sqr(x);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

var

i,j,l,T,k,N,M:integer;

u:array [0..100,0..100] of extended;

x:array [0..100] of extended;

y:array [0..100] of extended;

dmax,dm,h1,h2,temp,eps:extended;

t3,t1,t2: TDateTime;

begin

  Timer1.Enabled := true;

  t1:=Now;

  eps:=strtofloat(Edit1.text);

  l:=strtoint(SpinEdit1.Text);

  T:=strtoint(SpinEdit2.Text);

  N:=strtoint(SpinEdit3.text);

  M:=strtoint(SpinEdit4.text);

  h1:=l/N;

  h2:=t/M;

  for i:=0 to N do

  begin

  x[i]:=i*h1;

  end;

  for j:=0 to M do

  begin

  y[j]:=j*h2;

  end;

  for j:=0 to M do

  begin

  u[0,j]:=U_0_y(y[j]);

  u[N,j]:=U_l_y(y[j]);

  end;

  for i:=0 to N do

  begin

  u[i,0]:=U_x_0(x[i]);

  u[i,M]:=U_x_T(x[i]);

  end;

   for i:=1 to N-1 do

    begin

      for j:=1 to M-1 do

      u[i,j]:=random(100);

   end;

  Repeat

  begin

    dmax:= 0;

    for i:=1 to N-1 do

    begin

      for j:=1 to M-1 do

      begin

        temp:= u[i,j];

        u[i,j]:=0.5*((sqr(h1)*(u[i,j-1]+u[i,j+1])+sqr(h2)*(u[i-1,j]+u[i+1,j])-sqr(h1)*sqr(h2)*f(x[i],y[j]))/(sqr(h1)+sqr(h2)));

        dm:= abs(temp-u[i,j]);

        if dmax < dm then dmax:= dm;

      end;

    end;

  end;

  Until dmax<eps;

  StringGrid1.ColCount:=N+1;

  StringGrid1.RowCount:=M+1;

  StringGrid2.RowCount:=M+1;

  StringGrid3.ColCount:=N+1;

  for i:=0 to N do

  begin

    for j:=0 to M do

      StringGrid1.Cells[i,j]:=FloatToStrF(u[i,j],ffnumber,7,7);

  end;

  for i:=0 to N do

  begin

    StringGrid2.Cells[i,0]:=FloatToStrF(x[i],ffNumber,7,7);

  end;

  for j:=0 to M do

  begin

     StringGrid3.Cells[0,j]:=FloatToStrF(y[j],ffNumber,7,7);

  end;

  t2:=Now;

  t3:=t2-t1;

  LongTimeFormat := 's,zzz';

  label1.caption:=timetostr(t3);

end;

procedure TForm1.Button2Click(Sender: TObject);

var

i,j,l,T,k,N,M,Kol_Proc,Nomer_Proc:integer;

u:array [0..100,0..100] of extended;

x:array [0..100] of extended;

y:array [0..100] of extended;

dmax,dm,h1,h2,temp,eps:extended;

t3,t1,t2: TDateTime;

begin

  eps:=strtofloat(Edit1.text);

  l:=strtoint(SpinEdit1.Text);

  T:=strtoint(SpinEdit2.Text);

  N:=strtoint(SpinEdit3.text);

  M:=strtoint(SpinEdit4.text);

  Kol_Proc:=N;

  i:=Nomer_Proc;

  h1:=l/N;

  h2:=t/M;

  Timer2.Enabled := true;

  t1:=Now;

  for i:=0 to N do

  begin

  x[i]:=i*h1;

  y[i]:=i*h2;

  end;

  for j:=0 to M do

  begin

  u[0,j]:=U_0_y(y[j]);

  u[N,j]:=U_l_y(y[j]);

  end;

  for i:=0 to N do

  begin

  u[i,0]:=U_x_0(x[i]);

  u[i,M]:=U_x_T(x[i]);

  end;

   for i:=1 to Kol_Proc -1 do

    begin

      for j:=1 to M-1 do

      u[i,j]:=random(100);

   end;

  Repeat

  begin

    dmax:= 0;

    for i:=1 to Kol_Proc -1 do

    begin

      for j:=1 to M-1 do

      begin

        temp:= u[i,j];

        u[i,j]:=0.5*((sqr(h1)*(u[i,j-1]+u[i,j+1])+sqr(h2)*(u[i-1,j]+u[i+1,j])-sqr(h1)*sqr(h2)*f(x[i],y[j]))/(sqr(h1)+sqr(h2)));

        dm:= abs(temp-u[i,j]);

        if dmax < dm then dmax:= dm;

      end;

    end;

  end;

  Until dmax<eps;

  StringGrid1.ColCount:=N+1;

  StringGrid1.RowCount:=M+1;

  StringGrid2.RowCount:=M+1;

  StringGrid3.ColCount:=N+1;

  for i:=0 to N do

  begin

    for j:=0 to M do

      StringGrid4.Cells[i,j]:=FloatToStrF(u[i,j],ffnumber,7,7);

  end;

  for i:=0 to N do

  begin

    StringGrid5.Cells[i,0]:=FloatToStrF(x[i],ffNumber,7,7);

  end;

  for j:=0 to M do

  begin

     StringGrid6.Cells[0,j]:=FloatToStrF(y[j],ffNumber,7,7);

  end;

  t2:=Now;

  t3:=t2-t1;

  LongTimeFormat := 's,zzz';

  label14.caption:=timetostr(t3);

  end;

end.

 

 

 

 

 

 


Информация о работе Распараллеливание решения уравнения Пуассона с краевыми условиями Дирихле