| Path: | src/lumatrix.f90 |
| Last Update: | Sun Mar 05 19:23:34 JST 2006 |
Copyright (c) 2002-2006 Shin-ichi Takehiro. All rights reserved.
表題 lumatrix : 行列の LU 分解による線形連立方程式の解
spml/lumatrix モジュールは, LU 分解法により連立 1 次方程式を解くための
Fortran90 関数を提供する.
他のスペクトル計算用モジュールの中で登場する境界値問題を解くために
用いられている.
ベクトル計算機を意識して, 同じ次数の複数個の連立1 次方程式
A[ij]^(n) X [j]^(n) = B[i]^(n)
の解を同時に複数個の右辺ベクトル B[i]^(n)b に対して求めることが
できるようになっている.
履歴 2002/01/20 竹広真一
2002/06/10 竹広真一 ベクトル長問題回避のため lusol2 を使用
2005/01/10 竹広真一 msgdmp -> MessageNotify に変更
2006/03/04 竹広真一 コメントを RDoc 用に修正
| Subroutine : | |||
| alu(:,: ) : | real(8), intent(inout)
| ||
| kp(size(alu,1)) : | integer, intent(out)
|
ALU(NDIM,NDIM), KP(NDIM) NDIM x NDIM の行列を LU 分解. LU行列は 入力行列に上書きされる.
subroutine ludecomp21(alu,kp)
!
! ALU(NDIM,NDIM), KP(NDIM)
! NDIM x NDIM の行列を LU 分解.
! LU行列は 入力行列に上書きされる.
!
use dc_message
real(8), intent(inout) :: alu(:,: ) ! 入力/LU行列
integer, intent(out) :: kp(size(alu,1)) ! ピボット
if ( size(alu,1) > size(alu,2) ) then
call MessageNotify('E','ludecomp', 'The third dimension is less than the second')
elseif( size(alu,1) < size(alu,2) ) then
call MessageNotify('W','ludecomp', 'The third dimension is grater than the second')
endif
!" 行列のLU分解(部分ピボット選択)
call LUMAKE( alu, kp, 1, size(alu,1) )
end subroutine ludecomp21
| Subroutine : | |||
| alu(:,:,:) : | real(8), intent(inout)
| ||
| kp(size(alu,1),size(alu,2)) : | integer, intent(out)
|
ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM) NDIM x NDIM の行列 JDIM 個を一度に LU 分解. LU行列は 入力行列に上書きされる.
subroutine ludecomp32(alu,kp)
!
! ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM)
! NDIM x NDIM の行列 JDIM 個を一度に LU 分解.
! LU行列は 入力行列に上書きされる.
!
use dc_message
real(8), intent(inout) :: alu(:,:,:) ! 入力/LU行列
integer, intent(out) :: kp(size(alu,1),size(alu,2)) ! ピボット
if ( size(alu,2) > size(alu,3) ) then
call MessageNotify('E','ludecomp', 'The third dimension is less than the second')
elseif( size(alu,2) < size(alu,3) ) then
call MessageNotify('W','ludecomp', 'The third dimension is grater than the second')
endif
!" 行列のLU分解(部分ピボット選択)
call LUMAKE( alu, kp, size(alu,1), size(alu,2) )
end subroutine ludecomp32
| Function : | |||
| lusolve211(size(b)) : | real(8)
| ||
| alu(:,:) : | real(8), intent(in)
| ||
| kp(:) : | integer, intent(in)
| ||
| b(:) : | real(8), intent(in)
|
ALU(NDIM,NDIM), KP(NDIM), B(NDIM) NDIM x NDIM 型行列の連立方程式 A X = B を 1 個の B に対して計算する.
function lusolve211(alu,kp,b)
!
! ALU(NDIM,NDIM), KP(NDIM), B(NDIM)
! NDIM x NDIM 型行列の連立方程式
! A X = B を 1 個の B に対して計算する.
!
use dc_message
real(8), intent(in) :: alu(:,:) ! 入力/LU行列
integer, intent(in) :: kp(:) ! ピボット
real(8), intent(in) :: b(:) ! 右辺ベクトル
real(8) :: lusolve211(size(b)) ! 解
lusolve211 = b
call LUSOL2( lusolve211, alu , kp, 1, size(b) )
end function lusolve211
| Function : | |||
| lusolve212(size(b,1),size(b,2)) : | real(8)
| ||
| alu(:,:) : | real(8), intent(in)
| ||
| kp(:) : | integer, intent(in)
| ||
| b(:,:) : | real(8), intent(in)
|
ALU(NDIM,NDIM), KP(NDIM), B(JDIM,NDIM) NDIM x NDIM 型行列の連立方程式 A X = B を JDIM 個の B に対して計算する.
function lusolve212(alu,kp,b)
!
! ALU(NDIM,NDIM), KP(NDIM), B(JDIM,NDIM)
! NDIM x NDIM 型行列の連立方程式
! A X = B を JDIM 個の B に対して計算する.
!
use dc_message
real(8), intent(in) :: alu(:,:) ! 入力/LU行列
integer, intent(in) :: kp(:) ! ピボット
real(8), intent(in) :: b(:,:) ! 右辺ベクトル
real(8) :: lusolve212(size(b,1),size(b,2)) ! 解
lusolve212 = b
call LUSOL2( lusolve212, alu , kp, size(b,1), size(b,2) )
end function lusolve212
| Function : | |||
| lusolve322(size(b,1),size(b,2)) : | real(8)
| ||
| alu(:,:,:) : | real(8), intent(in)
| ||
| kp(:,:) : | integer, intent(in)
| ||
| b(:,:) : | real(8), intent(in)
|
ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM), B(JDIM,NDIM) NDIM x NDIM 型行列を JDIM 個並べた連立方程式 A X = B をひとつの B の並びに対して計算する.
function lusolve322(alu,kp,b)
!
! ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM), B(JDIM,NDIM)
! NDIM x NDIM 型行列を JDIM 個並べた連立方程式
! A X = B をひとつの B の並びに対して計算する.
!
use dc_message
real(8), intent(in) :: alu(:,:,:) ! 入力/LU行列
integer, intent(in) :: kp(:,:) ! ピボット
real(8), intent(in) :: b(:,:) ! 右辺ベクトル
real(8) :: lusolve322(size(b,1),size(b,2)) ! 解
lusolve322 = b
call LUSOLV( lusolve322, alu , kp, 1, size(b,1), size(b,2) )
end function lusolve322
| Function : | |||
| lusolve323(size(b,1),size(b,2),size(b,3)) : | real(8)
| ||
| alu(:,:,:) : | real(8), intent(in)
| ||
| kp(:,:) : | integer, intent(in)
| ||
| b(:,:,:) : | real(8), intent(in)
|
ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM), B(IDIM,JDIM,NDIM) NDIM x NDIM 型行列を JDIM 個並べた連立方程式 A X = B を IDIM 個の B に対して計算する.
function lusolve323(alu,kp,b)
!
! ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM), B(IDIM,JDIM,NDIM)
! NDIM x NDIM 型行列を JDIM 個並べた連立方程式
! A X = B を IDIM 個の B に対して計算する.
!
use dc_message
real(8), intent(in) :: alu(:,:,:) ! 入力/LU行列
integer, intent(in) :: kp(:,:) ! ピボット
real(8), intent(in) :: b(:,:,:) ! 右辺ベクトル
real(8) :: lusolve323(size(b,1),size(b,2),size(b,3)) ! 解
lusolve323 = b
call LUSOLV( lusolve323, alu , kp, size(b,1), size(b,2), size(b,3) )
end function lusolve323