spml/lumatrix レファレンスマニュアル

spml/lumatrix モジュールは, LU 分解法により連立 1 次方程式を解くための Fortran90 関数を提供する. 他のスペクトル計算用モジュールの中で登場する 境界値問題を解くために用いられている. ベクトル計算機を意識して, 同じ次数の複数個の連立 1 次方程式 Aij(n) X j(n) = Bi(n) の解を同時に複数個の右辺ベクトル Bi(n)b に対して 求めることができるようになっている.

目次


サブルーチン・関数一覧

名前 機能
LUDecomp 行列の LU 分解を行う
LUSolve 連立 1 次方程式の解を求める


サブルーチンの説明

subroutine LUDecomp(Alu,kp)

  1. 機能 : 与えられた行列の LU 分解を行い, ピボットを格納する.
  2. 引数の説明

    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)) ! ピボット
        
  3. 備考

関数の説明

function LUSolve(Alu,kp,b)

  1. 機能 : 連立 1 次方程式の解を求める
  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))    ! 解
        
  3. 備考
    LUSolve を用いる前に LUDecompを呼んで Alu を LU 分解し, ピボット情報 kp を計算して おかねばならない.


地球流体電脳倶楽部 SPMODEL プロジェクト
spmodel@gfd-dennou.org

2002/08/24 作成 (竹広真一)