Class y_base_module
In: setup/y_base_module.f90

1 次元 (y 方向) 等間隔交互格子 有限差分モデル用 基本モジュール

概要

y_base_module は, 1 次元 (y 方向) 等間隔交互格子を用いた有限差分 法に基づく数値モデルのための基本的な Fortran90 副プログラムおよび 関数を提供する. このモジュールは y_module の下位モジュールである.

備考

  • 例外処理がない
  • その場合のメッセージ表示がない
  • 初期化の値はマシンイプシロン値としておくべき

Methods

AvrY_q   AvrY_y   IntY_q   IntY_y   jm   jmax   jmin   q_Y   q_avr_y   q_dy   y_Y   y_avr_q   y_axis_init   y_dy   ymargin  

Included Modules

dc_types

Public Instance methods

Function :
AvrY_q :real(DBKIND)
: 出力
q_Var(jmin:jmax) :real(DBKIND), intent(in)
: 入力

整数格子上の配列に対し y 方向の平均操作を行う

[Source]

    function AvrY_q(q_Var)
      ! 整数格子上の配列に対し y 方向の平均操作を行う

      real(DBKIND), intent(in) :: q_Var(jmin:jmax)  ! 入力
      real(DBKIND)             :: AvrY_q            ! 出力

      AvrY_q = IntY_q(q_Var)/sum(q_dy(1:jm))

    end function AvrY_q
Function :
AvrY_y :real(DBKIND)
: 出力
y_Var(jmin:jmax) :real(DBKIND), intent(in)
: 入力

半整数格子上の配列に対し y 方向の平均操作を行う

[Source]

    function AvrY_y(y_Var)
      ! 半整数格子上の配列に対し y 方向の平均操作を行う

      real(DBKIND), intent(in) :: y_Var(jmin:jmax)  ! 入力
      real(DBKIND)             :: AvrY_y            ! 出力

      AvrY_y = IntY_y(y_Var)/sum(y_dy(1:jm))

    end function AvrY_y
Function :
IntY_q :real(DBKIND)
: 出力
q_Var(jmin:jmax) :real(DBKIND), intent(in)
: 入力

整数格子上の配列に対し y 方向に重み付きの積分を行う

[Source]

    function IntY_q(q_Var)
      ! 整数格子上の配列に対し y 方向に重み付きの積分を行う

      real(DBKIND), intent(in) :: q_Var(jmin:jmax)  ! 入力
      real(DBKIND)             :: IntY_q            ! 出力

      ! 初期化
      IntY_q = 0.0d0

      ! 積分
      IntY_q = sum(q_Var(1:jm)*q_dy(1:jm))

    end function IntY_q
Function :
IntY_y :real(DBKIND)
: 出力
y_Var(jmin:jmax) :real(DBKIND), intent(in)
: 入力

半整数格子上の配列に対し y 方向に重み付きの積分を行う

[Source]

    function IntY_y(y_Var)
      ! 半整数格子上の配列に対し y 方向に重み付きの積分を行う

      real(DBKIND), intent(in) :: y_Var(jmin:jmax)  ! 入力
      real(DBKIND)             :: IntY_y            ! 出力

      ! 初期化
      IntY_y = 0.0d0

      ! 積分
      IntY_y = sum(y_Var(1:jm)*y_dy(1:jm))

    end function IntY_y
jm
Variable :
jm = 10 :integer
: 格子点数
jmax
Variable :
jmax :integer
: 配列添字の上限
jmin
Variable :
jmin :integer
: 配列添字の下限
q_Y
Variable :
q_Y(:) :real(DBKIND),allocatable
: 整数格子点座標
Function :
q_avr_y(jmin:jmax) :real(DBKIND)
: 出力
y_Var(jmin:jmax) :real(DBKIND),intent(in)
: 入力

平均操作を行い半整数格子点の配列値を整数格子点上へ返す

