Class xyz_deriv_module
In: utils/xyz_deriv_module.f90

3 次元 (xyz 方向) 不等間隔交互格子 微分演算モジュール

機能

xyz_deriv_module は, 3 次元 (xyz 方向) 不等間隔交互格子を用いた有限差分 法に基づく数値モデルのための, 微分演算を行う Fortran90 関数を提供する. 微分演算は 2 次精度中心差分を用いて行う.

このモジュールは下請けモジュールとして xyz_base_module, data_type モジュールを用いている.

モジュール内の変数と手続きの命名方法については xyz_module を参照のこと.

変数, 手続きの要約

1 階微分

xyz_dx_pyz, pyz_dx_xyz :x 方向 1 階微分を計算する
xyz_dy_xqz, xqz_dy_xyz :y 方向 1 階微分を計算する
xyz_dz_xyr, xyr_dz_xyz :z 方向 1 階微分を計算する

Methods

Included Modules

dc_types gridset axesset

Public Instance methods

Function :
pqz_dx_xqz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xqz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

[Source]

    function pqz_dx_xqz(xqz_Var)
  
      real(DP),intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: pqz_dx_xqz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: ix

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

      ! 1 階微分の計算
      !
      do ix = imin, imax-1
        pqz_dx_xqz(ix,:,:) = (xqz_Var(ix+1,:,:)-xqz_Var(ix,:,:))/p_dx(ix)
      end do

      pqz_dx_xqz(imax,:,:) = pqz_dx_xqz(imax-1,:,:)

    end function pqz_dx_xqz
