ブロックLU分解FORTRANプログラムNO.1
2003/09/08 日立製作所 & 早稲田大学 後 保範 ( Ushiro Yasunori )
--------------------------------------------------------------
1. 概要
実密行列を係数とする連立一次方程式Ax=bをブロックガウス消去法でLU分解し、
LUx=bの数値解を前進後退代入で求める。
軸交換も特異性のチェックもしていない最も単純なプログラムである。
2. プログラム
C=================================================================C
SUBROUTINE BLU1(A,B,N,ND,MB)
C=================================================================C
C Real-Dense LU Decomposition by Block Gauss Elimination C
C and Solve Ax=b by Substitution C
C A ---> LU Decomposition without Partial Pivoting C
C-----------------------------------------------------------------C
C A(ND,N) R*8, I/O, Input and Output Matrix C
C B(N) R*8, I/O, Right vector and Solution Vector C
C N I*4, In, Matrix Order of A C
C ND I*4, In, Array Size of A ( ND >= N ) C
C MB I*4, In. Block Size C
C-----------------------------------------------------------------C
C Written by Yasunori Ushiro , 2003/09/04 C
C ( Hitachi Ltd. and Waseda University ) C
C Ver.1 No tuning Version C
C=================================================================C
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION A(ND,N), B(N)
C----- Block Gauss Elimination Step ------------
C Gauss Elimination
do kk=1,N,MB
MBK = min(kk+MB-1,N)
C Block Process-1
do k=kk,MBK
C A(*,k)=A(*,k)/A(k,k)
do i=k+1,N
A(i,k) = A(i,k)/A(k,k)
end do
C Lower-Block Elimination
do j=k+1,MBK
do i=k+1,N
A(i,j) = A(i,j) - A(k,j)*A(i,k)
end do
end do
end do
C Block Process-2 ( Upper-Block Elimination )
do k=MBK+1,N
do j=kk,MBK-1
do i=j+1,MBK
A(i,k) = A(i,k) - A(j,k)*A(i,j)
end do
end do
end do
C Block Process-3 ( Main Elimination by C=C-A*B) )
do j=MBK+1,N
do k=kk,MBK
do i=MBK+1,N
A(i,j) = A(i,j) - A(i,k)*A(k,j)
end do
end do
end do
end do
C---- Solve LUx=b by Substitution -------------
C Forward Substitution
do j=1,N-1
do i=j+1,N
B(i) = B(i) - B(j)*A(i,j)
end do
end do
C Backword Substitution
do j=N,1,-1
B(j) = B(j)/A(j,j)
do i=1,j-1
B(i) = B(i) - A(i,j)*B(j)
end do
end do
C
RETURN
END