Solves the tridiagonal system of equations.
| 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,CFor 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)
call close_tridiagonalThe following module variables are used to retain the relevant information if one recalls tri_invert without changing (A,B,C)
call tri_invert ( x,d,a,b,c)
d | The right-hand side term, see the schematic above. [real, dimension(:,:,:)] |
a,b,c | The left-hand-side terms (matrix), see the schematic above.
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. [real, dimension(:,:,:)] |
x | The solution to the tridiagonal system of equations. [real, dimension(:,:,:)] |
call close_tridiagonal
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.
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?