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.

 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 , include the W and E values in your solution vector and fill your 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

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 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: and , where I start by filling with an initial guess for the field, and then store the solved temperature distribution in , and then overwrite 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 04:43.