def _external_force(x,t,pot): dim= len(x) if dim == 3: #x is rectangular so calculate R and phi R= nu.sqrt(x[0]**2.+x[1]**2.) phi= nu.arccos(x[0]/R) sinphi= x[1]/R cosphi= x[0]/R if x[1] < 0.: phi= 2.*nu.pi-phi #calculate forces Rforce= evaluateRforces(R,x[2],pot,phi=phi,t=t) phiforce= evaluatephiforces(R,x[2],pot,phi=phi,t=t) return nu.array([cosphi*Rforce-1./R*sinphi*phiforce, sinphi*Rforce+1./R*cosphi*phiforce, evaluatezforces(R,x[2],pot,phi=phi,t=t)]) elif dim == 2: #x is rectangular so calculate R and phi R= nu.sqrt(x[0]**2.+x[1]**2.) phi= nu.arccos(x[0]/R) sinphi= x[1]/R cosphi= x[0]/R if x[1] < 0.: phi= 2.*nu.pi-phi #calculate forces Rforce= evaluateplanarRforces(R,pot,phi=phi,t=t) phiforce= evaluateplanarphiforces(R,pot,phi=phi,t=t) return nu.array([cosphi*Rforce-1./R*sinphi*phiforce, sinphi*Rforce+1./R*cosphi*phiforce]) elif dim == 1: return evaluatelinearForces(x,pot,t=t)
def _rectForce(x,pot,t=0.): """ NAME: _rectForce PURPOSE: returns the force in the rectangular frame INPUT: x - current position t - current time pot - (list of) Potential instance(s) OUTPUT: force HISTORY: 2011-02-02 - Written - Bovy (NYU) """ #x is rectangular so calculate R and phi R= nu.sqrt(x[0]**2.+x[1]**2.) phi= nu.arccos(x[0]/R) sinphi= x[1]/R cosphi= x[0]/R if x[1] < 0.: phi= 2.*nu.pi-phi #calculate forces Rforce= evaluateplanarRforces(R,pot,phi=phi,t=t) phiforce= evaluateplanarphiforces(R,pot,phi=phi,t=t) return nu.array([cosphi*Rforce-1./R*sinphi*phiforce, sinphi*Rforce+1./R*cosphi*phiforce])
def _rectForce(x, pot, t=0.): """ NAME: _rectForce PURPOSE: returns the force in the rectangular frame INPUT: x - current position t - current time pot - (list of) Potential instance(s) OUTPUT: force HISTORY: 2011-02-02 - Written - Bovy (NYU) """ #x is rectangular so calculate R and phi R = nu.sqrt(x[0]**2. + x[1]**2.) phi = nu.arccos(x[0] / R) sinphi = x[1] / R cosphi = x[0] / R if x[1] < 0.: phi = 2. * nu.pi - phi #calculate forces Rforce = evaluateplanarRforces(R, pot, phi=phi, t=t) phiforce = evaluateplanarphiforces(R, pot, phi=phi, t=t) return nu.array([ cosphi * Rforce - 1. / R * sinphi * phiforce, sinphi * Rforce + 1. / R * cosphi * phiforce ])
def _EOM_dxdv(x,t,pot): """ NAME: _EOM_dxdv PURPOSE: implements the EOM, i.e., the right-hand side of the differential equation, for integrating phase space differences, rectangular INPUT: x - current phase-space position t - current time pot - (list of) Potential instance(s) OUTPUT: dy/dt HISTORY: 2011-10-18 - Written - Bovy (NYU) """ #x is rectangular so calculate R and phi R= nu.sqrt(x[0]**2.+x[1]**2.) phi= nu.arccos(x[0]/R) sinphi= x[1]/R cosphi= x[0]/R if x[1] < 0.: phi= 2.*nu.pi-phi #calculate forces Rforce= evaluateplanarRforces(R,pot,phi=phi,t=t) phiforce= evaluateplanarphiforces(R,pot,phi=phi,t=t) R2deriv= evaluateplanarPotentials(R,pot,phi=phi,t=t,dR=2) phi2deriv= evaluateplanarPotentials(R,pot,phi=phi,t=t,dphi=2) Rphideriv= evaluateplanarPotentials(R,pot,phi=phi,t=t,dR=1,dphi=1) #Calculate derivatives and derivatives+time derivatives dFxdx= -cosphi**2.*R2deriv\ +2.*cosphi*sinphi/R**2.*phiforce\ +sinphi**2./R*Rforce\ +2.*sinphi*cosphi/R*Rphideriv\ -sinphi**2./R**2.*phi2deriv dFxdy= -sinphi*cosphi*R2deriv\ +(sinphi**2.-cosphi**2.)/R**2.*phiforce\ -cosphi*sinphi/R*Rforce\ -(cosphi**2.-sinphi**2.)/R*Rphideriv\ +cosphi*sinphi/R**2.*phi2deriv dFydx= -cosphi*sinphi*R2deriv\ +(sinphi**2.-cosphi**2.)/R**2.*phiforce\ +(sinphi**2.-cosphi**2.)/R*Rphideriv\ -sinphi*cosphi/R*Rforce\ +sinphi*cosphi/R**2.*phi2deriv dFydy= -sinphi**2.*R2deriv\ -2.*sinphi*cosphi/R**2.*phiforce\ -2.*sinphi*cosphi/R*Rphideriv\ +cosphi**2./R*Rforce\ -cosphi**2./R**2.*phi2deriv return nu.array([x[2],x[3], cosphi*Rforce-1./R*sinphi*phiforce, sinphi*Rforce+1./R*cosphi*phiforce, x[6],x[7], dFxdx*x[4]+dFxdy*x[5], dFydx*x[4]+dFydy*x[5]])
def _EOM_dxdv(x, t, pot): """ NAME: _EOM_dxdv PURPOSE: implements the EOM, i.e., the right-hand side of the differential equation, for integrating phase space differences, rectangular INPUT: x - current phase-space position t - current time pot - (list of) Potential instance(s) OUTPUT: dy/dt HISTORY: 2011-10-18 - Written - Bovy (NYU) """ #x is rectangular so calculate R and phi R = nu.sqrt(x[0]**2. + x[1]**2.) phi = nu.arccos(x[0] / R) sinphi = x[1] / R cosphi = x[0] / R if x[1] < 0.: phi = 2. * nu.pi - phi #calculate forces Rforce = evaluateplanarRforces(R, pot, phi=phi, t=t) phiforce = evaluateplanarphiforces(R, pot, phi=phi, t=t) R2deriv = evaluateplanarPotentials(R, pot, phi=phi, t=t, dR=2) phi2deriv = evaluateplanarPotentials(R, pot, phi=phi, t=t, dphi=2) Rphideriv = evaluateplanarPotentials(R, pot, phi=phi, t=t, dR=1, dphi=1) #Calculate derivatives and derivatives+time derivatives dFxdx= -cosphi**2.*R2deriv\ +2.*cosphi*sinphi/R**2.*phiforce\ +sinphi**2./R*Rforce\ +2.*sinphi*cosphi/R*Rphideriv\ -sinphi**2./R**2.*phi2deriv dFxdy= -sinphi*cosphi*R2deriv\ +(sinphi**2.-cosphi**2.)/R**2.*phiforce\ -cosphi*sinphi/R*Rforce\ -(cosphi**2.-sinphi**2.)/R*Rphideriv\ +cosphi*sinphi/R**2.*phi2deriv dFydx= -cosphi*sinphi*R2deriv\ +(sinphi**2.-cosphi**2.)/R**2.*phiforce\ +(sinphi**2.-cosphi**2.)/R*Rphideriv\ -sinphi*cosphi/R*Rforce\ +sinphi*cosphi/R**2.*phi2deriv dFydy= -sinphi**2.*R2deriv\ -2.*sinphi*cosphi/R**2.*phiforce\ -2.*sinphi*cosphi/R*Rphideriv\ +cosphi**2./R*Rforce\ -cosphi**2./R**2.*phi2deriv return nu.array([ x[2], x[3], cosphi * Rforce - 1. / R * sinphi * phiforce, sinphi * Rforce + 1. / R * cosphi * phiforce, x[6], x[7], dFxdx * x[4] + dFxdy * x[5], dFydx * x[4] + dFydy * x[5] ])
def _EOM(y,t,pot): """ NAME: _EOM PURPOSE: implements the EOM, i.e., the right-hand side of the differential equation INPUT: y - current phase-space position t - current time pot - (list of) Potential instance(s) l2 - angular momentum squared OUTPUT: dy/dt HISTORY: 2010-07-20 - Written - Bovy (NYU) """ l2= (y[0]**2.*y[3])**2. return [y[1], l2/y[0]**3.+evaluateplanarRforces(y[0],pot,phi=y[2],t=t), y[3], 1./y[0]**2.*(evaluateplanarphiforces(y[0],pot,phi=y[2],t=t)- 2.*y[0]*y[1]*y[3])]
def _EOM(y, t, pot): """ NAME: _EOM PURPOSE: implements the EOM, i.e., the right-hand side of the differential equation INPUT: y - current phase-space position t - current time pot - (list of) Potential instance(s) l2 - angular momentum squared OUTPUT: dy/dt HISTORY: 2010-07-20 - Written - Bovy (NYU) """ l2 = (y[0]**2. * y[3])**2. return [ y[1], l2 / y[0]**3. + evaluateplanarRforces(y[0], pot, phi=y[2], t=t), y[3], 1. / y[0]**2. * (evaluateplanarphiforces(y[0], pot, phi=y[2], t=t) - 2. * y[0] * y[1] * y[3]) ]