[Source]

    function q_avr_y(y_Var)
      ! 平均操作を行い半整数格子点の配列値を整数格子点上へ返す
  
      real(DBKIND),intent(in) :: y_Var(jmin:jmax)  ! 入力
      real(DBKIND)            :: q_avr_y(jmin:jmax) ! 出力
      integer                 :: jy                ! ループ添字

      ! 初期化
      ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
      !
      q_avr_y = 0.0d0

      ! 平均操作
      ! * 平均がとれない jmax 格子上の値は計算しない.
      ! * 不等間隔格子なので重みをつけて平均する.
      !   点 P, Q を a:b に内分する点の X の値は, a*X(Q) + b*X(P) 
      !   (a+b=1 を仮定) であることから, 
      !
      !     q_Var(jy) = [0.5*y_dy(jy)  /q_dy(jy)]*y_Var(jy+1) +    
      !                 [0.5*y_dy(jy+1)/q_dy(jy)]*y_Var(jy)     
      !   
      !   変形すると
      !
      !     q_Var(jy) = [y_dy(jy)*y_Var(jy+1) + y_dy(jy+1)*y_Var(jy)]
      !                 *0.5/q_dy(jy)
      ! 
      do jy = jmin, jmax-1
        q_avr_y(jy) = (y_dy(jy)*y_Var(jy+1) + y_dy(jy+1)*y_Var(jy))*0.5d0/q_dy(jy)
      end do

      ! jmax 格子点の値
      q_avr_y(jmax) = q_avr_y(jmax-1)

    end function q_avr_y
q_dy
Variable :
q_dy(:) :real(DBKIND),allocatable
: 整数格子点座標
y_Y
Variable :
y_Y(:) :real(DBKIND),allocatable
: 半整数格子点座標
Function :
y_avr_q(jmin:jmax) :real(DBKIND)
: 出力
q_Var(jmin:jmax) :real(DBKIND),intent(in)
: 入力

平均操作を行い整数格子点の配列値を半整数格子点上へ返す

[Source]

    function y_avr_q(q_Var)
      ! 平均操作を行い整数格子点の配列値を半整数格子点上へ返す
  
      real(DBKIND),intent(in) :: q_Var(jmin:jmax)  ! 入力
      real(DBKIND)            :: y_avr_q(jmin:jmax) ! 出力
      integer                 :: jy                ! ループ添字

      ! 初期化
      ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
      !
      y_avr_q = 0.0d0

      ! 平均操作
      ! * 平均がとれない jmin 格子上の値は計算しない.
      !
      do jy = jmin+1, jmax
        y_avr_q(jy) = (q_Var(jy) + q_Var(jy-1))*0.5d0 
      end do

      ! jmin 格子点の値
      y_avr_q(jmin) = y_avr_q(jmin+1)

    end function y_avr_q
Subroutine :
j :integer,intent(in)
: y 方向格子点数
ymg :integer,intent(in)
: y 方向糊代格子点数
ymin :real(DBKIND),intent(in)
: y 座標最小値
ymax :real(DBKIND),intent(in)
: y 座標最大値

y 方向の座標値と格子点間隔を設定する

[Source]

    subroutine y_axis_init(j, ymg, ymin, ymax)
      ! y 方向の座標値と格子点間隔を設定する

      integer,intent(in)      :: j    ! y 方向格子点数
      integer,intent(in)      :: ymg  ! y 方向糊代格子点数
      real(DBKIND),intent(in) :: ymin ! y 座標最小値     
      real(DBKIND),intent(in) :: ymax ! y 座標最大値  
      integer                 :: jy   ! ループ添字
      real(DBKIND)            :: dy

      jm = j
      ymargin = ymg

      jmin = 1  - ymargin
      jmax = jm + ymargin

      allocate(y_Y(jmin:jmax))
      allocate(q_Y(jmin:jmax))
      allocate(y_dy(jmin:jmax))
      allocate(q_dy(jmin:jmax))

      dy = (ymax - ymin)/jm

      do jy = jmin, jmax
        q_Y(jy) = dy * jy
        y_Y(jy) = dy * (jy - 0.5)
        y_dy(jy) = dy
        q_dy(jy) = dy
      end do

    end subroutine y_axis_init  
y_dy
Variable :
y_dy(:) :real(DBKIND),allocatable
: 半整数格子点座標
ymargin
Variable :
ymargin = 2 :integer
: 糊代格子点数