Hi. I'm having troubles with my code. I'm using Numerical Recipes subroutines in my program but at the time of execute the program, I have the following error:
SALFORD RUN-TIME LIBRARY Stack overflow: Re-link with bigger stack value Stack:reserve.commit .will attempt to trace back
I haven't find the error in the code, I don't know if you can help me. Thanks Here's the code:
PROGRAM Bulirsch_Stoer
Use NRTYPE
INTERFACE
subroutine bsstep(y,dydx,x,htry,eps,yscal,hdid,hnext,derivs)
use nrtype
real(sp),dimension(:),intent(inout)::y
real(sp),dimension(:),intent(in)::dydx,yscal
real(sp),intent(inout)::x
real(sp),intent(in)::htry,eps
real(sp),intent(out)::hdid,hnext
end subroutine bsstep
END INTERFACE
PARAMETER(N=4)
real,dimension(n)::y,dydx,yscal
X=1.0
Y(1)=bessj0_s(x)
Y(2)=bessj1_s(x)
Y(3)=bessj_s(2,x)
Y(4)=bessj_s(3,x)
DYDX(1)=-Y(2)
DYDX(2)=Y(1)-Y(2)
DYDX(3)=Y(2)-2.0Y(3)
DYDX(4)=Y(3)-3.0Y(4)
DO I=1,4
YSCAL(I)=1.0
CONTINUE
HTRY=1.0
WRITE(,'(/1X,T8,A,T19,A,T31,A,T43,A/)')
END DO
DO I=1,15
EPS=EXP(-FLOAT(I))
CALL bsstep(y,dydx,x,htry,eps,yscal,hdid,hnext,derivs)
WRITE(,'(2X,E12.4,F8.2,2X,2F12.6)') EPS,HTRY,HDID,HNEXT
CONTINUE
ENDDO
END PROGRAM Bulirsch_Stoer
SUBROUTINE DERIVS(X,Y,DYDX)
PARAMETER(N=4)
real,dimension(n)::y,dydx
DYDX(1)=-Y(2)
DYDX(2)=Y(1)-(1.0/X)Y(2)
DYDX(3)=Y(2)-(2.0/X)Y(3)
DYDX(4)=Y(3)-(3.0/X)Y(4)
End subroutine derivs
subroutine BSSTEP(y,dydx,x,htry,eps,yscal,hdid,hnext,derivs)
use NRTYPE;use nrutil,only:arth,assert_eq,cumsum,iminloc,nrerror,&
outerdiff,outerprod,upper_triangle
use NR,only:mmid,pzextr
implicit none
real(sp),dimension(:),intent(inout)::y
real(sp),dimension(:),intent(in)::dydx,yscal
real(sp),intent(inout)::x
real(sp),intent(in)::htry,eps
real(sp),intent(out)::hdid,hnext
interface
SUBROUTINE derivs(x,y,dydx)
use NRTYPE
implicit none
real(sp),intent(in)x
real(sp),dimension(:),intent(in)y
real(sp),dimension(:),intent(out)dydx
end subroutine derivs
end interface
integer(I4B),parameterimax=9,kmaxx=imax-1
real(sp),parametersafe1=0.25_sp,safe2=0.7_sp,redmax=1.0e-5_sp,&
redmin=0.7_sp,tiny=1.0e-30_sp,scalmx=0.1_sp
integer(I4B)k,km,iq,ndum
integer(I4B),dimension(imax)nseq=(/2,4,6,8,10,12,14,16,18/)
integer(I4B),savekopt,kmax
real(sp),dimension(kmaxx,kmaxx),savealf
real(sp),dimension(kmaxx)err
real(sp),dimension(imax),savea
real(sp),saveepsold=-1.0_sp,xnew
real(sp)::eps1,errmax,fact,h,red,scale,wrkmin,xest
real(sp),dimension(size(y))::yerr,ysav,yseq
logical(LGT)reduct
logical(LGT),savefirst=.true.
ndum = assert_eq(size(y),size(dydx),size(dydx),size(yscal),'bsstep')
if(eps/=epsold) then
hnext=-1.0e29_sp
xnew=-1.0e29_sp
eps1=safe1eps
a(:)=cumsum(nseq,1)
do iq=2,KMAXX
a(k+1)=a(k)+nseq(k+1)
end do
do iq=2,KMAXX
do k=1,iq-1
alf(k,iq)=eps1((a(k+1)-a(iq-1))/&
((a(iq+1)-a(1)+1.0_sp)(2k+1)))
enddo
enddo
epsold=eps
do kopt=2,kmaxx-1
if(a(kopt+1)>a(kopt)alf(kopt-1,kopt)) exit
end do
kmax=kopt
end if
h=htry
ysav(:)=y(:)
if(h/=hnext .or. x/=xnew) then
first=.true.
kopt=kmax
end if
reduct=.false.
main_loop: do
do k=1,kmax
xnew=x+h
if(xnew==x)call nrerror('step size underflow in bsstep')
call mmid(ysav,dydx,x,h,nseq(k),yseq,derivs)
xest=(h/nseq(k))2
call pzextr(k,xest,yseq,y,yerr)
if(k/=1)then
errmax=maxval(abs(yerr(:)/yscal(:)))
errmax=max(tiny,errmax)/eps
km=k-1
err(km)=(errmax/safe1)(1.0_sp/(2km+1))
end if
if(k/=1.and.(k>=kopt-1.or.first))then
if(errmax<1.0)exit main_loop
if(k == kmax .or. k == kopt+1) then
red=safe2/err(km)
exit
else if(kkopt)then
if(alf(kopt-1,kopt)<err(km))then
red=1.0_sp/err(km)
exit
end if
else if(koptkmax)then
if(alf(km,kmax-1)<err(km))then
red=alf(km,kmax-1)safe2/err(km)
exit
end if
else if(alf(km,kopt)<err(km))then
red=alf(km,kopt-1)/err(km)
exit
end if
end if
end do
red=max(min(red,redmin),redmax)
h=hred
reduct=.true.
end do main_loop
x=xnew
hdid=h
first=.false.
kopt=1+iminloc(a(2:km+1)max(err(1:km),scalmx))
scale=max(err(kopt-1),scalmx)
wrkmin=scalea(kopt)
hnext=h/scale
if(kopt>=k.and.kopt/=kmax.and..not.reduct)then
fact=max(scale/alf(kopt-1,kopt),scalmx)
if(a(kopt+1)fact<=wrkmin)then
hnext=h/fact
kopt=kopt+1
end if
end if
END SUBROUTINE bsstep
SUBROUTINE mmid(y,dydx,xs,htot,nstep,yout,derivs)
USE nrtype; USE nrutil, ONLY: assert_eq3,swap
IMPLICIT NONE
INTEGER(I4B),INTENT(IN)::nstep
REAL(SP),INTENT(IN)::xs,htot
REAL(SP),DIMENSION(:),INTENT(IN)::y,dydx
REAL(SP),DIMENSION(:),INTENT(OUT)::yout
INTERFACE
SUBROUTINE derivs(x,y,dydx)
USE nrtype
IMPLICIT NONE
REAL(SP),INTENT(IN)::x
REAL(SP),DIMENSION(:),INTENT(IN)::y
REAL(SP),DIMENSION(:),INTENT(OUT)::dydx
END SUBROUTINE derivs
END INTERFACE
INTEGER(I4B)::n,ndum
REAL(SP)::h,h2,x
REAL(SP),DIMENSION(size(y))::ym,yn
ndum=assert_eq3(size(y),size(dydx),size(yout),'mmid')
h=htot/nstep
ym=y
yn=y+hdydx
x=xs+h
call derivs(x,yn,yout)
h2=2.0_sph
do n=2,nstep
call swap(ym,yn)
yn=yn+h2yout
x=x+h
call derivs(x,yn,yout)
enddo
yout=0.5_sp*(ym+yn+hyout)
END SUBROUTINE mmid
SUBROUTINE pzextr(iest,xest,yest,yz,dy)
USE nrtype; USE nrutil, ONLY : assert_eq,nrerror
IMPLICIT NONE
INTEGER(I4B),INTENT(IN)::iest
REAL(SP),INTENT(IN)::xest
REAL(SP),DIMENSION(:),INTENT(IN)::yest
REAL(SP),DIMENSION(:),INTENT(OUT)yz,dy
INTEGER(I4B),PARAMETERIEST_MAX=16
INTEGER(I4B)j,nv
INTEGER(I4B),SAVEnvold=-1
REAL(SP)delta,f1,f2
REAL(SP),DIMENSION(size(yz))d,tmp,q
REAL(SP),DIMENSION(IEST_MAX),SAVEx
REAL(SP),DIMENSION(:,:),ALLOCATABLE,SAVEqcol
nv=assert_eq(size(yz),size(yest),size(dy),'pzextr')
if (iest>IEST_MAX) call &
nrerror('pzextr:probable misuse, too much extrapolation')
if (nv/=nvold) then
if (allocated(qcol))deallocate(qcol)
allocate(qcol(nv,IEST_MAX))
nvold=nv
end if
x(iest)=xest
dy(:)=yest(:)
yz(:)=yest(:)
if (iest==1) then
qcol(:,1)=yest(:)
else
d(:)=yest(:)
do j=1,iest-1
delta=1.0_sp/(x(iest-j)-xest)
f1=xestdelta
f2=x(iest-j)delta
q(:)=qcol(:,j)
qcol(:,j)=dy(:)
tmp(:)=d(:)-q(:)
dy(:)=f1tmp(:)
d(:)=f2*tmp(:)
yz(:)=yz(:)+dy(:)
end do
qcol(:,iest)=dy(:)
end if
END SUBROUTINE pzextr