00001 function dfdx_nth(no,x,f,v)
00002 use phys_constant, only : long
00003 implicit none
00004 integer, intent(in) :: no
00005 real(long), intent(in) :: v
00006 real(long), intent(in) :: x(no+1),f(no+1)
00007 real(long) :: dfdx_nth
00008 real(long) :: deno, nume, prodxv
00009 real(long) :: dx(0:no,0:no), xv(0:no), wex(0:no)
00010 integer :: ir(0:no), iset(no), comb(no-1)
00011 integer :: i,j,k
00012
00013 do i=0,no
00014 ir(i) = i+1
00015 end do
00016
00017 do i=0,no
00018 do j= i+1,no
00019 dx(i,j) = x(ir(i)) - x(ir(j))
00020 dx(j,i) =-dx(i,j)
00021 end do
00022 end do
00023
00024 do i=0,no
00025 xv(i) = v - x(ir(i))
00026 end do
00027
00028 do i=0,no
00029 deno = 1.0d0; k=1
00030 do j=0,no
00031 if (i.ne.j) then
00032 deno = deno*dx(i,j)
00033 iset(k)=j; k=k+1
00034 end if
00035 end do
00036 nume=0.0d0
00037 comb(1)=1
00038 call combinations(1,2,1)
00039
00040
00041
00042
00043 wex(i) = nume/deno
00044 end do
00045
00046 dfdx_nth =0.0d0
00047 do i=0,no
00048 dfdx_nth = dfdx_nth + wex(i)*f(ir(i))
00049 end do
00050
00051 contains
00052
00053 RECURSIVE subroutine combinations(is,ie,jj)
00054 integer, intent(in) :: is,ie
00055 integer :: ii,jj,m
00056 do ii=is,ie
00057 comb(jj)=ii
00058 if(jj.lt.(no-1)) call combinations(ii+1,ie+1,jj+1)
00059 if(jj.eq.(no-1)) then
00060
00061 prodxv=1.0d0
00062 do m=1,no-1
00063 prodxv = prodxv*xv(iset(comb(m)))
00064 end do
00065 nume = nume + prodxv
00066
00067 end if
00068 end do
00069 END subroutine combinations
00070 end function dfdx_nth
00071