Class sltt_dp
In: sltt/sltt_dp.f90

ä¸�æµ��¹æŽ¢ç´�

Finding Departure Point

Note that Japanese and English are described in parallel.

Procedures List

SLTTDPHor :æ°´å¹³�¹å�����æµ��¹æŽ¢ç´�
SLTTDPVer :���´æ�¹å�����æµ��¹æŽ¢ç´�
——————— :————
SLTTDPHor :Finding DP in Horizontal
SLTTDPVer :Finding DP in Vertical

NAMELIST

NAMELIST#

References

  • Williamson, D. L., and Rasch, P. J., 1989: Two-dimensional semi-Lagrangian transport with shape-preserving interpolation. Mon. Wea. Rev., 117, 102-129.

Methods

Included Modules

dc_types gridset sltt_const constants0 constants mpi_wrapper sltt_lagint axesset

Public Instance methods

Subroutine :
DelTime :real(DP), intent(in )
: $Delta t$
x_Lon(0:imax-1) :real(DP), intent(in )
: $lambda$ longitude
y_Lat(1:jmax/2) :real(DP), intent(in )
: $varphi$ latitude
y_SinLat(1:jmax/2) :real(DP), intent(in )
: $sin\varphi$
y_CosLat(1:jmax/2) :real(DP), intent(in )
: $cos\varphi$
iexmin :integer , intent(in )
iexmax :integer , intent(in )
jexmin :integer , intent(in )
jexmax :integer , intent(in )
x_ExtLon(iexmin:iexmax) :real(DP), intent(in )
: çµ�åº����¡å¼µ���� Extended array of Lon
y_ExtLat(jexmin:jexmax) :real(DP), intent(in )
: ç·�º¦���¡å¼µ���� Extended array of Lat
xyz_ExtU(iexmin:iexmax, jexmin:jexmax, 1:kmax) :real(DP), intent(in )
: �±è¥¿é¢������¡å¼µ���� Extended array of zonal velocity
xyz_ExtV(iexmin:iexmax, jexmin:jexmax, 1:kmax) :real(DP), intent(in )
: ����é¢������¡å¼µ���� Extended array of meridional velocity
xyz_DPLon(0:imax-1, 1:jmax/2, 1:kmax) :real(DP), intent(out)
: ä¸�æµ��¹ã���åº� Lon of departure point
xyz_DPLat(0:imax-1, 1:jmax/2, 1:kmax) :real(DP), intent(out)
: ä¸�æµ��¹ã��·¯åº� Lat of departure point

æ°´å¹³�¹å�����æµ��¹æŽ¢ç´� Finding DP in Horizontal

