!----------------------------------------------------------------------- ! PSCF - Polymer Self-Consistent Field Theory ! Copyright (2002-2016) Regents of the University of Minnesota ! contact: David Morse, morse012@umn.edu ! ! This program is free software; you can redistribute it and/or modify ! it under the terms of the GNU General Public License as published by ! the Free Software Foundation. A copy of this license is included in ! the LICENSE file in the top-level PSCF directory. !----------------------------------------------------------------------
! PURPOSE ! Richardson extrapolation - extrapolate to ds = 0 ! SOURCE !---------------------------------------------------------------------- module extrapolate_mod use const_mod implicit none private public :: extrapolate_real public :: extrapolate_complex !*** contains !-----------------------------------------------------------------
! SUBROUTINE ! extrapolate_real(order,xarray,yarray,extrap_yvalue) ! PURPOSE ! Calculate the extrapolated value of a real array ! ARGUMENTS ! integer order - order of extrapolation ! real xarray - the array of x ! real yarray - the array of y that depends on x ! real extrap_value - the y value extrapolated to x = 0 case ! SOURCE !----------------------------------------------------------------- subroutine extrapolate_real(order,xarray,yarray,extrap_yvalue) integer,intent(IN) :: order real(long),intent(IN) :: xarray(order+1) real(long),intent(IN) :: yarray(order+1) real(long),intent(out) :: extrap_yvalue !*** integer :: i integer :: j real(long) :: num real(long) :: den real(long) :: a !---------------------------------------------------------- ! Using Lagrange's formula for an nth order polynomial that ! passes through n points, for extrapolation !---------------------------------------------------------- ! extrap_yvalue = 0.0_long ! do i = 1,order+1 ! num = yarray(i) ! a = xarray(i) ! den = 1.0_long ! do j = 1,order+1 ! if (j /= i) then ! num = num*xarray(j) * (-1.0_long) ! den = den *(a-xarray(j)) ! end if ! end do ! extrap_yvalue = extrap_yvalue + (num/den) ! end do !---------------------------------------------------------- if (order == 1) then extrap_yvalue = 4.0_long*yarray(2)-yarray(1) extrap_yvalue = extrap_yvalue/3.0_long end if if (order == 2) then ! extrap_yvalue = -6*yarray(1) ! extrap_yvalue = extrap_yvalue + 80.0_long*yarray(2) ! extrap_yvalue = extrap_yvalue + 256.0_long*yarray(3) ! extrap_yvalue = extrap_yvalue/330.0_long extrap_yvalue = 64.0_long*yarray(3) extrap_yvalue = extrap_yvalue - 20.0_long*yarray(2) extrap_yvalue = extrap_yvalue + yarray(1) extrap_yvalue = extrap_yvalue/45.0_long end if end subroutine extrapolate_real !-----------------------------------------------------------------
! SUBROUTINE ! extrapolate_complex(order,xarray,yarray,extrap_yvalue) ! PURPOSE ! Calculate the extrapolated value of a complex array ! ARGUMENTS ! integer order - order of extrapolation ! complex xarray - the array of x ! complex yarray - the array of y that depends on x ! complex extrap_value - the y value extrapolated to x = 0 case ! SOURCE !----------------------------------------------------------------- subroutine extrapolate_complex(order,xarray,yarray,extrap_yvalue) integer,intent(IN) :: order real(long),intent(IN) :: xarray(order+1) complex(long),intent(IN) :: yarray(order+1) complex(long),intent(out) :: extrap_yvalue !*** integer :: i integer :: j complex(long) :: num complex(long) :: den real(long) :: a !---------------------------------------------------------- ! Using Lagrange's formula for an nth order polynomial that ! passes through n points, for extrapolation !---------------------------------------------------------- ! extrap_yvalue = (0.0_long,0.0_long) ! do i = 1,order+1 ! num = yarray(i) ! a = xarray(i) ! den = 1.0_long ! do j = 1,order+1 ! if (j /= i) then ! num = num*xarray(j) * (-1.0_long) ! den = den *(a-xarray(j)) ! end if ! end do ! extrap_yvalue = extrap_yvalue + (num/den) ! end do !---------------------------------------------------------- if (order == 1) then extrap_yvalue = 4.0_long*yarray(2)-yarray(1) extrap_yvalue = extrap_yvalue/3.0_long end if if (order == 2) then ! extrap_yvalue = -6*yarray(1) ! extrap_yvalue = extrap_yvalue + 80.0_long*yarray(2) ! extrap_yvalue = extrap_yvalue + 256.0_long*yarray(3) ! extrap_yvalue = extrap_yvalue/330.0_long extrap_yvalue = 64.0_long*yarray(3) extrap_yvalue = extrap_yvalue - 20.0_long*yarray(2) extrap_yvalue = extrap_yvalue + yarray(1) extrap_yvalue = extrap_yvalue/45.0_long end if end subroutine extrapolate_complex !=================================================================== end module extrapolate_mod