41 lines
968 B
Fortran
41 lines
968 B
Fortran
SUBROUTINE zroots(a,m,roots,polish)
|
|
INTEGER m,MAXM
|
|
REAL EPS
|
|
COMPLEX a(m+1),roots(m)
|
|
LOGICAL polish
|
|
PARAMETER (EPS=1.e-6,MAXM=101)
|
|
CU USES laguer
|
|
INTEGER i,j,jj,its
|
|
COMPLEX ad(MAXM),x,b,c
|
|
do 11 j=1,m+1
|
|
ad(j)=a(j)
|
|
11 continue
|
|
do 13 j=m,1,-1
|
|
x=cmplx(0.,0.)
|
|
call laguer(ad,j,x,its)
|
|
if(abs(aimag(x)).le.2.*EPS**2*abs(real(x))) x=cmplx(real(x),0.)
|
|
roots(j)=x
|
|
b=ad(j+1)
|
|
do 12 jj=j,1,-1
|
|
c=ad(jj)
|
|
ad(jj)=b
|
|
b=x*b+c
|
|
12 continue
|
|
13 continue
|
|
if (polish) then
|
|
do 14 j=1,m
|
|
call laguer(a,m,roots(j),its)
|
|
14 continue
|
|
endif
|
|
do 16 j=2,m
|
|
x=roots(j)
|
|
do 15 i=j-1,1,-1
|
|
if(real(roots(i)).le.real(x))goto 10
|
|
roots(i+1)=roots(i)
|
|
15 continue
|
|
i=0
|
|
10 roots(i+1)=x
|
|
16 continue
|
|
return
|
|
END
|