[Source]

  subroutine SLTTDPHor( DelTime, x_Lon, y_Lat, y_SinLat, y_CosLat, iexmin, iexmax, jexmin, jexmax, x_ExtLon, y_ExtLat, xyz_ExtU, xyz_ExtV, xyz_DPLon, xyz_DPLat )
    ! æ°´å¹³�¹å�����æµ��¹æŽ¢ç´�
    ! Finding DP in Horizontal

    use sltt_const, only : PIx2, dtjw, nloop_dp_h


    real(DP), intent(in ) :: DelTime
                              ! $\Delta t$         
    real(DP), intent(in ) :: x_Lon(0:imax-1)
                              ! $\lambda$ longitude 
    real(DP), intent(in ) :: y_Lat(1:jmax/2)
                              ! $\varphi$ latitude
    real(DP), intent(in ) :: y_SinLat(1:jmax/2)
                              ! $\sin\varphi$
    real(DP), intent(in ) :: y_CosLat(1:jmax/2)
                              ! $\cos\varphi$
    integer , intent(in ) :: iexmin
    integer , intent(in ) :: iexmax
    integer , intent(in ) :: jexmin
    integer , intent(in ) :: jexmax
    real(DP), intent(in ) :: x_ExtLon(iexmin:iexmax)
                              ! çµ�åº����¡å¼µ����
                              ! Extended array of Lon
    real(DP), intent(in ) :: y_ExtLat(jexmin:jexmax)
                              ! ç·�º¦���¡å¼µ����
                              ! Extended array of Lat    
    real(DP), intent(in ) :: xyz_ExtU(iexmin:iexmax, jexmin:jexmax, 1:kmax)    
                              ! �±è¥¿é¢������¡å¼µ����
                              ! Extended array of zonal velocity
    real(DP), intent(in ) :: xyz_ExtV(iexmin:iexmax, jexmin:jexmax, 1:kmax)
                              ! ����é¢������¡å¼µ����
                              ! Extended array of meridional velocity
    real(DP), intent(out) :: xyz_DPLon(0:imax-1, 1:jmax/2, 1:kmax)
                              ! ä¸�æµ��¹ã���åº�
                              ! Lon of departure point
    real(DP), intent(out) :: xyz_DPLat(0:imax-1, 1:jmax/2, 1:kmax)
                              ! ä¸�æµ��¹ã��·¯åº�
                              ! Lat of departure point

    !
    ! local variables
    !
    real(DP) :: xyz_MPLon (0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã���åº�
                              ! Lon of mid-point
    real(DP) :: xyz_MPLat (0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã��·¯åº�
                              ! Lat of mid-point
    real(DP) :: xyz_MPLonN(0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã���åº���¾å��Ž¨å®��¤ï�
                              ! Lon of mid-point (temporal estimation)
    real(DP) :: xyz_MPLatN(0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã��·¯åº���¾å��Ž¨å®��¤ï�
                              ! Lat of mid-point (now)
    logical  :: FlagWindInt   ! ��������������
                              ! Flag for initialization
    logical  :: xyz_FlagEstDP(0:imax-1, 1:jmax/2, 1:kmax)

    integer:: i               ! �±è¥¿�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in zonal direction
    integer:: j               ! �����¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in meridional direction
    integer:: k               ! ���´æ�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in vertical direction
    integer :: t              ! ������°ã�� DO ���¼ã�����業å���
                              ! Work variables for DO loop for DP estimation


    ! ����������
    ! initialization
    !
    xyz_FlagEstDP = .true.
    do k = 1, kmax
      do j = 1, jmax/2
        do i = 0, imax-1
          xyz_MPLonN(i,j,k) = x_Lon(i)
          xyz_MPLatN(i,j,k) = y_Lat(j)
        end do
      end do
    end do


    FlagWindInt = .false.
    mp_search_loop : do t = 1, nloop_dp_h
      if( mod( t, 5 ) .eq. 0 ) write( 6, * ) "### Loop for searching departure points : ", t


      xyz_MPLon = xyz_MPLonN
      xyz_MPLat = xyz_MPLatN


      call SLTTDPHorCore( DelTime, x_Lon, y_Lat, y_SinLat, y_CosLat, iexmin, iexmax, jexmin, jexmax, x_ExtLon, y_ExtLat, xyz_ExtU, xyz_ExtV, xyz_MPLon, xyz_MPLat, xyz_MPLonN, xyz_MPLatN, xyz_FlagEstDP, FlagWindInt )
      FlagWindInt = .true.


    end do mp_search_loop

    xyz_FlagEstDP = .true.
    FlagWindInt   = .true.

    call SLTTDPHorCore( 2.0_DP * DelTime, x_Lon, y_Lat, y_SinLat, y_CosLat, iexmin, iexmax, jexmin, jexmax, x_ExtLon, y_ExtLat, xyz_ExtU, xyz_ExtV, xyz_MPLon, xyz_MPLat, xyz_DPLon, xyz_DPLat, xyz_FlagEstDP, FlagWindInt )


  end subroutine SLTTDPHor
Subroutine :
DelTime :real(DP), intent(in )
: $Delta t$
xyr_SigmaDot(0:imax-1, 1:jmax, 0:kmax) :real(DP), intent(in )
: ���´æ���ï¼�SigmaDotï¼�
xyz_DPSigma(0:imax-1, 1:jmax, 1:kmax) :real(DP), intent(out)
: ä¸�æµ��¹é�åº� Sigma of the departure point

���´æ�¹å�����æµ��¹æŽ¢ç´� Finding DP in Vertical

[Source]

  subroutine SLTTDPVer( DelTime, xyr_SigmaDot, xyz_DPSigma )
    ! ���´æ�¹å�����æµ��¹æŽ¢ç´�
    ! Finding DP in Vertical

    ! 座æ����¼ã�¿è¨­å®�
    ! Axes data settings
    !
    use axesset, only : r_Sigma, z_Sigma

    use sltt_const, only : nloop_dp_v


    real(DP), intent(in ) :: DelTime
                              ! $\Delta t$
    real(DP), intent(in ) :: xyr_SigmaDot(0:imax-1, 1:jmax, 0:kmax)
                              ! ���´æ���ï¼�SigmaDotï¼�    
    real(DP), intent(out) :: xyz_DPSigma (0:imax-1, 1:jmax, 1:kmax)
                              ! ä¸�æµ��¹é�åº�
                              ! Sigma of the departure point        


    !
    ! local variables
    !
    real(DP) :: xyz_MPSigma   (0:imax-1, 1:jmax, 1:kmax)
                              ! 中é���¹ã���åº�
                              ! Sigma of mid-point
    real(DP) :: xyz_MPSigmaN  (0:imax-1, 1:jmax, 1:kmax)
                              ! 中é���¹ã���åº���¾å��Ž¨å®��¤ï�
                              ! Lat of mid-point (temporal estimation)
    real(DP) :: xyz_MPSigmaDot(0:imax-1, 1:jmax, 1:kmax)
                              ! 中é���¹ã��SigmaDot
                              ! SigmaDot of mid-point
    real(DP) :: xyza_lcifz(0:imax-1, 1:jmax, 1:kmax, -1:2)
                              ! ���°ã���³ã�¸ã�¥è������������業å���
                              ! Work variable for Lagrange interpolation
    integer :: xyz_kk(0:imax-1, 1:jmax, 1:kmax)
                              ! ���°ã���³ã�¸ã�¥è������������業å���
                              ! Work variable for Lagrange interpolation
    

    integer:: i               ! �±è¥¿�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in zonal direction
    integer:: j               ! �����¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in meridional direction
    integer:: k, kk, k2       ! ���´æ�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in vertical direction
    integer :: t              ! ������°ã�� DO ���¼ã�����業å���
                              ! Work variables for DO loop for DP estimation


    ! ����������
    ! initialization
    !
    do k = 1, kmax
      xyz_MPSigmaN(:,:,k) = z_Sigma(k)
    end do

    ! ä¸�æµ��¹æŽ¨å®������¼ã��
    ! Loop for finding departure point
    mp_search_loop : do t = 1, nloop_dp_v


      xyz_MPSigma = xyz_MPSigmaN


      ! 中é���¹ã�����´æ��������°ã���³ã�¸ã�¥ï�次è����§æ����� 
      ! vertical wind velocity at mid-point is estimated by using Lagrange cubic 
      ! interpolation
      !
      do k = 1, kmax
        do j = 1, jmax
          do i = 0, imax-1

            !
            ! Routine for dcpam
            !
            ! Departure points, xyz_MPSigma(:,:,k), must be located between 
            ! r_Sigma(kk) > xyz_MPSigma(k) > r_Sigma(kk+1).
            ! Further, 1 <= kk <= kmax-2.
            !

            !
            ! economical method
            !
            if( xyz_MPSigma(i,j,k) > r_Sigma(k) ) then
              k_search_1 : do k2 = k, 1, -1
                if( r_Sigma(k2) > xyz_MPSigma(i,j,k) ) exit k_search_1
              end do k_search_1
              xyz_kk(i,j,k) = k2
            else
              k_search_2 : do k2 = min( k+1, kmax ), kmax
                if( r_Sigma(k2) < xyz_MPSigma(i,j,k) ) exit k_search_2
              end do k_search_2
              xyz_kk(i,j,k) = k2 - 1
            end if
            xyz_kk(i,j,k) = min( max( xyz_kk(i,j,k), 1 ), kmax-2 )

          end do
        end do
      end do
      !
      do k = 1, kmax
        do j = 1, jmax
          do i = 0, imax-1
            kk = xyz_kk(i,j,k)
            xyza_lcifz(i,j,k,-1) = ( xyz_MPSigma(i,j,k) - r_Sigma(kk  ) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk+1) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk+2) ) / ( ( r_Sigma(kk-1) - r_Sigma(kk  ) ) * ( r_Sigma(kk-1) - r_Sigma(kk+1) ) * ( r_Sigma(kk-1) - r_Sigma(kk+2) ) )
            xyza_lcifz(i,j,k, 0) = ( xyz_MPSigma(i,j,k) - r_Sigma(kk-1) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk+1) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk+2) ) / ( ( r_Sigma(kk  ) - r_Sigma(kk-1) ) * ( r_Sigma(kk  ) - r_Sigma(kk+1) ) * ( r_Sigma(kk  ) - r_Sigma(kk+2) ) )
            xyza_lcifz(i,j,k, 1) = ( xyz_MPSigma(i,j,k) - r_Sigma(kk-1) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk  ) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk+2) ) / ( ( r_Sigma(kk+1) - r_Sigma(kk-1) ) * ( r_Sigma(kk+1) - r_Sigma(kk  ) ) * ( r_Sigma(kk+1) - r_Sigma(kk+2) ) )
            xyza_lcifz(i,j,k, 2) = ( xyz_MPSigma(i,j,k) - r_Sigma(kk-1) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk  ) ) * ( xyz_MPSigma(i,j,k) - r_Sigma(kk+1) ) / ( ( r_Sigma(kk+2) - r_Sigma(kk-1) ) * ( r_Sigma(kk+2) - r_Sigma(kk  ) ) * ( r_Sigma(kk+2) - r_Sigma(kk+1) ) )
          end do
        end do
      end do
      !
      do k = 1, kmax
        do j = 1, jmax
          do i = 0, imax-1
            kk = xyz_kk(i,j,k)
            xyz_MPSigmaDot(i,j,k) = xyza_lcifz(i,j,k,-1) * xyr_SigmaDot(i,j,kk-1) + xyza_lcifz(i,j,k, 0) * xyr_SigmaDot(i,j,kk  ) + xyza_lcifz(i,j,k, 1) * xyr_SigmaDot(i,j,kk+1) + xyza_lcifz(i,j,k, 2) * xyr_SigmaDot(i,j,kk+2)
          end do
        end do
      end do



      do k = 1, kmax
        xyz_MPSigmaN(:,:,k) = z_Sigma(k) - xyz_MPSigmaDot(:,:,k) * DelTime
      end do
      xyz_MPSigmaN = min( max( xyz_MPSigmaN, r_Sigma(kmax) ), r_Sigma(0) )


    end do mp_search_loop

    ! ä¸�æµ��¹é�åº���Ž¨å®�
    ! estimating departure point
    !
    do k = 1, kmax
      xyz_DPSigma(:,:,k) = z_Sigma(k) - xyz_MPSigmaDot(:,:,k) * 2.0_DP * DelTime
    end do


  end subroutine SLTTDPVer

