! The following schematic represents the system of equations solved,
! where X is the solution.
!
! | B(1) A(1) 0 0 ....... 0 | |X(1)| |D(1)|
! | C(2) B(2) A(2) 0 ....... 0 | |X(2)| |D(2)|
! | 0 C(3) B(3) A(3) 0 ....... 0 | | .. | | .. |
! | .......................................... | | .. | = | .. |
! | .......................................... | | .. | | .. |
! | C(N-2) B(N-2) A(N-2) 0 | | .. | | .. |
! | 0 C(N-1) B(N-1) A(N-1)| | .. | | .. |
! | 0 0 C(N) B(N) | |X(N)| |D(N)|
!
!
! To solve this system
!
! call tri_invert(X,D,A,B,C)
!
! real, intent(out), dimension(:,:,:) :: X
! real, intent(in), dimension(:,:,:) :: D
! real, optional, dimension(:,:,:) :: A,B,C
!
! For simplicity (?), A and C are assumed to be dimensioned the same size
! as B, D, and X, although any input values for A(N) and C(1) are ignored.
! (some checks are needed here)
!
! If A is not present, it is assumed that the matrix (A,B.C) has not been changed
! since the last call to tri_invert.
!
! To release memory,
!
! call close_tridiagonal
!
! The following module variables are used to retain the relevant information
! if one recalls tri_invert without changing (A,B,C)
!
!--------------------------------------------------------------------------
real, private, allocatable, dimension(:,:,:) :: e,g,cc
real, private, allocatable, dimension(:,:) :: bb
logical, private :: init_tridiagonal = .false.
!--------------------------------------------------------------------------
contains
!--------------------------------------------------------------------------
!
!
! Optional arguments A,B,C have no intent declaration,
! so the default intent is inout. The value of A(N) is modified
! on output, and B and C are unchanged.
!
!
! The following private allocatable arrays save the relevant information
! if one recalls tri_invert without changing (A,B,C):
!
! allocate ( e (size(x,1), size(x,2), size(x,3)) )
! allocate ( g (size(x,1), size(x,2), size(x,3)) )
! allocate ( cc (size(x,1), size(x,2), size(x,3)) )
! allocate ( bb (size(x,1), size(x,2)) )
!
! This storage is deallocated when close_tridiagonal is called.
!
!
! Maybe a cleaner version?
!
!