Lampiran 1: Iterasi Newton
1 format long % agar memberikan nilai sebanyak 15 bilangan decimal 2
3 % nilai perkiraan awal
4 x= xguess; 5 y= yguess; 6
7 % input jumlah iterasi yang diinginkan
8 Niter=input('jumlah iterasi= '); 9 iterasiold(1) = x;
10 iterasiold(2) = y; 11 for n=1:Niter 12 f1=xˆ2-yˆ2-y; 13 f2=yˆ2+xˆ2-x;
14 j=[2*x-2*y-1; 2*x-1 2*y];
15 iterasi = [x; y]-inv(j)*[f1; f2] 16 galat = norm(iterasi-iterasiold') 17 x = iterasi(1);
18 y = iterasi(2);
Lampiran 2: Aliran Satu Fase
1 maxk = 10000; % jumlah waktu 2 tfinal = 200;
3 dt = tfinal/maxk;
4 n = 30; % jumlah diskritisasi
5 dx = 1/n; 6 b=dt/2*dx; 7
8 % Initial condition
9 x(1) = 0.0; 10 u(1,1) = 1.0; 11
12 for i = 2:n+1
13 x(i) =x(i-1) + dx; 14 u(i,1) =1-[x(i)*x(i)]; 15 end
16
17 for k=1:maxk+1
18 time(k) = (k-1)*dt; 19 end
20
21 % metode eksplisit
22 for k=2:maxk+1 23 u(1,k)=1; 24 for i=2:n+1
25 u(i,k) =b * u(i-1,k-1) * u(i-1,k-1) + u(i,k-1) *
26 (1-b*u(i,k-1));
27 end
28 end
29
30 hold on;
31 plot(x,u(:,maxk/2+1),'r--'); 32 plot(x,u(:,1),'blue');
33 title('explicit method') 34 xlabel('X')
Lampiran 3: Aliran Dua Fase
1 % input parameter
2 L = 1; %panjang domain
3 tfinal = a;
4 maxk = t; %jumlah perputaran waktu
5 n = d; %jumlah diskritisasi
6 dt = tfinal/maxk; 7 dx = L/n;
8 b=dt/dx; 9
10 % kondisi awal
11 x(1) = 0.0; 12 u=zeros(n+1,1); 13 u(1,1) = 1.0;
20 for k=1:maxk+1
21 time(k) = (k-1)*dt; 22 end
23
24 % metode eksplisit
25 F = zeros(n+1,1); 26 for k = 2:maxk+1 27 u(1,k)=1;
28 v = velocity(u(:,k-1),dx); 29 F = Fflux(u(:,k-1))*v; 30 Fkanan = F(2:n+1,1); 31 Fkiri = F(1:n,1);
32 u(2:n+1,k) = u(2:n+1,k-1) - b*(Fkanan - Fkiri); 33 end
34
35 % representasi grafik
36 hold on;
40 title('Profile Saturation') 41 xlabel('x')
42 ylabel('S(x,t)') 43 hold off;
fungsi yang diimplementasikan pada code Aliran dua fase diatas
1 % subfungsi fungsi flux
2 function value = Fflux(u)
3 vr = k; % nilai viskositas
4 value=(vr*u.*u)./(vr*u.*u+(1-u).*(1-u));
1 % subfungsi velocity
2 function vel = velocity(u,dx) 3 m = size(u);
4 laval = 0.0; 5 for j=2:m
6 increment = (1/lamda(u(j-1))+1/lamda(u(j)))*0.5*dx; 7 laval = increment+ laval;
8 end
9 vel = 1/laval;
fungsi lamda diimplementasikan pada subfungsi velocity
1 function val = lamda(u)
2 vr = k; % nilai viskositas
Lampiran 4: Aliran Dua Fase Nonekuilibrium
1 L = 1.0; % Panjang domain
2 M = 400; % jumlah diskritisasi
3 dx = L/M;
4 x = linspace(0,L,M+1)'; 5
14 sigma = initialsigma(cc, M); % kondisi awal untuk sigma 15
16 U = zeros(2*M,1); 17 U(1:M,1) = 0.0;
18 U(M+1:2*M,1) = sigma(2:M+1,1); 19
26 effsat = [1; U(M+1:2*M,1)]; 27 figure(1);
28 hold on;
29 plot(x,sigma,'b--');
30 plot(x,sat, 'k', x,effsat,'r');
31 legend('sigma awal', 'saturation', 'sigma');
Terdapat beberapa subfungsi yang diimplementasikan pada M-File diatas yaitu
4 sigma = zeros(M+1,1); 5 sigma(1) = 1.0;
6 si = 0.2; %Initial Guess
7 % Implementation of Newton's Iteration
8 for i = 2:M+1
9 ss = sigma(i-1);
10 fluxfunold = fluxfunc(ss); 11 for k=1:Niter
12 fluxfun = fluxfunc(si);
13 derfluxfun = derfluxfunc(si); 14 Fsi=si+c*(fluxfun-fluxfunold); 15 Fsi2=1+c*derfluxfun;
16 Delta = -Fsi/Fsi2; 17 si = si + Delta; 18 if (Delta<1.0e-8)
19 break;
1 %subfungsi iterasi newton pada U
2 function [U] = iterasiU(U, Uold, b, c, dx)
3 Niter = 100; % jumlah iterasi
4
5 for m = 1:Niter
6 F = Fvektor(U, Uold, b, c, dx); 7 jacobi = matriksjacobian(U, b, c); 8 Delta = -jacobi \ F;
9 U = U + Delta;
10 if (norm(Delta)<1.0e-8)
11 m;
12 break;
13 end
14 end
15 end
1 % subfungsi untuk menghitung F(U)
7 v = velocity(U(1:M+1), dx); 8
9 F(1) = U(1) - Uold(1) + v*b*(fluxfunc(0.5*(U(1+M) + 10 Uold(M+1)))) - (v*b*(0.5*(1+1)));
11 F(M+1) = 0.5*(U(M+1) U(1) + Uold(M+1) Uold(1))
-12 c*(U(1)-Uold(1));
13
14 for i=2:M
15 F(i) = U(i) - Uold(i) + v*b*(fluxfunc(0.5*(U(i+M)+ 16 Uold(M+i)))) - v*b*(fluxfunc(0.5*(U(i+M-1)+
17 Uold(M+i-1))));
18 F(M+i) = 0.5*(U(M+i) U(i) + Uold(M+i) Uold(i))
-19 c*(U(i)-Uold(i));
20 end
21 end
22 %
Pada subfungsi iterasiU dihitung matriks jacobian F(U) yang diimplementasikan
oleh subfungsi berikut
1 %fungsi matriksjacobi
2 function [jacobian] = matriksjacobian(U, b, c) 3
4 tt = length(U); 5 M = tt/2;
6 jacobian = zeros(tt); 7 for l=1:M
8 jacobian(l,l) = 1;
14 jacobian(l,l+M) = 0.5*b*derfluxfunc(U(l+M)); 15 end
16
17 for l=2:M
18 jacobian(l,M+l-1) = -0.5*b*derfluxfunc(U(M+l-1)); 19 end
20
21 jacobian = sparse(jacobian); 22 end
Pada subfungsi Fvektor terdapat fungsi fluxfunc dan velocity
1 % subfungsi fungsi flux
2 function new = fluxfunc(sigma) 3 vr = 7;
4 new=(vr.*sigma.*sigma)/(vr.*sigma.*sigma+(1-sigma).*(1-sigma));
1 % subfungsi velocity sebagai nilai persamaan Darcy
2 function vel = velocity(u,dx) 3 m=size(u);
4 laval = 0.0; 5 for j=2:m
6 increment = (1/lamda(u(j-1))+1/lamda(u(j)))*0.5*dx; 7 laval = increment+ laval;
8 end
9 vel=1/laval; 10 end
pada fungsi matriksjacobi terdapat subfungsi derflux
1 %subfungsi untuk menghitung turunan fungsi flux
2 function val=derfluxfunc(sigma) 3 vr = 7;