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)
示例#2
0
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))
示例#5
0
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
示例#6
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