public Stardata Fk524(Stardata j2000) {

        /* Miscellaneous */
        double r, d, ur, ud, px, rv;
        double sr, cr, sd, cd, x, y, z, w;
        double v1[] = new double[6], v2[] = new double[6];
        double xd, yd, zd;
        double rxyz, wd, rxysq, rxy;
        int i, j;

        /* Radians per year to arcsec per century */
        final double pmf = 100.0 * 60.0 * 60.0 * 360.0 / D2PI;

        /*
     * Canonical constants (see references)
     */

        /*
     * km per sec to AU per tropical century = 86400 * 36524.2198782 /
     * 1.49597870e8
     */
        final double vf = 21.095;

        /* Constant vector and matrix (by rows) */
        final double a[] = {-1.62557e-6, -0.31919e-6, -0.13843e-6, 1.245e-3, -1.580e-3, -0.659e-3};

        final double emi[][] = {{0.9999256795, /* emi[0][0] */
                                 0.0111814828, /* emi[0][1] */
                                 0.0048590039, /* emi[0][2] */
                                 -0.00000242389840, /* emi[0][3] */
                                 -0.00000002710544, /* emi[0][4] */
                                 -0.00000001177742}, /* emi[0][5] */

                                {-0.0111814828, /* emi[1][0] */
                                 0.9999374849, /* emi[1][1] */
                                 -0.0000271771, /* emi[1][2] */
                                 0.00000002710544, /* emi[1][3] */
                                 -0.00000242392702, /* emi[1][4] */
                                 0.00000000006585}, /* emi[1][5] */

                                {-0.0048590040, /* emi[2][0] */
                                 -0.0000271557, /* emi[2][1] */
                                 0.9999881946, /* emi[2][2] */
                                 0.00000001177742, /* emi[2][3] */
                                 0.00000000006585, /* emi[2][4] */
                                 -0.00000242404995}, /* emi[2][5] */

                                {-0.000551, /* emi[3][0] */
                                 0.238509, /* emi[3][1] */
                                 -0.435614, /* emi[3][2] */
                                 0.99990432, /* emi[3][3] */
                                 0.01118145, /* emi[3][4] */
                                 0.00485852}, /* emi[3][5] */

                                {-0.238560, /* emi[4][0] */
                                 -0.002667, /* emi[4][1] */
                                 0.012254, /* emi[4][2] */
                                 -0.01118145, /* emi[4][3] */
                                 0.99991613, /* emi[4][4] */
                                 -0.00002717}, /* emi[4][5] */

                                {0.435730, /* emi[5][0] */
                                 -0.008541, /* emi[5][1] */
                                 0.002117, /* emi[5][2] */
                                 -0.00485852, /* emi[5][3] */
                                 -0.00002716, /* emi[5][4] */
                                 0.99996684} /* emi[5][5] */};

        /* Pick up J2000 data (units radians and arcsec/JC) */
        r = j2000.getAngle().getAlpha();
        d = j2000.getAngle().getDelta();
        ur = j2000.getMotion()[0] * pmf;
        ud = j2000.getMotion()[1] * pmf;
        px = j2000.getParallax();
        rv = j2000.getRV();

        /* Spherical to Cartesian */
        sr = Math.sin(r);
        cr = Math.cos(r);
        sd = Math.sin(d);
        cd = Math.cos(d);

        x = cr * cd;
        y = sr * cd;
        z = sd;

        w = vf * rv * px;

        v1[0] = x;
        v1[1] = y;
        v1[2] = z;

        v1[3] = -ur * y - cr * sd * ud + w * x;
        v1[4] = ur * x - sr * sd * ud + w * y;
        v1[5] = cd * ud + w * z;

        /* Convert position+velocity vector to BN system */
        for (i = 0; i < 6; i++) {
            w = 0.0;
            for (j = 0; j < 6; j++) {
                w += emi[i][j] * v1[j];
            }
            v2[i] = w;
        }

        /* Position vector components and magnitude */
        x = v2[0];
        y = v2[1];
        z = v2[2];
        rxyz = Math.sqrt(x * x + y * y + z * z);

        /* Include e-terms */
        w = x * a[0] + y * a[1] + z * a[2];
        x += a[0] * rxyz - w * x;
        y += a[1] * rxyz - w * y;
        z += a[2] * rxyz - w * z;

        /* Recompute magnitude */
        rxyz = Math.sqrt(x * x + y * y + z * z);

        /* Apply E-terms to both position and velocity */
        x = v2[0];
        y = v2[1];
        z = v2[2];
        w = x * a[0] + y * a[1] + z * a[2];
        wd = x * a[3] + y * a[4] + z * a[5];
        x += a[0] * rxyz - w * x;
        y += a[1] * rxyz - w * y;
        z += a[2] * rxyz - w * z;
        xd = v2[3] + a[3] * rxyz - wd * x;
        yd = v2[4] + a[4] * rxyz - wd * y;
        zd = v2[5] + a[5] * rxyz - wd * z;

        /* Convert to spherical */
        rxysq = x * x + y * y;
        rxy = Math.sqrt(rxysq);

        r = (x != 0.0 || y != 0.0) ? Math.atan2(y, x) : 0.0;
        if (r < 0.0) {
            r += D2PI;
        }
        d = Math.atan2(z, rxy);

        if (rxy > VERYTINY) {
            ur = (x * yd - y * xd) / rxysq;
            ud = (zd * rxysq - z * (x * xd + y * yd)) / ((rxysq + z * z) * rxy);
        }

        /* Radial velocity and parallax */
        if (px > VERYTINY) {
            rv = (x * xd + y * yd + z * zd) / (px * vf * rxyz);
            px = px / rxyz;
        }

        /* Return results */
        AngleDR r1950 = new AngleDR(r, d);
        double d1950[] = {ur / pmf, ud / pmf};
        return new Stardata(r1950, d1950, px, rv);
    }