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)) ! 解