spml/lumatrix モジュールは, LU 分解法により連立 1 次方程式を解くための Fortran90 関数を提供する. 他のスペクトル計算用モジュールの中で登場する 境界値問題を解くために用いられている. ベクトル計算機を意識して, 同じ次数の複数個の連立 1 次方程式 Aij(n) X j(n) = Bi(n) の解を同時に複数個の右辺ベクトル Bi(n)b に対して 求めることができるようになっている.
| 名前 | 機能 |
|---|---|
| LUDecomp | 行列の LU 分解を行う |
| LUSolve | 連立 1 次方程式の解を求める |
Alu が 2 次元配列(与える係数行列が 1 つ)の場合
! ALU(NDIM,NDIM), KP(NDIM)
! NDIM x NDIM の行列を LU 分解.
! LU行列は 入力行列に上書きされる.
real(8), intent(inout) :: alu(:,: ) ! 入力/LU行列
integer, intent(out) :: kp(size(alu,1)) ! ピボット
Alu が 3 次元配列(与える係数行列が複数)の場合
! ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM)
! NDIM x NDIM の行列 JDIM 個を一度に LU 分解.
! LU行列は 入力行列に上書きされる.
real(8), intent(inout) :: alu(:,:,:) ! 入力/LU行列
integer, intent(out) :: kp(size(alu,1),size(alu,2)) ! ピボット
Alu が 2 次元配列(与える係数行列が 1 つ), b が 1 次元配列(与える右辺ベクトルが 1 つ)の場合
! ALU(NDIM,NDIM), KP(NDIM), B(NDIM)
! NDIM x NDIM 型行列の連立方程式
! A X = B を 1 個の B に対して計算する.
real(8), intent(in) :: alu(:,:) ! 入力/LU行列
integer, intent(in) :: kp(:) ! ピボット
real(8), intent(in) :: b(:) ! 右辺ベクトル
real(8) :: lusolve(size(b)) ! 解
Alu が 2 次元配列(与える係数行列が 1 つ),
b が 2 次元配列(与える右辺ベクトルが複数)の場合
! ALU(NDIM,NDIM), KP(NDIM), B(JDIM,NDIM)
! NDIM x NDIM 型行列の連立方程式
! A X = B を JDIM 個の B に対して計算する.
real(8), intent(in) :: alu(:,:) ! 入力/LU行列
integer, intent(in) :: kp(:) ! ピボット
real(8), intent(in) :: b(:,:) ! 右辺ベクトル
real(8) :: lusolve(size(b,1),size(b,2)) ! 解
Alu が 3 次元配列(与える係数行列が複数),
b が 2 次元配列(与える右辺ベクトルが 1 つ)の場合
! ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM), B(JDIM,NDIM)
! NDIM x NDIM 型行列を JDIM 個並べた連立方程式
! A X = B をひとつの B の並びに対して計算する.
real(8), intent(in) :: alu(:,:,:) ! 入力/LU行列
integer, intent(in) :: kp(:,:) ! ピボット
real(8), intent(in) :: b(:,:) ! 右辺ベクトル
real(8) :: lusolve(size(b,1),size(b,2)) ! 解
Alu が 3 次元配列(与える係数行列が複数),
b が 3 次元配列(与える右辺ベクトルが複数)の場合
! ALU(JDIM,NDIM,NDIM), KP(JDIM,NDIM), B(IDIM,JDIM,NDIM)
! NDIM x NDIM 型行列を JDIM 個並べた連立方程式
! A X = B を IDIM 個の B に対して計算する.
real(8), intent(in) :: alu(:,:,:) ! 入力/LU行列
integer, intent(in) :: kp(:,:) ! ピボット
real(8), intent(in) :: b(:,:,:) ! 右辺ベクトル
real(8) :: lusolve(size(b,1),size(b,2),size(b,3)) ! 解