Class ssl2_linear
In: src/util/ssl2_linear.f90

Methods

Included Modules

dc_message

Public Instance methods

A(:,:) :real(8), intent(inout)
: In/Out 係数行列
B(:) :real(8), intent(inout)
: 定数/解行列
sw :logical, intent(out), optional
: Output 非正則を表すスイッチ

実行列の連立 1 次方程式(倍精度)

[Source]

  subroutine ssl2_lax(A, B, sw)

    !=== In/Out
    real(8), intent(inout)         :: A(:,:)     !係数行列
    real(8), intent(inout)         :: B(:)       !定数/解行列

    !=== Output
    logical, intent(out), optional :: sw         !非正則を表すスイッチ
                                                                 !=end
    integer                        :: ICON
    integer                        :: IS

    IS = 0
 VW = 0.0d0
 IP = 0
 ICON = 0
    if (present(sw)) sw = .false.

    !配列の大きさチェック
    if (N /= size(B,1) .OR. N /= size(A,1) .OR. N /= size(A,2)) then  
       write(*,*) "ssl2_lax
 matrix size is wrong"
       stop
    end if

    !解行列の計算. SSL II を使用. 
    call DLAX(A, K, N, B, EPSZ, ISW, IS, VW, IP, ICON)
  
    !解のコンディションをチェック. 
    if (ICON == 30000) then
       write(*,*) 'ssl2_lax: ICON is 30000' 
       stop
    elseif (ICON == 20000) then
       write(*,*) 'ssl2_lax: ICON is 20000' 
       write(*,*) "ssl2_lax: matrix is singular!"
       if (present(sw)) then           
          sw = .true.
       else
          stop
       end if
    end if
  end subroutine ssl2_lax
M :integer, intent(in)
: Input 配列の大きさ

[Source]

  subroutine ssl2_lax_init(M)

    !=== Input
    integer, intent(in) :: M  !配列の大きさ
                                                                 !=end
    if (allocated(IP)) deallocate(IP, VW)
    allocate(IP(M), VW(M))
    N = M
    K = M
  end subroutine ssl2_lax_init
A(:) :real(8), intent(inout)
: In/Out 係数行列
B(:) :real(8), intent(inout)
: 定数/解行列
sw :logical, intent(out), optional
: Output 非正則を表すスイッチ

実対称行列の連立 1 次方程式(倍精度)

[Source]

  subroutine ssl2_lsix(A, B, sw)

    !=== In/Out
    real(8), intent(inout)         :: A(:)   !係数行列
    real(8), intent(inout)         :: B(:)   !定数/解行列
    !=== Output
    logical, intent(out), optional :: sw     !非正則を表すスイッチ
                                                                 !=end
    integer                        :: ICON
    
    ICON = 0
 VW = 0.0d0
 IP = 0
 IVW = 0
    if (present(sw)) sw = .false.

    !配列の大きさチェック
    if (N /= size(B,1) .OR. N*(N+1)/2 /= size(A,1)) then 
       write(*,*) "ssl2_lsx
 matrix size is wrong"
    end if

    !解行列の計算. SSL II を使用. 
    call DLSIX(A, N, B, EPSZ, ISW, VW, IP, IVW, ICON)
  
    !解のコンディションをチェック. 
    if (ICON == 30000) then
       write(*,*) 'ssl2_lsix: ICON is 30000' 
       stop
    elseif (ICON == 20000) then
       write(*,*) 'ssl2_lsix: ICON is 20000' 
       write(*,*) "ssl2_lsix: matrix is singular!"
       if (present(sw)) then           
          sw = .true.
       else
          stop
       end if
    end if
    
  end subroutine ssl2_lsix
M :integer, intent(in)
: Input 配列の大きさ

[Source]

  subroutine ssl2_lsix_init(M)

    !=== Input
    integer, intent(in) :: M    !配列の大きさ
                                                                 !=end
    if (allocated(IP)) deallocate(IP, VW, IVW)
    allocate(IP(M), VW(2*M), IVW(M))
    N = M
    K = M
  end subroutine ssl2_lsix_init
A(:) :real(8), intent(inout)
: 係数行列
B(:) :real(8), intent(inout)
: 定数/解行列
sw :logical, intent(out), optional
: 非正則を表すスイッチ

正値対称行列の連立 1 次方程式(倍精度)

[Source]

  subroutine ssl2_lsx(A, B, sw)
    real(8), intent(inout)         :: A(:)   !係数行列
    real(8), intent(inout)         :: B(:)   !定数/解行列
    logical, intent(out), optional :: sw     !非正則を表すスイッチ
                                                                 !=end
    integer                        :: ICON

    ICON = 0
    if (present(sw)) sw = .false.

    !配列の大きさチェック
    if (N /= size(B,1) .OR. N*(N+1)/2 /= size(A,1)) then 
       write(*,*) "ssl2_lsx
 matrix size is wrong"
    end if

    !解行列の計算. SSL II を使用. 
    call DLSX(A, N, B, EPSZ, ISW, ICON)
  
    !解のコンディションをチェック. 
    if (ICON == 30000) then
       write(*,*) 'ssl2_lsx: ICON is 30000' 
       stop
    elseif (ICON == 20000) then
       write(*,*) 'ssl2_lsx: ICON is 20000' 
       write(*,*) "ssl2_lsx: matrix is singular!"
       if (present(sw)) then           
          sw = .true.
       else
          stop
       end if
    end if
  end subroutine ssl2_lsx
M :integer, intent(in)
: Input 配列の大きさ

[Source]

  subroutine ssl2_lsx_init(M)
    !=== Input
    integer, intent(in) :: M   !配列の大きさ
                                                                 !=end
    N = M
  end subroutine ssl2_lsx_init
A(N) :real(8), intent(in)
: end
 暗黙の型宣言禁止

begin

 Input

係数行列

B(N-1) :real(8), intent(in)
: 係数行列
C(N-1) :real(8), intent(in)
: 係数行列
D(N) :real(8), intent(inout)
: In/Out 定数/解行列

実 3 項行列の連立 1 次方程式(倍精度)

[Source]

  subroutine ssl2_ltx(A, B, C, D)
    !=== Dependency

                                                                 !=end
    !=== 暗黙の型宣言禁止
    implicit none
                                                                 !=begin
    !=== Input
    real(8), intent(in)            :: A(N)      !係数行列
    real(8), intent(in)            :: B(N-1)    !係数行列
    real(8), intent(in)            :: C(N-1)    !係数行列

    !=== In/Out
    real(8), intent(inout)         :: D(N)      !定数/解行列
                                                                 !=end
    !=== Work
    integer                        :: ICON
    integer                        :: IS
    
    ICON = 0
 VW = 0.0d0
 IP = 0
    
    !=== 解行列の計算. SSL II を使用. 
    call DLTX(C, A, B, N, D, EPSZ, ISW, IS, IP, VW, ICON)
    
    !=== 解のコンディションをチェック. 
    if (ICON == 30000) then
       call MessageNotify("Error", "ssl2_linear",                         "ICON is 30000. matrix is singular!!")
       stop
    elseif (ICON == 20000) then
       call MessageNotify("Error", "ssl2_linear",                         "ICON is 20000. matrix is singular!!")
       stop
    end if
    
  end subroutine ssl2_ltx
M :integer, intent(in)
: Input 配列の大きさ

[Source]

  subroutine ssl2_ltx_init(M)

    !=== Input
    integer, intent(in) :: M  !配列の大きさ
                                                                 !=end
    if (allocated(IP)) deallocate(IP, VW)
    allocate(IP(M), VW(M))
    N = M
  end subroutine ssl2_ltx_init

[Validate]