Class | xyz_deriv_module |
In: |
utils/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(DP) |
xqz_Var(imin:imax,jmin:jmax,kmin:kmax) : | real(DP),intent(in) |
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 階微分を計算する
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) |
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 階微分を計算する
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 階微分を計算する
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 階微分を計算する
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 階微分を計算する
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 階微分を計算する
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 階微分を計算する
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) |
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 階微分を計算する
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 階微分を計算する
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) |
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 階微分を計算する
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 階微分を計算する
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 階微分を計算する
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 階微分を計算する
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 階微分を計算する
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