| Class | x_base_module | 
| In: | 
                
                setup/x_base_module.f90
                
         | 
x_base_module は, 1 次元 (x 方向) 等間隔交互格子を用いた有限差分 法に基づく数値モデルのための, 基本的な Fortran90 副プログラムおよび 関数を提供する.
このモジュールは x_module の下位モジュールである. 下請けモジュール として data_type モジュールを用いている.
| Function : | |||
| AvrX_p : | real(DBKIND)
  | ||
| p_Var(imin:imax) : | real(DBKIND), intent(in)
  | 
整数格子上の配列に対し x 方向の平均操作を行う
    function AvrX_p(p_Var)
      ! 整数格子上の配列に対し x 方向の平均操作を行う
      real(DBKIND), intent(in) :: p_Var(imin:imax)  ! 入力
      real(DBKIND)             :: AvrX_p            ! 出力
      AvrX_p = IntX_p(p_Var)/sum(p_dx(1:im))
    end function AvrX_p
          | Function : | |||
| AvrX_x : | real(DBKIND)
  | ||
| x_Var(imin:imax) : | real(DBKIND), intent(in)
  | 
半整数格子上の配列に対し x 方向の平均操作を行う
    function AvrX_x(x_Var)
      ! 半整数格子上の配列に対し x 方向の平均操作を行う
      real(DBKIND), intent(in) :: x_Var(imin:imax)  ! 入力
      real(DBKIND)             :: AvrX_x            ! 出力
      AvrX_x = IntX_x(x_Var)/sum(x_dx(1:im))
    end function AvrX_x
          | Function : | |||
| IntX_p : | real(DBKIND)
  | ||
| p_Var(imin:imax) : | real(DBKIND), intent(in)
  | 
整数格子上の配列に対し x 方向に重み付きの積分を行う
    function IntX_p(p_Var)
      ! 整数格子上の配列に対し x 方向に重み付きの積分を行う
      real(DBKIND), intent(in) :: p_Var(imin:imax)  ! 入力
      real(DBKIND)             :: IntX_p            ! 出力
      ! 初期化
      IntX_p = 0.0d0
      ! 積分
      IntX_p = sum(p_Var(1:im)*p_dx(1:im))
    end function IntX_p
          | Function : | |||
| IntX_x : | real(DBKIND)
  | ||
| x_Var(imin:imax) : | real(DBKIND), intent(in)
  | 
半整数格子上の配列に対し x 方向に重み付きの積分を行う
    function IntX_x(x_Var)
      ! 半整数格子上の配列に対し x 方向に重み付きの積分を行う
      real(DBKIND), intent(in) :: x_Var(imin:imax)  ! 入力
      real(DBKIND)             :: IntX_x            ! 出力
      real(DBKIND), allocatable:: work(:)
      ! 初期化
      IntX_x = 0.0d0
      allocate(work(imin:imax))
      ! 積分
      work = x_Var*x_dx
      IntX_x = sum(work(1:im))
      
      deallocate(work)
    end function IntX_x
          | Function : | |||
| p_avr_x(imin:imax) : | real(DBKIND)
  | ||
| x_Var(imin:imax) : | real(DBKIND),intent(in)
  | 
平均操作を行い半整数格子点の配列値を整数格子点上へ返す
    function p_avr_x(x_Var)
      ! 平均操作を行い半整数格子点の配列値を整数格子点上へ返す
  
      real(DBKIND),intent(in) :: x_Var(imin:imax)  ! 入力
      real(DBKIND)            :: p_avr_x(imin:imax) ! 出力
      integer             :: ix                ! ループ添字
      ! 初期化
      ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
      !
      p_avr_x = 0.0d0
      ! 平均操作
      ! * 平均がとれない imax 格子上の値は計算しない.
      ! * 不等間隔格子なので重みをつけて平均する.
      !   点 P, Q を a:b に内分する点の X の値は, a*X(Q) + b*X(P) 
      !   (a+b=1 を仮定) であることから, 
      !
      !     p_Var(ix) = [0.5*x_dx(ix)  /p_dx(ix)]*x_Var(ix+1) +    
      !                 [0.5*x_dx(ix+1)/p_dx(ix)]*x_Var(ix)     
      !   
      !   変形すると
      !
      !     p_Var(ix) = [x_dx(ix)*x_Var(ix+1) + x_dx(ix+1)*x_Var(ix)]
      !                 *0.5/p_dx(ix)
      ! 
      do ix = imin, imax-1
        p_avr_x(ix) = (x_dx(ix)*x_Var(ix+1) + x_dx(ix+1)*x_Var(ix))*0.5d0/p_dx(ix)
      end do
      ! imax 格子点上の値
      p_avr_x(imax) = p_avr_x(imax-1)
    end function p_avr_x
          | Function : | |||
| x_avr_p(imin:imax) : | real(DBKIND)
  | ||
| p_Var(imin:imax) : | real(DBKIND),intent(in)
  | 
平均操作を行い整数格子点の配列値を半整数格子点上へ返す
    function x_avr_p(p_Var)
      ! 平均操作を行い整数格子点の配列値を半整数格子点上へ返す
  
      real(DBKIND),intent(in) :: p_Var(imin:imax)  ! 入力
      real(DBKIND)            :: x_avr_p(imin:imax) ! 出力
      integer             :: ix                ! ループ添字
      ! 初期化
      ! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
      !
      x_avr_p = 0.0d0
      ! 平均操作
      ! * 平均がとれない imin 格子上の値は計算しない.
      !
      do ix = imin+1, imax
        x_avr_p(ix) = (p_Var(ix) + p_Var(ix-1))*0.5d0 
      end do
      ! imin 格子上の値
      x_avr_p(imin) = x_avr_p(imin+1)
    end function x_avr_p
          | Subroutine : | |||
| i : | integer,intent(in)
  | ||
| xmg : | integer,intent(in)
  | ||
| xmin : | real(DBKIND),intent(in)
  | ||
| xmax : | real(DBKIND),intent(in)
  | 
配列の上下限の値と格子点座標値, 格子点間隔を設定する
    subroutine x_axis_init(i, xmg, xmin, xmax)
      ! 配列の上下限の値と格子点座標値, 格子点間隔を設定する
      integer,intent(in)  :: i    ! x 方向格子点数
      integer,intent(in)  :: xmg  ! x 方向糊代格子点数
      real(DBKIND),intent(in) :: xmin ! x 座標最小値     
      real(DBKIND),intent(in) :: xmax ! x 座標最大値  
      integer             :: ix   ! do ループ添字
      real(DBKIND)            :: dx   ! 格子間隔
      im = i
      xmargin = xmg
      imin = 1  - xmargin
      imax = im + xmargin
      allocate(x_X(imin:imax))
      allocate(p_X(imin:imax))
      allocate(x_dx(imin:imax))
      allocate(p_dx(imin:imax))
      dx = (xmax - xmin)/im
      do ix = imin, imax
        p_X(ix) = dx * ix
        x_X(ix) = dx * (ix - 0.5)
        x_dx(ix) = dx
        p_dx(ix) = dx
      end do
    end subroutine x_axis_init