67 lines
1.6 KiB
Fortran
67 lines
1.6 KiB
Fortran
PROGRAM sphoot
|
|
INTEGER i,m,n,nvar,N2
|
|
PARAMETER (N2=1)
|
|
REAL c2,dx,gamma,q1,x1,x2,v(N2)
|
|
LOGICAL check
|
|
COMMON /sphcom/ c2,gamma,dx,m,n
|
|
COMMON /caller/ x1,x2,nvar
|
|
CU USES newt
|
|
dx=1.e-4
|
|
nvar=3
|
|
1 write(*,*) 'input m,n,c-squared (999 to end)'
|
|
read(*,*) m,n,c2
|
|
if (c2.eq.999.) stop
|
|
if ((n.lt.m).or.(m.lt.0)) goto 1
|
|
gamma=1.0
|
|
q1=n
|
|
do 11 i=1,m
|
|
gamma=-0.5*gamma*(n+i)*(q1/i)
|
|
q1=q1-1.0
|
|
11 continue
|
|
v(1)=n*(n+1)-m*(m+1)+c2/2.0
|
|
x1=-1.0+dx
|
|
x2=0.0
|
|
call newt(v,N2,check)
|
|
if(check)then
|
|
write(*,*)'shoot failed; bad initial guess'
|
|
else
|
|
write(*,'(1x,t6,a)') 'mu(m,n)'
|
|
write(*,'(1x,f12.6)') v(1)
|
|
goto 1
|
|
endif
|
|
END
|
|
SUBROUTINE load(x1,v,y)
|
|
INTEGER m,n
|
|
REAL c2,dx,gamma,x1,y1,v(1),y(3)
|
|
COMMON /sphcom/ c2,gamma,dx,m,n
|
|
y(3)=v(1)
|
|
if(mod(n-m,2).eq.0)then
|
|
y1=gamma
|
|
else
|
|
y1=-gamma
|
|
endif
|
|
y(2)=-(y(3)-c2)*y1/(2*(m+1))
|
|
y(1)=y1+y(2)*dx
|
|
return
|
|
END
|
|
SUBROUTINE score(x2,y,f)
|
|
INTEGER m,n
|
|
REAL c2,dx,gamma,x2,f(1),y(3)
|
|
COMMON /sphcom/ c2,gamma,dx,m,n
|
|
if (mod(n-m,2).eq.0) then
|
|
f(1)=y(2)
|
|
else
|
|
f(1)=y(1)
|
|
endif
|
|
return
|
|
END
|
|
SUBROUTINE derivs(x,y,dydx)
|
|
INTEGER m,n
|
|
REAL c2,dx,gamma,x,dydx(3),y(3)
|
|
COMMON /sphcom/ c2,gamma,dx,m,n
|
|
dydx(1)=y(2)
|
|
dydx(2)=(2.0*x*(m+1.0)*y(2)-(y(3)-c2*x*x)*y(1))/(1.0-x*x)
|
|
dydx(3)=0.0
|
|
return
|
|
END
|