def _Rzderiv(self, R, z, phi=0., t=0.): """ NAME: _Rzderiv PURPOSE: evaluate the mixed R,z derivative for this potential INPUT: R - Galactocentric cylindrical radius z - vertical height phi - azimuth t- time OUTPUT: d2phi/dR/dz HISTORY: 2015-02-13 - Written - Trick (MPIA) """ l, n = bovy_coords.Rz_to_lambdanu(R, z, ac=self._ac, Delta=self._Delta) jac = bovy_coords.Rz_to_lambdanu_jac(R, z, Delta=self._Delta) hess = bovy_coords.Rz_to_lambdanu_hess(R, z, Delta=self._Delta) dldR = jac[0, 0] dndR = jac[1, 0] dldz = jac[0, 1] dndz = jac[1, 1] d2ldRdz = hess[0, 0, 1] d2ndRdz = hess[1, 0, 1] return d2ldRdz * self._lderiv(l,n) + \ d2ndRdz * self._nderiv(l,n) + \ dldR*dldz * self._l2deriv(l,n) + \ dndR*dndz * self._n2deriv(l,n) + \ (dldR*dndz+dldz*dndR)* self._lnderiv(l,n)
def test_Rz_to_lambdanu_r2lt0(): # Special case that leads to r2 just below zero #coordinate system: a = 3. g = 7. Delta = numpy.sqrt(g - a) ac = numpy.sqrt(a / g) #_____test float input (R=0)_____ #true values: l, n = 2., -3. + 10.**-10. #coordinate transformation: lt, nt = bovy_coords.Rz_to_lambdanu(*bovy_coords.lambdanu_to_Rz( l, n, ac=ac, Delta=Delta), ac=ac, Delta=Delta) #test: assert numpy.fabs( lt - l) < 10.**-8., 'Rz_to_lambdanu conversion did not work as expected (l)' assert numpy.fabs( nt - n) < 10.**-8., 'Rz_to_lambdanu conversion did not work as expected (n)' #___Also test for arrays___ l = numpy.array([2., 10., 20., 0.]) n = numpy.array([-7., -3. + 10.**-10., -5., -5.]) lt, nt = bovy_coords.Rz_to_lambdanu(*bovy_coords.lambdanu_to_Rz( l, n, ac=ac, Delta=Delta), ac=ac, Delta=Delta) assert numpy.all( numpy.fabs(lt - l) < 10.**-8. ), 'Rz_to_lambdanu conversion did not work as expected (l array)' assert numpy.all( numpy.fabs(nt - n) < 10.**-8. ), 'Rz_to_lambdanu conversion did not work as expected (n array)' return None
def _evaluate(self, R, z, phi=0., t=0.): """ NAME: _evaluate PURPOSE: evaluate the potential at R,z INPUT: R - Galactocentric cylindrical radius z - vertical height phi - azimuth t - time OUTPUT: Phi(R,z) HISTORY: 2015-02-15 - Written - Trick (MPIA) """ l, n = bovy_coords.Rz_to_lambdanu(R, z, ac=self._ac, Delta=self._Delta) return -1. / (nu.sqrt(l) + nu.sqrt(n))
def _Rforce(self, R, z, phi=0., t=0.): """ NAME: _Rforce PURPOSE: evaluate the radial force for this potential INPUT: R - Galactocentric cylindrical radius z - vertical height phi - azimuth t - time OUTPUT: the radial force = -dphi/dR HISTORY: 2015-02-13 - Written - Trick (MPIA) """ l, n = bovy_coords.Rz_to_lambdanu(R, z, ac=self._ac, Delta=self._Delta) jac = bovy_coords.Rz_to_lambdanu_jac(R, z, Delta=self._Delta) dldR = jac[0, 0] dndR = jac[1, 0] return - (dldR * self._lderiv(l,n) + \ dndR * self._nderiv(l,n))
def test_Rz_to_lambdanu_hess(): #coordinate system: a = 3. g = 7. Delta = numpy.sqrt(g - a) ac = numpy.sqrt(a / g) #_____test float input (R=0)_____ R, z = 1.4, 0.1 dR = 10.**-5. dz = 10.**-5. # R derivatives tmp = R + dR dR = tmp - R # z derivatives tmp = z + dz dz = tmp - z num_deriv_llRR = ( bovy_coords.Rz_to_lambdanu(R + dR, z, ac=ac, Delta=Delta)[0] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[0] + bovy_coords.Rz_to_lambdanu(R - dR, z, ac=ac, Delta=Delta)[0]) / dR**2. num_deriv_nnRR = ( bovy_coords.Rz_to_lambdanu(R + dR, z, ac=ac, Delta=Delta)[1] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[1] + bovy_coords.Rz_to_lambdanu(R - dR, z, ac=ac, Delta=Delta)[1]) / dR**2. num_deriv_llRz = ( bovy_coords.Rz_to_lambdanu(R + dR, z + dz, ac=ac, Delta=Delta)[0] - bovy_coords.Rz_to_lambdanu(R + dR, z - dz, ac=ac, Delta=Delta)[0] - bovy_coords.Rz_to_lambdanu(R - dR, z + dz, ac=ac, Delta=Delta)[0] + bovy_coords.Rz_to_lambdanu(R - dR, z - dz, ac=ac, Delta=Delta)[0]) / dR**2. / 4. num_deriv_llzz = ( bovy_coords.Rz_to_lambdanu(R, z + dz, ac=ac, Delta=Delta)[0] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[0] + bovy_coords.Rz_to_lambdanu(R, z - dz, ac=ac, Delta=Delta)[0]) / dz**2. num_deriv_nnzz = ( bovy_coords.Rz_to_lambdanu(R, z + dz, ac=ac, Delta=Delta)[1] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[1] + bovy_coords.Rz_to_lambdanu(R, z - dz, ac=ac, Delta=Delta)[1]) / dz**2. num_deriv_nnRz = ( bovy_coords.Rz_to_lambdanu(R + dR, z + dz, ac=ac, Delta=Delta)[1] - bovy_coords.Rz_to_lambdanu(R + dR, z - dz, ac=ac, Delta=Delta)[1] - bovy_coords.Rz_to_lambdanu(R - dR, z + dz, ac=ac, Delta=Delta)[1] + bovy_coords.Rz_to_lambdanu(R - dR, z - dz, ac=ac, Delta=Delta)[1]) / dR**2. / 4. hess = bovy_coords.Rz_to_lambdanu_hess(R, z, Delta=Delta) assert numpy.fabs( num_deriv_llRR - hess[0, 0, 0] ) < 10.**-4., 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dl/dR)' assert numpy.fabs( num_deriv_llRz - hess[0, 0, 1] ) < 10.**-4., 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dR)' assert numpy.fabs( num_deriv_nnRR - hess[1, 0, 0] ) < 10.**-4., 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dR)' assert numpy.fabs( num_deriv_llzz - hess[0, 1, 1] ) < 10.**-4., 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dl/dz)' assert numpy.fabs( num_deriv_nnRz - hess[1, 0, 1] ) < 10.**-4., 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dz)' assert numpy.fabs( num_deriv_nnzz - hess[1, 1, 1] ) < 10.**-4., 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dz)' #___Also test for arrays___ R = numpy.arange(1, 4) * 0.5 z = numpy.arange(1, 4) * 0.125 # R derivatives tmp = R + dR dR = tmp - R # z derivatives tmp = z + dz dz = tmp - z dR = 10.**-5. dz = 10.**-5. num_deriv_llRR = ( bovy_coords.Rz_to_lambdanu(R + dR, z, ac=ac, Delta=Delta)[0] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[0] + bovy_coords.Rz_to_lambdanu(R - dR, z, ac=ac, Delta=Delta)[0]) / dR**2. num_deriv_nnRR = ( bovy_coords.Rz_to_lambdanu(R + dR, z, ac=ac, Delta=Delta)[1] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[1] + bovy_coords.Rz_to_lambdanu(R - dR, z, ac=ac, Delta=Delta)[1]) / dR**2. num_deriv_llRz = ( bovy_coords.Rz_to_lambdanu(R + dR, z + dz, ac=ac, Delta=Delta)[0] - bovy_coords.Rz_to_lambdanu(R + dR, z - dz, ac=ac, Delta=Delta)[0] - bovy_coords.Rz_to_lambdanu(R - dR, z + dz, ac=ac, Delta=Delta)[0] + bovy_coords.Rz_to_lambdanu(R - dR, z - dz, ac=ac, Delta=Delta)[0]) / dR**2. / 4. num_deriv_llzz = ( bovy_coords.Rz_to_lambdanu(R, z + dz, ac=ac, Delta=Delta)[0] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[0] + bovy_coords.Rz_to_lambdanu(R, z - dz, ac=ac, Delta=Delta)[0]) / dz**2. num_deriv_nnzz = ( bovy_coords.Rz_to_lambdanu(R, z + dz, ac=ac, Delta=Delta)[1] - 2. * bovy_coords.Rz_to_lambdanu(R, z, ac=ac, Delta=Delta)[1] + bovy_coords.Rz_to_lambdanu(R, z - dz, ac=ac, Delta=Delta)[1]) / dz**2. num_deriv_nnRz = ( bovy_coords.Rz_to_lambdanu(R + dR, z + dz, ac=ac, Delta=Delta)[1] - bovy_coords.Rz_to_lambdanu(R + dR, z - dz, ac=ac, Delta=Delta)[1] - bovy_coords.Rz_to_lambdanu(R - dR, z + dz, ac=ac, Delta=Delta)[1] + bovy_coords.Rz_to_lambdanu(R - dR, z - dz, ac=ac, Delta=Delta)[1]) / dR**2. / 4. hess = bovy_coords.Rz_to_lambdanu_hess(R, z, Delta=Delta) assert numpy.all( numpy.fabs(num_deriv_llRR - hess[0, 0, 0]) < 10.**-4. ), 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dl/dR)' assert numpy.all( numpy.fabs(num_deriv_llRz - hess[0, 0, 1]) < 10.**-4. ), 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dR)' assert numpy.all( numpy.fabs(num_deriv_nnRR - hess[1, 0, 0]) < 10.**-4. ), 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dR)' assert numpy.all( numpy.fabs(num_deriv_llzz - hess[0, 1, 1]) < 10.**-4. ), 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dl/dz)' assert numpy.all( numpy.fabs(num_deriv_nnRz - hess[1, 0, 1]) < 10.**-4. ), 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dz)' assert numpy.all( numpy.fabs(num_deriv_nnzz - hess[1, 1, 1]) < 10.**-4. ), 'hessian [d^2(lamda)/d(R,z)^2 , d^2(nu)/d(R,z)^2] fails for (dn/dz)' return None
def test_Rz_to_lambdanu_jac(): #coordinate system: a = 3. g = 7. Delta = numpy.sqrt(g - a) ac = numpy.sqrt(a / g) #_____test float input (R=0)_____ R, z = 1.4, 0.1 dR = 10.**-8. dz = 10.**-8. # R derivatives tmp = R + dR dR = tmp - R num_deriv_lR= (bovy_coords.Rz_to_lambdanu(R+dR,z,ac=ac,Delta=Delta)[0]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[0])/dR num_deriv_nR= (bovy_coords.Rz_to_lambdanu(R+dR,z,ac=ac,Delta=Delta)[1]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[1])/dR # z derivatives tmp = z + dz dz = tmp - z num_deriv_lz= (bovy_coords.Rz_to_lambdanu(R,z+dz,ac=ac,Delta=Delta)[0]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[0])/dR num_deriv_nz= (bovy_coords.Rz_to_lambdanu(R,z+dz,ac=ac,Delta=Delta)[1]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[1])/dR jac = bovy_coords.Rz_to_lambdanu_jac(R, z, Delta=Delta) assert numpy.fabs(num_deriv_lR - jac[ 0, 0]) < 10.**-6., 'jacobian d((lambda,nu))/d((R,z)) fails for (dl/dR)' assert numpy.fabs(num_deriv_nR - jac[ 1, 0]) < 10.**-6., 'jacobian d((lambda,nu))/d((R,z)) fails for (dn/dR)' assert numpy.fabs(num_deriv_lz - jac[ 0, 1]) < 10.**-6., 'jacobian d((lambda,nu))/d((R,z)) fails for (dl/dz)' assert numpy.fabs(num_deriv_nz - jac[ 1, 1]) < 10.**-6., 'jacobian d((lambda,nu))/d((R,z)) fails for (dn/dz)' #___Also test for arrays___ R = numpy.arange(1, 4) * 0.5 z = numpy.arange(1, 4) * 0.125 dR = 10.**-8. dz = 10.**-8. # R derivatives tmp = R + dR dR = tmp - R num_deriv_lR= (bovy_coords.Rz_to_lambdanu(R+dR,z,ac=ac,Delta=Delta)[0]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[0])/dR num_deriv_nR= (bovy_coords.Rz_to_lambdanu(R+dR,z,ac=ac,Delta=Delta)[1]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[1])/dR # z derivatives tmp = z + dz dz = tmp - z num_deriv_lz= (bovy_coords.Rz_to_lambdanu(R,z+dz,ac=ac,Delta=Delta)[0]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[0])/dR num_deriv_nz= (bovy_coords.Rz_to_lambdanu(R,z+dz,ac=ac,Delta=Delta)[1]\ -bovy_coords.Rz_to_lambdanu(R,z,ac=ac,Delta=Delta)[1])/dR jac = bovy_coords.Rz_to_lambdanu_jac(R, z, Delta=Delta) assert numpy.all(numpy.fabs(num_deriv_lR - jac[0, 0]) < 10.**-6. ), 'jacobian d((lambda,nu))/d((R,z)) fails for (dl/dR)' assert numpy.all(numpy.fabs(num_deriv_nR - jac[1, 0]) < 10.**-6. ), 'jacobian d((lambda,nu))/d((R,z)) fails for (dn/dR)' assert numpy.all(numpy.fabs(num_deriv_lz - jac[0, 1]) < 10.**-6. ), 'jacobian d((lambda,nu))/d((R,z)) fails for (dl/dz)' assert numpy.all(numpy.fabs(num_deriv_nz - jac[1, 1]) < 10.**-6. ), 'jacobian d((lambda,nu))/d((R,z)) fails for (dn/dz)' return None