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 _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_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