Class at_av_galerkin_NN
In: libsrc/at_galerkin_module/at_av_galerkin_NN.f90

at_av_galerkin_NN

Authors:Shin-ichi Takehiro, Youhei SASAKI
Version:$Id: at_av_galerkin_NN.f90 590 2013-08-19 08:48:21Z uwabami $
Copyright&License:See COPYRIGHT

概要

spml/at_av_galerkin_NN モジュールはチェビシェフ−ガラーキン法, 両端ノイマン境界条件用モジュール

      f'(:,i=0)=f'(:,i=im)=0

k 次のガラーキン基底が

    \phi_2(x)=T_0(x)
    \phi_k(x)=T_k(x) + C_{k-1}T_{k-1}(x) + C_{k-2}T_{k-2}(x)

の型式(Type1)を用いて計算するためのモジュールである.

定式化については解説文書「チェビシェフ関数展開を利用したガラーキン法」 (cheb_gal.pdf)を参照のこと.

Methods

TV   VT   ag_av   alpha   at_av   at_av_galerkin_NN_Initial   av_Dx_av   av_ag   av_at   beta   g_v   t_v   v_Dx_v   v_g   v_t  

Included Modules

lumatrix at_module dc_message

Public Instance methods

TV
Variable :
TV(:,:) :real(8), allocatable
: ガラーキン->チェビシェフ変換行列
VT
Variable :
VT(:,:) :real(8), allocatable
: チェビシェフ->ガラーキン変換行列
Function :
ag_av(size(av_data,1),0:im) :real(8)
: (out) 格子点データ
av_data(:,ks:) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

ガラーキン係数 -> 格子点データ変換(2次元データ)

