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))
示例#3
0
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