!----------------------------------------------------------------------
!     Copyright (c) 2001 Shin-ichi Takehiro. All rights reserved.
!----------------------------------------------------------------------

program cttest

  use ctpack
  implicit none

  integer,parameter          :: im=16, jm=8     ! 格子点の設定(X,Y)
  integer,parameter          :: km=5, lm=5     ! 切断波数の設定(X,Y)

  double precision,parameter :: pi=3.1415926535897932385D0
  double precision   :: xmin=0.0, xmax=1.0   ! 領域の大きさ
  double precision   :: ymin=0.0, ymax=1.0   ! 領域の大きさ

  double precision, dimension(0:jm,0:im-1)  :: gg_data
  double precision, dimension(-km:km,0:lm)  :: et_data
  double precision, dimension(0:jm,0:im-1)  :: gg_data1
  double precision, dimension(0:jm,0:im-1) :: x, y

  integer          :: i, j, k, l

  double precision, parameter :: eps=1e-10    ! 0 に近い数の閾値

!  call ctinitial(im,jm,km,lm,xmin,xmax,ymin,ymax)
  call ctinitial(im,jm,km,lm,xmin,xmax,ymax,ymin)

  x = gg_x()
  y = gg_y()
  gg_data = sin(2*pi*x)*y**4
  gg_data1 = sin(2*pi*x)*y**3*4

  write (6,*) 'Transform(k,l,value)'
  et_data = et_gg(gg_data)
  do k=-km,km
     do l=0,lm
        if ( abs(et_data(k,l)) .gt. eps ) then
           write (6,*) k, l, et_data(k,l)
        endif
     enddo
  enddo

!!$  gg_data = gg_et(et_data)               ! 逆変換      
!!$  gg_data = gg_et(et_dx_et(et_data))     ! X 微分      
  gg_data = gg_et(et_dy_et(et_data))     ! Y 微分      
!!$  gg_data = gg_et(et_lapla_et(et_data))  ! ラプラシアン
  call graph

!!$  gg_data = gg_et(et_data) - gg_data1                ! 逆変換      
!!$  gg_data = gg_et(et_dx_et(et_data)) - gg_data1      ! X 微分      
!!$  gg_data = gg_et(et_dy_et(et_data)) - gg_data1      ! Y 微分      
!!$  gg_data = gg_et(et_lapla_et(et_data)) - gg_data1   ! ラプラシアン
  do j=0,jm
     do i=0,im-1
        if ( abs(gg_data(j,i)) .gt. eps ) then
           write (6,*) i, j, gg_data(j,i)
        endif
     enddo
  enddo

  stop

contains

  subroutine graph

      CALL GROPN( 1 )
      CALL GRFRM
      CALL GRSWND( real(XMIN), real(XMAX), real(YMIN), real(YMAX) )
      CALL GRSVPT( 0.2, 0.8, 0.2, 0.8 )
      CALL GRSTRN( 1 )
      CALL GRSTRF

      CALL USDAXS
      call uwsgya(real(y(:,1)),jm+1)
      CALL UDCNTR(transpose(real(gg_data)) , im, im, jm )
      CALL GRFRM

      CALL GRSWND( real(XMIN), real(XMAX), real(YMIN), real(YMAX) )
      CALL GRSVPT( 0.2, 0.8, 0.2, 0.8 )
      CALL GRSTRN( 1 )
      CALL GRSTRF

      CALL USDAXS
      call UXPTMK('B',1,real(x(1,:)),im)
      call UXPTMK('T',1,real(x(1,:)),im)
      call UYPTMK('R',1,real(y(:,1)),jm+1)
      call UYPTMK('L',1,real(y(:,1)),jm+1)

      call uwsgya(real(y(:,1)),jm+1)
      CALL UDCNTR(transpose(real(gg_data1)) , im, im, jm )

      CALL GRCLS
    end subroutine graph

  end program cttest

