| Class | xyz_deriv_module |
| In: |
util/xyz_deriv_module.f90
|
xyz_deriv_module は, 3 次元 (xyz 方向) 不等間隔交互格子を用いた有限差分 法に基づく数値モデルのための, 微分演算を行う Fortran90 関数を提供する. 微分演算は 2 次精度中心差分を用いて行う.
このモジュールは下請けモジュールとして xyz_base_module, data_type モジュールを用いている.
モジュール内の変数と手続きの命名方法については xyz_module を参照のこと.
| xyz_dx_pyz, pyz_dx_xyz : | x 方向 1 階微分を計算する |
| xyz_dy_xqz, xqz_dy_xyz : | y 方向 1 階微分を計算する |
| xyz_dz_xyr, xyr_dz_xyz : | z 方向 1 階微分を計算する |
| Function : | |
| pqz_dx_xqz(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND) |
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
function pqz_dx_xqz(xqz_Var)
real(DBKIND),intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function pqz_dy_pyz(pyz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: pqz_dy_pyz(imin:imax,jmin:jmax,kmin:kmax)
integer :: jy
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
pqz_dy_pyz = 0.0d0
! 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(DBKIND) |
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
function pyr_dx_xyr(xyr_Var)
real(DBKIND),intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function pyr_dz_pyz(pyz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function pyz_dx_xyz(xyz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| pqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function pyz_dy_pqz(pqz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: pqz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: pyz_dy_pqz(imin:imax,jmin:jmax,kmin:kmax)
integer :: jy
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
pyz_dy_pqz = 0.0d0
! 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(DBKIND) |
| pyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function pyz_dz_pyr(pyr_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: pyr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xqr_dy_xyr(xyr_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: xqr_dy_xyr(imin:imax,jmin:jmax,kmin:kmax)
integer :: jy
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
xqr_dy_xyr = 0.0d0
! 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(DBKIND) |
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xqr_dz_xqz(xqz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| pqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
function xqz_dx_pqz(pqz_Var)
real(DBKIND),intent(in) :: pqz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xqz_dy_xyz(xyz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: xqz_dy_xyz(imin:imax,jmin:jmax,kmin:kmax)
integer :: jy
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
xqz_dy_xyz = 0.0d0
! 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(DBKIND) |
| xqr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xqz_dz_xqr(xqr_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xqr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| pyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
function xyr_dx_pyr(pyr_Var)
real(DBKIND),intent(in) :: pyr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| xqr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xyr_dy_xqr(xqr_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xqr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: xyr_dy_xqr(imin:imax,jmin:jmax,kmin:kmax)
integer :: jy
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
xyr_dy_xqr = 0.0d0
! 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(DBKIND) |
| xyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xyr_dz_xyz(xyz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| pyz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xyz_dx_pyz(pyz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: pyz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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(DBKIND) |
| xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xyz_dy_xqz(xqz_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xqz_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: xyz_dy_xqz(imin:imax,jmin:jmax,kmin:kmax)
integer :: jy
! 初期化
! * 0 割りを防ぐためにはマシンイプシロン値を用いるべき
!
xyz_dy_xqz = 0.0d0
! 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(DBKIND) |
| xyr_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DBKIND),intent(in) |
半整数格子点上の 1 階微分を計算する
function xyz_dz_xyr(xyr_Var)
! 半整数格子点上の 1 階微分を計算する
real(DBKIND),intent(in) :: xyr_Var(imin:imax,jmin:jmax,kmin:kmax)
real(DBKIND) :: 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