[Source]

  function ag_av(av_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! ガラーキン係数 -> 格子点データ変換(2次元データ)
    !
    real(8), intent(IN) :: av_data(:,ks:)              !(in)  ガラーキン係数  
    real(8)             :: ag_av(size(av_data,1),0:im) !(out) 格子点データ  
    
    ag_av = ag_at(at_av(av_data))
  end function ag_av
alpha
Variable :
alpha(:) :real(8), allocatable
: チェビシェフ<->ガラーキン行列積係数
Function :
at_av(size(av_data,1),0:km) :real(8)
: (out) チェビシェフ係数
av_data(:,ks:) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

ガラーキン係数 -> チェビシェフ係数変換(2次元データ)

[Source]

  function at_av(av_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! ガラーキン係数 -> チェビシェフ係数変換(2次元データ)
    !
    real(8), intent(IN)  :: av_data(:,ks:)              !(in)  ガラーキン係数
    real(8)              :: at_av(size(av_data,1),0:km) !(out) チェビシェフ係数
    integer :: m, n

    if ( .not. NN_Initialized ) call MessageNotify('E','at_av', 'at_av_galerkin_NN_module not initialized')

    at_av = 0.0D0
    do m=0,km
       do n=ks,km
          at_av(:,m) = at_av(:,m) + TV(m,n)*av_data(:,n)/beta(m)
       enddo
    enddo

  end function at_av
Subroutine :
i_in :integer, intent(IN)
: (in)格子点数
k_in :integer, intent(IN)
: (in)チェビシェフ切断波数

チェビシェフ−ガラーキン法 両端ノイマン境界条件用モジュール

初期化サブルーチン

[Source]

  subroutine at_av_galerkin_NN_Initial(i_in,k_in)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件用モジュール
    !
    ! 初期化サブルーチン
    !
    integer, intent(IN) :: i_in     ! (in)格子点数
    integer, intent(IN) :: k_in     ! (in)チェビシェフ切断波数  

    integer :: k, l, m, n

    im=i_in 
     km=k_in

    allocate(TV(0:km,ks:km),VT(ks:km,ks:km),kp(ks:km))
    allocate(alpha(0:km),beta(0:km))

    ! 両端ディリクレ条件用変換行列設定
    TV = 0.0D0
    TV(0,ks) = 1.0D0
    do k=ks+1,km
       TV(k,k) = 1.0D0
       TV(k-2,k) = -1.0D0*k**2/(k-2)**2
    enddo

    beta=1.0 
     beta(0)=0.5D0
    if (im .eq. km ) beta(km)=0.5D0

    ! 両端ディリクレ条件用変換逆行列
    alpha=1.0 
     alpha(0)=2.0D0

    VT = 0.0D0
    do m=ks,km
       do n=ks,km
          do l=0,km
             VT(m,n) = VT(m,n) + alpha(l)*TV(l,m)*TV(l,n)
          enddo
       enddo
    enddo

    call LUDecomp(VT,kp)

    call MessageNotify('M','at_av_galerkin_NN_Initial', 'Conversion matrices initialized')

    NN_Initialized=.true.

  end subroutine at_av_galerkin_NN_Initial
Function :
av_Dx_av(size(av_data,1),ks:km) :real(8)
: (out) 微分ガラーキン
av_data(:,ks:) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

X 微分計算(1 次元)

[Source]

  function av_Dx_av(av_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! X 微分計算(1 次元)
    !
    real(8), intent(IN) :: av_data(:,ks:)                  !(in) ガラーキン係数
    real(8)             :: av_Dx_av(size(av_data,1),ks:km) !(out) 微分ガラーキン
    av_Dx_av = av_at(at_Dx_at(at_av(av_data)))
  end function av_Dx_av
Function :
av_ag(size(ag_data,1),ks:km) :real(8)
: (out) ガラーキン係数
ag_data(:,0:) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 両端ノイマン境界条件

格子点データ -> ガラーキン係数変換(2次元データ)

[Source]

  function av_ag(ag_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! 格子点データ -> ガラーキン係数変換(2次元データ)
    !
    real(8), intent(IN)  :: ag_data(:,0:)                !(in)  格子点データ
    real(8)              :: av_ag(size(ag_data,1),ks:km) !(out) ガラーキン係数

    av_ag = av_at(at_ag(ag_data))
  end function av_ag
Function :
av_at(size(at_data,1),ks:km) :real(8)
: (out) ガラーキン係数
at_data(:,0:) :real(8), intent(IN)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

チェビシェフ係数 -> ガラーキン係数変換(2次元データ)

[Source]

  function av_at(at_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! チェビシェフ係数 -> ガラーキン係数変換(2次元データ)
    !
    real(8), intent(IN) :: at_data(:,0:)                !(in)  チェビシェフ係数
    real(8)             :: av_at(size(at_data,1),ks:km) !(out) ガラーキン係数  

    real(8)             :: av_work(size(at_data,1),ks:km)  ! 作業用配列
    
    integer :: k,m

    if ( .not. NN_Initialized ) call MessageNotify('E','av_at', 'at_av_galerkin_NN_module not initialized')

    av_work =0.0
    do m=ks,km
       do k=0,km
          av_work(:,m) = av_work(:,m) + alpha(k) * beta(k) * at_data(:,k) * TV(k,m)
       enddo
    enddo

    av_at = LUSolve(VT,kp,av_work)

  end function av_at
beta
Variable :
beta(:) :real(8), allocatable
: チェビシェフ<->ガラーキン行列和係数
Function :
g_v(0:im) :real(8)
: (out) 格子点データ
v_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

ガラーキン係数 -> 格子点データ変換(1次元データ)

[Source]

  function g_v(v_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! ガラーキン係数 -> 格子点データ変換(1次元データ)
    !
    real(8), intent(IN) :: v_data(ks:km)        !(in)  ガラーキン係数  
    real(8)             :: g_v(0:im)            !(out) 格子点データ  
    
    g_v = g_t(t_v(v_data))
  end function g_v
Function :
t_v(0:km) :real(8)
: (out) チェビシェフ係数
v_data(ks:km) :real(8), intent(IN)
: (in) ガラーキン係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

ガラーキン係数 -> チェビシェフ係数変換(1次元データ)

[Source]

  function t_v(v_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! ガラーキン係数 -> チェビシェフ係数変換(1次元データ)
    !
    real(8), intent(IN)  :: v_data(ks:km)       !(in)  ガラーキン係数  
    real(8)              :: t_v(0:km)           !(out) チェビシェフ係数

    integer :: m, n

    if ( .not. NN_Initialized ) call MessageNotify('E','t_v', 'at_av_galerkin_NN_module not initialized')

    t_v = 0.0D0
    do m=0,km
       do n=ks,km
          t_v(m) = t_v(m) + TV(m,n)*v_data(n)/beta(m)
       enddo
    enddo

  end function t_v
Function :
v_Dx_v(ks:km) :real(8)
v_data(ks:km) :real(8), intent(IN)

チェビシェフ−ガラーキン法 両端ノイマン境界条件

X 微分計算(1 次元)

[Source]

  function v_Dx_v(v_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! X 微分計算(1 次元)
    !
    real(8), intent(IN) :: v_data(ks:km)
    real(8)             :: v_Dx_v(ks:km)

    v_Dx_v = v_t(t_Dx_t(t_v(v_data)))

  end function v_Dx_v
Function :
v_g(ks:km) :real(8)
: (out) ガラーキン係数
g_data(0:im) :real(8), intent(IN)
: (in) 格子点データ

チェビシェフ−ガラーキン法 両端ノイマン境界条件

格子点データ -> ガラーキン係数変換(1次元データ)

[Source]

  function v_g(g_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! 格子点データ -> ガラーキン係数変換(1次元データ)
    !
    real(8), intent(IN)  :: g_data(0:im)        !(in)  格子点データ
    real(8)              :: v_g(ks:km)          !(out) ガラーキン係数

    v_g = v_t(t_g(g_data))
  end function v_g
Function :
v_t(ks:km) :real(8)
: (out) ガラーキン係数
t_data(0:km) :real(8), intent(IN)
: (in) チェビシェフ係数

チェビシェフ−ガラーキン法 両端ノイマン境界条件

チェビシェフ係数 -> ガラーキン係数変換(1次元データ)

[Source]

  function v_t(t_data)
    !
    ! チェビシェフ−ガラーキン法
    ! 両端ノイマン境界条件
    !
    ! チェビシェフ係数 -> ガラーキン係数変換(1次元データ)
    !
    real(8), intent(IN) :: t_data(0:km)        !(in)  チェビシェフ係数
    real(8)             :: v_t(ks:km)          !(out) ガラーキン係数  

    real(8)             :: v_work(ks:km)       ! 作業用配列

    integer :: k,m

    if ( .not. NN_Initialized ) call MessageNotify('E','v_t', 'at_av_galerkin_NN_module not initialized')

    v_work =0.0
    do m=ks,km
       do k=0,km
          v_work(m) = v_work(m) + alpha(k) * beta(k) * t_data(k) * TV(k,m)
       enddo
    enddo

    v_t = LUSolve(VT,kp,v_work)

  end function v_t