Class linlib
In: src/util/linlib.f90

Methods

Included Modules

dc_trace dc_message ssl2_linear lapack_linear

Public Instance methods

A(LN) :real(8), intent(in)
: Input
B(LN-1) :real(8), intent(in)
C(LN-1) :real(8), intent(in)
D(LN) :real(8), intent(inout)
: In/Out

利用する線形計算パッケージに配列を渡す

[Source]

  subroutine LinSolv(A, B, C, D)

    !=== Dependency


    !=== Input
    real(8), intent(in)    :: A(LN)
    real(8), intent(in)    :: B(LN-1)
    real(8), intent(in)    :: C(LN-1) 

    !=== In/Out
    real(8), intent(inout) :: D(LN)
                                                                 !=end

    !=== Work
    real(8)                :: AA(LN)
    real(8)                :: BB(LN-1)
    real(8)                :: CC(LN-1) 


    call BeginSub("linsolv",                  fmt="%c",                        c1="call linear algebra library.")

    !--- 用いるライブラリの初期化
    if (LLib == 's') then 
       call ssl2_ltx(A, B, C, D)

    elseif (LLib == 'l') then 
       !=== 属性が inout なので, 内部変数を使うことに.
       AA = A
 BB = B
 CC = C
       call lapack_dgtsv(AA, BB, CC, D)
       
    else
      call MessageNotify("Error", "linlib",                         "unknown LLib")
    end if

    call EndSub("linsolv")

  end subroutine LinSolv
cfgfile :character(*), intent(in)
: 設定ファイル (NAMELIST)
N :integer, intent(in)
: Input 配列サイズ

利用する線形計算パッケージを NAMELIST から設定し, 配列の大きさを決定する

[Source]

  subroutine linlib_init(cfgfile, N)

    !=== Dependency


    !=== Input
    integer, intent(in)      :: N       !配列サイズ
    character(*), intent(in) :: cfgfile !設定ファイル (NAMELIST)
    
    !=== NAMELIST
    NAMELIST /linlib/ LLib
                                                                 !=end
    open (10, FILE=cfgfile)
    read(10, NML=linlib)
    close(10)

    call BeginSub("linlib_init",                  fmt="%c",                        c1="Initialize linear algebra library.")

    !--- 配列サイズを保管
    LN = N

    !--- 用いるライブラリの初期化
    if (LLib == 's') then 
       call MessageNotify("Message", "linlib.f90",                          "Call SSL II in the calculation")

       call ssl2_ltx_init(LN)

    elseif (LLib == 'l') then 
       call MessageNotify("Message", "linlib.f90",                          "Call LAPACK in the calculation")

       call lapack_dgtsv_init(LN)

    else
      call MessageNotify("Error", "linlib.f90",                         "Unknown LLib ", c1=LLib)
    end if

    call EndSub("linlib_init")

  end subroutine linlib_init

[Validate]