Private Instance methods

Subroutine :
DelTime :real(DP), intent(in )
: $Delta t$
x_APLon(0:imax-1) :real(DP), intent(in )
: �°ç���¹ï��°ã������ä¸�ï¼����åº� Lon of arrival point (which is on grid)
y_APLat(1:jmax/2 ) :real(DP), intent(in )
: �°ç���¹ï��°ã������ä¸�ï¼���·¯åº� Lat of arrival point (which is on grid)
y_APSinLat(1:jmax/2) :real(DP), intent(in )
: �°ç���¹ã�� sin(ç·�º¦) sin(lat) of arrival point
y_APCosLat(1:jmax/2) :real(DP), intent(in )
: �°ç���¹ã�� cos(ç·�º¦) cos(lat) of arrival point
iexmin :integer , intent(in )
iexmax :integer , intent(in )
jexmin :integer , intent(in )
jexmax :integer , intent(in )
x_ExtLon(iexmin:iexmax) :real(DP), intent(in )
: çµ�åº����¡å¼µ���� Extended array of Lon
y_ExtLat(jexmin:jexmax) :real(DP), intent(in )
: ç·�º¦���¡å¼µ���� Extended array of Lat
xyz_ExtU(iexmin:iexmax, jexmin:jexmax, 1:kmax) :real(DP), intent(in )
: �±è¥¿é¢������¡å¼µ���� Extended array of zonal wind
xyz_ExtV(iexmin:iexmax, jexmin:jexmax, 1:kmax) :real(DP), intent(in )
: ����é¢������¡å¼µ���� Extended array of meridional wind
xyz_MPLon(0:imax-1, 1:jmax/2, 1:kmax) :real(DP), intent(in )
: 中é���¹ã���åº� Lon of mid-point
xyz_MPLat(0:imax-1, 1:jmax/2, 1:kmax) :real(DP), intent(in )
: 中é���¹ã��·¯åº� Lat of mid-point
xyz_DPLon(0:imax-1, 1:jmax/2, 1:kmax) :real(DP), intent(inout)
: ä¸�æµ��¹ã���åº� Lon of departure point
xyz_DPLat(0:imax-1, 1:jmax/2, 1:kmax) :real(DP), intent(inout)
: ä¸�æµ��¹ã��·¯åº� Lat of departure point
xyz_FlagEstDP(0:imax-1, 1:jmax/2, 1:kmax) :logical , intent(in )
: ä¸�æµ��¹æŽ¢ç´¢ã�������� Flag for finding departure point
FlagWindInt :logical , intent(in )
: ���������� Initial flag

