Searching...
Minggu, 17 November 2013

Fisika Komputasi UM - Proses Difusi Suhu Tunak Satu Dimensi

Ketika ada sebuah besi yang kedua ujungnya dipanaskan dengan lilin, dan bagian tengah dari besi dipegang dengan tangan, maka lama kelamaan tangan akan terasa panas. 


Hal tersebut dapat terjadi karena adanya perambatan kalor dari ujung-ujung besi yang menyebabkan suhu dari bagian tengah besi meningkat. Panas merambat dari ujung-ujung besi menuju ke bagian tengah suhu hingga nantinya mencapai suhu tunak(steady state).
Lihatlah video dibawah ini.


Dari video diatas terlihat proses perambatan kalor dari ujung-ujung besi menuju bagian tengah besi hingga mencapai steady state(kondisi setimbang). Proses difusi suhu tunak satu dimensi dapat diselesaikan secara analitik maupun numerik. Secara numerik solusinya dapat diselesaikan dengan menggunakan bahasa pemrograman delphi maupun matlab. Berikut persamaan differensial untuk proses difusi satu dimensi.
dengan D adalah tetapan difusi, adalah konduktifitas termal penghantar, adalah massa jenis penghantar, dan c adalah panas jenis penghantar.

Pertama-pertama kita membuatnya menjadi bentuk diskrit agar lebih mudah dihitung seperti pada gambar b. 

Pada sistem fisis ini kita asumsikan :
L   = 1     (panjang besi/logam)

T
L  = 70    (suhu pada bagian x = 1)
T
R  = 90   (suhu pada x = nx+1)
T
0  = 30   (suhu mula-mula batang logam)
Hx = 0.1

dt = 1


untuk n tertentu maka berlaku 
Berikut source code matlab untuk proses difusi satu dimensi :
clc
clear all

%sistem fisika
L = 1
D = 1
Tl = 70
Tr = 90
T0 = 30

%diskretisasi panjang

hx = 0.1

Nx = L/hx

perhx = 1/hx
perhx2 = perhx*perhx


%diskretisasi waktu

dt = 1

nmax = 200

nsave = 10


for i = 1:Nx+1

    x(i)=(i-1)*hx

end


T(Nx+1) = Tr

T(1) = Tl


for i = 2:Nx

  T(i)= T0

end


for n = 1:nmax

  tn = n*dt;

  for i = 2:Nx

    T(i) = (dt*D/perhx2)*(T(i+1)-2*T(i)+T(i-1))+T(i) %rumus
  end
  if mod(n,nsave)
      suhu = [x' T'];
      csvwrite(['test_' num2str(n) '.csv'],suhu,0,0)
  end
  suhu = [x' T']
end


Jika menggunakan bahasa pemrograman delphi maka source codenya untuk proses difusi satu dimensi :

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;


type
  TForm1 = class(TForm)
    SG1: TStringGrid;
    Button1: TButton;
    EdSuhuKiri: TEdit;
    EdSuhuKanan: TEdit;
    EdSuhuAwal: TEdit;
    EdPanjang: TEdit;
    EdCacah: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SG1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=0 to 1999 do
  begin
  SG1.Cells[i,0]:='t'+ inttostr(i);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var o,L,Tl,Tr,T,Nx,hx,tm,D,dt:real;
i,n: integer;
begin
L:=strtofloat(edPanjang.Text);
Tl:=strtofloat(edSuhuKiri.Text);
Tr:=strtofloat(edSuhuKanan.Text);
T:=strtofloat(edSuhuAwal.Text);
Nx:=strtofloat(edCacah.Text);
tm:=2000;
dt:=L/tm;
D:=1;
hx:=1/Nx;


SG1.RowCount:=round(Nx+1);
SG1.ColCount:=round(tm+1);
with SG1 do
begin
  for i:= 1 to round(Nx-1) do
  for n:= 0 to round(tm-1) do
  begin
  cells[0,1]:=floattostr(Tl);
  cells[n,round(Nx-1)]:=floattostr(Tr);
  cells[0,i]:=floattostr(T);
  end;
  for n:=0 to round(tm-1) do
  for i:=2 to round(Nx-2) do
  begin
  cells[n,1]:=floattostr(Tl);
  cells[n,round(Nx-1)]:=floattostr(Tr);


  o := dt*D*(strtofloat(cells[n,i-1]) - 2*strtofloat(cells[n,i]) + strtofloat(cells[n,i+1])) / (hx*hx) + strtofloat(cells[n,i]);
  cells[n+1,i]:=floattostr(o);
  end;


end;
end;


procedure TForm1.SG1Click(Sender: TObject);
var
Nx:integer;
begin
Nx:=strtoint(edCacah.Text);
SG1.RowCount:=Nx+1;
end;


procedure XlsWriteCellLabel(XlsStream: TStream; const ACol, ARow: Word;
const AValue: string);
var
L: Word;
const
{$J+}
CXlsLabel: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
{$J-}
begin
L := Length(AValue);
CXlsLabel[1] := 8 + L;
CXlsLabel[2] := ARow;
CXlsLabel[3] := ACol;
CXlsLabel[5] := L;
XlsStream.WriteBuffer(CXlsLabel, SizeOf(CXlsLabel));
XlsStream.WriteBuffer(Pointer(AValue)^, L);
end;
function SaveAsExcelFile(AGrid: TStringGrid; AFileName: string): Boolean;
const
{$J+} CXlsBof: array[0..5] of Word = ($809, 8, 00, $10, 0, 0); {$J-}
CXlsEof: array[0..1] of Word = ($0A, 00);
var
FStream: TFileStream;
I, J: Integer;
begin
Result := False;
FStream := TFileStream.Create(PChar(AFileName), fmCreate or fmOpenWrite);
try
CXlsBof[4] := 0;
FStream.WriteBuffer(CXlsBof, SizeOf(CXlsBof));
for i := 0 to AGrid.ColCount - 1 do
for j := 0 to AGrid.RowCount - 1 do
XlsWriteCellLabel(FStream, I, J, AGrid.cells[i, j]);
FStream.WriteBuffer(CXlsEof, SizeOf(CXlsEof));
Result := True;
finally
FStream.Free;
end;
 end;


// button1 untuk save ke excel
procedure TForm1.Button2Click(Sender: TObject);
begin
If SaveAsExcelFile(SG1,'C:\Users\A43S\Desktop\difusi.xls') then
ShowMessage('StringGrid saved!');
end;


end. 

Setelah selesai melakukan perhitungan data yang didapat dari proses perhitungan tadi diolah dengan menggunakan paraview. Setelah membuka aplikasi paraview maka akan terlihat tampilan seperti gambar di bawah ini.
Kemudian "file-open, dan pilih file yang berformat .csv klik "OK ". Setelah klik "apply", maka akan muncul tabel data dari file tadi. Setelah itu plih "line chart view" untuk membuat grafiknya. Jika grafik sudah jadi, kemudian isikan nilai pada kolom time, dan kemudian klik tombol play, maka grafik akan berjalan.


Simpan file tersebut dengan cara "file - save animation", simpan dengan tipe file "avi", dan jadilah sebuah video tentang proses difusi satu dimensi.

1 komentar:

 
Back to top!