در حل مسائل CFD در سیالات یا انتقال حرارت یک بعدی به حل ماتریس سه قطری tdma نیاز داریم. در مسائل دو بعدی ماتریس پنج قطری و در مسائل سه بعدی به حل ماتریس هفت قطری نیاز داریم.
کد لازم برای حل ماتریس سه قطری در ادامه مطلب :
!************************ T D M A ******************************* ! * ! Solution of a linear system of algebraic equations with * ! a tridiagonal matrix of coefficients.(No pivoting) * ! Equation no. i : * ! a(i)*x(i-1) + b(i)*x(i) + c(i)*x(i+1) = d(i), * ! i = 1,2,...n * ! === USE === * ! * ! call tdma(n,a,b,c,d,x) * ! or * ! call tdma(n,a,b,c,d,d) * ! * ! In the last case, vector d contains the solution. * ! * ! === INPUT === * ! * ! n ....... integer . Number of equations * ! a(1:n) .. real vector . Lower diagonal.Element A(1) * ! is not used. * ! b(1:n) .. real vector . Main diagonal * ! c(1:n) .. real vector . Upper diagonal.Element C(N) * ! is not used. * ! d(1:n) .. real vector . Right hand side of the system. * ! * ! === OUTPUT === * ! * ! x(1:n) .. real vector . The solution vector * ! * !********************** fortran 90 ****************************** subroutine tdma(n,a,b,c,d,x) implicit none integer, intent(in) :: n real, intent(in) :: a(n), c(n) real, intent(inout), dimension(n) :: b, d real, intent(out) :: x(n) ! --- Local variables --- integer :: i real :: q ! --- Elimination --- do i = 2,n q = a(i)/b(i - 1) b(i) = b(i) - c(i - 1)*q d(i) = d(i) - d(i - 1)*q end do ! --- Backsubstitution --- q = d(n)/b(n) x(n) = q do i = n - 1,1,-1 q = (d(i) - c(i)*q)/b(i) x(i) = q end do return end
برای اطلاعات بیشتر می تونید به ادرس های زیر مراجعه کنید:
https://en.wikibooks.org/wiki/Algorithm_Implementation/Linear_Algebra/Tridiagonal_matrix_algorithm
http://www.fem.unicamp.br/~im450/palestras&artigos/CFD%20of%20Turbulence_Chalmers_Un/chapter_7.pdf
یک نمونه کد دیگر
https://ww2.odu.edu/~agodunov/computing/programs/book2/Ch06/Thomas.f90
فلوچارتی که توی ادامه مطلب آوردم در واقع برای حل مسائل صریح استفاده می شه .
روشش فرق نمیکنه. میتونه آپویند Upwind باشه یا هر روش تک مرحله ای صریح دیگه ای .