Merge branch 'master' into reconnection
This commit is contained in:
commit
163edd0025
@ -1093,83 +1093,55 @@ module algebra
|
||||
! subroutine TRIDIAG:
|
||||
! ------------------
|
||||
!
|
||||
! Subroutine solves the system of tridiagonal linear equations.
|
||||
! Subroutine solves the system of tridiagonal linear equations using
|
||||
! Thomas algorithm.
|
||||
!
|
||||
! Arguments:
|
||||
!
|
||||
! n - the size of the matrix;
|
||||
! l(:) - the vector of the lower off-diagonal values;
|
||||
! d(:) - the vector of the diagonal values;
|
||||
! u(:) - the vector of the upper off-diagonal values;
|
||||
! r(:) - the vector of the right side values;
|
||||
! a(:) - the vector of the lower off-diagonal values;
|
||||
! b(:) - the vector of the diagonal values;
|
||||
! c(:) - the vector of the upper off-diagonal values;
|
||||
! d(:) - the vector of the right side values;
|
||||
! x(:) - the solution vector;
|
||||
!
|
||||
! References:
|
||||
!
|
||||
! [1] Press, W. H, Teukolsky, S. A., Vetterling, W. T., Flannery, B. P.,
|
||||
! "Numerical Recipes in Fortran",
|
||||
! Cambridge University Press, Cambridge, 1992
|
||||
! [1] https://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm
|
||||
!
|
||||
!===============================================================================
|
||||
!
|
||||
subroutine tridiag(n, l, d, u, r, x, iret)
|
||||
subroutine tridiag(n, a, b, c, d, x)
|
||||
|
||||
! import external procedures
|
||||
!
|
||||
use iso_fortran_env, only : error_unit
|
||||
|
||||
! local variables are not implicit by default
|
||||
!
|
||||
implicit none
|
||||
|
||||
! input/output arguments
|
||||
!
|
||||
integer , intent(in) :: n
|
||||
real(kind=8), dimension(n), intent(in) :: l, d, u, r
|
||||
real(kind=8), dimension(n), intent(in) :: a, b, c, d
|
||||
real(kind=8), dimension(n), intent(out) :: x
|
||||
integer , intent(out) :: iret
|
||||
|
||||
! local variables
|
||||
!
|
||||
integer :: i, j
|
||||
integer :: i
|
||||
real(kind=8) :: t
|
||||
real(kind=8), dimension(n) :: g
|
||||
|
||||
! local parameters
|
||||
!
|
||||
character(len=*), parameter :: loc = 'ALGEBRA::tridiag()'
|
||||
real(kind=8), dimension(n) :: cp, dp
|
||||
!
|
||||
!-------------------------------------------------------------------------------
|
||||
!
|
||||
! decomposition and forward substitution
|
||||
!
|
||||
t = d(1)
|
||||
x(1) = r(1) / t
|
||||
cp(1) = c(1) / b(1)
|
||||
dp(1) = d(1) / b(1)
|
||||
do i = 2, n
|
||||
j = i - 1
|
||||
g(i) = u(j) / t
|
||||
t = d(i) - l(i) * g(i)
|
||||
if (abs(t) > 0.0d+00) then
|
||||
x(i) = (r(i) - l(i) * x(j)) / t
|
||||
else
|
||||
write(error_unit,"('[',a,']: ',a)") trim(loc) &
|
||||
, "Could not find solution!"
|
||||
iret = 1
|
||||
return
|
||||
end if
|
||||
t = b(i) - a(i) * cp(i-1)
|
||||
cp(i) = c(i) / t
|
||||
dp(i) = (d(i) - a(i) * dp(i-1)) / t
|
||||
end do
|
||||
|
||||
! backsubstitution
|
||||
! backward substitution
|
||||
!
|
||||
x(n) = dp(n)
|
||||
do i = n - 1, 1, -1
|
||||
j = i + 1
|
||||
x(i) = x(i) - g(j) * x(j)
|
||||
x(i) = dp(i) - cp(i) * x(i+1)
|
||||
end do
|
||||
|
||||
! set return value to success
|
||||
!
|
||||
iret = 0
|
||||
|
||||
!-------------------------------------------------------------------------------
|
||||
!
|
||||
end subroutine tridiag
|
||||
|
@ -2631,7 +2631,6 @@ module interpolations
|
||||
! local variables
|
||||
!
|
||||
integer :: n, i, im1, ip1, im2, ip2
|
||||
integer :: iret
|
||||
real(kind=8) :: bl, bc, br, tt
|
||||
real(kind=8) :: wl, wc, wr, ww
|
||||
real(kind=8) :: ql, qc, qr
|
||||
@ -2948,7 +2947,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations for the left-side interpolation
|
||||
!
|
||||
call tridiag(n, a(1:n,1), b(1:n,1), c(1:n,1), r(1:n,1), u(1:n), iret)
|
||||
call tridiag(n, a(1:n,1), b(1:n,1), c(1:n,1), r(1:n,1), u(1:n))
|
||||
|
||||
! substitute the left-side values
|
||||
!
|
||||
@ -2956,7 +2955,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations for the left-side interpolation
|
||||
!
|
||||
call tridiag(n, a(1:n,2), b(1:n,2), c(1:n,2), r(1:n,2), u(1:n), iret)
|
||||
call tridiag(n, a(1:n,2), b(1:n,2), c(1:n,2), r(1:n,2), u(1:n))
|
||||
|
||||
! substitute the right-side values
|
||||
!
|
||||
@ -3027,7 +3026,6 @@ module interpolations
|
||||
! local variables
|
||||
!
|
||||
integer :: n, i, im1, ip1, im2, ip2
|
||||
integer :: iret
|
||||
real(kind=8) :: bl, bc, br, tt
|
||||
real(kind=8) :: wl, wc, wr, ww
|
||||
real(kind=8) :: ql, qc, qr
|
||||
@ -3347,7 +3345,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations for the left-side interpolation
|
||||
!
|
||||
call tridiag(n, a(1:n,1), b(1:n,1), c(1:n,1), r(1:n,1), u(1:n), iret)
|
||||
call tridiag(n, a(1:n,1), b(1:n,1), c(1:n,1), r(1:n,1), u(1:n))
|
||||
|
||||
! substitute the left-side values
|
||||
!
|
||||
@ -3355,7 +3353,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations for the left-side interpolation
|
||||
!
|
||||
call tridiag(n, a(1:n,2), b(1:n,2), c(1:n,2), r(1:n,2), u(1:n), iret)
|
||||
call tridiag(n, a(1:n,2), b(1:n,2), c(1:n,2), r(1:n,2), u(1:n))
|
||||
|
||||
! substitute the right-side values
|
||||
!
|
||||
@ -3426,7 +3424,6 @@ module interpolations
|
||||
! local variables
|
||||
!
|
||||
integer :: n, i, im1, ip1, im2, ip2
|
||||
integer :: iret
|
||||
real(kind=8) :: bl, bc, br
|
||||
real(kind=8) :: wl, wc, wr, ww
|
||||
real(kind=8) :: df, lq, l3, zt
|
||||
@ -3766,7 +3763,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations for the left-side interpolation
|
||||
!
|
||||
call tridiag(n, a(1:n,1), b(1:n,1), c(1:n,1), r(1:n,1), u(1:n), iret)
|
||||
call tridiag(n, a(1:n,1), b(1:n,1), c(1:n,1), r(1:n,1), u(1:n))
|
||||
|
||||
! substitute the left-side values
|
||||
!
|
||||
@ -3774,7 +3771,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations for the left-side interpolation
|
||||
!
|
||||
call tridiag(n, a(1:n,2), b(1:n,2), c(1:n,2), r(1:n,2), u(1:n), iret)
|
||||
call tridiag(n, a(1:n,2), b(1:n,2), c(1:n,2), r(1:n,2), u(1:n))
|
||||
|
||||
! substitute the right-side values
|
||||
!
|
||||
@ -4649,7 +4646,7 @@ module interpolations
|
||||
|
||||
! local variables
|
||||
!
|
||||
integer :: n, i, iret
|
||||
integer :: n, i
|
||||
|
||||
! local arrays for derivatives
|
||||
!
|
||||
@ -4718,7 +4715,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -4755,7 +4752,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -4829,7 +4826,7 @@ module interpolations
|
||||
|
||||
! local variables
|
||||
!
|
||||
integer :: n, i, iret
|
||||
integer :: n, i
|
||||
|
||||
! local arrays for derivatives
|
||||
!
|
||||
@ -4899,7 +4896,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -4936,7 +4933,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -5003,7 +5000,7 @@ module interpolations
|
||||
|
||||
! local variables
|
||||
!
|
||||
integer :: n, i, iret
|
||||
integer :: n, i
|
||||
|
||||
! local arrays for derivatives
|
||||
!
|
||||
@ -5078,7 +5075,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -5117,7 +5114,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -5185,7 +5182,7 @@ module interpolations
|
||||
|
||||
! local variables
|
||||
!
|
||||
integer :: n, i, iret
|
||||
integer :: n, i
|
||||
|
||||
! local arrays for derivatives
|
||||
!
|
||||
@ -5261,7 +5258,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -5300,7 +5297,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiting
|
||||
!
|
||||
@ -5353,7 +5350,7 @@ module interpolations
|
||||
real(kind=8), dimension(:), intent(in) :: fc
|
||||
real(kind=8), dimension(:), intent(out) :: fl, fr
|
||||
|
||||
integer :: n, i, iret
|
||||
integer :: n, i
|
||||
|
||||
real(kind=8), dimension(size(fc)) :: fi
|
||||
real(kind=8), dimension(size(fc)) :: a, b, c
|
||||
@ -5417,7 +5414,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiter
|
||||
!
|
||||
@ -5454,7 +5451,7 @@ module interpolations
|
||||
|
||||
! solve the tridiagonal system of equations
|
||||
!
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n), iret)
|
||||
call tridiag(n, a(1:n), b(1:n), c(1:n), r(1:n), u(1:n))
|
||||
|
||||
! apply the monotonicity preserving limiter
|
||||
!
|
||||
|
Loading…
x
Reference in New Issue
Block a user