æ°´å¹³�¹å�����æµ��¹æŽ¢ç´¢ã���³ã�¢é���� Finding DP in Horizontal (Core)

[Source]

  subroutine SLTTDPHorCore( DelTime, x_APLon, y_APLat, y_APSinLat, y_APCosLat, iexmin, iexmax, jexmin, jexmax, x_ExtLon, y_ExtLat, xyz_ExtU, xyz_ExtV, xyz_MPLon, xyz_MPLat, xyz_DPLon, xyz_DPLat, xyz_FlagEstDP, FlagWindInt )
    ! æ°´å¹³�¹å�����æµ��¹æŽ¢ç´¢ã���³ã�¢é����
    ! Finding DP in Horizontal (Core)

    use constants0 , only : PI
    use constants  , only : RPlanet
    use mpi_wrapper, only : myrank
    use sltt_const , only : PIx2, PIH
    use sltt_lagint, only : SLTTLagIntCubCalcFactHor , SLTTLagIntCubIntHor


    real(DP), intent(in   ) :: DelTime
                              ! $\Delta t$    
    real(DP), intent(in   ) :: x_APLon(0:imax-1)
                              ! �°ç���¹ï��°ã������ä¸�ï¼����åº�
                              ! Lon of arrival point (which is on grid)
    real(DP), intent(in   ) :: y_APLat(1:jmax/2 )
                              ! �°ç���¹ï��°ã������ä¸�ï¼���·¯åº�
                              ! Lat of arrival point (which is on grid)
    real(DP), intent(in   ) :: y_APSinLat(1:jmax/2)
                              ! �°ç���¹ã�� sin(ç·�º¦)
                              ! sin(lat) of arrival point
    real(DP), intent(in   ) :: y_APCosLat(1:jmax/2)
                              ! �°ç���¹ã�� cos(ç·�º¦)
                              ! cos(lat) of arrival point    
    integer , intent(in   ) :: iexmin
    integer , intent(in   ) :: iexmax
    integer , intent(in   ) :: jexmin
    integer , intent(in   ) :: jexmax
    real(DP), intent(in   ) :: x_ExtLon(iexmin:iexmax)
                              ! çµ�åº����¡å¼µ����
                              ! Extended array of Lon
    real(DP), intent(in   ) :: y_ExtLat(jexmin:jexmax)
                              ! ç·�º¦���¡å¼µ����
                              ! Extended array of Lat
    real(DP), intent(in   ) :: xyz_ExtU(iexmin:iexmax, jexmin:jexmax, 1:kmax)
                              ! �±è¥¿é¢������¡å¼µ����
                              ! Extended array of zonal wind
    real(DP), intent(in   ) :: xyz_ExtV(iexmin:iexmax, jexmin:jexmax, 1:kmax)
                              ! ����é¢������¡å¼µ����
                              ! Extended array of meridional wind
    real(DP), intent(in   ) :: xyz_MPLon(0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã���åº�
                              ! Lon of mid-point
    real(DP), intent(in   ) :: xyz_MPLat(0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã��·¯åº�
                              ! Lat of mid-point
    real(DP), intent(inout) :: xyz_DPLon(0:imax-1, 1:jmax/2, 1:kmax)
                              ! ä¸�æµ��¹ã���åº�
                              ! Lon of departure point    
    real(DP), intent(inout) :: xyz_DPLat(0:imax-1, 1:jmax/2, 1:kmax)
                              ! ä¸�æµ��¹ã��·¯åº�
                              ! Lat of departure point    
    logical , intent(in   ) :: xyz_FlagEstDP(0:imax-1, 1:jmax/2, 1:kmax)
                              ! ä¸�æµ��¹æŽ¢ç´¢ã��������
                              ! Flag for finding departure point
    logical , intent(in   ) :: FlagWindInt
                              ! ����������
                              ! Initial flag

    !
    ! local variables
    !
    real(DP) :: xyz_MPU(0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã���±è¥¿é¢���
                              ! Zonal wind at mid-point
    real(DP) :: xyz_MPV(0:imax-1, 1:jmax/2, 1:kmax)
                              ! 中é���¹ã������é¢���
                              ! Meridional wind at mid-point
    real(DP) :: MPCosLat      ! 中é���¹ã��cos(lat)
                              ! cos(lat) at mid-point

    real(DP) :: xyza_lcifx(0:imax-1, 1:jmax/2, 1:kmax, -1:2)
    real(DP) :: xyza_lcify(0:imax-1, 1:jmax/2, 1:kmax, -1:2)
    integer :: xyz_ii(0:imax-1, 1:jmax/2, 1:kmax)
    integer :: xyz_jj(0:imax-1, 1:jmax/2, 1:kmax)
                              ! ���°ã���³ã�¸ã�¥è������������業å���
                              ! Working variables for Lagrange interpolation


    integer:: i               ! �±è¥¿�¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in zonal direction
    integer:: j               ! �����¹å�������� DO ���¼ã�����業å���
                              ! Work variables for DO loop in meridional direction
    integer:: k               ! ���´æ�¹å�������� DO ���¼ã�����業å���

    real(DP) :: InvRPlanet 


    InvRPlanet = 1.0_DP/RPlanet


    if( FlagWindInt ) then

      ! ���°ã���³ã�¸ã�¥ï�次è���
      ! Cubic interpolation
      call SLTTLagIntCubCalcFactHor( iexmin, iexmax, jexmin, jexmax, x_ExtLon, y_ExtLat, xyz_MPLon, xyz_MPLat, xyz_ii, xyz_jj, xyza_lcifx, xyza_lcify )
      ! 中é���¹ã��¢¨�����
      ! estimating wind velocities at mid-point
      !
      call SLTTLagIntCubIntHor( iexmin, iexmax, jexmin, jexmax, xyz_ii, xyz_jj, xyza_lcifx, xyza_lcify, xyz_ExtU, xyz_MPU )
      call SLTTLagIntCubIntHor( iexmin, iexmax, jexmin, jexmax, xyz_ii, xyz_jj, xyza_lcifx, xyza_lcify, xyz_ExtV, xyz_MPV )
    else

      !
      ! ���é¢������´æ��
      !
      xyz_MPU(0:imax-1,1:jmax/2,:) = xyz_ExtU(0:imax-1,1:jmax/2,:)
      xyz_MPV(0:imax-1,1:jmax/2,:) = xyz_ExtV(0:imax-1,1:jmax/2,:)

    end if


    do k = 1, kmax
      do j = 1, jmax/2
        do i = 0, imax-1

          if( xyz_FlagEstDP(i,j,k) ) then

!            MPCosLat = cos( xyz_MPLat(i,j,k) )
            xyz_DPLon(i,j,k) = x_APLon(i) - DelTime * xyz_MPU(i,j,k) / cos( xyz_MPLat(i,j,k) ) * InvRPlanet !/ RPlanet
            xyz_DPLat(i,j,k) = y_APLat(j) - DelTime * xyz_MPV(i,j,k)* InvRPlanet ! / RPlanet

          end if

        end do
      end do
    end do

    ! ������·¯åº��åº�����²ã���´ã��
    do k = 1, kmax
      do j = 1, jmax/2
        do i = 0, imax-1
          if( xyz_DPLat(i,j,k) < -PIH ) then
            xyz_DPLon(i,j,k) = xyz_DPLon(i,j,k) + PI
            xyz_DPLat(i,j,k) = -PIH + ( -PIH - xyz_DPLat(i,j,k) )
          else if( xyz_DPLat(i,j,k) > PIH ) then
            xyz_DPLon(i,j,k) = xyz_DPLon(i,j,k) + PI
            xyz_DPLat(i,j,k) = PIH - ( xyz_DPLat(i,j,k) - PIH )
          end if
          xyz_DPLon(i,j,k) = mod( xyz_DPLon(i,j,k) + PIx2, PIx2 )
        end do
      end do
    end do


  end subroutine SLTTDPHorCore