def test_impulse_deltav_general_curved(): from galpy.df import impulse_deltav_plummer_curvedstream, \ impulse_deltav_general_curvedstream from galpy.potential import PlummerPotential tol= -10. kick= impulse_deltav_plummer_curvedstream(\ numpy.array([[3.4,0.,0.]]), numpy.array([[4.,0.,0.]]), 3., numpy.array([0.,numpy.pi/2.,0.]), numpy.array([0.,0.,0.]), numpy.array([3.4,0.,0.]), 1.5,4.) pp= PlummerPotential(amp=1.5,b=4.) general_kick= impulse_deltav_general_curvedstream(\ numpy.array([[3.4,0.,0.]]), numpy.array([[4.,0.,0.]]), 3., numpy.array([0.,numpy.pi/2.,0.]), numpy.array([0.,0.,0.]), numpy.array([3.4,0.,0.]), pp) assert numpy.all(numpy.fabs(kick-general_kick) < 10.**tol), 'general kick calculation does not agree with Plummer calculation for a Plummer potential, for curved stream' # Same for a bunch of positions v= numpy.zeros((100,3)) v[:,0]= 3.4 xpos= numpy.random.normal(size=100) xpos= numpy.array([xpos,numpy.zeros(100),numpy.zeros(100)]).T kick= impulse_deltav_plummer_curvedstream(\ v, xpos, 3., numpy.array([0.,numpy.pi/2.,0.]), numpy.array([0.,0.,0.]), numpy.array([3.4,0.,0.]), numpy.pi,numpy.exp(1.)) pp= PlummerPotential(amp=numpy.pi,b=numpy.exp(1.)) general_kick=\ impulse_deltav_general_curvedstream(\ v, xpos, 3., numpy.array([0.,numpy.pi/2.,0.]), numpy.array([0.,0.,0.]), numpy.array([3.4,0.,0.]), pp) assert numpy.all(numpy.fabs(kick-general_kick) < 10.**tol), 'general kick calculation does not agree with Plummer calculation for a Plummer potential, for curved stream' return None
def test_impulse_deltav_plummerstream_curved_subhalo_perpendicular(): from galpy.util import conversion from galpy.potential import LogarithmicHaloPotential from galpy.df import impulse_deltav_plummer_curvedstream, \ impulse_deltav_plummerstream_curvedstream R0, V0= 8., 220. lp= LogarithmicHaloPotential(normalize=1.,q=0.9) tol= -5. GM= 10.**-2./conversion.mass_in_1010msol(V0,R0) rs= 0.625/R0 dt= 0.01*rs/(numpy.pi/4.) kick= impulse_deltav_plummer_curvedstream(\ numpy.array([[.5,0.1,0.2]]), numpy.array([[1.2,0.,0.]]), rs, numpy.array([0.1,numpy.pi/4.,0.1]), numpy.array([1.2,0.,0.]), numpy.array([.5,0.1,0.2]), GM,rs) stream_kick= impulse_deltav_plummerstream_curvedstream(\ numpy.array([[.5,0.1,0.2]]), numpy.array([[1.2,0.,0.]]), numpy.array([0.]), rs, numpy.array([0.1,numpy.pi/4.,0.1]), numpy.array([1.2,0.,0.]), numpy.array([.5,0.1,0.2]), lambda t: GM/dt,rs,lp,-dt/2.,dt/2.) # Should be equal assert numpy.all(numpy.fabs((kick-stream_kick)/kick) < 10.**tol), 'Curved, short Plummer-stream kick does not agree with curved Plummer-sphere kick by %g' % (numpy.amax(numpy.fabs((kick-stream_kick)/kick))) return None
def test_impulse_deltav_general_fullintegration_zeroforce(): from galpy.df import impulse_deltav_plummer_curvedstream, \ impulse_deltav_general_fullplummerintegration tol= -3. rcurv=10. vp=220. GM=1.5 rs=4. x0 = numpy.array([rcurv,0.,0.]) v0 = numpy.array([0.,vp,0.]) w = numpy.array([1.,numpy.pi/4.*vp,0.]) plummer_kick= impulse_deltav_plummer_curvedstream(\ v0,x0,3.,w,x0,v0,GM,rs) galpot = constantPotential() orbit_kick= impulse_deltav_general_fullplummerintegration(\ v0,x0,3.,w,x0,v0,galpot,GM,rs,tmaxfac=100.,N=1000) nzeroIndx= numpy.fabs(plummer_kick) > 10.**tol assert numpy.all(numpy.fabs((orbit_kick-plummer_kick)/plummer_kick)[nzeroIndx] < 10.**tol), \ 'general kick with acceleration calculation does not agree with Plummer calculation for a Plummer potential, for straight' assert numpy.all(numpy.fabs(orbit_kick-plummer_kick)[True-nzeroIndx] < 10.**tol), \ 'general kick with acceleration calculation does not agree with Plummer calculation for a Plummer potential, for straight' # Same for a bunch of positions tol= -2.5 GM=numpy.pi rs=numpy.exp(1.) theta = numpy.linspace(-numpy.pi/4.,numpy.pi/4.,10) xc,yc = rcurv*numpy.cos(theta),rcurv*numpy.sin(theta) Xc = numpy.zeros((10,3)) Xc[:,0]=xc Xc[:,1]=yc vx,vy = -vp*numpy.sin(theta),vp*numpy.cos(theta) V = numpy.zeros((10,3)) V[:,0]=vx V[:,1]=vy plummer_kick= impulse_deltav_plummer_curvedstream(\ V,Xc,3.,w,x0,v0,GM,rs) orbit_kick= impulse_deltav_general_fullplummerintegration(\ V,Xc,3.,w,x0,v0,galpot,GM,rs,tmaxfac=100.) nzeroIndx= numpy.fabs(plummer_kick) > 10.**tol assert numpy.all(numpy.fabs((orbit_kick-plummer_kick)/plummer_kick)[nzeroIndx] < 10.**tol), \ 'full stream+halo integration calculation does not agree with Plummer calculation for a Plummer potential, for curved stream' assert numpy.all(numpy.fabs(orbit_kick-plummer_kick)[True-nzeroIndx] < 10.**tol), \ 'full stream+halo integration calculation does not agree with Plummer calculation for a Plummer potential, for curved stream' return None
def test_impulse_deltav_general_fullintegration_zeroforce(): from galpy.df import impulse_deltav_plummer_curvedstream, \ impulse_deltav_general_fullplummerintegration tol= -3. rcurv=10. vp=220. GM=1.5 rs=4. x0 = numpy.array([rcurv,0.,0.]) v0 = numpy.array([0.,vp,0.]) w = numpy.array([1.,numpy.pi/4.*vp,0.]) plummer_kick= impulse_deltav_plummer_curvedstream(\ v0,x0,3.,w,x0,v0,GM,rs) galpot = constantPotential() orbit_kick= impulse_deltav_general_fullplummerintegration(\ v0,x0,3.,w,x0,v0,galpot,GM,rs,tmaxfac=100.,N=1000) nzeroIndx= numpy.fabs(plummer_kick) > 10.**tol assert numpy.all(numpy.fabs((orbit_kick-plummer_kick)/plummer_kick)[nzeroIndx] < 10.**tol), \ 'general kick with acceleration calculation does not agree with Plummer calculation for a Plummer potential, for straight' assert numpy.all(numpy.fabs(orbit_kick-plummer_kick)[True^nzeroIndx] < 10.**tol), \ 'general kick with acceleration calculation does not agree with Plummer calculation for a Plummer potential, for straight' # Same for a bunch of positions tol= -2.5 GM=numpy.pi rs=numpy.exp(1.) theta = numpy.linspace(-numpy.pi/4.,numpy.pi/4.,10) xc,yc = rcurv*numpy.cos(theta),rcurv*numpy.sin(theta) Xc = numpy.zeros((10,3)) Xc[:,0]=xc Xc[:,1]=yc vx,vy = -vp*numpy.sin(theta),vp*numpy.cos(theta) V = numpy.zeros((10,3)) V[:,0]=vx V[:,1]=vy plummer_kick= impulse_deltav_plummer_curvedstream(\ V,Xc,3.,w,x0,v0,GM,rs) orbit_kick= impulse_deltav_general_fullplummerintegration(\ V,Xc,3.,w,x0,v0,galpot,GM,rs,tmaxfac=100.) nzeroIndx= numpy.fabs(plummer_kick) > 10.**tol assert numpy.all(numpy.fabs((orbit_kick-plummer_kick)/plummer_kick)[nzeroIndx] < 10.**tol), \ 'full stream+halo integration calculation does not agree with Plummer calculation for a Plummer potential, for curved stream' assert numpy.all(numpy.fabs(orbit_kick-plummer_kick)[True^nzeroIndx] < 10.**tol), \ 'full stream+halo integration calculation does not agree with Plummer calculation for a Plummer potential, for curved stream' return None
def test_impulse_deltav_general_orbit_zeroforce(): from galpy.df import impulse_deltav_plummer_curvedstream, \ impulse_deltav_general_orbitintegration from galpy.potential import PlummerPotential tol= -6. rcurv=10. vp=220. x0 = numpy.array([rcurv,0.,0.]) v0 = numpy.array([0.,vp,0.]) w = numpy.array([1.,numpy.pi/2.,0.]) plummer_kick= impulse_deltav_plummer_curvedstream(\ v0,x0,3.,w,x0,v0,1.5,4.) pp= PlummerPotential(amp=1.5,b=4.) vang=vp/rcurv angrange=numpy.pi maxt=5.*angrange/vang galpot = constantPotential() orbit_kick= impulse_deltav_general_orbitintegration(\ v0,x0,3.,w,x0,v0,pp,maxt,galpot) assert numpy.all(numpy.fabs(orbit_kick-plummer_kick) < 10.**tol), \ 'general kick with acceleration calculation does not agree with Plummer calculation for a Plummer potential, for straight' # Same for a bunch of positions tol= -5. pp= PlummerPotential(amp=numpy.pi,b=numpy.exp(1.)) theta = numpy.linspace(-numpy.pi/4.,numpy.pi/4.,100) xc,yc = rcurv*numpy.cos(theta),rcurv*numpy.sin(theta) Xc = numpy.zeros((100,3)) Xc[:,0]=xc Xc[:,1]=yc vx,vy = -vp*numpy.sin(theta),vp*numpy.cos(theta) V = numpy.zeros((100,3)) V[:,0]=vx V[:,1]=vy plummer_kick= impulse_deltav_plummer_curvedstream(\ V,Xc,3.,w,x0,v0,numpy.pi,numpy.exp(1.)) orbit_kick= impulse_deltav_general_orbitintegration(\ V,Xc,3.,w,x0,v0,pp, maxt, galpot) assert numpy.all(numpy.fabs(orbit_kick-plummer_kick) < 10.**tol), \ 'general kick calculation does not agree with Plummer calculation for a Plummer potential, for curved stream' return None
def test_impulse_deltav_plummer_curved_subhalo_perpendicular(): from galpy.df import impulse_deltav_plummer, \ impulse_deltav_plummer_curvedstream tol= -10. kick= impulse_deltav_plummer(numpy.array([[3.4,0.,0.]]), numpy.array([4.]), 3., numpy.array([0.,numpy.pi/2.,0.]), 1.5,4.) curved_kick= impulse_deltav_plummer_curvedstream(\ numpy.array([[3.4,0.,0.]]), numpy.array([[4.,0.,0.]]), 3., numpy.array([0.,numpy.pi/2.,0.]), numpy.array([0.,0.,0.]), numpy.array([3.4,0.,0.]), 1.5,4.) # Should be equal assert numpy.all(numpy.fabs(kick-curved_kick) < 10.**tol), 'curved Plummer kick does not agree with straight kick for straight track' # Same for a bunch of positions v= numpy.zeros((100,3)) v[:,0]= 3.4 xpos= numpy.random.normal(size=100) kick= impulse_deltav_plummer(v, xpos, 3., numpy.array([0.,numpy.pi/2.,0.]), 1.5,4.) xpos= numpy.array([xpos,numpy.zeros(100),numpy.zeros(100)]).T curved_kick= impulse_deltav_plummer_curvedstream(\ v, xpos, 3., numpy.array([0.,numpy.pi/2.,0.]), numpy.array([0.,0.,0.]), numpy.array([3.4,0.,0.]), 1.5,4.) # Should be equal assert numpy.all(numpy.fabs(kick-curved_kick) < 10.**tol), 'curved Plummer kick does not agree with straight kick for straight track' return None