CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   Main CFD Forum (http://www.cfd-online.com/Forums/main/)
-   -   TDMA code for MATLAB (http://www.cfd-online.com/Forums/main/97367-tdma-code-matlab.html)

amin144 February 15, 2012 14:34

TDMA code for MATLAB
 
TDMA is a quick Aligorithm for solving AX=b when A is Tridiagonal matrix:

Code:

% Written by Amin ShariatKhah 2012 - Shahrood University Of technology
%Feel Free to use it
%This code solve the AX=b (When A is Tridiagonal )

function X=TDMAsolver(A,b)

m=length(b);                % m is the number of rows
X=zeros(m,1);
A(1,2)= A(1,2)  ./ A(1,1);    % Division by zero risk.
b(1)=  b(1)    ./ A(1,1);    % Division by zero would imply a singular matrix

for i=2:m-1
    temp=  A(i,i) - A(i,i-1) .* A(i-1,i);
    A(i,i+1)=  A(i,i+1)  ./ temp;
    b(i)= ( b(i) - A(i,i-1) .* b(i-1) )  ./ temp;
end

i=m;
X(m)=(b(i) - A(i,i-1) .* b(i-1))  ./ (A(i,i) - A(i,i-1) .* A(i-1,i));

for i=m-1:-1:1
X(i)=  -A(i,i+1) .* X(i+1) + b(i);
end
end


there is another version of this code in wikipedia:

Code:

function x = TDMAsolver(a,b,c,d)
%a, b, c are the column vectors for the compressed tridiagonal matrix, d is the right vector
n = length(b); % n is the number of rows
 
% Modify the first-row coefficients
c(1) = c(1) / b(1);    % Division by zero risk.
d(1) = d(1) / b(1);    % Division by zero would imply a singular matrix.
 
for i = 2:n-1
    temp = b(i) - a(i) * c(i-1);
    c(i) = c(i) / temp;
    d(i) = (d(i) - a(i) * d(i-1)) / temp;
end
 
d(n) = (d(n) - a(n) * d(n-1))/( b(n) - a(n) * c(n-1));
 
% Now back substitute.
x(n) = d(n);
for i = n-1:-1:1
    x(i) = d(i) - c(i) * x(i + 1);
end
end


you can find some explanation about TDMA and find this code in C and Fortran90 in :
HTML Code:

http://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm

hityangsir March 27, 2012 11:33

thank you very much,that is what I need
 
thank you very much,that is what I need

amin144 April 6, 2012 15:27

You're welcome

fsouayfane March 2, 2016 09:04

2D line by line iterative TDMA
 
hello,

I am working on modelling phase change including the effect of convection in liquid phase. I want to write my program on MATLAB.

Actually I am a beginner in MATLAB.
I need help to write the 2D line by line TDMA iterative solution of my equations ( 2D transient)
Can any one provide me with a code to 2D TDMA line by line iterative algorithm for the solution of 2D discretized equations.

Thank you in advance

j_02 March 2, 2016 11:12

I cannot provide a Matlab code, but I can provide some advice.

If your stencil looks like this
http://i.imgur.com/0Og2iKV.png,

you can treat the W and E values explicitly (use the values from the previous time-/iteration step). If you are solving Ax = b, include the W and E values in your b solution vector and fill your A matrix with the coefficients of unknowns along a North-South line.

You can step W to E in the domain along N-S lines.

fsouayfane March 4, 2016 03:02

2D line by line iterative TDMA
 
Thank you for your reply,

Actually I have a problem in how to define the temperature field in Matlab code,
is it a vector or a matrix??

for example in my 2D grid I have T(1,1) T(1,2) .....T(n,m)

When I use A line by line TDMA the pentadiagonal matrix became tridiagonal.

I am sweeping from west to east along N-S lines so for a determined line ( for a specified n ) I have to calculate all the values of temperature for m going from 2 to m ( for example if n=2 (x direction ) so I calculate T(2,2) T(2,3) T(2,4) T(2,5).....(T2,m) and then I sweep to n=3 ....) . here I don't understand how can I define the temperature field in Matlab ??

j_02 March 4, 2016 10:42

Quote:

Originally Posted by fsouayfane (Post 587987)
Actually I have a problem in how to define the temperature field in Matlab code,
is it a vector or a matrix??

for example in my 2D grid I have T(1,1) T(1,2) .....T(n,m)

Using an n\times m matrix will work just fine.

Quote:

When I use A line by line TDMA the pentadiagonal matrix became tridiagonal.
Forgive me, I do not understand... do you mean because you treat two of the coefficients in an explicit manner?

Quote:


I am sweeping from west to east along N-S lines so for a determined line ( for a specified n ) I have to calculate all the values of temperature for m going from 2 to m ( for example if n=2 (x direction ) so I calculate T(2,2) T(2,3) T(2,4) T(2,5).....(T2,m) and then I sweep to n=3 ....) . here I don't understand how can I define the temperature field in Matlab ??
This procedure sounds great. I am not sure what you mean by being unable to define the temperature field in matlab... when I implemented a similar code in FORTRAN, I used two data structures, something like: \texttt{temperature} and \texttt{temperature\_prev}, where I start by filling \texttt{temperature\_prev} with an initial guess for the field, and then store the solved temperature distribution in \texttt{temperature}, and then overwrite \texttt{temperature\_prev} with the solved temperature before the next iteration.

Does that make any sense? Does that help?


All times are GMT -4. The time now is 22:28.