Function :
pqz_dy_pyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
pyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function pqz_dy_pyz(pyz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: pqz_dy_pyz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: jy

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

      ! y 方向一様な場合は微分はゼロ.
      if (jmin == jmax) return

      ! 1 階微分の計算
      !
      do jy = jmin, jmax-1
          pqz_dy_pyz(:,jy,:) = (pyz_Var(:,jy+1,:) - pyz_Var(:,jy,:))/q_dy(jy)
      end do

      pqz_dy_pyz(:,jmax,:) = pqz_dy_pyz(:,jmax-1,:) 

    end function pqz_dy_pyz
Function :
pyr_dx_xyr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xyr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

[Source]

    function pyr_dx_xyr(xyr_Var)
  
      real(DP),intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: pyr_dx_xyr(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: ix

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

      ! 1 階微分の計算
      !
      do ix = imin, imax-1
        pyr_dx_xyr(ix,:,:) = (xyr_Var(ix+1,:,:)-xyr_Var(ix,:,:))/p_dx(ix)
      end do

      pyr_dx_xyr(imax,:,:) = pyr_dx_xyr(imax-1,:,:)

    end function pyr_dx_xyr
Function :
pyr_dz_pyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
pyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function pyr_dz_pyz(pyz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: pyr_dz_pyz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: kz

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

      ! 1 階微分の計算
      !
      do kz = kmin, kmax-1
        pyr_dz_pyz(:,:,kz) = (pyz_Var(:,:,kz+1) - pyz_Var(:,:,kz))/r_dz(kz)
      end do

      pyr_dz_pyz(:,:,kmax) = pyr_dz_pyz(:,:,kmax-1)

    end function pyr_dz_pyz
Function :
pyz_dx_xyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function pyz_dx_xyz(xyz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: pyz_dx_xyz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: ix 

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

      ! 1 階微分の計算
      !
      do ix = imin, imax-1
        pyz_dx_xyz(ix,:,:) = (xyz_Var(ix+1,:,:) - xyz_Var(ix,:,:))/p_dx(ix)
      end do

      pyz_dx_xyz(imax,:,:) = pyz_dx_xyz(imax-1,:,:)

    end function pyz_dx_xyz
Function :
pyz_dy_pqz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
pqz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function pyz_dy_pqz(pqz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: pqz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: pyz_dy_pqz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: jy 

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

      ! y 方向一様な場合は微分はゼロ.
      if (jmin == jmax) return

      ! 1 階微分の計算
      !
      do jy = jmin+1, jmax
        pyz_dy_pqz(:,jy,:) = (pqz_Var(:,jy,:) - pqz_Var(:,jy-1,:))/y_dy(jy)
      end do

      pyz_dy_pqz(:,jmin,:) = pyz_dy_pqz(:,jmin+1,:)

    end function pyz_dy_pqz
Function :
pyz_dz_pyr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
pyr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function pyz_dz_pyr(pyr_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: pyr_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: pyz_dz_pyr(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: kz

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

      ! 1 階微分の計算
      !
      do kz = kmin+1, kmax
        pyz_dz_pyr(:,:,kz) = (pyr_Var(:,:,kz) - pyr_Var(:,:,kz-1))/z_dz(kz)
      end do

      pyz_dz_pyr(:,:,kmin) = pyz_dz_pyr(:,:,kmin+1)

    end function pyz_dz_pyr
Function :
xqr_dy_xyr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xyr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xqr_dy_xyr(xyr_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xqr_dy_xyr(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: jy

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

      ! y 方向一様な場合は微分はゼロ.
      if (jmin == jmax) return

      ! 1 階微分の計算
      !
      do jy = jmin, jmax-1
        xqr_dy_xyr(:,jy,:) = (xyr_Var(:,jy+1,:) - xyr_Var(:,jy,:))/q_dy(jy)
      end do

      xqr_dy_xyr(:,jmax,:) = xqr_dy_xyr(:,jmax-1,:)

    end function xqr_dy_xyr
Function :
xqr_dz_xqz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xqz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xqr_dz_xqz(xqz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xqr_dz_xqz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: kz

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

      ! 1 階微分の計算
      !
      do kz = kmin, kmax-1
        xqr_dz_xqz(:,:,kz) = (xqz_Var(:,:,kz+1) - xqz_Var(:,:,kz))/r_dz(kz)
      end do

      xqr_dz_xqz(:,:,kmax) = xqr_dz_xqz(:,:,kmax-1)

    end function xqr_dz_xqz
Function :
xqz_dx_pqz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
pqz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

[Source]

    function xqz_dx_pqz(pqz_Var)
  
      real(DP),intent(in) :: pqz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xqz_dx_pqz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: ix

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

      ! 1 階微分の計算
      !
      do ix = imin+1, imax
        xqz_dx_pqz(ix,:,:) = (pqz_Var(ix,:,:)-pqz_Var(ix-1,:,:))/x_dx(ix)
      end do

      xqz_dx_pqz(imin,:,:) = xqz_dx_pqz(imin+1,:,:)

    end function xqz_dx_pqz
Function :
xqz_dy_xyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xqz_dy_xyz(xyz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xqz_dy_xyz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: jy

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

      ! y 方向一様な場合は微分はゼロ.
      if (jmin == jmax) return

      ! 1 階微分の計算
      !
      do jy = jmin, jmax-1
        xqz_dy_xyz(:,jy,:) = (xyz_Var(:,jy+1,:) - xyz_Var(:,jy,:))/q_dy(jy)
      end do

      xqz_dy_xyz(:,jmax,:) = xqz_dy_xyz(:,jmax-1,:)

    end function xqz_dy_xyz
Function :
xqz_dz_xqr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xqr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xqz_dz_xqr(xqr_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xqr_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xqz_dz_xqr(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: kz

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

      ! 1 階微分の計算
      !
      do kz = kmin+1, kmax
        xqz_dz_xqr(:,:,kz) = (xqr_Var(:,:,kz) - xqr_Var(:,:,kz-1))/z_dz(kz)
      end do

      xqz_dz_xqr(:,:,kmin) = xqz_dz_xqr(:,:,kmin+1)

    end function xqz_dz_xqr
Function :
xyr_dx_pyr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
pyr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

[Source]

    function xyr_dx_pyr(pyr_Var)
  
      real(DP),intent(in) :: pyr_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xyr_dx_pyr(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: ix

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

      ! 1 階微分の計算
      !
      do ix = imin+1, imax
        xyr_dx_pyr(ix,:,:) = (pyr_Var(ix,:,:)-pyr_Var(ix-1,:,:))/x_dx(ix)
      end do

      xyr_dx_pyr(imin,:,:) = xyr_dx_pyr(imin+1,:,:)

    end function xyr_dx_pyr
Function :
xyr_dy_xqr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xqr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xyr_dy_xqr(xqr_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xqr_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xyr_dy_xqr(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: jy 

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

      ! y 方向一様な場合は微分はゼロ.
      if (jmin == jmax) return

      ! 1 階微分の計算
      !
      do jy = jmin+1, jmax
        xyr_dy_xqr(:,jy,:) = (xqr_Var(:,jy,:) - xqr_Var(:,jy-1,:))/y_dy(jy)
      end do

      xyr_dy_xqr(:,jmin,:) = xyr_dy_xqr(:,jmin+1,:)

    end function xyr_dy_xqr
Function :
xyr_dz_xyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xyr_dz_xyz(xyz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xyr_dz_xyz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: kz

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

      ! 1 階微分の計算
      !
      do kz = kmin, kmax-1
        xyr_dz_xyz(:,:,kz) = (xyz_Var(:,:,kz+1) - xyz_Var(:,:,kz))/r_dz(kz)
      end do

      xyr_dz_xyz(:,:,kmax) = xyr_dz_xyz(:,:,kmax-1)
      
    end function xyr_dz_xyz
Function :
xyz_dx_pyz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
pyz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xyz_dx_pyz(pyz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xyz_dx_pyz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: ix

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

      ! 1 階微分の計算
      !
      do ix = imin+1, imax
        xyz_dx_pyz(ix,:,:) = (pyz_Var(ix,:,:)-pyz_Var(ix-1,:,:))/x_dx(ix)
      end do

      xyz_dx_pyz(imin,:,:) = xyz_dx_pyz(imin+1,:,:)


    end function xyz_dx_pyz
Function :
xyz_dy_xqz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xqz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xyz_dy_xqz(xqz_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xyz_dy_xqz(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: jy 

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

      ! y 方向一様な場合は微分はゼロ.
      if (jmin == jmax) return

      ! 1 階微分の計算
      !
      do jy = jmin+1, jmax
        xyz_dy_xqz(:,jy,:) = (xqz_Var(:,jy,:) - xqz_Var(:,jy-1,:))/y_dy(jy)
      end do

      xyz_dy_xqz(:,jmin,:) = xyz_dy_xqz(:,jmin+1,:)

    end function xyz_dy_xqz
Function :
xyz_dz_xyr(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xyr_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

半整数格子点上の 1 階微分を計算する

[Source]

    function xyz_dz_xyr(xyr_Var)
      ! 半整数格子点上の 1 階微分を計算する
  
      real(DP),intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax) 
      real(DP)            :: xyz_dz_xyr(imin:imax,jmin:jmax,kmin:kmax)
      integer                 :: kz

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

      ! 1 階微分の計算
      !
      do kz = kmin+1, kmax
        xyz_dz_xyr(:,:,kz) = (xyr_Var(:,:,kz) - xyr_Var(:,:,kz-1))/z_dz(kz)
      end do

      xyz_dz_xyr(:,:,kmin) = xyz_dz_xyr(:,:,kmin+1)

    end function xyz_dz_xyr