SUBROUTINE gauher(x,w) USE nrtype; USE nrutil, ONLY : arth,assert_eq,nrerror IMPLICIT NONE REAL(SP), DIMENSION(:), INTENT(OUT) :: x,w REAL(DP), PARAMETER :: EPS=3.0e-13_dp,PIM4=0.7511255444649425_dp INTEGER(I4B) :: its,j,m,n INTEGER(I4B), PARAMETER :: MAXIT=10 REAL(SP) :: anu REAL(SP), PARAMETER :: C1=9.084064e-01_sp,C2=5.214976e-02_sp,& C3=2.579930e-03_sp,C4=3.986126e-03_sp REAL(SP), DIMENSION((size(x)+1)/2) :: rhs,r2,r3,theta REAL(DP), DIMENSION((size(x)+1)/2) :: p1,p2,p3,pp,z,z1 LOGICAL(LGT), DIMENSION((size(x)+1)/2) :: unfinished n=assert_eq(size(x),size(w),'gauher') m=(n+1)/2 anu=2.0_sp*n+1.0_sp rhs=arth(3,4,m)*PI/anu r3=rhs**(1.0_sp/3.0_sp) r2=r3**2 theta=r3*(C1+r2*(C2+r2*(C3+r2*C4))) z=sqrt(anu)*cos(theta) unfinished=.true. do its=1,MAXIT where (unfinished) p1=PIM4 p2=0.0 end where do j=1,n where (unfinished) p3=p2 p2=p1 p1=z*sqrt(2.0_dp/j)*p2-sqrt(real(j-1,dp)/real(j,dp))*p3 end where end do where (unfinished) pp=sqrt(2.0_dp*n)*p2 z1=z z=z1-p1/pp unfinished=(abs(z-z1) > EPS) end where if (.not. any(unfinished)) exit end do if (its == MAXIT+1) call nrerror('too many iterations in gauher') x(1:m)=z x(n:n-m+1:-1)=-z w(1:m)=2.0_dp/pp**2 w(n:n-m+1:-1)=w(1:m) END SUBROUTINE gauher