c----------------------------------------------------------- program nbody c----------------------------------------------------------- c This program (adapted from deut.f) uses LSODA to c integrate the equations of motion for n particles c interacting gravitationally. The maximum number of c particles is set with nbdmax. c----------------------------------------------------------- c Assignments implicit none character*5 cdnm parameter (cdnm='nbody') integer iargc,indlnb,i4arg real*8 r8arg real*8 r8_never parameter (r8_never=-1.0d-60) integer nbdmax,neqmax parameter (nbdmax=5) parameter (neqmax=6*nbdmax) integer maxout parameter (maxout=10000) real*8 y0(neqmax) real*8 vtout(maxout),vyout(maxout,neqmax),work(maxout) real*8 tfin,tdel real*8 v1,v2,v3,v4,v5,v6,v7 real*8 x_com,y_com,z_com,E_tot real*8 KE_tot,PE_tot,P_tot,J_tot real*8 m_tot,xi,yi,zi,xv,yv,zv,xj,yj,zj,r2 real*8 x_mom,y_mom,z_mom real*8 x_ang,y_ang,z_ang real*8 m1,m2,m3,md,x1,x2,x3,xd,vd,rd,dd integer ir integer ntout,itout,ntout_succ integer nbd,ibd,jbd,neq,ieq,iof,jof logical ltrace,vtrace,errortrace,lsodatrace parameter (ltrace=.false.) parameter (vtrace=.false.) parameter (lsodatrace=.false.) character*32 argi c----------------------------------------------------------- c LSODA assignments external fcn,jac real*8 y(neqmax) real*8 tbgn,tend integer itol real*8 rtol,atol integer itask,istate,iopt integer lrw parameter (lrw=22+neqmax*16) real*8 rwork(lrw) integer liw parameter (liw=20+neqmax) integer iwork(liw) integer jt real*8 tol real*8 default_tol parameter (default_tol=1.0d-6) include 'fcn.inc' G = 1.0d0 c G = 6.672d-6 c----------------------------------------------------------- c Parse input (final t, delta t, optional tolerance,trace) if(iargc().lt.2) goto 99 tfin = r8arg(1,r8_never) tdel = r8arg(2,r8_never) tol = r8arg(3,default_tol) errortrace = .false. if(iargc().ge.3) call getarg(3,argi) if(argi.eq.'trace') errortrace = .true. if(iargc().ge.4) call getarg(4,argi) if(argi.eq.'trace') errortrace = .true. if(tfin.eq.r8_never.or.tdel.eq.r8_never) goto 99 if(ltrace) write(0,*) tfin,tdel,tol,errortrace if(vtrace) then v1 = sqrt(1.0d0*0.2d0/2.0d0**2) v2 = sqrt(9.0d0*1.8d0/2.0d0**2) c write(0,*) 'Two-body orbit @-.2,1.8 ',v1,v2 m1 = 9.0d0 m2 = 1.0d0 m3 = 0.001d0 md = m2 + m3 rd = tfin dd = tdel x1 = -md*rd/(m1+md) xd = x1 + rd v1 = -sqrt(-G*md*x1/rd**2) vd = +sqrt(+G*m1*xd/rd**2) x2 = m3*dd/md x3 = x2 - dd v2 = -sqrt(+G*m3*x2/dd**2) v3 = +sqrt(-G*m2*x3/dd**2) x2 = xd + x2 x3 = xd + x3 v2 = vd + v2 v3 = vd + v3 write(0,*) '9.000 ',x1,' 0 0 0 ',v1,' 0' write(0,*) '1.000 ',x2,' 0 0 0 ',v2,' 0' write(0,*) '0.001 ',x3,' 0 0 0 ',v3,' 0' endif c----------------------------------------------------------- c Determine integration time steps if(tdel.le.0.0d0.or.tdel.gt.tfin) then write(0,*) cdnm//': delta t range (0
', & '[ ]' write(0,*) ' ' write(0,*) ' Input read from standard input' stop end