Class xyz_deriv_module
In: ../src/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 :
paa_dx_xaa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xaa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! imax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !
      paa_dx_xaa(imax,:,:) = 1.0d10

    end function paa_dx_xaa
Function :
aqa_dy_aya(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aya_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

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

      ! jmax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aqa_dy_aya(:,jmax,:) = 1.0d10

    end function aqa_dy_aya
Function :
paa_dx_xaa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xaa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! imax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !
      paa_dx_xaa(imax,:,:) = 1.0d10

    end function paa_dx_xaa
Function :
aar_dz_aaz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aaz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! kmax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aar_dz_aaz(:,:,kmax) = 1.0d10
      
    end function aar_dz_aaz
Function :
paa_dx_xaa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
xaa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! imax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !
      paa_dx_xaa(imax,:,:) = 1.0d10

    end function paa_dx_xaa
Function :
aya_dy_aqa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aqa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

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

      ! jmin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aya_dy_aqa(:,jmin,:) = 1.0d10
      
    end function aya_dy_aqa
Function :
aaz_dz_aar(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aar_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! kmin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aaz_dz_aar(:,:,kmin) = 1.0d10

    end function aaz_dz_aar
Function :
aqa_dy_aya(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aya_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

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

      ! jmax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aqa_dy_aya(:,jmax,:) = 1.0d10

    end function aqa_dy_aya
Function :
aar_dz_aaz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aaz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! kmax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aar_dz_aaz(:,:,kmax) = 1.0d10
      
    end function aar_dz_aaz
Function :
xaa_dx_paa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
paa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! imin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !
      xaa_dx_paa(imin,:,:) = 1.0d10

    end function xaa_dx_paa
Function :
aqa_dy_aya(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aya_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

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

      ! jmax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aqa_dy_aya(:,jmax,:) = 1.0d10

    end function aqa_dy_aya
Function :
aaz_dz_aar(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aar_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! kmin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aaz_dz_aar(:,:,kmin) = 1.0d10

    end function aaz_dz_aar
Function :
xaa_dx_paa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
paa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! imin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !
      xaa_dx_paa(imin,:,:) = 1.0d10

    end function xaa_dx_paa
Function :
aya_dy_aqa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aqa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

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

      ! jmin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aya_dy_aqa(:,jmin,:) = 1.0d10
      
    end function aya_dy_aqa
Function :
aar_dz_aaz(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aaz_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! kmax での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aar_dz_aaz(:,:,kmax) = 1.0d10
      
    end function aar_dz_aaz
Function :
xaa_dx_paa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
paa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! imin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !
      xaa_dx_paa(imin,:,:) = 1.0d10

    end function xaa_dx_paa
Function :
aya_dy_aqa(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aqa_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

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

      ! jmin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aya_dy_aqa(:,jmin,:) = 1.0d10
      
    end function aya_dy_aqa
Function :
aaz_dz_aar(imin:imax,jmin:jmax,kmin:kmax) :real(DP)
aar_Var(imin:imax,jmin:jmax,kmin:kmax) :real(DP),intent(in)

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

[Source]

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

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

      ! kmin での値は決まらないので, 値を入れておく.
      ! 計算領域に滲み出した時にわかるように, 大きな値を入れておく
      !     
      aaz_dz_aar(:,:,kmin) = 1.0d10

    end function aaz_dz_aar