signfunc.F90

Path: ZolotarevModule/signfunc.F90
Last Update: Wed Dec 15 15:48:03 +0900 2010
dot/f_3.png

Required files

Methods

Included Modules

signfunc_mod

Public Instance methods

Main Program :

[Source]

program test_signfunc
  use signfunc_mod
  implicit none
  integer, parameter :: DP=KIND(1.0d0)
  real(DP) :: Lmax,Lmin
  real(DP) :: eps,rr,rr2,x,dx,dr
  type(zolotarev_signfunc) :: sf
  character(256) ::arg
  integer :: NS
  integer :: i,j

  if (command_argument_count() == 3) then
    call get_command_argument(1,arg)
    read(arg,*)eps
    call get_command_argument(2,arg)
    read(arg,*)Lmax
    call get_command_argument(3,arg)
    read(arg,*)Lmin

    write(*,'("# EPS=",ES24.15)')eps
    write(*,'("# Lambda_max=",ES24.15)') Lmax
    write(*,'("# Lambda_min=",ES24.15)') Lmin
  else
    write(*,'("Usage: signfunc eps Lmax Lmin")')
    stop
  endif

  call new(sf,Lmax,Lmin,eps)
  write(*,'("# NS=",I3)')sf%NS
  write(*,'("# rr(x)   : rational approx in original form.")')
  write(*,'("# rr2(x)  : rational approx in polar decompd form.")')
  write(*,'("# x                    rr2(x)                  |sign(x)-rr2(x)|           rr(x)-rr2(x)")')
  x = -10.0_DP
  do
    dx = max(abs(x)*0.001_DP,(Lmin/Lmax)/1000)
    rr  = signfunc(sf,x)
    rr2 = signfunc2(sf,x)
    dr = rr - rr2
    write(*,'(4ES41.31)')x,rr2,abs(sign(1.0_DP,x)-rr2),dr
    x = x+dx
    if (x > 10.0_DP) exit
  enddo
  write(*,*)
  write(*,*)
  write(*,'("# ERROR BOUND:")')
  write(*,'(4ES24.15)') sf%kappa,eps,sf%delta,sf%delta_ex
  write(*,'(3ES24.15)')   1.0_DP,eps,sf%delta
  write(*,*)
  write(*,*)
  write(*,'("# ZERO:")')
  do i=1,sf%NS
    x  = sf%omg(i)
    rr = abs(1.0_DP-signfunc2(sf,x))
    write(*,'(3ES24.15)') sf%omg(i),rr
  enddo

  call delete(sf)

  stop
end program