در حل مسائل 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 باشه یا هر روش تک مرحله ای صریح دیگه ای .